Qt Linguist介绍

简介

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

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

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

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

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

  • 简介
  • 发布者
    • 创建翻译文件
    • 使用lupdate
    • 使用lrelease
  • 翻译者
    • 翻译字符串
    • 更改快捷键
      • Alt快捷键
      • Ctrl快捷键
    • 处理带编号的参数
    • 更改目标语言环境
    • 选择上下文进行翻译
    • 选择字符串进行翻译
  • 开发者
    • 指定翻译源
    • 使用条件来隐藏QML来源
    • 国际化应用
    • 部署翻译

发布者

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应用翻译:

Hello tr()
Arrow Pad
Troll Print
Internationalization

时间: 2024-08-30 12:53:10

Qt Linguist介绍的相关文章

Qt Assistant介绍

简介 Qt Assistant也就是我们常说的Qt助手,是一款用于呈现在线文档的工具. 简介 一分钟学会使用 Qt参考文档 Qt Assistant详解 命令行选项 工具窗口 文档窗口 工具栏 菜单 文件菜单 编辑菜单 查看菜单 前往菜单 书签菜单 帮助菜单 对话框 打印对话框 首选项对话框 查找文本控制 全文搜索 一分钟学会使用 一旦你安装好Qt,便可以随时使用Qt Assistant: 在Windows下,Qt Assistant作为Qt菜单上的菜单选项. 在Mac OS X下,Qt Ass

c++-用Qt linguist进行界面汉化的时候出现了问题

问题描述 用Qt linguist进行界面汉化的时候出现了问题 看代码如下:sound sound_array[MAX_SOUNDS]= { {0,QT_TR_NOOP("Grand Piano 1")}, {1,"Grand Piano 2"}, }: 定义如下: struct sound { int id; QString name; }: 这个字符串数组在另外一个.cpp文件中. 这个是我写的程序,我想用Qt linguist把字符串数组中的字符提取出来进行汉

qt基础介绍

  Qt工具包进行图形用户界面编程.它没有包括所有的东西:强调的是教授一种图形用户界面编程的编程思想,并且介绍Qt的特征也是必需的.一些通常情况下使用的特征在这个教程里没有用到. Qt 是一个跨平台的C++图形用户界面应用程序框架.它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能.Qt是完全面向对象的,很容易扩展,并且允许真正地组件编程. 基本上,Qt 同 X Window 上的 Motif,Openwin,GTK 等图形界 面库和 Windows 平台上的 MFC,OWL,VCL,

Qt Creator介绍

简介 Qt Creator是使用Qt开发的IDE.Qt支持Windows.Linux/Unix.Mac OS X.Android.BlackBerry.QNX等多种平台,Qt Creator为不同平台提供了统一的开发环境. Qt Creator集成了Qt Designer.Qt Assistant.Help等工具.因此,在开发过程中可以很快的通过Designer来设计界面.如果想从Qt API中获得更详细的信息,只需要将光标定位到相应的类或函数并按下F1即可. 简介 欢迎模式 工程 示例 教程

《Qt 实战一二三》

简介 "我们来自Qt分享&&交流,我们来自Qt Quick分享&&交流",不管你是笑了,还是笑了,反正我们是认真的.我们就是要找寻一种Hold不住的状态,来开始每一天的点滴分享,我们是一个有激情,有态度的部队. 但是我们还是我们,我们只是多了一份责任.古语有云:"不积跬步无以至千里,不积小流无以成江海",所以每一个伟大事务的产生都不是一蹴而就的.现在我们要立足眼下,把第一站放在地球,"<Qt 实战一二三>&quo

Qt实战一二三

简介 "我们来自Qt分享&&交流,我们来自Qt Quick分享&&交流",不管你是笑了,还是笑了,反正我们是认真的.我们就是要找寻一种Hold不住的状态,来开始每一天的点滴分享,我们是一个有激情,有态度的部队,还在等什么,赶快加入吧! 但是我们还是我们,我们只是多了一份责任.古语有云:"不积跬步无以至千里,不积小流无以成江海",所以每一个伟大事务的产生都不是一蹴而就的.现在我们需要立足眼下,把我们的第一站放在地球,"Qt实战

Qt之国际化

简介 Qt国际化属于Qt高级中的一部分,本想着放到后面来说,上节刚好介绍了Qt Linguist,趁热打铁就一起了解下. 对于绝大多数的应用程序,在刚启动时,需要加载默认的语言(或最后一次设置的语言).在使用的过程中,我们也不需要重启应用程序而实现语言的动态切换.这样的话,易用性就非常好了. 简介 多语言切换 源码分析 添加翻译源 翻译 发布翻译 加载翻译文件 源码下载 多语言切换 要进行多语言的切换,需要执行以下步骤: 对用户可见的文本信息全部使用tr()进行封装 提供用户可以用来切换语言的一

国际化-Qt tr()翻译 加载 问题

问题描述 Qt tr()翻译 加载 问题 关于Qt 多语言的问题 加载qm时,有些没有翻译过来,显示的还是原本的! 是这样的,我想把所有成员变量写在一个类中,这些成员变量是公共 的,供其它类来访问修改,那么问题来了:在其它类中调用全局变量或全局类后翻译后,加载时没有翻译过来,都保持了原样: 网上说的大部分资料我都看过,大部分针对的是乱码问题,对于我这种形式的介绍的比较少,我不知道怎么办,所以来求助各位大侠: 代码抽出来了,简化成以下示例: test.pro: QT += core gui TAR

[Qt教程] 第46篇 进阶(六) 国际化

[Qt教程] 第46篇 进阶(六) 国际化 楼主  发表于 2013-10-7 09:23:45 | 查看: 109| 回复: 0 国际化 版权声明 该文章原创于Qter开源社区 导语 在第2篇中讲述如何显示中文时,曾提到使用QTextCodec和tr()的方式直接显示中文,其实这只是一种临时的方法,方便我们快速完成程序,显示效果.当真正要发布一个程序时,最好的方式是在程序中使用英文字符串,而后使用国际化工具进行翻译. 国际化的英文表述为Internationalization,通常简写为I18