2012-01-19 54 views
3

Qt lupdate和QTranslator組源字符串轉換爲獨佔上下文。這意味着在一個上下文中定義的翻譯將不能在不同的上下文中訪問。將自定義QTranslator上下文自動化

C++中的默認上下文是覆蓋了QObject::tr()的類的名稱。聲明式QML中的默認上下文是沒有擴展名的當前文件名。要覆蓋翻譯上下文,可以在C++或QML中使用qApp->translate("context", "source")qsTranslate("context", "source")

我希望能夠在一個大型項目中使用單個通用翻譯上下文,並且我發現用每一個翻譯函數指定翻譯上下文非常繁瑣。是否有任何現有的或未來的Qt翻譯框架擴展可以簡化這項任務?我正在尋找一些簡單的事情,如tr("source")qsTr("source"),但使用系統範圍或項目範圍的默認上下文。有任何想法嗎?

回答

0

有比這更容易的東西。使用qtTrId/qsTrId(Qt/QML)而不是tr/qsTr,並將-idbased參數添加到您的lrelease調用中。基於ID的翻譯完全沒有語境。

+0

這似乎工作得很好,謝謝! 「ID」可以是一個帶有空格和標點符號的複雜字符串,但它不會在語言學家中出現。相反,需要在'qtTrId()'/'qsTrId()'調用之前添加特殊的'//%'源文本''註釋。 ...或者編寫腳本以自動將ID字符串複製到源標記中。 :)希望我不需要在路上進行背景分離。 – Igor

2

您可以使用Q_DECLARE_TR_FUNCTIONS()宏應用於類定義,只作爲一個背景:

class CONTEXT_CLASS { 
    Q_DECLARE_TR_FUNCTIONS(CONTEXT_CLASS) 
}; 

其中CONTEXT_CLASS可短,只要你願意,我們說X(希望這與您的代碼中的其他任何內容不衝突)。這將使您的TR()語句

X::tr("source"); 

不要嘗試#定義的東西,以縮短X :: TR,因爲這將無法獲得通過翻譯工具拾起。

+0

很感謝!這對於C++組件來說是完美的。有沒有辦法將其擴展到QML? – Igor