Преобразуйте трехбуквенный код языка в идентификатор языка (LANGID)

Используйте Zend Profiler, чтобы видеть начало как текст запроса, а Zend_Db_Prfiler :: TRANSACTION как тип запроса без коммита или отката в качестве текста запроса. (Предполагая, что в вашем приложении нет запроса -> («START TRANSACTION») и Zend Profiler)

5
задан Jonas 13 October 2009 в 12:23
поделиться

3 ответа

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

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

Фрагмент кода, который вы ищете, находится в функции

LANGID CLanguageSupport::GetLangIdFromFile(LPCTSTR pszFilename)

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

2
ответ дан 15 December 2019 в 06:29
поделиться

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

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

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

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

1
ответ дан 15 December 2019 в 06:29
поделиться

Вы можете получить 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". В любом случае подкаталоги - простое решение и, надеюсь, не усложнят процесс сборки так, как изменение имени целевого файла.

0
ответ дан 15 December 2019 в 06:29
поделиться
Другие вопросы по тегам:

Похожие вопросы: