因此,我正在將我的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++的知識,如果有更好的方法來做到這一點。
看起來這是關於最好的解決方案,也就是說沒有真正乾淨的解決方案。我想這是有道理的,因爲從gettext到Qt的所有人都只是實現了一個小解析器。 – tfinniga 2009-09-02 23:00:41