VC++ 10 MFC:如何正确进行本地化?

9
我是一名.NET开发人员,现在需要处理一个MFC应用程序。该应用程序是一个VS2008 MFC可执行文件,我已将其转换为VS2010。原始开发人员通过在应用程序命令行上指定包含键值对的.txt文件的名称来进行本地化。安装快捷方式到可执行文件会根据安装应用程序的国家/地区指定不同的.txt文件。但如果直接运行.exe,则无法使用此方法。这对我来说似乎是一种奇怪的做法。
我想以正确的MFC方式完成这个任务,但在Google上很难找到权威答案。我的理解是应该使用.rc文件中的字符串表进行本地化?这是MFC的最佳实践吗?
关于字符串表,我了解到最好为每种语言创建一个单独的字符串表。MFC应用程序如何选择要使用的语言?它是基于计算机当前的语言设置还是可以由我们控制(可能是我们正在构建的Wix .msi安装程序指定语言)?
我也了解到,将所有资源嵌入MFC应用程序已经不再流行,现在应该编译单独的资源.dll文件。如果这是真的,我会研究如何操作...
最后,我需要特别设置MFC才能支持Unicode吗?或者MFC默认支持Unicode?
谢谢。

1
MFC和Unicode是独立的,您可以单独使用其中一个。如果您正在使用向导构建项目,则Unicode将是其中之一选项(应该是默认选项)。否则,您可以在项目设置中找到它。 - Mark Ransom
另一篇 CodeProject 文章:http://www.codeproject.com/Articles/11040/Multiple-language-support-for-MFC-applications-wit - Martin Ba
2个回答

11
这个想法是将所有可本地化的项存储在资源中。标准UI对象,例如菜单和对话框会自动为您存储在那里(资源),但是像字符串文字(例如:错误消息、消息框提示...)这样的项应该从源代码中提取到字符串表中。我在这篇短的codeproject文章中演示了如何轻松地从字符串表中提取代码中的字符串。
注意:您的资源脚本(.rc)中应该只有一个字符串表。
从那里开始,您可以翻译您的资源并创建资源DLL(也称卫星DLL)。这个想法是为每种语言保留不同的.rc文件副本。每个翻译都被编译成一个不包含代码的DLL,充当资源的容器。
我的另一篇codeproject文章让您根据系统设置或用户首选项轻松加载资源DLL:代码会查找可用的最匹配用户设置的语言(基于用户的UI语言和区域设置)的资源DLL。该代码还让您轻松构建具有所有可用语言的菜单。这样,您的用户就可以覆盖默认选择。
免责声明: 我的广告接下来。随便跳过 :-)
关于资源的翻译、翻译管理和资源DLL的创建,您可以查看appTranslator
广告结束 :-)
关于Unicode,MFC提供了ANSI和Unicode版本的代码。你可以自行选择是否构建ANSI或Unicode应用程序:只需在项目设置的第一页中进行选择即可。当然,如果你从头开始,你应该选择Unicode。但是如果由于遗留原因迫使你保持ANSI/MBCS,则不必担心:这不会阻止你本地化应用程序。

6

多年前,当我需要在MFC中使用多种语言时,我们使用单独的资源DLL。您只需要进行一次调用以切换资源函数将使用的句柄,从那时起所有操作都是自动的。

您需要做的不仅仅是更改字符串。特别是对话框中会有包含字符串的内容,如果这些字符串在翻译后变得太长,则可能需要更改布局。


那么,MFC没有提供一种从对话框中分离字符串的方法吗? - OneWorld
@OneWorld,这不仅仅是MFC,用于创建对话框的Windows API依赖于带有嵌入字符串的对话框资源。 - Mark Ransom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接