在全球化的今天,软件应用的国际化变得尤为重要。
国际化不仅仅是翻译界面文本,更涉及到日期、时间、货币、数字格式等多方面的适应性调整。
Qt作为一个强大的跨平台应用开发框架,提供了丰富的国际化支持工具,使得开发者可以轻松地将应用程序本地化到不同的语言和地区。
本文将深入探讨Qt国际化的方方面面,包括工具使用、常见问题以及实际操作,帮助开发者掌握如何在Qt应用中实现高效的国际化,从而为全球用户提供更好的使用体验。
lupdate是一个命令行工具,随Qt框架一起提供,它的主要作用是从源代码中提取出所有的可翻译字符串,并更新.ts文件(Translation Source文件)。.ts文件是XML格式的,包含了源代码中出现的所有可翻译字符串及其对应的翻译。
lupdate的工作原理大致如下:
解析源代码:lupdate遍历指定的源文件或源代码目录,解析C++、QML或JavaScript文件,寻找所有的可翻译字符串。在C++中,这通常是通过tr()函数、QT_TR_NOOP()宏、QObject::tr()方法或者其他相关的Qt翻译宏来标识的。
提取字符串:当lupdate找到一个可翻译的字符串时,它会提取出字符串及其上下文信息。上下文通常是包含该字符串的类名,这有助于翻译人员了解字符串在应用程序中的用途。
更新.ts文件:lupdate然后将这些字符串添加到对应的.ts文件中。如果字符串已经存在,它会保留现有的翻译并标记任何更改。如果字符串是新的,它将被添加,等待翻译。
处理旧字符串:对于在源代码中不再出现的字符串,lupdate可以标记它们为“obsolete”(过时的),或者根据命令行参数的不同,直接从.ts文件中删除。
保存.ts文件:更新后的.ts文件将包含所有从源代码中提取的字符串,以及任何现有的翻译和新的、未翻译的或标记为过时的条目。
使用lupdate的基本命令行格式如下:
lupdate [options] [source files or directories] -ts [translation files] 其中,[options]是用于控制lupdate行为的参数,[source files or directories]是指定源代码所在位置的项目文件或源代码文件列表。
选项和参数
lupdate 提供了一些选项来控制其行为:
-pro filename :指定 Qt 项目的 Pro 文件,lupdate 将自动从 Pro 文件配置中查找源文件。
-ts filename [filename …] :指定输出的翻译文件,可以是多个文件。
-recursive :递归地扫描目录及其子目录中的源文件。
-no-obsolete :移除翻译文件中不再存在于源代码中的条目。
-extensions extensions :指定源文件的扩展名,例如 .cpp, .h, .qml。
lupdate用法示例:
lupdate -recursive ./src -ts translations/myapp_zh.ts 在这个例子中,-recursive告诉lupdate递归地查找./src目录下的所有源文件,-ts指定更新的.ts文件。
指定多个翻译文件:
lupdate . -ts translations_en.ts translations_fr.ts lupdate 将它们合并到一个主翻译文件中: lupdate module1.pro module2.pro -ts main_translations.ts -extensions 参数: lupdate . -extensions qml -ts translations_qml.ts lupdate 是一个强大的工具,可以自动化地从代码中提取可翻译字符串并生成或更新翻译文件。它支持多种文件类型(包括 C++、QML、UI 文件),适用于多种项目配置方式,非常适合在多语言 Qt 项目中使用。通过理解 lupdate 的工作原理和使用方法,可以大大简化翻译流程,提高开发和翻译效率。
lconvert 是 Qt 工具链的一部分,用于处理 Qt 的翻译文件。它可以将翻译文件的格式转换成不同的形式,合并多个翻译文件,或者提取、更新翻译内容。这里将介绍 lconvert 的基本工作原理和主要用途。
lconvert 工具的主要功能包括:
.ts、.qm、.po 等。主要用途
①格式转换
在开发多语言应用程序时,通常需要将不同的翻译文件格式进行转换。lconvert 的命令如下:
lconvert -i input.ts -o output.qm ②合并多个翻译文件
有时需要将多个翻译文件合并,lconvert 可以帮助完成这一任务:
lconvert -i file1.ts file2.ts -o merged.qm ③提取和更新翻译内容
lconvert 也可以用于提取和更新翻译内容,例如:
lconvert -i input.ts -o output.ts -if contextname -of anothername 这个命令在一个翻译文件中提取指定上下文的翻译内容或将上下文名称进行替换。
lrelease 是 Qt 工具链的一部分,用于将 .ts (Qt 翻译源文件) 编译为 .qm (Qt 翻译二进制文件) 文件。.qm 文件用于在运行时加载翻译内容,从而实现多语言支持。lrelease 的工作原理和使用方法如下:
基本工作原理
.ts 文件:lrelease 读取一个或多个 .ts 文件,这些文件包含源语言字符串及其翻译内容。.ts 文件是基于 XML 格式的文本文件,lrelease 解析这些 XML 数据,提取所有翻译条目信息。lrelease 将这些解析后的数据编译成高效的二进制格式 .qm 文件,这些文件可以在运行时被 Qt 应用程序加载。运行 lrelease 的基本命令如下:
lrelease [options] [project files] [source .ts files] 例如,将 translations.ts 文件编译为 translations.qm 文件:
lrelease translations.ts -qm translations.qm 初始准备:
lupdate 提取可翻译字符串并生成 .ts 文件。.ts 文件中的翻译内容。编译翻译文件:
lrelease 将更新后的 .ts 文件编译成 .qm 文件。lrelease。lrelease 提供了一些选项来控制其行为:
filename:指定输出的 .qm 文件名,如果省略则默认与输入的 .ts 文件名相同但后缀为 .qm。例如,编译多个 .ts 文件并输出详细信息:
lrelease file1.ts file2.ts -qm output.qm -verbose 将单个 .ts 文件编译成 .qm 文件
lrelease translations_en.ts -qm translations_en.qm 编译多个 .ts 文件
假设你有多个 .ts 文件:
lrelease translations_en.ts translations_fr.ts translations_de.ts 这将分别生成 translations_en.qm、translations_fr.qm 和 translations_de.qm 文件。
使用 Qt 项目文件编译
如果你有一个 Qt 项目文件(.pro 文件),可以直接使用它来编译所有翻译文件:
lrelease my_project.pro 这将根据项目文件中的配置编译所有相关 .ts 文件。
.ts 文件:lrelease *.ts lrelease 步骤集成到构建系统中,比如在 CMake 或 qmake 中添加自定义构建步骤,自动生成 .qm 文件。CMake 中的一个简单规则: add_custom_command( OUTPUT ${CMAKE_CURRENT_BINARY_DIR}/translations.qm COMMAND lrelease ${CMAKE_CURRENT_SOURCE_DIR}/translations.ts -qm ${CMAKE_CURRENT_BINARY_DIR}/translations.qm DEPENDS ${CMAKE_CURRENT_SOURCE_DIR}/translations.ts COMMENT "Generating translations.qm" ) lrelease 是 Qt 提供的一个工具,用于将翻译源文件 .ts 编译成应用程序在运行时需要的二进制翻译文件 .qm。它通过处理 XML 格式的 .ts 文件,高效生成适合加载的二进制文件,确保应用程序能够以最小的性能开销实现多语言支持。
无论是手动操作还是集成到自动化构建系统中,lrelease 都是一个关键的工具,帮助开发人员在国际化项目中高效地管理翻译工作。
Linguist 是 Qt 提供的一个用于翻译和本地化的工具套件,它包括三个关键的命令行工具:lupdate、lrelease 和 linguist 主程序。
这些工具分别用于提取可翻译字符串、生成可执行的翻译文件以及编辑翻译文件。这里主要介绍 linguist 主程序的工作原理和使用方法。

