Преобразовать трехбуквенный код языка в идентификатор языка (LANGID) - PullRequest
5 голосов
/ 13 октября 2009

Есть ли способ в Win32 API преобразовать трехбуквенный языковой код, возвращаемый GetLocaleInfo() с указанным LOCALE_SABBREVLANGNAME, в соответствующий LANGID или LCID? То есть идти в «обратном направлении» к тому, что обычно делает GetLocaleInfo()

То, что я пытаюсь сделать, - это проанализировать, какой язык использует DLL-библиотека ресурса, и до сих пор, не затрагивая ничего о DLL, переходя по имени dll в формате nameLNG.dll, где LNG представляет собой трехбуквенный код языка, кажется, самый простой способ, при условии, что такая функция существует.

Если это нелегко сделать, я думаю, что План Б состоит в том, чтобы предоставить нашим языковым DLL информацию о версии, указать их соответствующие культуры, а затем в приложении прочитать, какие культуры они используют.

Ответы [ 3 ]

2 голосов
/ 13 октября 2009

К сожалению, нет прямого API Win32, который бы давал LANGID с трехбуквенным сокращением.

Похоже, CLanguageSupport ваш друг сегодня :-) Он уже реализует ваш план B для поиска LANGID на основе содержимого информационного ресурса о версии.

Часть кода, которую вы ищете - это функция

LANGID CLanguageSupport::GetLangIdFromFile(LPCTSTR pszFilename)

Конечно, недостатком является то, что у вас может быть несоответствие между информацией о версии и именем DLL. Но вы очень быстро поймете это во время тестов. И если вы позволите таким инструментам, как appTranslator , создать библиотеки DLL для вас, вы наверняка будете в безопасности.

1 голос
/ 13 октября 2009

Вы можете перечислить установленные локали, используя EnumSystemLocales(), и построить карту самостоятельно. Я делаю это во время инициализации приложения в службе, которую я написал некоторое время назад, и до сих пор она работала хорошо.

Я бы порекомендовал использовать Plan B в этом случае. Я обычно избегаю кодирования вещей в имени файла. Если по какой-либо другой причине использование 3-символьного варианта ISO-639 не является идеальным, если вы не укажете строго, какой вариант вы используете - ISO-639-2 / B, ISO-639- 2 / T или ISO-639-3 .

Если вам нужно предоставить специфичные для локали варианты, вам следует внимательно посмотреть на RFC3066 . В основном вам необходимо указать язык и код страны, а в некоторых случаях и код региона. В любом случае, LCID заключает в себе все эти качества.

Единственное, в чем я не совсем уверен, это то, является ли langID в информации о ресурсе полным LCID или нет. Коды, перечисленные в справочнике VERSIONINFO , являются LCID, поэтому я бы попробовал использовать LCID в заголовке VERSIONINFO. Если нет, вы всегда можете включить информацию в виде строки в строковый блок.

0 голосов
/ 14 октября 2009

Вы можете получить LangID, вызвав GetLocaleInfo() с LOCAL_RETURN_NUMBER|LOCALE_ILANGUAGE для параметра LCType , так же, как вы передали LOCALE_SABBREVLANGNAME, чтобы получить трехбуквенный код ISO. Передав в эту функцию тот же lcid , вы можете сохранить соответствующий LangID с кодом ISO.

Обратите внимание, что MSDN говорит, что LOCALE_ILANGUAGE не следует использовать в пользу LOCALE_SLANG в Vista и выше, но я считаю, что комментарий не применяется для использования LOCALE_ILANGUAGE с LOCALE_RETURN_NUMBER.

По мере развития вашего проекта вы можете создавать несколько локализованных файлов для каждого языка. По этой причине я бы посоветовал вам хранить ваши локализованные файлы в подкаталогах, названных по имени языка. Microsoft использовала каталоги, названные в честь LangID, например, «1033» в качестве каталога ресурсов на английском языке. Я думаю, что было бы более удобно использовать трехбуквенный код, такой как «ENU \ name.dll». В любом случае, подкаталоги - это простое решение, и мы надеемся, что оно не будет усложнять процесс сборки так, как изменение имени целевого файла.

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