2

因此,我正在將我的C++應用程序翻譯成多種語言。我目前使用的是一樣的東西:是否可以在編譯時/運行時生成標記字符串的全局列表?

#define TR(x) (lookupTranslatedString(currentLocale(), x)) 
wcout << TR(L"This phrase is in English") << endl; 

的翻譯是從英文字符串翻譯字符串映射CSV文件。

"This phrase is in English","Nasa Tagalog itong pagsabi" 

這是簡化的,但這是基本的想法。

我的問題是關於生成需要翻譯的英語短語列表。我只需要所有英文短語的CSV和空白翻譯的短語。我希望可以在編譯時或運行時生成這個列表。在編譯時,我想這樣的事情:

#define TR(x) \ 
    #warning x \ 
    (lookupTranslatedString(currentLocale(), x)) 

然後可能解析編譯日誌,或者其他東西。這看起來不太好。

在運行時也會很棒。我正在考慮啓動應用程序並使用隱藏的命令來轉儲英文CSV。我已經看到類似的方法用於使用全局變量註冊帶有中央列表的命令。它可能看起來像這樣:

class TrString 
{ 
public: 
    static std::set<std::wstring> sEnglishPhrases; 
    TrString(std::wstring english_phrase) { sEnglishPhrases.insert(english_phrase); } 
}; 

#define TR(x) do {static TrString trstr(x);} while(false); (lookupTranslatedString(currentLocale(), x)); 

我知道上面的代碼有兩個問題。我懷疑它是否編譯,但更重要的是,爲了生成所有英文短語的列表,我需要在訪問sEnglishPhrases之前打中每條代碼路徑。

看起來我最終會寫一個小解析器來讀取我所有的代碼並查找TR字符串,這並不是那麼艱難。我只是希望學習更多關於C++的知識,如果有更好的方法來做到這一點。

回答

1

我覺得你快到了。以過去的想法:

class TrString 
{ 
public: 
    static std::set<std::string> sEnglishPhrases; 
    std::string phrase; 
    TrString(const std::string& english_phrase):phrase(english_phrase) 
    { sEnglishPhrases.insert(english_phrase); } 
    friend ostream &operator<<(ostream &stream, const TrString& o); 
}; 

ostream &operator<<(ostream &stream, const TrString& o) 
{ 
    stream << lookupTranslatedString(currentLocale(), o.phrase); 
    return stream; 
} 

#define TR(x) (TrString(x)) 
// ... 
std::cout << TR("This phrase is in English") << std::endl; 

正如你說的,你需要運行在每個TR()語句的代碼,但你可以配置一個單元測試框架來做到這一點。

我的替代方法是使用上述TrString類,使靜態變量爲每個模塊:

// unnamed namespace gives static instances 
namespace 
{ 
    TrString InEnglish("This phrase is in English"); 
    // ... 
} 

現在你只需要在替代main()鏈接打印出來TrString :: sEnglishPhrases

+0

看起來這是關於最好的解決方案,也就是說沒有真正乾淨的解決方案。我想這是有道理的,因爲從gettext到Qt的所有人都只是實現了一個小解析器。 – tfinniga 2009-09-02 23:00:41

2

你可以建立一個快速腳本來解析文件並去掉你需要的東西。

awk '/TR\(L"[^"]*")/ {print}' plop.c 

如果你需要稍微複雜一些,那麼perl是你的朋友。

+0

是的,這就是我最終會做的事情。我只是想知道是否有更好的方法。 – tfinniga 2009-09-02 18:38:19

相關問題