第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 手动翻译流程

整个翻译流程其实就三步。我习惯叫它「三步走」:

  1. 生成.ts文件:用lupdate工具从源代码中提取待翻译文本
  2. 翻译.ts文件:用Qt Linguist打开.ts文件,逐条翻译
  3. 生成.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国际化核心流程。你看一眼就能明白整个体系是怎么串起来的:

Qt国际化核心流程 源代码 tr("Hello") lupdate .ts文件 XML格式 Linguist 翻译完成 已翻译.ts lrelease .qm文件 二进制格式 加载 运行时加载 自动切换语言 核心工具链:lupdate → Linguist → lrelease 记住:.ts是中间产物,.qm才是最终交付

这张图把整个流程串起来了。从源代码里的tr()开始,经过lupdate提取成.ts文件,再用Linguist翻译,最后用lrelease编译成.qm。程序运行时加载.qm文件,根据系统语言自动切换显示。

说白了,Qt Linguist就是整个链条里的翻译环节。它不负责提取,也不负责编译,只负责让你舒舒服服地把文本翻译完。我个人觉得,这个工具最大的价值在于:它把翻译工作从程序员手里解放出来,让专门的翻译人员也能参与进来。

我的经验:刚开始用Linguist时,我总想着把所有翻译都自己搞定。后来发现,把.ts文件发给专业的翻译团队,效率高得多。Linguist生成的.ts文件,翻译人员用任何文本编辑器都能打开,非常方便。

好了,这一章的内容就到这里。记住三个关键词:.ts是源文件,.qm是编译后的文件,Linguist是翻译工具。下一章我们会深入讲解如何用lupdate和lrelease自动化整个流程。

可可精品资料库