简介

Qt提供了一款优秀的支持Qt C++和Qt Quick应用程序的翻译工具。发布者、翻译者和开发者可以使用这款工具来完成他们的任务。

发布者:承担了全面发布应用程序的责任。通常,他们协调开发者和翻译者的工作,可以使用lupdate工具同步源代码,进行翻译,使用lrelease同步工具为发布应用程序创建运行时使用的翻译文件。

翻译者:可以使用Qt Linguist工具翻译应用程序的文本。当然,这必须要有专业的翻译知识。

开发者:必须创建Qt应用程序能够使用的翻译文本。也应该帮助翻译者识别短语出现的场景。

以上有三种角色-发布者、翻译者、开发者,当然很多情况下,其实就是一种,那就是程序猿自己,大家都懂得。

发布者

Qt Linguist为发布者提供了两款工具-lupdate和lrelease。它们可以处理qmake项目文件,或直接在文件系统上运行。

创建翻译文件

要创建翻译文件:

  1. 运行lupdate产生一组翻译源(TS)文件,里面含有所有用户可见的文本,但未经过翻译。

  2. 把生成的TS文件交给翻译者(谁使用Qt Linguist添加翻译)。Qt Linguist关注任何源文本的改变或删除。

  3. 运行lupdate,可以从应用程序中同步用户可见的文本,它不会破坏任何数据。

  4. 发布应用程序,运行lrelease,即可读取TS文件,并生成用于应用程序运行时的QM文件。

使用lupdate

用法:

Creator菜单栏,选择:工具->外部->Qt语言家->更新翻译(lupdate)

命令行:lupdate myproject.pro

使用lrelease

用法:

Creator菜单栏,选择:工具->外部->Qt语言家->发布翻译(lrelease )

命令行:lrelease myproject.pro

翻译者

Qt Linguist是为Qt应用程序添加翻译的工具。

在Qt语言主窗口包含一个菜单栏和以下视图:

上下文(F6):将要被翻译的字符串所在的上下文列表。

字符串(F7):用于查看上下文中翻译的字符串。

短语和表单(F9):用于查看当前字符串所在的上下文,如果上下文源代码可访问。

翻译区:显示源文、进行译文及译文注释。

短语和猜测(F10):用于查看为当前字符串可能的翻译。

警告(F8):查看未通过验证测试的翻译字符串。

翻译区(1)是始终可见。要显示/隐藏其它视图,选择:查看->视图,也可以使用上面列出的快捷键。由于各个窗口为悬浮界面,所以可以通过标题栏任意拖动。

翻译字符串

在Qt Linguist中打开翻译源(TS)文件进行翻译。TS文件是可读的XML文件-包含源短语及其翻译,TS文件通常由lupdate创建与更新。

Qt Linguist在翻译领域显示目标语言,相应的输入字段适应复数形式。当打开多个TS文件同时翻译时,译文和译文注释字段显示为每种语言的。

要翻译字符串:

  1. 选择:文件->打开(Ctrl+O)来加载TS文件。

  2. 上下文视图中选择一个上下文,来加载翻译的字符串到字符串视图中。

  3. 选择字符串视图中的某个需要翻译的字符串。

  4. 在翻译区域输入当前字符串对应的译文。

    也可以通过双击它从短语和猜测视图中选择现有的翻译。短语是从短语书籍中读取,猜测是在TS文件类似的短语中查找现有的翻译。

  5. 这项是可选的,可以输入译文注释,方便其他翻译者理解。

  6. 如果接受这个翻译,按Ctrl+Enter,选择,或点击字符串列表中所选源字符串的左侧图标。

  7. 选择:文件->保存,来完成工作。

重复这个过程,直到字符串列表中的所有串标有(接受/正确的)或(接受/警告)标记。然后选择下一个上下文并继续。

选择:查看->统计,可以看原文和译文单词和字符数。

选择:文件->发布,创建一个和当前翻译文件名称相同的QM(Qt message)文件。发布管理器的命令行工具lrelease有相同的功能,可完成应用程序的所有翻译源文件。

更改快捷键

快捷键是一个键盘组合键,按下时应用程序会执行相应操作。有两种类型的快捷键:Alt、Ctrl。

Alt快捷键

Alt快捷键被用于菜单以及按钮。如果菜单或按钮的字符带有下划线时,表示按下ALT键和带下划线的字符将和点击菜单项或按下按钮执行相同的操作。

