Qt Quick的國際化和本地化

 

國際化您的應用程序

如下部分描述了國際化QML源代碼的各個方面。若是您對應用程序中的全部用戶界面組件都遵循這些指南,則能夠針對不一樣語言和本地文化約定(例如日期和數字的格式化方式)本地化應用程序的各個方面。html

1.對全部Literal用戶界面字符串使用qsTr()

可使用qsTr(),qsTranslate(),qsTrId(),QT_TR_NOOP(),QT_TRANSLATE_NOOP()和QT_TRID_NOOP()函數標記QML中的字符串進行轉換。標記字符串的最經常使用方法是使用qsTr()函數。例如:api

Text {
    id: txt1;
    text: qsTr("Back")
}

此代碼使「Back」成爲翻譯文件中的關鍵條目。在運行時,翻譯系統會查找關鍵字「Back」,而後獲取當前系統區域設置的相應翻譯值。結果返回到text屬性,用戶界面將顯示當前語言環境的「Back」的相應轉換。數據結構

2.爲翻譯器添加上下文

用戶界面字符串一般很短,所以您須要幫助翻譯文本的人理解文本的上下文。您能夠在要翻譯的字符串以前將源代碼中的上下文信息添加爲額外的描述性文本。這些額外的描述包含在提供給翻譯者的.ts翻譯文件中。app

注意: .ts文件是包含源文本的XML文件和翻譯文本的位置。更新的.ts文件將轉換爲二進制轉換文件,並做爲最終應用程序的一部分包含在內。ide

在如下代碼段中,該//:行上的文本是翻譯者的主要註釋。函數

//~行上的文字是可選的額外信息。文本的第一個單詞用做.ts文件中XML元素的附加標識符,所以請確保第一個單詞不是句子的一部分。例如,註釋「Context not related that that」將轉換爲.ts文件中的「<extra-Context>與此無關」。工具