打开翻译文件:
Linguist 打开以 .ts 为扩展名的 Qt 翻译文件。这些文件通常由 lupdate 工具生成,其中包含待翻译的字符串、上下文及其在源代码中的定位信息。编辑翻译条目:
Linguist 编辑每个翻译条目的翻译内容。界面显示原始字符串和待翻译的字符串,翻译人员可以直接输入相应的翻译。翻译状态管理:
Linguist 支持不同的翻译状态,如“未翻译”、“已翻译”、“已校对”等,帮助翻译人员和项目管理人员跟踪翻译进度和质量。术语库和建议:
Linguist 能够使用术语库和以前的翻译建议,提高翻译的一致性和效率。这些建议可以从已翻译的字符串和外部的术语库文件中获得。语法和拼写检查:
Linguist 提供内置的语法和拼写检查功能,提醒翻译人员可能的拼写错误或常见语法问题。生成二进制翻译文件:
lrelease 工具将 .ts 文件编译成 .qm 文件,供应用程序在运行时加载。用途:
.ts 文件:lupdate 从源代码中提取可翻译字符串,并生成初始的 .ts 文件。例如:lupdate project.pro -ts translations.ts .ts 文件:linguist translations.ts 保存和关闭:
完成翻译后,保存 .ts 文件。翻译完成后,将 .ts 文件交由开发人员生成二进制翻译文件。
生成 .qm 文件:
使用 lrelease 工具将 .ts 文件编译成 .qm 文件:
lrelease translations.ts -qm translations.qm File Archivo 批量操作:Linguist 支持批量查找和替换,适用于大型项目的翻译。
翻译记忆库:
可以利用翻译记忆库(Translation Memory)进行重复字符串的自动翻译,提高翻译效率。
Linguist作为 Qt 的翻译编辑器,结合lupdate和lrelease工具,为 Qt 应用程序提供了完整的本地化解决方案。它通过直观的用户界面和多种辅助功能,使得翻译流程更加高效和有条理,是开发多语言 Qt 应用程序的重要工具之一。通过合理利用Linguist` 的功能,可以确保应用程序的翻译质量和一致性,提升用户的本地化体验。
使用lupdate重新生成已翻译的.ts即可。
lupdate test.pro -ts 已翻译.ts -no-obsolete 使用lupdate , 先将单个.ts过时内容删掉,再合并。
lupdate test1.pro -ts test1.ts -no-obsolete lupdate test2.pro -ts test2.ts -no-obsolete lconvert -i test1.ts test2.ts -o test.ts -no-obsolete ①手动去掉屏蔽功能、界面中的tr
②手动删掉屏蔽的功能、界面
无论哪种方式,都耗时耗力,有多删误删的情况。
①每个项目生成单个.ts,然后合并成一个,在代码main中同一应用。
lupdate test1.pro -ts test1.ts -no-obsolete lupdate test2.pro -ts test2.ts -no-obsolete lconvert -i test1.ts test2.ts -o test.ts -no-obsolete ②直接将多个项目翻译生成到一个ts中。
lupdate module1.pro module2.pro -ts main_translations.ts ①从0开始国际化,首先需确定源语言(如:中/英文)
②UI设计中添加源语言文本
③根据UI开发设计实现
④开发完成后,使用lupdate生成.ts
⑤给到翻译翻译成其他需要语言版本
⑥翻译完成后应用
确认当前语言是否直接替换成目标语言,还是通过翻译的方式。
比如当前是中文,所有文本都没有tr包裹,无法进行国际化,而目标语言是英文。
首先肯定需要先将所有需要翻译的文本用tr包裹。
这里可以直接在代码中将中文文本直接改成英文的,而无需在单独翻译。
也可以用tr包裹中,用lupdate生成.ts翻译成英文应用。
注意:
在vs中新建的.h、.cpp默认编码是GBK的
建议手动将所有的.h、.cpp用utf-8 bom保存,否则会有乱码问题。