Как установить правильный исходный язык для программы на С++ в Windows?

Я новичок в локализованном программировании, и я пытаюсь выяснить, как установить правильную начальную локаль для недавно запущенного неуправляемого приложения С++ (из приложения).

Насколько я могу судить, новые приложения начинаются с локали C, а не с соответствующей региональной локали (на английском, немецком и т.д.). Поэтому мне нужно сделать вызов setlocale( LC_ALL, "???" ), но я не уверен, как получить правильное значение для второго аргумента. Это будет нечто вроде "английский" или "немецкий: Германия" - в основном, независимо от того, какой язык был установлен пользователем через панель управления "Язык и региональные стандарты". Чтобы быть ясным, я не ищу, как отформатировать строку locale, я ищу правильную строку локали для компьютера, на котором работает приложение.

Я предполагаю, что есть какой-то Win32 API, который даст мне это, или, возможно, раздел реестра, который будет содержать правильное значение. Кто-нибудь знает, что я должен делать?

Ответы

Ответ 1

setlocale() - это C, а не С++. Я смутно помню, как между ними воздействовали VC6, но это была ошибка. Обычно setlocale() влияет только на поведение функций C.

В С++ локализация контролируется классом std:: locale. По умолчанию в локально-чувствительных операциях используется глобальная локаль, которая получается по умолчанию - построение объекта локали и может быть установлена ​​с помощью std:: locale:: global (const std:: locale &).

Построение объекта локали с пустой строкой (std:: locale ("")) создает локаль, соответствующую программной среде.

При запуске программы глобальная локаль - это "C" или "Классический" язык. Чтобы установить глобальную локаль в локаль программной среды (я думаю, это то, что вы просите), вы, таким образом, пишете:

std::locale::global(std::locale(""));

Например, мои региональные настройки в настоящее время установлены на французский (Канада). Выполнение этого:

int main(void)
{
  std::cout << std::locale().name() << std::endl;
  std::locale::global(std::locale(""));
  std::cout << std::locale().name() << std::endl;
  std::locale::global(std::locale("C"));
  std::cout << std::locale().name() << std::endl;
  return 0;
}

печатает:

C
French_Canada.1252
C