lupdate_only{
SOURCES = *.qml \
          *.js \
          content/*.qml \
          content/*.js
}

3.消除相同文本的歧義

翻譯系統將用戶界面文本字符串合併爲惟一項。這種合併能夠節省翻譯工做的人必須屢次翻譯相同的文本。可是,在某些狀況下,文本相同但含義不一樣。例如,在英語中,「後退」表示向後退一步,也表示與前面相對的物體部分。您須要告訴翻譯系統這兩個單獨的含義,以便翻譯人員能夠建立兩個單獨的翻譯。oop

經過添加一些id文本做爲qsTr()函數的第二個參數來區分相同的文本。ui

在下面的代碼片斷中,not front文本是一個id,用於區分「Back」文本和backstepping「Back」文本:spa

Text {
    id: txt1;
    // This user interface string is only used here
    //: The back of the object, not the front
    //~ Context Not related to back-stepping
    text: qsTr("Back");
}

4.用於%x將參數插入字符串

不一樣的語言將單詞放在不一樣的順序中,所以經過鏈接單詞和數據來建立句子不是一個好主意。相反,用於%將參數插入字符串。例如,下面的片斷具備兩個數參數的字符串%1%2。這些參數隨.arg()函數一塊兒插入。

Text {
    id: txt1;
    // This user interface string is used only here
    //: The back of the object, not the front
    //~ Context Not related to back-stepping
    text: qsTr("Back", "not front");
}

%1引用第一個參數並%2引用第二個參數,所以該代碼生成以下輸出:「File 2 of 3」。

5.使用%Lx使數字本地化

若是%L在指定參數時包含修改器,則會根據當前區域設置對數字進行本地化。例如,在如下代碼段中,%L1表示根據當前所選語言環境(地理區域)的數字格式約定格式化第一個參數:

Text {
    text: qsTr("File %1 of %2").arg(counter).arg(total)
}

而後,用上面的代碼,若是total是數字「4321.56」(四千三百二十一點五十六); 使用英文區域設置,(區域設置)輸出爲「4,321.56」; 使用德國區域設置,輸出爲「4.321,56」。

6.國際化日期,時間和貨幣

沒有用於格式化日期和時間的特殊字符串修飾符。相反,您須要查詢當前區域設置(地理區域)並使用Date方法格式化字符串。

Qt.locale()返回一個Locale對象,其中包含有關語言環境的各類信息。特別是,Locale.name屬性包含當前語言環境的語言和國家/地區信息。您能夠按原樣使用該值,也能夠對其進行解析以肯定當前區域設置的相應內容。

如下代碼段使用Date()獲取當前日期和時間,而後將其轉換爲當前語言環境的字符串。而後,它將日期字符串插入%1參數以進行適當的轉換。

Text {
    text: qsTr("%L1").arg(total)
}

要確保貨幣號已本地化,請使用數字類型。此類型具備與日期類型相似的功能,用於將數字轉換爲本地化貨幣字符串。

7.對可翻譯數據文本字符串使用QT_TR_NOOP()

若是用戶在不從新啓動的狀況下更改系統語言,則系統可能沒法自動刷新陣列和列表模型中的字符串以及其餘數據結構。要在用戶界面中顯示文本時強制刷新文本,您須要使用QT_TR_NOOP()宏聲明字符串。而後,當您填充要顯示的對象時,您須要顯式檢索每一個文本的翻譯。例如:

Text {
    text: qsTr("Date %1").arg(Date().toLocaleString(Qt.locale()))
}

8.使用區域設置擴展本地化功能

若是您想要不一樣地理區域的不一樣圖形或音頻,可使用Qt。locale()獲取當前的語言環境。而後爲該區域設置選擇合適的圖形或音頻。

如下代碼段顯示瞭如何選擇表明當前語言環境語言的相應圖標。

ListModel {
    id: myListModel;
    ListElement {
        //: Capital city of Finland
        name: QT_TR_NOOP("Helsinki");
        }
    }

...

Text {
    text: qsTr(myListModel.get(0).name); // get the translation of the name property in element 0
    }

9.準備動態語言更改

您能夠經過使用QCoreApplication :: installTranslator()和QCoreApplication :: removeTranslator()添加和刪​​除轉換器來更改Qt轉換函數使用的語言。以後,您能夠調用QQmlEngine :: retranslate()來觸發刷新全部使用翻譯的綁定。所以,您的用戶界面將動態切換到新選擇的語言。

或者,您也能夠將QEvent :: LanguageChange事件轉發到應用程序的QQmlEngine實例,或將您本身的信號鏈接到QQmlEngine :: retranslate()。

本地化您的應用程序

Qt Quick應用程序使用與Qt C ++應用程序相同的底層本地化系統(lupdate,lrelease和.ts文件)。您使用Qt語言學手冊中描述的相同工具。您甚至能夠在同一個應用程序中使用C ++和QML源中的用戶界面字符串。系統將建立單個組合翻譯文件,而且能夠從QML和C ++訪問字符串。

使用條件隱藏編譯器中的QML源

lupdate工具從應用程序中提取用戶界面字符串。lupdate讀取應用程序的.pro文件,以識別哪些源文件包含要翻譯的文本。這意味着您的源文件必須列在.pro文件的SOURCESHEADERS條目中。若是未列出您的文件,則沒法找到其中的文本。

可是,SOURCES變量適用於C ++源文件。若是在那裏列出QML或JavaScript源文件,編譯器會嘗試將它們構建爲C ++文件。做爲一種變通方法,您可使用lupdate_only{...}條件語句,以便lupdate工具查看.qml文件,但C ++編譯器會忽略它們。

例如,如下.pro文件片斷指定應用程序中的兩個.qml文件。

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";
    }
}

您還可使用通配符匹配指定.qml源文件。搜索不是遞歸的,所以您須要指定源代碼中存在用戶界面字符串的每一個目錄:

lupdate_only{
SOURCES = main.qml \
          MainPage.qml
}

有關Qt本地化的更多詳細信息,請參閱Qt語言學手冊

相關文章
相關標籤/搜索