這段code會在translation文件中為string" />

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

Qt(QML)本地化

系統 1980 0

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


Qt(QML)本地化


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

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

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 五月婷婷激情视频 | 五月天婷婷缴情五月免费观看 | 色片在线 | 国产精品久久久久久久久免费hd | 成人影视在线观看 | 狠狠操夜夜操 | 日本黄色不卡视频 | 国产亚洲精品中文带字幕21页 | 在线精品日韩一区二区三区 | 福利一区视频 | 男人的天堂a在线 | 欧美激情观看一区二区久久 | 欧美一级久久 | 夜夜躁狠狠躁日日躁2021 | 精品国产亚一区二区三区 | 国产亚洲精品一区二区三区 | 四虎影库网址 | 国产在线一区二区三区 | 精品久久久久久影院免费 | 天天草天天爽 | 亚洲精品色播一区二区 | 国产福利视频一区 | 91精品全国免费观看老司机 | 久久亚洲精品中文字幕第一区 | 国产玖玖在线观看 | 涩色涩| 91香蕉嫩草| 九色福利 | 亚洲精品动漫一区二区三区在线 | 久久婷婷午色综合夜啪 | 久久国产精品99久久久久久牛牛 | 99久热re在线精品视频 | 精品国产高清a毛片无毒不卡 | 精品国产日韩亚洲一区二区 | 99这里只有精品在线 | 久久国产精品偷 | 狠狠干综合 | 中文字幕在线观看不卡视频 | 免费视频性 | 天天综合网久久 | 不卡免费在线视频 |