0

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

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

4

5 回答 5

5

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

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

于 2009-11-08T05:36:26.913 回答
4

最灵活的方法是编译器从消息目录中读取翻译后的消息,并根据语言环境选择语言。这将需要更改编译器以使用诸如 gettext之类的工具。

于 2009-11-08T05:38:13.337 回答
1

只是一个快速的想法......

你能超载你的错误报告程序吗?说你正在使用

printf("MESSAGE")

您可以"MESSAGE"以输入的方式对其进行重载,然后将其散列到相应的德语消息中。

这能行吗?

于 2009-11-08T05:38:19.530 回答
1

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

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

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

于 2009-11-11T12:36:08.963 回答
0

在 Windows 上,您可以使用资源编译器和 WinAPI 加载函数来获得本地化的字符串和其他资源。FindResource () 及其特殊派生类如LoadString () 将根据用户当前的语言环境自动加载特定于语言的资源。FindResourceEx () 甚至允许您手动指定您希望检索的资源的语言版本。

为了在您的程序中启用此功能,您必须首先更改程序以编译资源文件 (.rc) 中的字符串,并使用 LoadString() 在运行时获取字符串,而不是使用文字字符串。然后,在资源文件中,您可以使用LANGUAGE修饰符设置您使用的STRINGTABLE的多个语言版本。然后根据 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
于 2011-12-21T19:36:37.757 回答