在win32上构建多语言应用程序的最佳实践是什么?

时间:2009-01-29 02:26:12

标签: windows windows-mobile multilingual

我必须在Windows Mobile上构建一个GUI应用程序,并希望能够让用户选择她想要的语言,或者应用程序自动选择语言。我考虑使用包含所需资源的多个dll。

1)什么是首选(默认?)方式让应用程序自动选择适当的资源语言,无需用户干预?有样品吗?

2)我有哪些选择允许用户/应用程序控制它应显示哪种语言?

3)如果可能,如何创建一个包含多种语言资源的dll,然后动态选择语言?

2 个答案:

答案 0 :(得分:4)

对于#1,您可以使用GetSystemDefaultLangID功能获取机器的语言标识符。

对于#2,您可以列出您支持的语言,当用户选择一种语言时,将选择内容写入文本文件或注册表(Windows Mobile上是否有注册表?)。启动时,仅当文件或注册表中没有选择时才使用#1中的函数。

对于#3,我们这样做的方法是每种语言有一个资源DLL,每个资源都包含相同的资源ID。找到语言后,加载该语言的DLL,其余的就可以了。

答案 1 :(得分:3)

Re 1:以前的GetSystemDefuaultLangID建议很好。

Re 2:您可以在安装时提出第一步。或者,您可以为每种语言打包不同的安装程序。

回复3: 从理论上讲,上面提到的DLL方法听起来很棒,但是在实践中它对我个人来说根本不起作用。

更好的方法是使用以下任一方式包围程序中的所有字符串:Localize或NoLocalize。

MessageBox(Localize("Hello"), Localize("Title"), MB_OK);
RegOpenKey(NoLocalize("\\SOFTWARE\\RegKey"), ...);

Localize只是一个将英文文本转换为所选语言的函数。 NoLocalize什么都不做。

您希望用这些值包围字符串,因为您可以使用您选择的脚本语言构建一些有用的脚本。

1)搜索所有Localize的脚本(“前缀并输出带有english = otherlangauge名称值对的.ini文件。如果输出.ini文件已经包含映射,则不再添加它。你从不完全重新创建ini文件,每次运行脚本时,脚本都会添加缺少的文件。

2)一个脚本,它搜索所有字符串,并确保它们被Localize(“或NoLocalize(”)包围。如果不是,它会告诉您仍需要本地化的字符串。

#2之所以重要,是因为你需要确保所有的字符串都被有意识地标记为需要本地化。否则绝对不可能确保你有适当的本地化。

#1而不是从DLL加载的原因是因为维护此解决方案无需任何工作,您可以添加需要动态转换的新字符串。

您运送随程序输出的ini文件。您还可以将这些ini文件提供给翻译人员,以便他们可以转换english = otherlanguage对。当他们将它发回给您时,您只需将已签入的.ini文件替换为您的翻译人员。如果翻译人员在翻译过程中完成任何翻译,那么运行#1中提到的脚本将重新添加任何缺失的翻译。