例如,大多数的应用具有一个带有下划线”F”字符的文件菜单”文件(F)”。这时,可以通过点击菜单栏上的按钮或按Alt+F调用即可。为了使快捷键可用,译文中必须包含指定的符号。例如:“File”应该翻译为”文件(&F)”,“Edit(&E)”应该翻译为”编辑(&E)”,

Ctrl快捷键

Ctrl键可以在任何视觉控制中独立存在。它们通常用于调用菜单中的菜单项,否则将需要多次操作键盘或鼠标。也可用于执行没有出现在任何菜单或按钮上的动作。

例如,大多数应用在文件菜单中有一个新建动作。新建动作可能会在文件菜单中显示为”新建Ctrl+N”,这意味着新建动作只需按下Ctrl+N,即可与选择:文件->新建执行相同的操作.

理想情况下,翻译Ctrl快捷键可以选择:译文->从源文中复制(Ctrl+B)。然而,在某些情况下,字符将在目标语言没有意义,也必须改变。无论选择任何一个字符(字母或数字),翻译都必须为”Ctrl+”后跟大写字符格式。Qt会在运行时自动显示正确名称。与Alt快捷键一样,如果译者改变了Ctrl快捷键,那么新的Ctrl快捷键不能与任何其他的Ctrl快捷键冲突。

警告:不要翻译了”Alt”、”Ctrl”、”Shift”快捷键部分。 Qt依赖于这些字符串。对于支持的语言,Qt会自动翻译这些字符串。

处理带编号的参数

有些短语包含带编号的参数。带编号的参数是一个占位符,将在运行时被替换为指定文本。带编号参数以%后跟数字形式出现在源字符串中。

例如:我们需要翻译的文本正如上所述,为可变字符串。

那么我们可以这样处理:

label->setText(tr(“User Name:”)+userName)。

这样提取出来的文本为”User Name:”,我们只需要将其翻译为”用户名:”即可,后面的userName将会在每次执行时动态显示。

更改目标语言环境

如果目标语言和国家没有明确设定,Qt Linguist 将会从翻译的原文件命中解析。例如,app_de.ts设定目标语言为德文,app_de_ch.ts设置目标语言为德文和瑞士。这有助于自动加载翻译当前的语言环境。

如果你的文件不遵守这个习惯,你也可以通过选择:编辑->翻译文件设置来指定信息。

选择上下文进行翻译

上下文窗口中列出了可被翻译的字符串所在的上下文,按照上下文名称顺序列出。每个上下文都是QObject的一个子类的名称,还可以有一个上下文QObject本身,它包含字符串传递到静态函数QObject::tr(),还可以有一个<匿名上下文>,它包含不属于在QObject一个子类的字符串。

下面的图标表示每个上下文的当前翻译状态:

状态 图标 描述
接受/正确 上下文中所有字符串都已被翻译,并通过验证测试。
接受/警告 上下文中所有字符串都被翻译或被标记为翻译,但至少有一个翻译验证测试不通过。在字符串视图中,可以看到字符串失败的测试。
不接受 至少有一个字符串没有被翻译或不被标记为翻译。
废弃的 没有课翻译的字符串出现在赏析文中,这意味着上下文本身不再属于应用程序。

选择字符串进行翻译

字符串视图中列出了所有在当前上下文可翻译的字符串。选择字符串使它出现在翻译区。

单击某个字符串前的图标改变它的翻译状态。一个勾,绿色或黄色,表示该字符串已被翻译并且被接受。问号意味着要么该字符串没有被翻译,要么翻译还没有被接受。

下面的图标表示每个字符串的当前翻译状态:

状态 图标 描述
接受/正确 源字符串存在翻译(可能为空)。用户已经接受了翻译,并通过所有验证测试。如果译文为空,可以点击图标进行撤销,这时上下文视图的”项”列接受翻译的数量减1,如果lupdate改变一个字符串的内容,其接受状态自动复位变为不被接受状态。
接受/警告 用户已经接受了翻译,但翻译没有通过所有的验证测试。验证测试失败显示在警告视图。单击该图标可撤销认可的翻译。状态被重置到校验失败,这时上下文视图的”项”列接受翻译的数量减1。
不接受 字符串已经通过了所有的验证测试,但那是用户没有接受翻译。点击图标或按下Ctrl+Enter来接受翻译,状态被重置为接受/正确,这时上下文视图的”项”列接受翻译的数量加1。
未翻译 该字符串没有翻译。点击图标以接受空翻译。状态被重置为接受/正确,这时上下文视图的”项”列接受翻译的数量加1。
验证失败 该字符串有一个翻译,但翻译没有通过所有的验证测试。验证测试失败会显示在警告视图。点击图标或按下Ctrl+Enter接受翻译尽管验证失败。状态被重置为接受/警告。建议编辑翻译来修复验证失败问题。当所有的失败已得到修复,状态将自动重置为不接受。
废弃的 该字符串已过时,它不再在上下文中使用。

