2011-12-12 107 views
0

有沒有一種方法可以將QT應用程序翻譯成不同的語言,而無需直接在源代碼中定義文本?我想分離源文本。這將導致所有語言的某種資源文件,包括默認語言(例如英文)。在代碼中翻譯沒有文字的QT應用程序

回答

0

我們要做的是: *包括轉換爲前默認語言。使用此* .ts文件自動生成其他* .ts文件。這是必需的,因爲我們將翻譯保留在QT環境之外,因爲它們與其他與QT無關的項目相匹配。

然後只需確保此翻譯包含正確的值。

將來我們可以在代碼中定義ID,代表默認翻譯中的文本。就像將TXT_ID_ABOUT翻譯爲「About」一樣。

0

您可能可以使用QT_TRANSLATE_NOOP宏系列來執行您想要的操作。那些簡單地將一些文本標記爲「需要翻譯」,以便lupdate選取它,但可以通過代碼中的變量常量引用這些翻譯後的值。所以......

const char *kHelloWorld = QT_TRANSLATE_NOOP("SomeScope", "Hello world"); 

後...

return qApp->translate("SomeScope", kHelloWorld); 

這仍然是在源代碼中的某處,但它至少是一個步驟中去除。理論上你可以將QT_TRANSLATE_NOOP的東西放在一個完全不同的Qt項目中,但是在你的真實項目中你需要一些的方法來知道你應該翻譯什麼。 (你仍然需要char *常量某處。)

你想通過沒有源代碼中的英文文本來完成什麼?這可能有助於人們提供更合適的答案。

編輯

基於低於預期的使用

確定您的評論,那麼這恰恰是正常的Qt的翻譯過程中做了什麼。運行lupdate將創建這些XML文件(它們具有.ts擴展名)。他們可以通過非常易於使用的Qt語言專家的翻譯員打開。他們被翻譯,然後發回給你(程序員),在那裏你運行lrelease來創建你將隨該應用程序一起提供的二進制翻譯文件。翻譯在運行時上解析爲,所以不需要重新編譯。

如果你想使用戶能夠做到這一點,你會:

  • 船舶您有一個空的(翻譯).ts文件和lrelease程序應用。
  • 提供如何使用Qt Linguist翻譯的說明。 (他們可以使用文本編輯器,並直接修改XML,但它更容易與語言學家很多。)
  • 解釋如何運行lrelease並在砸二進制翻譯文件,使您的應用程序拉他們。

在這最後一步,理論上你可以提供一個很好的類似嚮導的應用程序來隱藏實現細節。

+0

我的目標是沒有源代碼訪問的人可以調整文本(所有語言),而不需要某些進程來運行或重新計算某些內容。想象一下5種語言(包括「源語言」)會產生5個相同的格式化的,人類可讀的文件(例如xml)。我從QT得到的是數百個帶有文本的源文件,以及其他4種語言的一些經過處理的xml文件。 – Uwe

+0

沒有任何東西阻止您將默認語言作爲另一種翻譯語言 - 如果找到匹配項,Qt將用翻譯後的值覆蓋源代碼值。 –

+0

事實上,如果你想使用複數形式之類的東西,你*有*包括默認語言(比如說英語)的翻譯文件。我們正在爲我們的項目做這件事。 –

0

由於lupdate會在每次運行時將其放在那裏,因此您將無法將英文(或源語言,不一定是英文)從XML(.ts)文件中移出。但只要所選語言的翻譯存在,源文本將被忽略。如果沒有翻譯文本,它將默認爲源文本。這很有用,因爲您可以保證在翻譯中獲得某種文本,但是測試團隊可以確保翻譯存在。我編寫了一個python腳本來自動檢查翻譯文件,因爲我們有9種語言,每個翻譯有近1k個字符串。爲了測試這個,我們使用了一個非常簡單的sed腳本來創建pseudo-loc源字符串,所以如果翻譯缺失,僞loc文本將非常明顯。

關於編輯.ts文件的過程,我們將翻譯翻譯給了各個翻譯人員,爲他們提供了他們的語言的.ts文件,並且通常使用QT Linguist的時間約爲一小時。如果翻譯員在現場並希望立即在我們的設備上看到他們的翻譯,我寫了一個自動運行腳本,將生成的.qm文件放在我們嵌入式文件系統的正確位置,並重新啓動應用程序以顯示新的翻譯。如果他們不在現場,我們會通過上面提到的python腳本運行它們來檢查許多不同的問題,然後只需檢查.ts文件,以便下次啓動。

HTH