簡介
Qt提供了一款優秀的支持Qt C++和Qt Quick應用程序的翻譯工具。發布者、翻譯者和開發者可以使用這款工具來完成他們的任務。
發布者:承擔了全面發布應用程序的責任。通常,他們協調開發者和翻譯者的工作,可以使用lupdate工具同步源代碼,進行翻譯,使用lrelease同步工具為發布應用程序創建運行時使用的翻譯文件。
翻譯者:可以使用Qt Linguist工具翻譯應用程序的文本。當然,這必須要有專業的翻譯知識。
開發者:必須創建Qt應用程序能夠使用的翻譯文本。也應該幫助翻譯者識別短語出現的場景。
以上有三種角色-發布者、翻譯者、開發者,當然很多情況下,其實就是一種,那就是程序猿自己,大家都懂得。
發布者
Qt Linguist為發布者提供了兩款工具-lupdate和lrelease。它們可以處理qmake項目文件,或直接在文件系統上運行。
創建翻譯文件
要創建翻譯文件:
-
運行lupdate產生一組翻譯源(TS)文件,里面含有所有用戶可見的文本,但未經過翻譯。
-
把生成的TS文件交給翻譯者(誰使用Qt Linguist添加翻譯)。Qt Linguist關注任何源文本的改變或刪除。
-
運行lupdate,可以從應用程序中同步用戶可見的文本,它不會破壞任何數據。
-
發布應用程序,運行lrelease,即可讀取TS文件,並生成用於應用程序運行時的QM文件。
使用lupdate
用法:
Creator菜單欄,選擇:工具->外部->Qt語言家->更新翻譯(lupdate)
命令行:lupdate myproject.pro
使用lrelease
用法:
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快捷鍵被用於菜單以及按鈕。如果菜單或按鈕的字符帶有下划線時,表示按下ALT鍵和帶下划線的字符將和點擊菜單項或按下按鈕執行相同的操作。
例如,大多數的應用具有一個帶有下划線”F”字符的文件菜單”文件(F)”。這時,可以通過點擊菜單欄上的按鈕或按Alt+F調用即可。為了使快捷鍵可用,譯文中必須包含指定的符號。例如:“File”應該翻譯為”文件(&F)”,“Edit(&E)”應該翻譯為”編輯(&E)”,
Ctrl快捷鍵
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部分指定每種語言的翻譯源。
一個典型的寫法是這樣的:
TRANSLATIONS = arrowpad_fr.ts \
arrowpad_nl.ts
翻譯文件名中使用的語言環境用於確定在運行時加載哪種語言。欲了解更多信息,請參閱QLocale。
lupdate工具從應用程序中提取的用戶界面字符串。它讀取應用程序的.pro文件,以確定哪些源文件包含的文本需要被翻譯。這意味着源文件都必須被列在.pro中。如果文件沒有列出,其中的文本則不會被發現。
一個有四個翻譯源文件的完整.pro例子:
HEADERS = main-dlg.h \
options-dlg.h
SOURCES = main-dlg.cpp \
options-dlg.cpp \
main.cpp
FORMS = search-dlg.ui
TRANSLATIONS = superapp_dk.ts \
superapp_fi.ts \
superapp_no.ts \
superapp_se.ts
如果你的編譯器和運行系統使用不同的編碼,並要使用非ASCII字符的字符串,則需要設置CODECFORSRC。 例如:
CODECFORSRC = UTF-8
使用條件來隱藏QML來源
SOURCES變量是用於C++的源文件。如果列出QML或JavaScript源文件存在,編譯器試圖像C++一樣構建他們。作為一種變通方法,您可以使用lupdate_only{…}條件語句,所以lupdate工具看到.qml文件,但C++編譯器會忽略它們。
例如,下面的.pro文件指定了應用程序中的2個qml文件:
lupdate_only {
SOURCES = main.qml \
MainPage.qml
}
也可以指定.qml源文件的通配符匹配。搜索不是遞歸的,所以你需要指定每個目錄里的位置:
lupdate_only {
SOURCES = *.qml \
*.js \
content/*.qml \
content/*.js
}
國際化應用
設計應用程序,使其可以適應各種語言和地區沒有工程變更。Qt試圖使你的國際化盡可能的簡單。所有輸入控件和文本繪制方法Qt中提供內置所有語言支持。但編寫源代碼時仍然需要記住以下幾點考慮:
-
讓您的應用程序查找和加載適當的翻譯文件。
-
讓用戶可見的文字和Ctrl快捷鍵作為目標進行翻譯。
-
提供文本翻譯的上下文。
-
消除歧義相同的文本。
-
使用編號參數(%n)作為參數占位符在運行時替換文本或數字。
-
國際化數字、日期、時間、貨幣。
-
標記數據文本字符串函數外翻譯。
你可以使用C++和QML源在同一應用程序中,甚至有兩個來源的用戶接口字符串。該工具創建一個組合的翻譯文件,字符串可以從C++和QML訪問。
支持國際化的Qt應用程序的類可以參考:Qt國際化。
源代碼翻譯的過程可以參考:編寫源代碼翻譯、Qt Quick國際化和本地化。
部署翻譯
應用程序所需的.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,運行:
lconvert -o installation_folder/qt_de.qm qtbase_de.qm qtdeclarative_de.qm
更多參考:
下面的教程介紹如何准備Qt應用翻譯:
原文作者:一去丶二三里
作者博客:去作者博客空間