开发者

在Qt应用程序中支持多国语言非常简单,为开发者的工作增加了很小的开销。当然,这会降低运行时性能。

指定翻译源

为了让发布者使用lupdate和lrelease,即可指定一个.pro的Qt工程文件。必须为TRANSLATIONS部分指定每种语言的翻译源。

一个典型的写法是这样的:

TRANSLATIONS = arrowpad_fr.ts \
arrowpad_nl.ts

翻译文件名中使用的语言环境用于确定在运行时加载哪种语言。欲了解更多信息,请参阅QLocale

lupdate工具从应用程序中提取的用户界面字符串。它读取应用程序的.pro文件,以确定哪些源文件包含的文本需要被翻译。这意味着源文件都必须被列在.pro中。如果文件没有列出,其中的文本则不会被发现。

一个有四个翻译源文件的完整.pro例子:

HEADERS         = main-dlg.h \
options-dlg.h
SOURCES = main-dlg.cpp \
options-dlg.cpp \
main.cpp
FORMS = search-dlg.ui
TRANSLATIONS = superapp_dk.ts \
superapp_fi.ts \
superapp_no.ts \
superapp_se.ts

如果你的编译器和运行系统使用不同的编码,并要使用非ASCII字符的字符串,则需要设置CODECFORSRC。 例如:

CODECFORSRC     = UTF-8

使用条件来隐藏QML来源

SOURCES变量是用于C++的源文件。如果列出QML或JavaScript源文件存在,编译器试图像C++一样构建他们。作为一种变通方法,您可以使用lupdate_only{…}条件语句,所以lupdate工具看到.qml文件,但C++编译器会忽略它们。

例如,下面的.pro文件指定了应用程序中的2个qml文件:

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

也可以指定.qml源文件的通配符匹配。搜索不是递归的,所以你需要指定每个目录里的位置:

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

国际化应用

设计应用程序,使其可以适应各种语言和地区没有工程变更。Qt试图使你的国际化尽可能的简单。所有输入控件和文本绘制方法Qt中提供内置所有语言支持。但编写源代码时仍然需要记住以下几点考虑:

  1. 让您的应用程序查找和加载适当的翻译文件。

  2. 让用户可见的文字和Ctrl快捷键作为目标进行翻译。

  3. 提供文本翻译的上下文。

  4. 消除歧义相同的文本。

  5. 使用编号参数(%n)作为参数占位符在运行时替换文本或数字。

  6. 国际化数字、日期、时间、货币。

  7. 标记数据文本字符串函数外翻译。

你可以使用C++和QML源在同一应用程序中,甚至有两个来源的用户接口字符串。该工具创建一个组合的翻译文件,字符串可以从C++和QML访问。

支持国际化的Qt应用程序的类可以参考:Qt国际化

源代码翻译的过程可以参考:编写源代码翻译Qt Quick国际化和本地化

部署翻译

应用程序所需的.qm文件应放置在使用QTranslator加载代码可以找到他们的位置中。通常,通过指定相对QCoreApplication::applicationDirPath()的路径来完成。

通常,有用于应用程序.qm文件,并且,如果一个版本的Qt使用未安装在系统上,Qt的.qm文件需要被部署为好。

在Qt4中,有一个很大的、整体的.qm每个区域设置文件。例如,文件qt_de.qm包含了所有的德语翻译库。

在Qt5中,.qm文件由模块拆分,有一个所谓的元目录文件,其中包含的所有模块的.qm文件。元目录文件的名称和Qt4整体.qm文件的名称是相同的,以便现有的装载程序的工作原理和之前提供的所有包括.qm文件一样被发现。

然而,没有必要总部署所有Qt5的.qm文件。建议连接匹配源目录名模块的.qm文件在部署阶段使用工具lconvert 。例如,创建一个德语翻译文件使用模块Qt Core、Qt GUI、和Qt Quick,运行:

lconvert -o installation_folder/qt_de.qm qtbase_de.qm qtdeclarative_de.qm

更多参考

下面的教程介绍如何准备Qt应用翻译:

