字符串文字的本地化

时间:2009-11-08 05:29:31

标签: c++ localization string-literals

我需要本地化来自编译器的错误消息。就目前而言,所有错误消息都在整个源代码中以英文字符串文字的形式传播。我们想将这些错误消息翻译成德语。什么是最好的方法来解决这个问题?保持字符串文字不变,并将char *映射到错误报告例程中的另一种语言,或者用描述性宏替换英语文字,例如。 ERR_UNDEFINED_LABEL_NAME并在编译时将此映射到正确的字符串?

在类似的项目中如何处理这样的事情?

5 个答案:

答案 0 :(得分:5)

在Windows上,通常通过用整数常量替换字符串,然后使用LoadString或类似的方法从DLL或EXE中的资源获取它们来完成。然后你可以有多个语言DLL和一个EXE。

在Unixy系统上,我认为最典型的方法是gettext。最终结果是类似的,但不是定义整数常量,而是将您的英文字符串文字包装在一个宏中,它将应用一些魔法将其转换为本地化的字符串。

答案 1 :(得分:4)

最灵活的方式是编译器从消息目录中读取已翻译的消息,并根据语言环境选择语言。这需要更改编译器以使用某些工具 gettext

答案 2 :(得分:1)

快速思考......

您是否可以重载错误报告例程?假设您正在使用

printf("MESSAGE")

您可以以"MESSAGE"为输入的方式重载它,并将其散列为德语中相应的消息。

这可行吗?

答案 3 :(得分:1)

您可以在LoadString()API周围使用我的CMsg() and CFMsg()包装器。它们使您的生活更容易加载并格式化从资源中拉出的字符串。

当然,appTranslator是您翻译资源的最好朋友; - )

免责声明:我是appTranslator的作者。

答案 4 :(得分:0)

在Windows上,您可以使用资源编译器和WinAPI加载函数来获取本地化字符串和其他资源。 FindResource()及其专用衍生产品(如LoadString()将根据用户当前的区域设置自动加载特定于语言的资源。 FindResourceEx()甚至允许您手动指定要检索的资源的语言版本。

为了在程序中启用它,您必须首先更改程序以在资源文件(.rc)中编译字符串,并使用LoadString()在运行时获取字符串而不是使用文字字符串。在资源文件中,您可以使用STRINGTABLE修饰符设置您使用的LANGUAGE的多种语言版本。然后根据MSDN上描述的搜索顺序加载多语言资源:Multiple-Language Resources

注意:如果您没有理由需要单个可执行文件,或者正在执行类似于在应用程序中使用用户选择的语言的操作,则可以在单独的dll中编译每种语言并加载它们,从而提供更多控制并减少混淆动态而不是拥有大型单个资源文件并尝试动态切换区域设置。

以下是多语言StringTable资源文件的示例(即:strings.rc):

#define IDS_HELLOSTR     361

STRINGTABLE
  LANGUAGE LANG_ENGLISH, SUBLANG_ENGLISH_CAN
  BEGIN
     IDS_HELLO, "Hello!"
  END

STRINGTABLE
   LANG_FRENCH, SUBLANG_NEUTRAL
   BEGIN
      IDS_HELLO, "Bonjour!"
   END