代码之家  ›  专栏  ›  技术社区  ›  Jonas

将三个字母的语言代码转换为语言标识符(langid)

  •  5
  • Jonas  · 技术社区  · 15 年前

    在win32 api中,是否有方法转换由返回的三个字母的语言代码? GetLocaleInfo() 具有 LOCALE_SABBREVLANGNAME 指定,到相应的 LANGID LCID ?也就是说,以“反向”的方式 获取本地信息() 通常是吗?

    我要做的是解析资源dll使用的语言,到目前为止,在不涉及任何关于dll的内容的情况下,使用带有格式的dll名称 nameLNG.dll 在哪里 LNG 是一种三字母的语言代码,似乎是最简单的方法,假设存在这样一个函数。

    如果这不容易做到,我想B计划是给我们的语言DLL一个版本信息资源,在那里指定它们各自的区域性,然后在应用程序中读取它们使用的区域性。

    3 回复  |  直到 15 年前
        1
  •  2
  •   Community kfsone    7 年前

    不幸的是,没有一个直接的win32 api能为您提供一个由3个字母组成的langid缩写。

    看起来像 CLanguageSupport 是你的朋友 today :-)它已经实现了基于版本信息资源内容查找langid的计划B。

    您要查找的代码是int函数

    LANGID CLanguageSupport::GetLangIdFromFile(LPCTSTR pszFilename)
    

    当然,缺点是版本信息和dll名称之间可能不匹配。但在测试过程中你会很快抓住它。如果你让一个工具 appTranslator 为你创建DLL,你一定会安全的。

        2
  •  1
  •   D.Shawley    15 年前

    可以使用枚举已安装的区域设置 EnumSystemLocales() 自己做地图。我在不久前编写的一个服务中的应用程序初始化过程中完成了这项工作,到目前为止效果良好。

    我建议使用 B计划 在这种情况下。我通常不把代码编码成文件名。如果没有其他原因,请使用3个字符 ISO-639 除非您严格指定要使用的变体,否则变体并不完美。- ISO-639-2/B, ISO-639-2/T ISO-639-3 .

    如果您需要提供特定于区域设置的变体,那么应该仔细查看 RFC3066 . 基本上,您需要指定语言和国家代码,在某些情况下还需要指定地区代码。无论如何,LCID封装了所有这些优点。

    有一件事我不能完全确定,那就是资源信息中的langid是否是完整的lcid。中列出的代码 VERSIONINFO 引用是LCID,因此我将尝试在versionInfo头中使用LCID。如果没有,则可以将信息作为字符串包含在字符串块中。

        3
  •  0
  •   Heath Hunnicutt    15 年前

    您可以通过调用 GetLocaleInfo() 具有 LOCAL_RETURN_NUMBER|LOCALE_ILANGUAGE 对于 LCyType 参数,就像传递 LOCALE_SABBREVLANGNAME 获得三个字母的ISO代码。通过相同的 LCID 对于此函数,可以使用ISO代码存储相应的langid。

    注意,msdn说 LOCALE_ILANGUAGE 不应该有利于 LOCALE_SLANG 在Vista和更高版本上,但我认为该评论不适用于 本地语言 具有 LOCALE_RETURN_NUMBER .

    随着项目的发展,可能会为每种语言生成几个本地化文件。因此,我建议您将本地化文件存储在以该语言命名的子目录中。微软使用了以langid命名的目录,例如“1033”作为英文资源目录。我认为使用三个字母的代码会更友好一些,比如“enu\name.dll”。在任何情况下,子目录都是一个简单的解决方案,希望不会像更改目标文件名那样使构建过程复杂化。