Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Windows 在win32上构建多语言应用程序的最佳实践是什么?_Windows_Windows Mobile_Multilingual - Fatal编程技术网

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

Windows 在win32上构建多语言应用程序的最佳实践是什么?,windows,windows-mobile,multilingual,Windows,Windows Mobile,Multilingual,我必须在Windows Mobile上构建一个GUI应用程序,并且希望它能够让用户选择她想要的语言,或者让应用程序自动选择语言。我考虑使用多个只包含所需资源的DLL。 1首选默认值是什么?如何让应用程序自动选择合适的资源语言,而无需用户干预?有样品吗 2允许用户/应用程序控制的选项有哪些?应显示何种语言 3如果可能,如何创建包含多个语言资源的dll,然后动态选择语言?对于1,您可以使用函数获取计算机的语言标识符 对于2,您可以列出您支持的语言,当用户选择一种语言时,将选择内容写入文本文件或注册表

我必须在Windows Mobile上构建一个GUI应用程序,并且希望它能够让用户选择她想要的语言,或者让应用程序自动选择语言。我考虑使用多个只包含所需资源的DLL。 1首选默认值是什么?如何让应用程序自动选择合适的资源语言,而无需用户干预?有样品吗

2允许用户/应用程序控制的选项有哪些?应显示何种语言

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

对于1,您可以使用函数获取计算机的语言标识符

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

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

对于1,您可以使用函数获取机器的语言标识符

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

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

Re 1:前面的GetSystemDefaultLangid建议很好

回复2:您可以在安装的第一步询问。或者,您可以为每种语言打包不同的安装程序

关于3: 理论上,上面提到的DLL方法听起来不错,但实际上,对我个人来说,它一点也不管用

更好的方法是用Localize或NoLocalize包围程序中的所有字符串

MessageBox(Localize("Hello"), Localize("Title"), MB_OK);
RegOpenKey(NoLocalize("\\SOFTWARE\\RegKey"), ...);
本地化只是一个将英语文本转换为所选语言的函数。NoLocalize什么都不做

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

1搜索所有本地化前缀并输出带有english=otherlangauge名称-值对的.ini文件的脚本。如果output.ini文件已经包含映射,则不再添加它。您永远不会完全重新创建ini文件,每次运行脚本时,脚本只会添加缺少的ini文件

2搜索所有字符串并确保它们被本地化或非本地化包围的脚本。如果没有,它会告诉您哪些字符串仍然需要本地化

原因2很重要,因为您需要确保所有字符串实际上都有意识地标记为需要本地化或不需要本地化。否则,绝对不可能确保您有适当的本地化

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

随程序一起输出ini文件。您还可以将这些ini文件提供给翻译人员,以便他们可以转换英语=其他语言对。当他们将其发送回您时,您只需将签入的.ini文件替换为翻译器提供的文件。如1所述运行脚本将重新添加任何缺少的翻译(如果在翻译器翻译时完成了任何翻译)

Re 1:前面的getSystemDefaultLangid建议很好

回复2:您可以在安装的第一步询问。或者,您可以为每种语言打包不同的安装程序

关于3: 理论上,上面提到的DLL方法听起来不错,但实际上,对我个人来说,它一点也不管用

更好的方法是用Localize或NoLocalize包围程序中的所有字符串

MessageBox(Localize("Hello"), Localize("Title"), MB_OK);
RegOpenKey(NoLocalize("\\SOFTWARE\\RegKey"), ...);
本地化只是一个将英语文本转换为所选语言的函数。NoLocalize什么都不做

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

1搜索所有本地化前缀并输出带有english=otherlangauge名称-值对的.ini文件的脚本。如果output.ini文件已经包含映射,则不再添加它。您永远不会完全重新创建ini文件,每次运行脚本时,脚本只会添加缺少的ini文件

2搜索所有字符串并确保 ey被Localize或NoLocalize包围。如果没有,它会告诉您哪些字符串仍然需要本地化

原因2很重要,因为您需要确保所有字符串实际上都有意识地标记为需要本地化或不需要本地化。否则,绝对不可能确保您有适当的本地化

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


随程序一起输出ini文件。您还可以将这些ini文件提供给翻译人员,以便他们可以转换英语=其他语言对。当他们将其发送回您时,您只需将签入的.ini文件替换为翻译器提供的文件。如1所述运行脚本将重新添加任何缺少的翻译(如果在翻译器翻译时完成了任何翻译)

出于好奇,你为什么说DLL方法不太好用?这就是我们的商业软件包15年来一直在做的事情。我们的每个语言DLL都包含6000多个字符串,我们支持15种语言。添加一个新的字符串int-ID,然后将该ID与实际字符串关联,这浪费了多少开发时间?还有,如何确保所有字符串都被翻译。我不是说用.dll文件是不可能的,我只是说有更好的方法。上面概述了更好的方法。我们只需不在代码中添加任何用户可能看到的字符串,即可确保所有字符串都被翻译,所有字符串都必须从语言DLL加载。11年来,我不记得有任何非本地化字符串进入发布的软件。继续。添加一个新的字符串ID是一个10秒的过程,我们有perl脚本,可以使这一切变得简单,并确保没有重复等等。话虽如此,我还是喜欢你的方法。出于好奇,你为什么说DLL方法不太管用?这就是我们的商业软件包15年来一直在做的事情。我们的每个语言DLL都包含6000多个字符串,我们支持15种语言。添加一个新的字符串int-ID,然后将该ID与实际字符串关联,这浪费了多少开发时间?还有,如何确保所有字符串都被翻译。我不是说用.dll文件是不可能的,我只是说有更好的方法。上面概述了更好的方法。我们只需不在代码中添加任何用户可能看到的字符串,即可确保所有字符串都被翻译,所有字符串都必须从语言DLL加载。11年来,我不记得有任何非本地化字符串进入发布的软件。继续。添加一个新的字符串ID是一个10秒的过程,我们有perl脚本,可以使这一切变得简单,并确保没有重复等等。话虽如此,我还是喜欢你的方法。