Qt Linguist介绍的更多相关文章

  1. 【Qt】Qt Linguist介绍【转】

    简介 Qt提供了一款优秀的支持Qt C++和Qt Quick应用程序的翻译工具.发布者.翻译者和开发者可以使用这款工具来完成他们的任务. 发布者:承担了全面发布应用程序的责任.通常,他们协调开发者和翻 ...

  2. Qt Assistant介绍

    简介 Qt Assistant也就是我们常说的Qt助手,是一款用于呈现在线文档的工具. 简介 一分钟学会使用 Qt参考文档 Qt Assistant详解 命令行选项 工具窗口 文档窗口 工具栏 菜单 ...

  3. 【Qt】Qt Assistant介绍【转】

    简介 Qt Assistant也就是我们常说的Qt助手,是一款用于呈现在线文档的工具. 简介 一分钟学会使用 Qt参考文档 Qt Assistant详解 命令行选项 工具窗口 文档窗口 工具栏 菜单 ...

  4. Qt Linguist的使用

    国际化的英文表述为Internationalization,通常简写为I18N,QT Linguist是一个将“tr(“”)”引号中的语言翻译成另外语言的工具 1. 创建.ts文件 在Creator中 ...

  5. QT-第一个程序 Hello QT , 以及QT creator介绍

    第一个程序 - Hello QT 首先写main.cpp: #include <QApplication> #include <QMainWindow> #include &l ...

  6. Qt语言家(Qt Linguist)更新翻译报错-Qt5.9-MinGW

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt语言家(Qt Linguist)更新翻译报错-Qt5.9-MinGW     本文地址:h ...

  7. Qt版权介绍:GPL, LGPL 以及 Commercial 授权

    http://blog.csdn.net/changsheng230/article/details/6167933 Qt版权介绍:GPL, LGPL 以及 Commercial 授权 分类: Qt ...

  8. Qt Creator介绍

    简介 Qt Creator是使用Qt开发的IDE.Qt支持Windows.Linux/Unix.Mac OS X.Android.BlackBerry.QNX等多种平台,Qt Creator为不同平台 ...

  9. 【Qt】Qt Creator介绍【转】

    简介 Qt Creator是使用Qt开发的IDE.Qt支持Windows.Linux/Unix.Mac OS X.Android.BlackBerry.QNX等多种平台,Qt Creator为不同平台 ...

随机推荐

  1. ios 编码转换 保存文件

    - (NSString *)SaveFileToDocuments:(NSString *)url { // NSString *url = @"http://172.28.250.70/a ...

  2. Windows服务创建及安装

    Windows服务创建及安装http://www.cnblogs.com/tuyile006/archive/2006/11/27/573654.html

  3. Combination Sum III

    https://leetcode.com/problems/combination-sum-iii/ Find all possible combinations of k numbers that ...

  4. 使用var声明的变量 和 直接赋值并未声明的变量的区别

    在看JS高级程序设计时忽然想到这个问题,众所周知,直接赋值一个变量而为声明,会产生一个全局变量(或者说是全局对象的属性),但用var声明的变量 和 直接赋值而并未声明的变量 都有哪些区别呢,这是我在百 ...

  5. excel设置下拉菜单,并且不同值会显示不同颜色

    工作中常常要用的excel,每次都会有新的需求,然后不会,然后百度,然后过段时间可能就又忘了,于是就想说,自己记录下来~~~因为自己用的都是2010,其实哪个版本都差不多,都是应该可以找到相应的按钮滴 ...

  6. 使用ADO连接oracle数据库“未找到提供程序。该程序可能未正确安装”解决方案

    问题描述:VS2010开发的C++程序,在一台Win7旗舰版的已安装Oracle客户端的PC上连接不上Oracle,提示“未找到提供程序.该程序可能未正确安装”,其他语言编写的程序比如C#是可以成功连 ...

  7. hdu 4764 Stone (巴什博弈,披着狼皮的羊,小样,以为换了身皮就不认识啦)

    今天(2013/9/28)长春站,最后一场网络赛! 3~5分钟后有队伍率先发现伪装了的签到题(博弈) 思路: 与取石头的巴什博弈对比 题目要求第一个人取数字在[1,k]间的某数x,后手取x加[1,k] ...

  8. VS2012如何更新下载TFS上面的代码到本地

    现在的代码基本上全都放在TFS上面,如何同步TFS上面的code呢? 1. Open "Team Explorer - Home" 2. Click "Source Co ...

  9. Bootstrap全屏

    1.由于bootstrap中的.containter是根据媒体查询定死了width,所以页面不会占满全屏,若要全屏,则最外面的div的class不能用container(或改用.container-f ...

  10. css3:target页内跳转

    :target 用于选取当前活动的目标元素 <!DOCTYPE html> <html> <head lang="en"> <meta c ...