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

最普遍的方式是:

  1. 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;

  1. //~ 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;

  1. text: qsTr("Back", "not front");

4) Use %x to Insert Parameters into a String

使用%在strings里插入参数, 比起直接将文字句子直接放入string更清晰;

  1. 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的数字格式转化方式来格式化第一个参数;

  1. 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包含了当前的语言和国家信息;

  1. 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()宏; 这样当显示对象的时候, 会显式地对每个文字寻取翻译;

  1. ListModel {
  2. id: myListModel;
  3. ListElement {
  4. //: Capital city of Finland
  5. name: QT_TR_NOOP("Helsinki");
  6. }
  7. }

8) Use Locale to Extend Localization Features

使用Qt.locale()取得当前locale, 选择相应的图像或声音来做到程序本地化;

  1. Component.onCompleted: {
  2. switch (Qt.locale().name.substring(0,2)) {
  3. case "en": // show the English-language icon
  4. languageIcon = "../images/language-icon_en.png";
  5. break;
  6. case "fi": // show the Finnish language icon
  7. languageIcon = "../images/language-icon_fi.png";
  8. break;
  9. default: // show a default language icon
  10. languageIcon = "../images/language-icon_default.png";
  11. }
  12. }

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++编译器会忽略;

  1. lupdate_only{
  2. SOURCES = main.qml \
  3. MainPage.qml
  4. }

可以使用通配符来查找, 由于不会递归查找, 我们需要设定每一个有UI string的目录;

  1. lupdate_only{
  2. SOURCES = *.qml \
  3. *.js \
  4. content/*.qml \
  5. content/*.js
  6. }

Qt Linguist Manual: Release Manager

Tools: lupdate, lrelease

Qt Project Files

最简单的方法是在.pro文件中定义TRANSLATIONS块, 为每一个语言的增加一个文件;

  1. TRANSLATIONS = arrowpad_fr.ts \
  2. arrowpad_nl.ts

使用文件名加上locale的方式对运行时判断语言种类有帮助(也可以用Folder来判断),

QTextCodec::setCodecForTr()可以选择8位encoding的方式显示tr()函数返回的String; 如果没有设置encoding, tr()会使用Latin1;

  1. CODECFORTR = ISO-8859-5 #often use UTF-8

使用QTextCodec::setCodecForTr()机制需要在.pro文件中设置CODECFORTR. 如果编译器在运行时使用的是不同的encoding, 也需要设置CODECFORTR. (MS VS2005.Net必须设置)

excape sequences:

  1. label->setText(tr("F\374r \310lise"));

lupdate

  1. 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

  1. lrelease myproject.pro

lrelease是命令行工具, 可以通过TS文件生成QM文件;
QM文件是压缩的二进制格式, 在localized application中使用; 查找翻译的速度非常快;

Note lrelease只会整合标记为"finished"的翻译, 否则使用的是原来的文字;

Missing translations
没有翻译的文字会在运行时显示为本地语言;

Qt Linguist Manual: Programmers

e.g.

  1. int main(int argc, char *argv[])
  2. {
  3. QApplication app(argc, argv);
  4.  
  5. QString locale = QLocale::system().name();
  6.  
  7. QTranslator translator;
  8. translator.load(QString("example_") + locale, qApp->applicationDirPath());
  9. app.installTranslator(&translator);
  10. }

使用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)本地化的更多相关文章

  1. Qt qml 单例模式

    Qt qml 单例模式,没什么好说的,看代码吧.单例模式很适合做全局的配置文件. [示例下载] http://download.csdn.net/detail/surfsky/8539313 [以下是 ...

  2. Qt qml listview 列表视图控件(下拉刷新、上拉分页、滚动轴)

    Qt qml listview下拉刷新和上拉分页主要根据contentY来判断.但要加上顶部下拉指示器.滚动条,并封装成可简单调用的组件,着实花了我不少精力:) [先看效果]    [功能] 下拉刷新 ...

  3. qt qml qchart 图表组件

    qt qml qchart 图表组件 * Author: Julien Wintz * Created: Thu Feb 13 23:41:59 2014 (+0100) 这玩意是从chart.js迁 ...

  4. qt qml中PropertyAnimation的几种使用方法

    qml文章 qt qml中PropertyAnimation的几种使用方法 动画应用场景有以下几种: 首先如果一个Rectangle.动画是要改变它的x和y值 1,Rectangle一旦被创建,就要移 ...

  5. Qt QML referenceexamples attached Demo hacking

    /********************************************************************************************* * Qt ...

  6. Qt qml的软件架构设计

    google: qt qml application architecture 有很多资源. 1 https://www.ics.com/blog/multilayered-architecture- ...

  7. QT QML目录导航列表视图

    [功能] /目录.文件 /文件过滤 /递归 /事件 /高亮当前行 /当前选项 /目录切换动画 /限制根目录 [下载]:http://download.csdn.net/detail/surfsky/8 ...

  8. qt qml 利用xmlhttprequest 调用有赞api

    最近朋友在有赞商城上面开了一个店铺,因为有实体店,一般卖商品后送货上门,但是打票时候老是人工用world文档人工复制黏贴订单打印小票, 所以就找我帮忙做一个软件专门打印小票的,就研究起来调用有赞第三方 ...

  9. QT QML 3D模型查看器

    原文链接:http://amin-ahmadi.com/2018/01/28/viewing-3d-models-using-qt/ 本文使用QT Quick中的Scene3D QML类型来查看3D模 ...

随机推荐

  1. html表格单元格设置背景颜色

  2. UIScrollview不全屏,解决方案

    self.edgesForExtendedLayout = UIRectEdgeNone;

  3. Backward Digit Sums(暴力)

    Backward Digit Sums Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 5664   Accepted: 32 ...

  4. android 混淆配置

    proguard 原理Java代码编译成二进制class 文件,这个class 文件也可以反编译成源代码 ,除了注释外,原来的code 基本都可以看到.为了防止重要code 被泄露,我们往往需要混淆( ...

  5. ASP.NET对路径"xxxxx"的访问被拒绝的解决方法小结

    异常详细信息: System.UnauthorizedAccessException: 对路径“D:/temp1/MyTest.txt”的访问被拒绝     在windows 2003下,在运行web ...

  6. PHP自学4——通过mail函数将feedback界面用户填写表单信息发送至指定邮箱

    这一讲的内容依旧简单(谁叫PO主水平菜,依旧是个弱鸡ORZ),通过PHP的内置mail函数将一个反馈界面的信息发送到指定邮箱.在Windows平台不能直接需要使用该函数,需要下载一个sendmail并 ...

  7. MSSQL查询连接数

    SELECT * FROM [Master].[dbo].[SYSPROCESSES] WHERE [DBID] IN ( SELECT [DBID] FROM [Master].[dbo].[SYS ...

  8. WinRAR 自动解压 解压完成后,执行批处理文件

    部分内容参考网页:http://bbs.kafan.cn/thread-1243208-1-1.html WinRAR 的自动解压文件功能使压缩包也能像 Setup 程序那样,双击后显示一个软件许可, ...

  9. 解决linux ping: unknown host www.baidu.com(转)

    解决方案:    如果某台Linux服务器ping不通域名, 如下提示: [root@localhost ~]# ping www.baidu.comping: unknown host www.ba ...

  10. VMWARE使用问题

    因为一些原因创建的两个虚拟机出问题了,然而里面还放了好多东西呢不想就这样删掉,就抱着试一试的心态看能不能恢复(结果真能恢复). 这里使用的方法是VMware虚拟机配置文件(.vmx)损坏修复 在这过程 ...