我需要本地化來自編譯器的錯誤消息。就目前而言,所有錯誤消息都以英文字符串文字的形式在整個源代碼中傳播。我們希望將這些錯誤信息翻譯成德語。什麼是最好的方法來解決這個問題?將字符串保留原樣,並將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