我需要本地化来自编译器的错误消息。就目前而言,所有错误消息都以英文字符串文字的形式在整个源代码中传播。我们希望将这些错误信息翻译成德语。什么是最好的方法来解决这个问题?将字符串保留原样,并将char *映射到错误报告例程中的另一种语言,或者用描述性宏替换英文文本,例如。 ERR_UNDEFINED_LABEL_NAME
并在编译时将此映射映射到正确的字符串?字符串文字的本地化
在类似的项目中如何接近这样的事情?
我需要本地化来自编译器的错误消息。就目前而言,所有错误消息都以英文字符串文字的形式在整个源代码中传播。我们希望将这些错误信息翻译成德语。什么是最好的方法来解决这个问题?将字符串保留原样,并将char *映射到错误报告例程中的另一种语言,或者用描述性宏替换英文文本,例如。 ERR_UNDEFINED_LABEL_NAME
并在编译时将此映射映射到正确的字符串?字符串文字的本地化
在类似的项目中如何接近这样的事情?
在Windows上,通常这是通过用整型常量替换字符串,然后使用LoadString
或类似方法从DLL或EXE中的资源获取它们。然后你可以有多个语言DLL和一个EXE。
在Unixy系统上,我认为最典型的方法是gettext。最终结果是相似的,但不是定义整型常量,而是将您的英文字符串文字包装在宏中,并且它会应用一些魔法将其转换为本地化字符串。
最灵活的方法是让编译器从消息目录中读取已翻译的消息,并根据语言环境选择语言。这需要改变编译器使用一些工具,如 gettext。
只是一个快速的想法...
你可以重载你的错误报告例程?假设你正在使用
printf("MESSAGE")
你可以重载它的方式,"MESSAGE"
是输入,而你是散列到德国相应的消息。
请问这项工作?
这实际上是gettext的工作原理。英文字符串被用作获取本地化字符串的关键字。 – asveikau 2009-11-08 05:49:33
您可以使用我的CMsg() and CFMsg()包装在LoadString()API周围。它们让你的生活更容易加载和格式化从资源中抽出的字符串。
和当然,appTranslator是你最好的朋友翻译您的资源;-)
免责声明:我appTranslator的作者。
在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
+1,要建议的gettext。 – Artelius 2009-11-08 05:41:43