Donguy1976 Ответов: 2

MFC: loadstring с использованием cstring


У меня есть приложение на основе диалогов, написанное на 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"


Последняя строка будет такой
IDS_STRING_OK_BUTTON_ENG


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

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

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

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

2 Ответов

Рейтинг:
2

Richard MacCutchan

Зачем пытаться заново изобрести колесо, когда Windows уже предоставляет возможность иметь многоязычные ресурсы? Видеть Многоязычные Ресурсы[^].


Рейтинг:
16

User 7429338

Библиотеки DLL ресурсов-это рекомендуемый способ сделать это, но если у вас есть причины не использовать их, создание идентификаторов ресурсов в коде не является невозможным.

Идентификаторы в resource.h являются целыми числами, и ссылаться на них, например, как на IDS_STRING_OK_BUTTON_ENG, можно только во время компиляции. Однако вы могли бы сделать что-то подобное.

ресурса.ч:

#define IDS_STRING_OK_BUTTON_ENG	100
#define IDS_STRING_EXIT_BUTTON_ENG 	101
#define IDS_STRING_OK_BUTTON_FRA	200
#define IDS_STRING_EXIT_BUTTON_FRA 	201


.rc-файл:
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

А затем обратитесь к идентификаторам как к английскому идентификатору + смещение, зависящее от языка. В этом примере смещение для французского языка будет равно 100.