Qt(QML)本地化

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

相关文章
相关标签/搜索