Я хочу иметь возможность программно изменять язык приложения или, по крайней мере, использовать язык, указанный в Панели управления -> Региональные и языковые параметры -> Форматы.
Если я добавлю таблицу английских строк, сделаю ее копию на французском и немецком языках и удаляю английскую, я могу программно переключаться между загрузкой строк на французском и немецком языках.
Если я сохраняю английскую копию, английские строки загружаются, несмотря ни на что, когда я пытаюсь загрузить немецкую или французскую.
Я думаю, что это ошибка загрузчика ресурсов, и что загрузчик ресурсов игнорирует SetThreadLocale, если он находит таблицу строк на том же языке, что и язык пользовательского интерфейса Windows (например, язык меню Windows Explorer).
Я пытался изменить Панель управления -> Региональные и языковые параметры -> Форматы на французский, но это не имеет никакого эффекта. Редактор ресурсов показывает таблицу французских строк без добавленного языка, но моя программа по-прежнему всегда загружает английские строки. Копирование этого изменения в системную учетную запись также не имеет никакого эффекта.
Вот код, с которым я пытался это сделать:
#include "stdafx.h"
#include <iostream>
#include "windows.h" // this should go to stdafx.h
#include "resource.h" // this should not go to stdafx.h
using namespace std;
int _tmain(int argc, _TCHAR* argv[])
{
// 1036 = french, 1031 = german
SetThreadLocale(MAKELCID(1036, SORT_DEFAULT));
const int maxSize = 100;
wchar_t c[maxSize];
LoadString(GetModuleHandle(NULL), IDS_STRING101, c, maxSize);
std::cout << c;
return 0;
}
Здесь - наполовину неверное, неполное объяснение (во второй половине метода 2). Второй предложенный здесь обходной путь, использующий только строково-нейтральные строковые таблицы, бесполезен, потому что у меня есть отдельные строковые таблицы Португалия-Португалия и Португалия-Бразилия.
Первый предложенный обходной путь не работает. С кодом ниже я получаю ошибку 1814.
HRSRC r = FindResource(
GetModuleHandle(NULL),
MAKEINTRESOURCE(IDS_STRING101),
RT_STRING);
DWORD e = GetLastError();
Итак, что мне делать? Чем объясняется эта странная «ошибка»?
ПОСЛЕДНЕЕ РЕДАКТИРОВАНИЕ:
После еще нескольких тестов я узнал, что:
- GetThreadLocale () возвращает то, что
установить в панели управления -> Региональный и
Параметры языка -> Форматы.
- Ошибка загрузчика ресурсов заключается в том, что если в моей программе есть ресурсы на английском языке США, эти ресурсы будут загружаться независимо от того, что установлено в форматах. Если он не имеет ресурсов английского языка США, будет использоваться язык, установленный в форматах.
- Если у меня есть таблица строк на французском (Neutral) и немецком (Neutral), и я установил форматы на French (Франция), немецкие строки загружаются. Если я добавлю английскую (нейтральную) таблицу строк, английские строки будут загружены. Таким образом, нейтральный запасной вариант культуры не работает для форматов.
- Если я добавлю таблицу нейтральных строк, она будет использоваться, даже если у меня есть другая таблица строк на английском (нейтральном) или английском языке (США).