Internationalization and Localization with Qt Quick
程序國際化
1) Use qsTr() for all ?Literial UI strings
qsTr(), qsTranslate(), qsTrId(), QT_TR_NOOP(), QT_TRANSLATE_NOOP(), and QT_TRID_NOOP() functions
最普遍的方式是: ?
text: qsTr("Back");
>這段code會在translation文件中為string創建一個key entry; 運行時刻根據系統的locale, translation系統會尋找關鍵字"Back"然后拿到相應的翻譯值; 拿到的值設給text的property, 這樣UI可以顯示出對"Black"相應的翻譯;
2) Add Context for the Translate
UI string通常很短, 我們需要幫助翻譯人員理解文字的內容; 可以在源代碼中添加context information作為額外的描述文字, 放在將被翻譯的string前面. 這些文字會被引入到.ts文件中, 展示給翻譯人員;
Note:? .ts文件是XML格式, 內容是源文字和翻譯文字的占位符. 被updated的.ts文件會被轉換成二進制的翻譯文件并且作為程序的部分被引入到工程中;
//: 給翻譯器的主要注釋; ?//~ 可選的額外信息; 第一個word會被用作XML element中的元素id;
//~ Context Not related --> <extra-Context>Not related
3) Disambiguate Identical Texts
translation系統會將UI中重復的text string統一成唯一的item; 統一化節省了翻譯人員的重復工作量; 但是在某些情況下text一樣但是解釋不同; e.g. 英語里的"back"可以表示往后, 也可以表示物體的背面. 我們需要告訴translation系統這兩個是不同的意思, 翻譯器就可以創建2個分開的translations;在qsTr()中添加id text作為第二個參數用來區分相同的text;
text: qsTr("Back", "not front");
4) Use %
x
to Insert Parameters into a String
使用%在strings里插入參數, 比起直接將文字句子直接放入string更清晰;
text: qsTr("File %1 of %2").arg(counter).arg(total) // "File 2 of 3"
5) Use %Lx so Numbers are localized
當指定一個參數時, 如果使用了%L modifier, 數字會根據當前的區域設置本地化; e.g. %L1表示根據當前選擇的locale的數字格式轉化方式來格式化第一個參數;
text: qsTr("%L1").arg(total)) // total: 4321.56(english regional) --> German: 4.321,56;
6) Internationalize Dates Times and Currencies
沒有特定的in-string modifiers來格式化dates, times; 我們需要查詢當前locale然后使用Date的方法來format;Qt.locale() 返回Locale 對象, 包含所有的locale信息; Locale.name property包含了當前的語言和國家信息;
text: qsTr("Date %1").arg(Date().toLocaleString(Qt.locale()))//轉換成當前locale的日期格式貨幣數字使用Number類型;
7) Use QT_TR_NOOP() for Translatable Data Text Strings
如果用戶改變了系統的語言, 但沒有重啟; 在arrays和list model和其他數據結構里的strings可能無法自動刷新; 為了強制刷新UI上顯示的文字, 我們需要將strings聲明QT_TR_NOOP()宏; 這樣當顯示對象的時候, 會顯式地對每個文字尋取翻譯;
ListModel { id: myListModel; ListElement { //: Capital city of Finland name: QT_TR_NOOP("Helsinki"); } }
8) Use Locale to Extend Localization Features
使用Qt.locale()取得當前locale, 選擇相應的圖像或聲音來做到程序本地化;
Component.onCompleted: { switch (Qt.locale().name.substring(0,2)) { case "en": // show the English-language icon languageIcon = "../images/language-icon_en.png"; break; case "fi": // show the Finnish language icon languageIcon = "../images/language-icon_fi.png"; break; default: // show a default language icon languageIcon = "../images/language-icon_default.png"; } }
Qt Quick程序的localization系統和Qt C++程序一樣(lupdate, lrelease, .ts files). C++和QML的UI stings可以放在同一個程序中; 系統會創建一個整合的translation文件, strings在QML和C++中可以找到;
Use a Conditiobal to Hide QML Source From the Compiler
lupdate工具會將UI strings從程序中解析出來; lupdate會讀取.pro文件, 找到包含需要翻譯的text的源文件;? Note? 文件必須被列在.pro文件中的SORUCE或HEADERS路徑中, 否則text無法被找到;
SOURCES變量是為了C++source文件而設定的, 如果我們把QML或JavaScript文件放進去, 編譯器會把這些文件當作C++文件來編譯; 解決辦法是使用 lupdate_only{...}條件語句; 這樣lupdate能看到.qml文件但C++編譯器會忽略;
lupdate_only{ SOURCES = main.qml \ MainPage.qml }
可以使用通配符來查找, 由于不會遞歸查找, 我們需要設定每一個有UI string的目錄;
lupdate_only{ SOURCES = *.qml \ *.js \ content/*.qml \ content/*.js }
?
Qt Linguist Manual: Release Manager
Tools: lupdate, lrelease
Qt Project Files
最簡單的方法是在.pro文件中定義TRANSLATIONS塊, 為每一個語言的增加一個文件;
TRANSLATIONS = arrowpad_fr.ts \ arrowpad_nl.ts
使用文件名加上locale的方式對運行時判斷語言種類有幫助(也可以用Folder來判斷),
QTextCodec::setCodecForTr()可以選擇8位encoding的方式顯示tr()函數返回的String; 如果沒有設置encoding, tr()會使用Latin1;
CODECFORTR = ISO-8859-5 #often use UTF-8
使用QTextCodec::setCodecForTr()機制需要在.pro文件中設置CODECFORTR.? 如果編譯器在運行時使用的是不同的encoding, 也需要設置CODECFORTR.? (MS VS2005.Net必須設置)
excape sequences:
label->setText(tr("F\374r \310lise"));
lupdate
lupdate myproject.pro
lupdate是命令行工具, 會在source, header和QtDesigner interface files, 找到可翻譯的strings; 創建或更新.ts文件;?
TS文件類似XML格式, 可以在version control系統中使用;
lupdate也可以處理Localization Interchange File Format (XLIFF), .xlf文件;(支持的最小版本是1.1)
lrelease
lrelease myproject.pro
lrelease是命令行工具, 可以通過TS文件生成QM文件;
QM文件是壓縮的二進制格式, 在localized application中使用; 查找翻譯的速度非常快;
Note? lrelease只會整合標記為"finished"的翻譯, 否則使用的是原來的文字;
Missing translations
沒有翻譯的文字會在運行時顯示為本地語言;
?
Qt Linguist Manual: Programmers
e.g.
int main(int argc, char *argv[]) { QApplication app(argc, argv); QString locale = QLocale::system().name(); QTranslator translator; translator.load(QString("example_") + locale, qApp->applicationDirPath()); app.installTranslator(&translator); }
使用QCoreApplication::translate()和tr()函數翻譯非QObject類的text;
QT_TR_NOOP()和QT_TRANSLATE_NOOP()
可以標記text, 在函數外部進行動態翻譯;
Qt Linguist Manual: Translators
Qt Linguist工具的幫助文檔;
Other
Internationalization with Qt
Qt for Mac OS X - Specific Issues
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
