c++ - 设计字符串本地化的最佳方法

标签 c++ windows mfc localization

这是一个笼统的问题,欢迎发表意见。我一直在尝试想出一种好方法来设计用于 Windows MFC 应用程序和相关实用程序的字符串资源本地化。我的愿望 list 是:

  • 必须在代码中保留字符串字面量(而不是用宏 #define 资源 ID 替换),以便消息仍然可以内联读取
  • 必须允许本地化字符串资源 (duh)
  • 不得施加额外的运行时环境限制(例如:对 .NET 的依赖等)
  • 应尽量减少对现有代码的干扰(修改越少越好)
  • 应该是可调试的
  • 应生成可用常用工具编辑的资源文件(即:常用格式)
  • 不应使用复制/粘贴注释 block 来保留代码中的文字字符串或任何其他可能导致去同步的内容
  • 允许静态(编译时)检查每个“注释”字符串是否在资源文件中会很好
  • 允许跨语言资源字符串池会很好(适用于各种语言的组件,例如: native C++ 和 .NET)

除了静态检查之外,我有一种方法可以在某种程度上满足我的所有愿望,但我不得不开发一些自定义代码来实现它(并且它有局限性)。我想知道是否有人以特别好的方式解决了这个问题。

编辑: 我目前的解决方案是这样的:

ShowMessage( RESTRING( _T("Some string") ) );
ShowMessage( RESTRING( _T("Some string with variable %1"), sNonTranslatedStringVariable ) );

然后我有一个自定义实用程序来解析“RESTRING” block 中的字符串并将它们放入一个 .resx 文件中以进行本地化,并使用一个单独的 C# COM 对象从本地化资源文件中加载它们并返回。如果 C# 对象不可用(或无法加载),我会回退到代码中的字符串。该宏扩展为一个模板类,该类调用 COM 对象并进行格式化等。

无论如何,我认为添加我现在的引用资料会很有用。

最佳答案

我们使用英文字符串作为ID。

如果从国际资源对象(从安装的 I18N dll 加载)查找失败,那么我们默认使用 ID 字符串。

代码如下:

doAction(I18N.get("Press OK to continue"));

作为构建过程的一部分,我们有一个 perl 脚本来解析所有源代码中的字符串常量。它构建应用程序中所有字符串的临时文件,然后将它们与每个本地的资源字符串进行比较,以查看它们是否存在。任何缺失的字符串都会向相应的翻译团队发送电子邮件。

我们可以为每个本地设置多个 dll。 dll 的名称基于 RFC 3066
语言[_territory][.codeset][@modifier]

我们尝试从机器中提取语言环境,并在加载 I18N dll 时尽可能具体,但如果不存在更具体的版本,则回退到不太具体的本地变体。

例子:

在英国:如果本地是 en_GB.UTF-8
(我在特定的 Windows 意义上松散地使用术语 dll)。

首先查找 I18N.en_GB.UTF-8 dll。如果此 dll 不存在,则回退到 I18N.en_GB。如果此 dll 不存在则回退到 I18N.en 如果此 dll 不存在则回退到 I18N.default

此规则的唯一异常(exception)是: 简体中文 (zh_CN),其中备用是美国英语 (en_US)。如果机器不支持简体中文,则不太可能支持全中文。

关于c++ - 设计字符串本地化的最佳方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/185291/

相关文章:

C++ windows位图绘制文字

c++ - 包含 vector 和协方差矩阵的负积

c++ - 为什么 xlc++ 编译器会提示强制转换右值?

c++ - 如何通过 C++ 程序通过注册表编辑更改 IE 9 的默认搜索提供程序?

c++ - 在C++中获取目录

c++ - 为什么需要类型转换 (UINT)(void*)(DWORD)?

c++ - 为什么这段代码不返回 0?

c++ - MFC CScrollView 滚动不工作

c++ - Window Programming (C++) : How to check if child window ID is occupied? 以及如何为子窗口生成唯一ID?

mfc - 在 MFC 中动态创建控件(集合问题)