2009-11-08 92 views
0

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

在类似的项目中如何接近这样的事情?

回答

5

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

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

4

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

+0

+1,要建议的gettext。 – Artelius 2009-11-08 05:41:43

1

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

你可以重载你的错误报告例程?假设你正在使用

printf("MESSAGE") 

你可以重载它的方式,"MESSAGE"是输入,而你是散列到德国相应的消息。

请问这项工作?

+0

这实际上是gettext的工作原理。英文字符串被用作获取本地化字符串的关键字。 – asveikau 2009-11-08 05:49:33

1

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

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

免责声明:我appTranslator的作者。

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