Internationalization and Localization with Qt Quickweb
程序國際化api
1) Use qsTr() for all Literial UI stringsbash
qsTr(), qsTranslate(), qsTrId(), QT_TR_NOOP(), QT_TRANSLATE_NOOP(), and QT_TRID_NOOP() functions數據結構
最廣泛的方式是: app
text: qsTr("Back");
>這段code會在translation文件中爲string建立一個key entry; 運行時刻根據系統的locale, translation系統會尋找關鍵字"Back"而後拿到相應的翻譯值; 拿到的值設給text的property, 這樣UI能夠顯示出對"Black"相應的翻譯;
ide
2) Add Context for the Translate 函數
UI string一般很短, 咱們須要幫助翻譯人員理解文字的內容; 能夠在源代碼中添加context information做爲額外的描述文字, 放在將被翻譯的string前面. 這些文字會被引入到.ts文件中, 展現給翻譯人員; 工具
Note: .ts文件是XML格式, 內容是源文字和翻譯文字的佔位符. 被updated的.ts文件會被轉換成二進制的翻譯文件而且做爲程序的部分被引入到工程中; ui
//: 給翻譯器的主要註釋; //~ 可選的額外信息; 第一個word會被用做XML element中的元素id;
spa
//~ 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