国际化您的应用程序

以下部分描述了国际化QML源代码的各个方面。如果您对应用程序中的所有用户界面组件都遵循这些指南,则可以针对不同语言和本地文化约定(例如日期和数字的格式化方式)本地化应用程序的各个方面。

1.对所有Literal用户界面字符串使用qsTr()

可以使用qsTr(),qsTranslate(),qsTrId(),QT_TR_NOOP(),QT_TRANSLATE_NOOP()和QT_TRID_NOOP()函数标记QML中的字符串进行转换。标记字符串的最常用方法是使用qsTr()函数。例如:

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

此代码使“Back”成为翻译文件中的关键条目。在运行时,翻译系统会查找关键字“Back”,然后获取当前系统区域设置的相应翻译值。结果返回到text属性,用户界面将显示当前语言环境的“Back”的相应转换。

2.为翻译器添加上下文

用户界面字符串通常很短,因此您需要帮助翻译文本的人理解文本的上下文。您可以在要翻译的字符串之前将源代码中的上下文信息添加为额外的描述性文本。这些额外的描述包含在提供给翻译者的.ts翻译文件中。

注意: .ts文件是包含源文本的XML文件和翻译文本的位置。更新的.ts文件将转换为二进制转换文件,并作为最终应用程序的一部分包含在内。

在以下代码段中,该//:行上的文本是翻译者的主要注释。

//~行上的文字是可选的额外信息。文本的第一个单词用作.ts文件中XML元素的附加标识符,因此请确保第一个单词不是句子的一部分。例如,注释“Context not related that that”将转换为.ts文件中的“<extra-Context>与此无关”。

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

3.消除相同文本的歧义

翻译系统将用户界面文本字符串合并为唯一项。这种合并可以节省翻译工作的人必须多次翻译相同的文本。但是,在某些情况下,文本相同但含义不同。例如,在英语中,“后退”表示向后退一步,也表示与前面相对的物体部分。您需要告诉翻译系统这两个单独的含义,以便翻译人员可以创建两个单独的翻译。

通过添加一些id文本作为qsTr()函数的第二个参数来区分相同的文本。

在下面的代码片段中,not front文本是一个id,用于区分“Back”文本和backstepping“Back”文本:

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语言学手册

Qt Quick的国际化和本地化的更多相关文章

  1. Qt Quick实现的疯狂算数游戏

    使用 Qt Quick 写了个小游戏:疯狂算数.支持 Windows 和 Android 两个平台. 游戏简单,但牵涉到下面你的 Qt Quick 主题: 自己实现一个按钮 自适应分辨率 国际化 QM ...

  2. Qt 学习之路 :Qt Quick Controls

    自 QML 第一次发布已经过去一年多的时间,但在企业应用领域,QML 一直没有能够占据一定地位.很大一部分原因是,QML 缺少一些在企业应用中亟需的组件,比如按钮.菜单等.虽然移动领域,这些组件已经变 ...

  3. 对Qt for Android的评价(很全面,基本已经没有问题了,网易战网客户端就是Qt quick写的),可以重用QT积累20年的RTL是好事,QML效率是HTML5的5倍

    现在Qt不要光看跨平台了,Qt也有能力和原生应用进行较量的.可以直接去Qt官网查看他和那些厂商合作.关于和Java的比较,框架和Java进行比较似乎不且实际.如果是C++和Java比较,网上有很多文章 ...

  4. 一文入门Qt Quick

    以下内容为本人的著作,如需要转载,请声明原文链接微信公众号「englyf」https://www.cnblogs.com/englyf/p/16733091.html 初识Qt Quick 很高兴可以 ...

  5. 《Qt Quick 4小时入门》学习笔记4

    http://edu.csdn.net/course/detail/1042/14806?auto_start=1 Qt Quick 4小时入门 第七章:处理鼠标与键盘事件 1.处理鼠标事件 鼠标信号 ...

  6. 《Qt Quick 4小时入门》学习笔记3

    http://edu.csdn.net/course/detail/1042/14807?auto_start=1 Qt Quick 4小时入门 第八章:Qt Quick中的锚(anchors)布局 ...

  7. 《Qt Quick 4小时入门》学习笔记2

    http://edu.csdn.net/course/detail/1042/14805?auto_start=1   Qt Quick 4小时入门 第五章:Qt Quick基本界面元素介绍   1. ...

  8. 《Qt Quick 4小时入门》学习笔记

    http://edu.csdn.net/course/detail/1042/14804?auto_start=1   Qt Quick 4小时入门 第五章:Qt Quick里的信号与槽   QML中 ...

  9. 从头学Qt Quick(3)-- 用QML写一个简单的颜色选择器

    先看一下效果图: 实现功能:点击不同的色块可以改变文字的颜色. 实现步骤: 一.创建一个默认的Qt Quick工程: 二.添加文件Cell.qml 这一步主要是为了实现一个自定义的组件,这个组件就是我 ...

随机推荐

  1. 方法$.data()和$.('#test').on()的使用

    1.on() 方法的使用 在选择元素上绑定一个或多个事件的事件处理函数. on()方法绑定事件处理程序到当前选定的jQuery对象中的元素.在jQuery 1.7中,.on()方法 提供绑定事件处理程 ...

  2. python学习笔记——multiprocessing 多进程中的重构方法__init__

    重构: import multiprocessing import time class ClockProcesses(multiprocessing.Process): def __init__(s ...

  3. JMeter分布式配置

    搭建进行分布式平台测试前提: 1 所有的防火墙应该关闭 2 所有的客户端应该都是在同一个子网中. 3 确保jMeter可以访问这个服务器 4 确保各个客户端的jMeter的版本都是一致的,不同版本的J ...

  4. Spring MVC 的xml一些配置

    1.可以自动加载注解驱动,通过注解找到对应Controller <!-- spring MVC 注解驱动 --> <mvc:annotation-driven></mvc ...

  5. 在 Windows 8 中启用可匿名访问的共享

    就是不用输入用户名和密码,直接通过网上邻居可以访问的共享. 1.打开本地组策略编辑器(快捷键Win+R,打开运行,输入gpedit.msc,确定): 2.打开:"本地计算机策略->计算 ...

  6. Java中instanceof关键字的理解

    java 中的instanceof 运算符是用来在运行时指出对象是否是特定类的一个实例.instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例. 用法: res ...

  7. 【Linux】 无密码SCP在Crontab中失效的解决办法

    一.缘由: 之前由于服务器只能密钥登陆,并限制root账户登陆,故用SSH打通了所有服务器,实现了公钥转发scp免输密码等,极大方便了服务器的管理. 最近有个需求,是做数据的异地备份.最简单的用scp ...

  8. UnityTestTools測试工具

    由于工作关系,要了解Unity上的測试工具,该工具基于Nunit框架.通过查阅资料了解到在Unity5.3中做出了一些改变,自带的仅仅剩下单元測试工具,假设想用其它的工具比方断言.集成測试,就须要前往 ...

  9. tcp connection

    三次握手与四次挥手的原因 https://yq.aliyun.com/articles/7435?spm=5176.8091938.0.0.N4v33a linux里的backlog详解 tcp co ...

  10. AES加密 对应的 C#/JAVA 方法

    由于最近在项目中用到,之前在网上找了好多,来来回回,终于整出来了. 贴出来以后用起来方便 C# [csharp] view plaincopyprint? #region AES加解密 /// < ...