第1章:Qt Linguist工具入门
1.1 认识Qt Linguist
说实话,我第一次接触Qt Linguist时,觉得它就是个翻译工具。用久了才发现,这玩意儿比我想象的聪明得多。
Qt Linguist是Qt官方提供的翻译辅助工具。它专门用来处理.ts文件和.qm文件。我个人习惯叫它「语言学家」,因为它的工作就是帮我们把界面文字翻译成不同语言。
你想想看,一个软件要支持多语言,总不能把代码里的每个字符串都手动改一遍吧?Qt Linguist就是来解决这个问题的。它把需要翻译的文本提取出来,做成一个翻译文件。翻译人员只需要在这个文件里填写对应语言的译文,然后编译成二进制格式,程序就能自动加载了。
核心概念:
- .ts文件:翻译源文件,XML格式,可读可编辑
- .qm文件:编译后的二进制翻译文件,程序运行时加载
- Linguist:负责编辑.ts文件的图形化工具
1.2 界面布局详解
打开Qt Linguist,你会看到三个主要区域。嗯,这里要注意,布局其实很直观,但新手容易搞混。
左侧:上下文列表
这里显示的是所有需要翻译的上下文。每个上下文对应一个UI类或者一个翻译单元。我在项目中遇到过,有些人把所有文本都塞到一个上下文里,结果翻译时乱成一锅粥。建议按功能模块划分上下文,比如登录模块、设置模块、主界面等。
中间:源文本与译文
这是核心工作区。上面显示源语言文本(通常是英文),下面是译文输入框。你在这里输入翻译后的文字。旁边还有个「短语与语法」面板,可以查看上下文相关的短语。
右侧:翻译记忆与建议
这里会显示之前翻译过的相似文本。说白了就是帮你偷懒的。如果某个句子之前翻译过,这里会自动提示。我曾经靠这个功能,把重复翻译的工作量减少了至少30%。
| 区域 | 功能 | 我的建议 |
|---|---|---|
| 上下文列表 | 显示所有翻译单元 | 按模块命名,别偷懒 |
| 源文本/译文 | 编辑翻译内容 | 注意占位符不要改 |
| 翻译记忆 | 复用历史翻译 | 善用这个功能 |
1.3 .ts文件格式解析
.ts文件本质上是XML。你可以用文本编辑器打开看看。结构大概是这样的:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="zh_CN">
<context>
<name>MainWindow</name>
<message>
<source>File</source>
<translation>文件</translation>
</message>
<message>
<source>Open</source>
<translation>打开</translation>
</message>
</context>
</TS>
看到没?每个<context>对应一个翻译单元,里面包含多个<message>。每个<message>里,<source>是原始文本,<translation>是翻译后的文本。
小技巧:如果某个字符串不需要翻译(比如品牌名称),可以在<translation>里写<translation type="unfinished"></translation>,Linguist会跳过它。
1.4 .qm文件:编译后的翻译
.qm文件是二进制格式,人眼没法直接看。它是从.ts文件编译而来的。程序运行时,Qt会加载.qm文件,根据当前语言设置自动切换显示文本。
为什么要搞成二进制?说白了就两个原因:
- 加载快:二进制文件解析速度远快于XML
- 体积小:.qm文件比.ts文件小得多
我记得有一次,项目上线前发现翻译文件加载特别慢。排查了半天,发现是有人直接把.ts文件当.qm用了。嗯,这种低级错误我也犯过。
1.5 手动翻译流程
整个翻译流程其实就三步。我习惯叫它「三步走」:
- 生成.ts文件:用
lupdate工具从源代码中提取待翻译文本 - 翻译.ts文件:用Qt Linguist打开.ts文件,逐条翻译
- 生成.qm文件:用
lrelease工具将.ts编译成.qm
具体操作是这样的:
# 第一步:提取文本
lupdate myapp.pro -ts zh_CN.ts
# 第二步:用Linguist打开翻译
linguist zh_CN.ts
# 第三步:编译生成.qm
lrelease zh_CN.ts -qm zh_CN.qm
这里要注意,lupdate会扫描所有源文件,把tr()函数包裹的字符串提取出来。所以写代码时,所有需要翻译的文本都要用tr()包起来。我曾经接手过一个项目,里面大量字符串直接硬编码,没包tr(),结果翻译时全得手动补,那叫一个痛苦。
避坑指南:我曾经在翻译时不小心把占位符%1改成了中文全角符号,结果程序运行时直接崩溃。记住:占位符、HTML标签、转义字符这些,一个字都不要动。
1.6 知识体系总览
下面这张图,是我自己总结的Qt国际化核心流程。你看一眼就能明白整个体系是怎么串起来的:
这张图把整个流程串起来了。从源代码里的tr()开始,经过lupdate提取成.ts文件,再用Linguist翻译,最后用lrelease编译成.qm。程序运行时加载.qm文件,根据系统语言自动切换显示。
说白了,Qt Linguist就是整个链条里的翻译环节。它不负责提取,也不负责编译,只负责让你舒舒服服地把文本翻译完。我个人觉得,这个工具最大的价值在于:它把翻译工作从程序员手里解放出来,让专门的翻译人员也能参与进来。
我的经验:刚开始用Linguist时,我总想着把所有翻译都自己搞定。后来发现,把.ts文件发给专业的翻译团队,效率高得多。Linguist生成的.ts文件,翻译人员用任何文本编辑器都能打开,非常方便。
好了,这一章的内容就到这里。记住三个关键词:.ts是源文件,.qm是编译后的文件,Linguist是翻译工具。下一章我们会深入讲解如何用lupdate和lrelease自动化整个流程。