MFC: LoadString с использованием CString - PullRequest
0 голосов
/ 09 мая 2018

У меня диалоговое приложение, написанное на VC ++ с использованием Visual Studio 6. Это простое приложение с очень небольшим количеством текстов, но теперь оно должно поддерживать несколько языков. Поскольку текстов не много, планируется добавить все разные языки в одну строковую таблицу с уникальным идентификатором. Теперь пример таблицы строк выглядит так:

STRINGTABLE
BEGIN
    IDS_STRING_OK_BUTTON_ENG "OK"    //English text
    IDS_STRING_EXIT_BUTTON_ENG "Exit"   //English text
    IDS_STRING_OK_BUTTON_FRA "D'accord"   //French text
    IDS_STRING_EXIT_BUTTON_FRA "Sortie"   //French text
END

Теперь у меня есть функция, которая будет возвращать строку, основанную на настройке языка ОС.

    CString strLang = "";
    //Retrieves the system default locale identifier
    LCID lcid = GetSystemDefaultLCID();

    //Determine the language identifier from the locale identifier
    LANGID langid = LANGIDFROMLCID(lcid);

    //Does many processing here........
    //.................................
    //.................................
    // So if English is the OS language then this function will return "_ENG".

Теперь в другой части кода этот уникальный идентификатор языка объединяется с другой строкой, чтобы найти текст для конкретного языка.

CString okButton = "IDS_STRING_OK_BUTTON" + m_strLanguageIndex; //Here m_strLanguageIndex for example will be "_ENG"

Таким образом, я могу иметь только одну строковую таблицу со всеми разными языками, а затем использовать описанный выше метод для создания уникального идентификатора ресурса.

Но теперь проблема в том, что идентификаторы ресурсов в файле resource.h являются целыми числами. Поэтому приведенная выше строка CString бесполезна для поиска соответствующего текста.

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

Я не хочу создавать несколько библиотек DLL для каждого языка, поскольку это простое диалоговое приложение.

1 Ответ

0 голосов
/ 09 мая 2018

Win32 ресурсы хранятся в иерархии; type\name\language и функции ресурсов будут искать ресурс, соответствующий языку потоков, если он существует. Это позволит вам использовать в вашем коде идентификатор типа IDS_STRING_OK_BUTTON, а ваши ресурсы будут содержать две разные строковые таблицы, по одной для каждого языка.

В файле .RC вы можете использовать оператор LANGUAGE для создания переведенных копий различных ресурсов:

Определяет язык для всех ресурсов вплоть до следующего оператора LANGUAGE или до конца файла.

Когда оператор LANGUAGE появляется перед началом тела определения ресурса ACCELERATORS, DIALOGEX, MENU, RCDATA или STRINGTABLE, указанный язык применяется только к этому ресурсу.

Другим распространенным способом обеспечения поддержки перевода является создание ресурса .DLL для каждого языка и просто загрузка требуемого .DLL и использование его дескриптора HMODULE при загрузке ресурсов. Windows может сделать всю работу за вас, если вы создадите MUI resources .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...