【Qt】Qt Linguist介紹【轉】

簡介

Qt提供了一款優秀的支持Qt C++和Qt Quick應用程序的翻譯工具。發佈者、翻譯者和開發者可使用這款工具來完成他們的任務。html

發佈者:承擔了全面發佈應用程序的責任。一般,他們協調開發者和翻譯者的工做,可使用lupdate工具同步源代碼,進行翻譯,使用lrelease同步工具爲發佈應用程序建立運行時使用的翻譯文件。nginx

翻譯者:可使用Qt Linguist工具翻譯應用程序的文本。固然,這必需要有專業的翻譯知識。markdown

開發者:必須建立Qt應用程序可以使用的翻譯文本。也應該幫助翻譯者識別短語出現的場景。app

以上有三種角色-發佈者、翻譯者、開發者,固然不少狀況下,其實就是一種,那就是程序猿本身,你們都懂得。函數

發佈者

Qt Linguist爲發佈者提供了兩款工具-lupdate和lrelease。它們能夠處理qmake項目文件,或直接在文件系統上運行。工具

建立翻譯文件

要建立翻譯文件:性能

  1. 運行lupdate產生一組翻譯源(TS)文件,裏面含有全部用戶可見的文本,但未通過翻譯。測試

  2. 把生成的TS文件交給翻譯者(誰使用Qt Linguist添加翻譯)。Qt Linguist關注任何源文本的改變或刪除。ui

  3. 運行lupdate,能夠從應用程序中同步用戶可見的文本,它不會破壞任何數據。編碼

  4. 發佈應用程序,運行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文件同時翻譯時,譯文和譯文註釋字段顯示爲每種語言的。

要翻譯字符串:

  1. 選擇:文件->打開(Ctrl+O)來加載TS文件。

  2. 上下文視圖中選擇一個上下文,來加載翻譯的字符串到字符串視圖中。

  3. 選擇字符串視圖中的某個須要翻譯的字符串。

  4. 在翻譯區域輸入當前字符串對應的譯文。
    也能夠經過雙擊它從短語和猜想視圖中選擇現有的翻譯。短語是從短語書籍中讀取,猜想是在TS文件相似的短語中查找現有的翻譯。

  5. 這項是可選的,能夠輸入譯文註釋,方便其餘翻譯者理解。

  6. 若是接受這個翻譯,按Ctrl+Enter,選擇這裏寫圖片描述,或點擊字符串列表中所選源字符串的左側圖標。

  7. 選擇:文件->保存,來完成工做。

重複這個過程,直到字符串列表中的全部串標有這裏寫圖片描述(接受/正確的)或這裏寫圖片描述(接受/警告)標記。而後選擇下一個上下文並繼續。

選擇:查看->統計,能夠看原文和譯文單詞和字符數。

這裏寫圖片描述

選擇:文件->發佈,建立一個和當前翻譯文件名稱相同的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中提供內置全部語言支持。但編寫源代碼時仍然須要記住如下幾點考慮:

  1. 讓您的應用程序查找和加載適當的翻譯文件。

  2. 讓用戶可見的文字和Ctrl快捷鍵做爲目標進行翻譯。

  3. 提供文本翻譯的上下文。

  4. 消除歧義相同的文本。

  5. 使用編號參數(%n)做爲參數佔位符在運行時替換文本或數字。

  6. 國際化數字、日期、時間、貨幣。

  7. 標記數據文本字符串函數外翻譯。

你可使用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應用翻譯:

Hello tr()
Arrow Pad
Troll Print
Internationalization

 


原文做者:一去丶二三裏
做者博客:去做者博客空間
相關文章
相關標籤/搜索