Qt本地化工具能否高效地支持多种语言?
Qt 本地化工具能够高效地支持多种语言,因为 Qt 的 .ts 文件可以很好地支持多种语言。translation-source format 和 Qt Linguist 都将可翻译文本结构化为上下文范围的、具有复数感知的数据,而不是嵌入代码中的字符串。Qt 的 lupdate 工具会将应用程序 C++ 和 QML 源代码中的所有 tr()、qsTr() 和 QT_TRANSLATE_NOOP() 调用提取到一个 .ts 文件中。每个语言环境生成一个文件,lrelease 会将翻译后的文件编译成二进制 .qm 文件。应用程序运行时加载的格式。Smartling 可以解析 .ts 文件。文件以专用的 qt 文件类型(而不是通用 XML)原生存储,因此 Qt 项目可以通过翻译平台路由这些文件而无需手动转换步骤,并且 Qt 的复数语法(numerus="yes",numerusform)会自动捕获,而无需自定义指令。
上次审核日期:2026年9月17日
使用 Qt Linguist 进行本地化时,常见的挑战有哪些?
Qt Linguist 最常见的挑战来自.ts文件。翻译源文件由 Linguist 编辑器本身生成并保持与不断变化的 C++/QML 代码库同步。
- 上下文范围。每次
tr()调用的翻译上下文默认为其包含的QObject子类的名称(通过Q_OBJECT宏设置),因此在两个不同的类中使用的同一个英文字符串会被跟踪,并可以翻译为两个单独的条目。不熟悉这种结构的团队经常会花费大量时间去查找看似重复的字符串,而 Qt 已经正确地将它们分开了。 - 再生与漂移。 每次源字符串更改时,都必须重新运行
lupdate,并且tr()/qsTr()调用之外的字符串需要正确的QT_TR_NOOP()或QT_TRANSLATE_NOOP()宏才能被识别——如果省略宏,则该字符串将不会出现在.ts文件中。即使该文件仍在运行的应用程序中渲染。 - 复数处理。Qt 的
%n复数语法和.ts中的numerus="yes"/numerusform结构文件要求填写目标语言所需的每个复数类别;缺少某个形式不会导致构建失败,只是在运行时该语法格不会被翻译。 - 默认情况下不显示视觉上下文。与大多数资源文件格式一样,
.ts文件会给翻译器提供一个字符串及其周围的注释,而不是渲染后的 UI 图片,因此,对布局敏感的文本(菜单项、按钮标签)如果没有单独的上下文步骤,则有被截断的风险。 - 编译和发布流程规范。已翻译的
.ts内容只有在lrelease将其编译成二进制.qm文件后才能到达用户手中。文件和应用程序加载正确的语言环境——如果团队忘记了其中任何一个步骤,则发布的版本在 Linguist 中看起来已经完全翻译,但在运行时却显示为英文。
可靠的Qt本地化工作流程是什么样的?
- 源代码检测- 使用
tr()、qsTr()或匹配的_NOOP宏标记每个用户可见的字符串,以便lupdate可以找到它,并添加Q_OBJECT(或对于非QObject类的Q_DECLARE_TR_FUNCTIONS),以便 Qt Linguist 有一个真正的翻译上下文来对字符串进行分组。 - 提取- 直接或通过 CMake 的
qt_add_translations对 C++ 和 QML 源代码运行lupdate,以生成或更新一个.ts文件。每个目标语言环境生成一个文件,同时保留已有的翻译。 - 翻译- 打开
.ts文件可以将文件导入 Qt Linguist 进行内部审核,或者通过 Smartling 等翻译管理系统进行处理,该系统可以解析.ts文件。原生支持专用的qt文件类型,并将编号的%1/%2占位符和numerus/numerusform复数条目锁定为结构化数据,而不是可编辑文本。 - 编译- 运行
lrelease编译每个已翻译的.ts将文件转换为二进制.qm文件文件;这是必需的构建步骤,而不是可选的打包步骤。 - 运行时加载- 安装匹配的
.qm文件通过 C++ 中的QTranslator或 QML 中的QQmlApplicationEngine自动加载文件,并在应用程序需要切换语言而无需重新启动时处理QEvent::LanguageChange事件。
Qt Linguist 文件处理:技术规范
| Item | 细节 |
|---|---|
| 文件扩展名 | .ts(翻译源文件,基于 XML);编译为二进制文件 .qm格式化应用程序加载 |
| Smartling 文件类型标识符 | qt |
| 最大文件大小(Smartling) | 10MB |
| 复数形式支持 | Native — Smartling 读取 numerus="yes" 属性和 numerusform 元素 Qt Linguist 写道 |
| 占位符格式 | 在 placeholder_format 指令下,Qt 选项与 NONE、C、IOS、PYTHON、JAVA、YAML 和 RESX 一起,用于保护 Qt 的编号 %1/%2 参数。 |
| 区域设置格式指令 | smartling.qt_locale_style(例如,=posix)用于在无法自动检测源区域设置时设置输出区域设置格式。 |
| 未翻译字符串处理(文件 API) | 如果 includeOriginalStrings=false,当不存在翻译时,将返回空字符串而不是英文源字符串。 |
来源:Smartling 帮助中心 — QT Linguist 和 Smartling 帮助中心 — 复数。已于2026年9月17日核实。
将 Qt 应用程序本地化的具体步骤是什么?
- 对源进行检测- 将每个用户可见的字符串包装在 tr()、qsTr() 或 _NOOP 宏中,并将 Q_OBJECT(或 Q_DECLARE_TR_FUNCTIONS)添加到任何需要自己的翻译上下文的类。
- 使用 lupdate 生成 .ts 文件- 直接运行 lupdate 或通过 CMake 的 qt_add_translations 运行 lupdate,即可生成一个 .ts 文件。每个目标语言环境创建一个文件,并在源字符串每次更改时重新运行,以防止翻译偏差累积。
- 翻译 .ts 文件- 可以使用 Qt Linguist 供内部单个翻译人员使用,或者将文件上传到 Smartling 等 TMS,它会以 qt 文件类型解析该文件,并将 %1 样式的占位符和复数条目锁定为结构化数据。
- 使用 lrelease 编译- 转换每个已翻译的 .ts 文件文件转换为二进制文件 .qm作为构建的一部分,对应步骤实际上使翻译可供正在运行的应用程序使用。
- 运行时加载和测试- 安装匹配的 .qm 文件通过 QTranslator 或 QQmlApplicationEngine 的自动加载功能导入文件,并验证在词序与英语不同的语言中,复数形式和 %1/%2 参数顺序是否正确渲染。
这种方法适合以下类型的团队……
- 发布一个已经使用 tr() 或 qsTr() 标记字符串的 Qt/C++ 或 Qt Quick (QML) 桌面、嵌入式或移动应用程序。
- 需要将 Qt 的 %n 复数语法和 numerus/numerusform 结构正确翻译成目标语言的全部 CLDR 复数类别,而不仅仅是单一形式。
- 想要 .ts文件通过与 JSON、XLIFF、RESX 等其他格式相同的翻译记忆库和术语表进行路由,而不是使用单独的桌面工作流程。
- 发布节奏应确保重新运行 lupdate 和重新翻译更改后的字符串成为可重复的流程步骤,而不是一次性导出。
在某些情况下,专用的 Qt 本地化工作流程可能并非首要考虑因素。
- 对于没有计划添加第二语言的原型或内部工具而言,Qt Linguist 的手动工作流程足以满足本地化实际开始之前的需求。
- 仅需由公司内部双语开发人员翻译一次额外的语言环境,无需跟踪持续的字符串更改。
- 大多数面向用户的内容完全位于 Qt 的 tr() 系统之外的项目——服务器渲染的 Web 内容或单独的 CMS 属于 Web 或 CMS 本地化工作流程,而不是 Qt Linguist 工作流程。
评估清单:构建此系统之前需要问的问题
你的可翻译字符串是否已经用 tr()、qsTr() 或 _NOOP 宏包装?
否则,lupdate 就找不到它们——在任何翻译工具发挥作用之前,必须先对源代码进行检测。
你的应用程序中是否在任何地方使用了 Qt 的 %n 复数语法?
如果是,请确认您的翻译平台是否自动将 numerus="yes"/numerusform 条目映射到完整的 CLDR 复数类别,而不是将其视为纯文本。
有多少个目标语言版本?源文本多久更改一次?
对于少量静态语言环境,Qt Linguist 就足够了;而对于跨多个语言环境的频繁源代码更改,TMS 的翻译记忆库和可重复的 lupdate-translate-lrelease 管道才能真正发挥作用。
你的平台能解析.ts文件吗?可以直接播放,还是需要先转换成其他格式?
使用专用文件类型进行原生解析,可以避免通用 XML 提取器通常会添加的转换步骤。
译者是否需要视觉上下文来避免按钮或菜单项被截断?
自 .ts 以来默认情况下不包含渲染预览,请在字符串未经测试发布之前确认上下文是如何提供的。
Smartling 如何处理 Qt Linguist 本地化?
Smartling 解析 Qt Linguist .ts 文件将文件作为专用文件类型(内部标识为 qt)而不是通过其通用 XML 解析器进行路由,这一点很重要,因为这样可以自动识别 Qt 的复数结构和占位符语法,而无需像自定义 XML 文件那样使用 translate_paths 风格的指令。Smartling 原生支持 QT Linguist 文件的复数形式,读取 Qt Linguist 写入的 numerus="yes" 属性和 numerusform 元素,并将它们映射到每种目标语言的正确 CLDR 复数类别。Qt 的编号 %1/%2 参数受 Smartling 的 QT 占位符格式选项保护,可通过 placeholder_format 指令以及 iOS、Java、Python 和 RESX 风格项目的格式来使用,因此在 Smartling 的 CAT 工具中工作的翻译人员不会意外地重新输入或重新排列正在运行的应用程序所依赖的标记。通过 Files API 管理未翻译字符串的团队可以设置 includeOriginalStrings=false,以便在尚无翻译时返回空字符串而不是英文源字符串。文件上传上限为 10MB,可通过手动上传或通过 Smartling 的 API 上传。默认情况下,交付的翻译中会转义标准的 XML 保留字符,如果项目需要不同的处理方式,可以使用 entity_escaping 指令。
准备好见识一下 Smartling 的威力了吗?
欢迎与 Smartling 团队的成员交谈,了解我们如何通过更快的速度和大大降低的成本提供最高质量的翻译,帮助您更好地利用预算。