2009-11-08 137 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