qt提供了一款優秀的支援qt c++和qt quick應用程式的翻譯工具。釋出者、翻譯者和開發者可以使用這款工具來完成他們的任務。
釋出者:承擔了全面釋出應用程式的責任。通常,他們協調開發者和翻譯者的工作,可以使用lupdate工具同步源代碼,進行翻譯,使用lrelease同步工具為釋出應用程式建立運作時使用的翻譯檔案。
翻譯者:可以使用qt linguist工具翻譯應用程式的文本。當然,這必須要有專業的翻譯知識。
開發者:必須建立qt應用程式能夠使用的翻譯文本。也應該幫助翻譯者識别短語出現的場景。
以上有三種角色-釋出者、翻譯者、開發者,當然很多情況下,其實就是一種,那就是程式猿自己,大家都懂得。
<a href="#%e7%ae%80%e4%bb%8b">簡介</a>
<a href="#%e5%8f%91%e5%b8%83%e8%80%85">釋出者</a>
<a href="#%e5%88%9b%e5%bb%ba%e7%bf%bb%e8%af%91%e6%96%87%e4%bb%b6">建立翻譯檔案</a>
<a href="#%e4%bd%bf%e7%94%a8lupdate">使用lupdate</a>
<a href="#%e4%bd%bf%e7%94%a8lrelease">使用lrelease</a>
<a href="#%e7%bf%bb%e8%af%91%e8%80%85">翻譯者</a>
<a href="#%e7%bf%bb%e8%af%91%e5%ad%97%e7%ac%a6%e4%b8%b2">翻譯字元串</a>
<a href="#%e6%9b%b4%e6%94%b9%e5%bf%ab%e6%8d%b7%e9%94%ae">更改快捷鍵</a>
<a href="#alt%e5%bf%ab%e6%8d%b7%e9%94%ae">alt快捷鍵</a>
<a href="#ctrl%e5%bf%ab%e6%8d%b7%e9%94%ae">ctrl快捷鍵</a>
<a href="#%e5%a4%84%e7%90%86%e5%b8%a6%e7%bc%96%e5%8f%b7%e7%9a%84%e5%8f%82%e6%95%b0">處理帶編号的參數</a>
<a href="#%e6%9b%b4%e6%94%b9%e7%9b%ae%e6%a0%87%e8%af%ad%e8%a8%80%e7%8e%af%e5%a2%83">更改目智語言環境</a>
<a href="#%e9%80%89%e6%8b%a9%e4%b8%8a%e4%b8%8b%e6%96%87%e8%bf%9b%e8%a1%8c%e7%bf%bb%e8%af%91">選擇上下文進行翻譯</a>
<a href="#%e9%80%89%e6%8b%a9%e5%ad%97%e7%ac%a6%e4%b8%b2%e8%bf%9b%e8%a1%8c%e7%bf%bb%e8%af%91">選擇字元串進行翻譯</a>
<a href="#%e5%bc%80%e5%8f%91%e8%80%85">開發者</a>
<a href="#%e6%8c%87%e5%ae%9a%e7%bf%bb%e8%af%91%e6%ba%90">指定翻譯源</a>
<a href="#%e4%bd%bf%e7%94%a8%e6%9d%a1%e4%bb%b6%e6%9d%a5%e9%9a%90%e8%97%8fqml%e6%9d%a5%e6%ba%90">使用條件來隐藏qml來源</a>
<a href="#%e5%9b%bd%e9%99%85%e5%8c%96%e5%ba%94%e7%94%a8">國際化應用</a>
<a href="#%e9%83%a8%e7%bd%b2%e7%bf%bb%e8%af%91">部署翻譯</a>
qt linguist為釋出者提供了兩款工具-lupdate和lrelease。它們可以處理qmake項目檔案,或直接在檔案系統上運作。
要建立翻譯檔案:
運作lupdate産生一組翻譯源(ts)檔案,裡面含有所有使用者可見的文本,但未經過翻譯。
把生成的ts檔案交給翻譯者(誰使用qt linguist添加翻譯)。qt linguist關注任何源文本的改變或删除。
運作lupdate,可以從應用程式中同步使用者可見的文本,它不會破壞任何資料。
釋出應用程式,運作lrelease,即可讀取ts檔案,并生成用于應用程式運作時的qm檔案。
用法:
creator菜單欄,選擇:工具->外部->qt語言家->更新翻譯(lupdate)
指令行:lupdate myproject.pro
creator菜單欄,選擇:工具->外部->qt語言家->釋出翻譯(lrelease )
指令行:lrelease myproject.pro
qt linguist是為qt應用程式添加翻譯的工具。
在qt語言主視窗包含一個菜單欄和以下視圖:
上下文(f6):将要被翻譯的字元串所在的上下文清單。
字元串(f7):用于檢視上下文中翻譯的字元串。
短語和表單(f9):用于檢視目前字元串所在的上下文,如果上下文源代碼可通路。
翻譯區:顯示源文、進行譯文及譯文注釋。
短語和猜測(f10):用于檢視為目前字元串可能的翻譯。
警告(f8):檢視未通過驗證測試的翻譯字元串。
翻譯區(1)是始終可見。要顯示/隐藏其它視圖,選擇:檢視->視圖,也可以使用上面列出的快捷鍵。由于各個視窗為懸浮界面,是以可以通過标題欄任意拖動。
在qt linguist中打開翻譯源(ts)檔案進行翻譯。ts檔案是可讀的xml檔案-包含源短語及其翻譯,ts檔案通常由lupdate建立與更新。
qt linguist在翻譯領域顯示目智語言,相應的輸入字段适應複數形式。當打開多個ts檔案同時翻譯時,譯文和譯文注釋字段顯示為每種語言的。
要翻譯字元串:
選擇:檔案->打開(ctrl+o)來加載ts檔案。
在上下文視圖中選擇一個上下文,來加載翻譯的字元串到字元串視圖中。
選擇字元串視圖中的某個需要翻譯的字元串。
在翻譯區域輸入目前字元串對應的譯文。
也可以通過輕按兩下它從短語和猜測視圖中選擇現有的翻譯。短語是從短語書籍中讀取,猜測是在ts檔案類似的短語中查找現有的翻譯。
這項是可選的,可以輸入譯文注釋,友善其他翻譯者了解。
如果接受這個翻譯,按ctrl+enter,選擇
,或點選字元串清單中所選源字元串的左側圖示。
選擇:檔案->儲存,來完成工作。
重複這個過程,直到字元串清單中的所有串标有
(接受/正确的)或
(接受/警告)标記。然後選擇下一個上下文并繼續。
選擇:檢視->統計,可以看原文和譯文單詞和字元數。
選擇:檔案->釋出,建立一個和目前翻譯檔案名稱相同的qm(qt message)檔案。釋出管理器的指令行工具lrelease有相同的功能,可完成應用程式的所有翻譯源檔案。
快捷鍵是一個鍵盤組合鍵,按下時應用程式會執行相應操作。有兩種類型的快捷鍵:alt、ctrl。
alt快捷鍵被用于菜單以及按鈕。如果菜單或按鈕的字元帶有下劃線時,表示按下alt鍵和帶下劃線的字元将和點選菜單項或按下按鈕執行相同的操作。
例如,大多數的應用具有一個帶有下劃線”f”字元的檔案菜單”檔案(f)”。這時,可以通過點選菜單欄上的按鈕或按alt+f調用即可。為了使快捷鍵可用,譯文中必須包含指定的符号。例如:“file”應該翻譯為”檔案(&f)”,“edit(&e)”應該翻譯為”編輯(&e)”,
ctrl鍵可以在任何視覺控制中獨立存在。它們通常用于調用菜單中的菜單項,否則将需要多次操作鍵盤或滑鼠。也可用于執行沒有出現在任何菜單或按鈕上的動作。
例如,大多數應用在檔案菜單中有一個建立動作。建立動作可能會在檔案菜單中顯示為”建立ctrl+n”,這意味着建立動作隻需按下ctrl+n,即可與選擇:檔案->建立執行相同的操作.
理想情況下,翻譯ctrl快捷鍵可以選擇:譯文->從源文中複制(ctrl+b)。然而,在某些情況下,字元将在目智語言沒有意義,也必須改變。無論選擇任何一個字元(字母或數字),翻譯都必須為”ctrl+”後跟大寫字元格式。qt會在運作時自動顯示正确名稱。與alt快捷鍵一樣,如果譯者改變了ctrl快捷鍵,那麼新的ctrl快捷鍵不能與任何其他的ctrl快捷鍵沖突。
警告:不要翻譯了”alt”、”ctrl”、”shift”快捷鍵部分。 qt依賴于這些字元串。對于支援的語言,qt會自動翻譯這些字元串。
有些短語包含帶編号的參數。帶編号的參數是一個占位符,将在運作時被替換為指定文本。帶編号參數以%後跟數字形式出現在源字元串中。
例如:我們需要翻譯的文本正如上所述,為可變字元串。
那麼我們可以這樣處理:
label->settext(tr(“user name:”)+username)。
這樣提取出來的文本為”user name:”,我們隻需要将其翻譯為”使用者名:”即可,後面的username将會在每次執行時動态顯示。
如果目智語言和國家沒有明确設定,qt linguist 将會從翻譯的原檔案命中解析。例如,app_de.ts設定目智語言為德文,app_de_ch.ts設定目智語言為德文和瑞士。這有助于自動加載翻譯目前的語言環境。
如果你的檔案不遵守這個習慣,你也可以通過選擇:編輯->翻譯檔案設定來指定資訊。
上下文視窗中列出了可被翻譯的字元串所在的上下文,按照上下文名稱順序列出。每個上下文都是qobject的一個子類的名稱,還可以有一個上下文qobject本身,它包含字元串傳遞到靜态函數qobject::tr(),還可以有一個<匿名上下文>,它包含不屬于在qobject一個子類的字元串。
下面的圖示表示每個上下文的目前翻譯狀态:
狀态
圖示
描述
接受/正确
上下文中所有字元串都已被翻譯,并通過驗證測試。
接受/警告
上下文中所有字元串都被翻譯或被标記為翻譯,但至少有一個翻譯驗證測試不通過。在字元串視圖中,可以看到字元串失敗的測試。
不接受
至少有一個字元串沒有被翻譯或不被标記為翻譯。
廢棄的
沒有課翻譯的字元串出現在賞析文中,這意味着上下文本身不再屬于應用程式。
字元串視圖中列出了所有在目前上下文可翻譯的字元串。選擇字元串使它出現在翻譯區。
單擊某個字元串前的圖示改變它的翻譯狀态。一個勾,綠色或黃色,表示該字元串已被翻譯并且被接受。問号意味着要麼該字元串沒有被翻譯,要麼翻譯還沒有被接受。
下面的圖示表示每個字元串的目前翻譯狀态:
源字元串存在翻譯(可能為空)。使用者已經接受了翻譯,并通過所有驗證測試。如果譯文為空,可以點選圖示進行撤銷,這時上下文視圖的”項”列接受翻譯的數量減1,如果lupdate改變一個字元串的内容,其接受狀态自動複位變為不被接受狀态。
使用者已經接受了翻譯,但翻譯沒有通過所有的驗證測試。驗證測試失敗顯示在警告視圖。單擊該圖示可撤銷認可的翻譯。狀态被重置到校驗失敗,這時上下文視圖的”項”列接受翻譯的數量減1。
字元串已經通過了所有的驗證測試,但那是使用者沒有接受翻譯。點選圖示或按下ctrl+enter來接受翻譯,狀态被重置為接受/正确,這時上下文視圖的”項”列接受翻譯的數量加1。
未翻譯
該字元串沒有翻譯。點選圖示以接受空翻譯。狀态被重置為接受/正确,這時上下文視圖的”項”列接受翻譯的數量加1。
驗證失敗
該字元串有一個翻譯,但翻譯沒有通過所有的驗證測試。驗證測試失敗會顯示在警告視圖。點選圖示或按下ctrl+enter接受翻譯盡管驗證失敗。狀态被重置為接受/警告。建議編輯翻譯來修複驗證失敗問題。當所有的失敗已得到修複,狀态将自動重置為不接受。
該字元串已過時,它不再在上下文中使用。
在qt應用程式中支援多國語言非常簡單,為開發者的工作增加了很小的開銷。當然,這會降低運作時性能。
為了讓釋出者使用lupdate和lrelease,即可指定一個.pro的qt工程檔案。必須為translations部分指定每種語言的翻譯源。
一個典型的寫法是這樣的:
lupdate工具從應用程式中提取的使用者界面字元串。它讀取應用程式的.pro檔案,以确定哪些源檔案包含的文本需要被翻譯。這意味着源檔案都必須被列在.pro中。如果檔案沒有列出,其中的文本則不會被發現。
一個有四個翻譯源檔案的完整.pro例子:
如果你的編譯器和運作系統使用不同的編碼,并要使用非ascii字元的字元串,則需要設定codecforsrc。 例如:
sources變量是用于c++的源檔案。如果列出qml或javascript源檔案存在,編譯器試圖像c++一樣建構他們。作為一種變通方法,您可以使用lupdate_only{…}條件語句,是以lupdate工具看到.qml檔案,但c++編譯器會忽略它們。
例如,下面的.pro檔案指定了應用程式中的2個qml檔案:
也可以指定.qml源檔案的通配符比對。搜尋不是遞歸的,是以你需要指定每個目錄裡的位置:
設計應用程式,使其可以适應各種語言和地區沒有工程變更。qt試圖使你的國際化盡可能的簡單。所有輸入控件和文本繪制方法qt中提供内置所有語言支援。但編寫源代碼時仍然需要記住以下幾點考慮:
讓您的應用程式查找和加載适當的翻譯檔案。
讓使用者可見的文字和ctrl快捷鍵作為目标進行翻譯。
提供文本翻譯的上下文。
消除歧義相同的文本。
使用編号參數(%n)作為參數占位符在運作時替換文本或數字。
國際化數字、日期、時間、貨币。
标記資料文本字元串函數外翻譯。
你可以使用c++和qml源在同一應用程式中,甚至有兩個來源的使用者接口字元串。該工具建立一個組合的翻譯檔案,字元串可以從c++和qml通路。
應用程式所需的.qm檔案應放置在使用qtranslator加載代碼可以找到他們的位置中。通常,通過指定相對qcoreapplication::applicationdirpath()的路徑來完成。
通常,有用于應用程式.qm檔案,并且,如果一個版本的qt使用未安裝在系統上,qt的.qm檔案需要被部署為好。
在qt4中,有一個很大的、整體的.qm每個區域設定檔案。例如,檔案qt_de.qm包含了所有的德語翻譯庫。
在qt5中,.qm檔案由子產品拆分,有一個所謂的元目錄檔案,其中包含的所有子產品的.qm檔案。元目錄檔案的名稱和qt4整體.qm檔案的名稱是相同的,以便現有的裝載程式的工作原理和之前提供的所有包括.qm檔案一樣被發現。
然而,沒有必要總部署所有qt5的.qm檔案。建議連接配接比對源目錄名子產品的.qm檔案在部署階段使用工具lconvert 。例如,建立一個德語翻譯檔案使用子產品qt core、qt gui、和qt quick,運作:
更多參考:
下面的教程介紹如何準備qt應用翻譯:
<a href="http://doc.qt.io/qt-5/qtlinguist-hellotr-example.html">hello tr()</a>
<a href="http://doc.qt.io/qt-5/qtlinguist-arrowpad-example.html">arrow pad</a>
<a href="http://doc.qt.io/qt-5/qtlinguist-trollprint-example.html">troll print</a>
<a href="http://doc.qt.io/qt-5/qtqml-qml-i18n-example.html">internationalization</a>