2009-10-13 113 views
5

在Win32 API中是否有某种方法可将指定的GetLocaleInfo()LOCALE_SABBREVLANGNAME返回的三字母语言代码转换为相应的LANGIDLCID?也就是说,与“GetLocaleInfo()”通常所做的“相反”?将三字母语言代码转换为语言标识符(LANGID)

我想要做的是解析什么样的语言资源DLL正在使用,到目前为止,没有触及任何关于DLL,以格式nameLNG.dll,其中LNG是一个三字母语言代码,似乎是最简单的方法,假设这样的功能存在。

如果这不容易做,我猜计划B是给我们的语言DLL的版本信息资源,在那里指定他们各自的文化,然后在应用程序中,阅读他们使用的文化。

回答

2

不幸的是,没有直接的Win32 API给你一个3字母缩写的LANGID。

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

的一块你要找的代码是INT功能

LANGID CLanguageSupport::GetLangIdFromFile(LPCTSTR pszFilename) 

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

+0

是的,我想我最终会使用这个课程,因为你显然已经不仅仅是一个,而是我们现在面临的两个问题。我们甚至可能会重新实现我刚刚拿走的语言子菜单,认为我们切换到MFC机制将是最终的。哦,好吧...... – Jonas 2009-10-14 07:50:30

1

您可以使用EnumSystemLocales()来枚举已安装的语言环境并自行构建映射。我在应用程序初始化期间在我刚刚写的一个服务中执行此操作,迄今为止它运行良好。

我会推荐在这种情况下使用计划B。我通常避开编码的东西到文件名中。如果没有其他原因,使用3个字符的ISO-639变体是不完美的,除非您严格指定您正在使用哪个变体 - ISO-639-2/B, ISO-639-2/TISO-639-3

如果您需要提供特定于语言环境的变体,那么您应该仔细查看RFC3066。基本上,您需要指定语言和国家代码以及某些情况下的区域代码。在任何情况下,LCID都包含了所有这些优点。

我不完全确定的一件事是资源信息中的langID是否是完整的LCID。 VERSIONINFO引用中列出的代码是LCID,因此我会尝试在VERSIONINFO标头中使用LCID。如果不是,则可以始终将该信息作为字符串包含在字符串块中。

+1

EnumSystemLocales只给我一个三字母首字母缩略词的列表,对吗?我不确定如何仅使用这些信息来构建地图,并且缺乏LCID或LANGID来翻译?如果EnumSystemLocales的回调函数返回一对* LCID和“ISO”字符串,此解决方案将是完美的。 – Jonas 2009-10-14 07:45:47

+0

“EnumLocalesProc”的参数实际上是LCID格式化为一个字符串的十六进制数字。这个文档不太清楚 - _“指向包含以null结尾的区域标识符字符串的缓冲区的指针_”。他们没有提及的是你必须调用'_tcstoul(lpLocaleString,NULL,16)'来获取区域标识符为可用的形式。一旦你有了LCID,你可以使用'LOCALE_SISO639LANGNAME'和'LOCALE_SISO3166CTRYNAME'从'GetLocaleInfo()'中获得你需要的东西。 – 2009-10-14 11:01:33

0

你可以通过调用GetLocaleInfo()LOCAL_RETURN_NUMBER|LOCALE_ILANGUAGELCType参数,就像你通过LOCALE_SABBREVLANGNAME获得三个字母的ISO代码获取语言标识号。通过将相同的lcid传递给此函数,可以将相应的LangID与ISO代码一起存储。

注意,MSDN说:LOCALE_ILANGUAGE不应该在Vista及以上的青睐LOCALE_SLANG使用,但我相信注释不LOCALE_RETURN_NUMBER申请使用的LOCALE_ILANGUAGE

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

+0

我不幸没有LCID的使用权限,但想从语言代码三字母首字母缩略词(人造ISO代码)中获得一个LANGID。 – Jonas 2009-10-14 07:42:38

+0

FWIW,MS希望我们离开LOCALE_ILANGUAGE,因为他们希望转移到仅使用字符串的“lang ID”,即.NET文化ID。如果他们试图说服我们,LANGID *可能会死于某一天,至少对于Win8 +中新近支持的语言而言 – 2009-10-14 07:59:02