【问题标题】:VC++ 10 MFC: What is the correct way to do localizationVC++ 10 MFC:进行本地化的正确方法是什么
【发布时间】:2012-02-02 23:20:57
【问题描述】:

我是一名 .NET 人员,必须在 MFC 应用程序上做一些工作。该应用程序是一个 VS2008 MFC 可执行文件,我已将其转换为 VS2010。最初的开发人员通过在应用程序命令行中指定包含键值对的 .txt 文件的名称来进行本地化。已安装的可执行文件快捷方式会根据应用程序安装在哪个国家/地区指定不同的 .txt 文件。如果您只是直接运行 .exe,这当然不起作用。这对我来说似乎是一种奇怪的做事方式。

我想以适当的 MFC 方式执行此操作,但我很难在 Google 上找到明确的答案。我的理解是 .rc 文件中的字符串表应该用于此本地化?这是当前 MFC 的最佳实践吗?

关于字符串表,我读到过的做法是为不同的语言创建多个字符串表。 MFC 应用程序如何选择使用哪种语言?它是基于机器当前的语言设置还是我可以控制它(可能是我们希望我们也在构建的 Wix .msi 安装程序指定语言)?

我还了解到,将所有资源嵌入 MFC 应用程序已经失宠,现在您应该编译单独的资源 .dll 吗?这是真的吗?我调查一下怎么做...

最后,我必须做一些特别的事情来让 MFC 支持 Unicode 还是 MFC 默认为 Unicode?​​p>

谢谢

【问题讨论】:

  • MFC 和 Unicode 是独立的,你可以使用一个而没有另一个。如果您使用向导来构建您的项目,Unicode 将是选项之一(它应该是默认设置)。否则,您可以在项目设置中找到它。

标签: mfc localization visual-c++-2010 resource-file string-table


【解决方案1】:

这个想法是所有可本地化的项目都应该存储在资源中。标准 UI 对象(例如菜单和对话框)会自动存储在其中(资源),但应将字符串文字(例如:错误消息、消息框提示等)等项目从源代码中提取到字符串表中。我的这个简短的codeproject article 演示了如何轻松地从代码中的字符串表中提取字符串。

注意:您的资源脚本 (.rc) 中应该只有一个字符串表。

从那里开始,您可以翻译您的资源并创建资源 DLL(也称为卫星 DLL)。这个想法是您为每种语言保留不同的 .rc 文件副本。每个翻译都被编译成一个 无代码 DLL,作为资源的容器。

This other codeproject article of mine 让您可以根据系统设置或用户偏好轻松加载资源 DLL:代码在资源 DLL 中查找最匹配用户设置的可用语言(基于用户的 UI 语言和区域设置)。该代码还可以让您轻松构建包含所有可用语言的菜单。这样,您的用户就可以覆盖默认选择。

免责声明:我的广告如下。随意跳过:-)

关于资源的翻译、翻译的管理和资源 DLL 的创建,您可以查看appTranslator

广告结束 :-)

关于 Unicode,MFC 附带 ANSI 和 Unicode 版本的代码。您可以选择是否要构建 ANSI 或 Unicode 应用程序:只需在项目设置的第一页中选择即可。当然,如果你是从零开始,你绝对应该使用 Unicode。但如果遗留原因迫使您保留 ANSI/MBCS,请不要太担心:它不会阻止您对应用进行本地化。

【讨论】:

    【解决方案2】:

    几年前,当我不得不在 MFC 中使用多种语言时,我们使用了单独的资源 DLL。您需要做的只是一次调用来切换资源函数将使用哪个句柄,并且从那时起一切都是自动的。

    您需要做的不仅仅是更改字符串。尤其是对话框内部会有字符串,如果这些字符串在翻译后变得太长,您可能需要更改布局。

    【讨论】:

    • 那么,MFC 没有提供从对话框中分离字符串的方法吗?
    • @OneWorld 它不仅仅是 MFC,用于创建对话框的 Windows API 依赖于带有嵌入字符串的对话框资源。
    猜你喜欢
    • 2011-02-22
    • 2014-05-22
    • 1970-01-01
    • 2017-11-02
    • 1970-01-01
    • 1970-01-01
    • 2011-12-19
    • 2015-11-07
    • 1970-01-01
    相关资源
    最近更新 更多