【Qt】Qt Linguist介紹【轉】


簡介

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

發布者:承擔了全面發布應用程序的責任。通常,他們協調開發者和翻譯者的工作,可以使用lupdate工具同步源代碼,進行翻譯,使用lrelease同步工具為發布應用程序創建運行時使用的翻譯文件。

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

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

以上有三種角色-發布者、翻譯者、開發者,當然很多情況下,其實就是一種,那就是程序猿自己,大家都懂得。

發布者

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

創建翻譯文件

要創建翻譯文件:

  1. 運行lupdate產生一組翻譯源(TS)文件,里面含有所有用戶可見的文本,但未經過翻譯。

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

  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

 


原文作者:一去丶二三里
作者博客:去作者博客空間


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM