Qt国际化

写在前面

在全球化的今天,软件应用的国际化变得尤为重要。

国际化不仅仅是翻译界面文本,更涉及到日期、时间、货币、数字格式等多方面的适应性调整。

Qt作为一个强大的跨平台应用开发框架,提供了丰富的国际化支持工具,使得开发者可以轻松地将应用程序本地化到不同的语言和地区。

本文将深入探讨Qt国际化的方方面面,包括工具使用、常见问题以及实际操作,帮助开发者掌握如何在Qt应用中实现高效的国际化,从而为全球用户提供更好的使用体验。

工具

lupdate

lupdate是一个命令行工具,随Qt框架一起提供,它的主要作用是从源代码中提取出所有的可翻译字符串,并更新.ts文件(Translation Source文件)。.ts文件是XML格式的,包含了源代码中出现的所有可翻译字符串及其对应的翻译。

lupdate工作原理

lupdate的工作原理大致如下:

  1. 解析源代码lupdate遍历指定的源文件或源代码目录,解析C++、QML或JavaScript文件,寻找所有的可翻译字符串。在C++中,这通常是通过tr()函数、QT_TR_NOOP()宏、QObject::tr()方法或者其他相关的Qt翻译宏来标识的。

  2. 提取字符串 :当lupdate找到一个可翻译的字符串时,它会提取出字符串及其上下文信息。上下文通常是包含该字符串的类名,这有助于翻译人员了解字符串在应用程序中的用途。

  3. 更新.ts文件lupdate然后将这些字符串添加到对应的.ts文件中。如果字符串已经存在,它会保留现有的翻译并标记任何更改。如果字符串是新的,它将被添加,等待翻译。

  4. 处理旧字符串 :对于在源代码中不再出现的字符串,lupdate可以标记它们为"obsolete"(过时的),或者根据命令行参数的不同,直接从.ts文件中删除。

  5. 保存.ts文件 :更新后的.ts文件将包含所有从源代码中提取的字符串,以及任何现有的翻译和新的、未翻译的或标记为过时的条目。

lupdate用法示例

使用lupdate的基本命令行格式如下:

shell 复制代码
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用法示例:

shell 复制代码
lupdate -recursive ./src -ts translations/myapp_zh.ts

在这个例子中,-recursive告诉lupdate递归地查找./src目录下的所有源文件,-ts指定更新的.ts文件。

指定多个翻译文件:

shell 复制代码
lupdate . -ts translations_en.ts translations_fr.ts

高级用法

  • 合并翻译文件 :当项目有多个模块,各自拥有独立的翻译文件时,可以通过 lupdate 将它们合并到一个主翻译文件中:
shell 复制代码
  lupdate module1.pro module2.pro -ts main_translations.ts
  • 处理特定类型文件 :如果需要单独处理某些类型的文件(例如 QML 文件),可以使用 -extensions 参数:
shell 复制代码
  lupdate . -extensions qml -ts translations_qml.ts

lupdate 是一个强大的工具,可以自动化地从代码中提取可翻译字符串并生成或更新翻译文件。它支持多种文件类型(包括 C++、QML、UI 文件),适用于多种项目配置方式,非常适合在多语言 Qt 项目中使用。通过理解 lupdate 的工作原理和使用方法,可以大大简化翻译流程,提高开发和翻译效率。

lconvert

lconvert 是 Qt 工具链的一部分,用于处理 Qt 的翻译文件。它可以将翻译文件的格式转换成不同的形式,合并多个翻译文件,或者提取、更新翻译内容。这里将介绍 lconvert 的基本工作原理和主要用途。

lconvert基本工作原理

lconvert 工具的主要功能包括:

  1. 格式转换 :能够在不同的翻译文件格式之间进行转换,如 .ts.qm.po 等。
  2. 合并翻译:能将多个翻译文件合并成一个,便于管理和使用。
  3. 提取和更新翻译内容:从已有的翻译文件中提取内容或将新的翻译内容更新到文件中。

lconvert用法示例

主要用途

①格式转换

在开发多语言应用程序时,通常需要将不同的翻译文件格式进行转换。lconvert 的命令如下:

shell 复制代码
lconvert -i input.ts -o output.qm

②合并多个翻译文件

有时需要将多个翻译文件合并,lconvert 可以帮助完成这一任务:

shell 复制代码
lconvert -i file1.ts file2.ts -o merged.qm

③提取和更新翻译内容

lconvert 也可以用于提取和更新翻译内容,例如:

shell 复制代码
lconvert -i input.ts -o output.ts -if contextname -of anothername

这个命令在一个翻译文件中提取指定上下文的翻译内容或将上下文名称进行替换。

高级选项

  • -if , --id-filter: 过滤某些ID。
  • -of , --output-filter: 过滤上下文名称。
  • -lossless: 在转换中保留所有注释和未翻译字符串。

lrelease

lrelease 是 Qt 工具链的一部分,用于将 .ts (Qt 翻译源文件) 编译为 .qm (Qt 翻译二进制文件) 文件。.qm 文件用于在运行时加载翻译内容,从而实现多语言支持。lrelease 的工作原理和使用方法如下:

lrelease工作原理

基本工作原理

  1. 读取 .ts 文件
  • lrelease 读取一个或多个 .ts 文件,这些文件包含源语言字符串及其翻译内容。
  1. 解析 XML 数据
  • .ts 文件是基于 XML 格式的文本文件,lrelease 解析这些 XML 数据,提取所有翻译条目信息。
  1. 生成二进制文件
  • lrelease 将这些解析后的数据编译成高效的二进制格式 .qm 文件,这些文件可以在运行时被 Qt 应用程序加载。

lrelease用法示例

基本命令

运行 lrelease 的基本命令如下:

shell 复制代码
lrelease [options] [project files] [source .ts files]

例如,将 translations.ts 文件编译为 translations.qm 文件:

shell 复制代码
lrelease translations.ts -qm translations.qm
工作流程
  • 初始准备

    • 在项目开发过程中,先使用 lupdate 提取可翻译字符串并生成 .ts 文件。
    • 使用 Qt Linguist 编辑 .ts 文件中的翻译内容。
  • 编译翻译文件

    • 确保翻译工作完成后,使用 lrelease 将更新后的 .ts 文件编译成 .qm 文件。
    • 如果在 Qt 项目中使用 Qt Creator 构建系统,可以在配置过程中添加目标来自动调用 lrelease
选项和参数

lrelease 提供了一些选项来控制其行为:

  • -help:显示帮助信息。
  • -verbose:输出详细的编译过程信息。
  • -qm filename:指定输出的 .qm 文件名,如果省略则默认与输入的 .ts 文件名相同但后缀为 .qm

例如,编译多个 .ts 文件并输出详细信息:

shell 复制代码
lrelease file1.ts file2.ts -qm output.qm -verbose
示例

将单个 .ts 文件编译成 .qm 文件

shell 复制代码
lrelease translations_en.ts -qm translations_en.qm

编译多个 .ts 文件

假设你有多个 .ts 文件:

shell 复制代码
lrelease translations_en.ts translations_fr.ts translations_de.ts

这将分别生成 translations_en.qmtranslations_fr.qmtranslations_de.qm 文件。

使用 Qt 项目文件编译

如果你有一个 Qt 项目文件(.pro 文件),可以直接使用它来编译所有翻译文件:

shell 复制代码
lrelease my_project.pro

这将根据项目文件中的配置编译所有相关 .ts 文件。

高级用法

  1. 编译多个语言文件
  • 项目经常需要支持多种语言,可以批量编译不同语言的 .ts 文件:
shell 复制代码
lrelease *.ts
  1. 与构建系统集成
  • lrelease 步骤集成到构建系统中,比如在 CMakeqmake 中添加自定义构建步骤,自动生成 .qm 文件。
    例如,在 CMake 中的一个简单规则:
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

Linguist 是 Qt 提供的一个用于翻译和本地化的工具套件,它包括三个关键的命令行工具:lupdatelreleaselinguist 主程序。

这些工具分别用于提取可翻译字符串、生成可执行的翻译文件以及编辑翻译文件。这里主要介绍 linguist 主程序的工作原理和使用方法。

Linguist 主程序的工作原理

  • 打开翻译文件

    • Linguist 打开以 .ts 为扩展名的 Qt 翻译文件。这些文件通常由 lupdate 工具生成,其中包含待翻译的字符串、上下文及其在源代码中的定位信息。
  • 编辑翻译条目

    • 翻译人员可以使用 Linguist 编辑每个翻译条目的翻译内容。界面显示原始字符串和待翻译的字符串,翻译人员可以直接输入相应的翻译。
  • 翻译状态管理

    • Linguist 支持不同的翻译状态,如"未翻译"、"已翻译"、"已校对"等,帮助翻译人员和项目管理人员跟踪翻译进度和质量。
  • 术语库和建议

    • Linguist 能够使用术语库和以前的翻译建议,提高翻译的一致性和效率。这些建议可以从已翻译的字符串和外部的术语库文件中获得。
  • 语法和拼写检查

    • Linguist 提供内置的语法和拼写检查功能,提醒翻译人员可能的拼写错误或常见语法问题。
  • 生成二进制翻译文件

    • 翻译完成后,可以通过 lrelease 工具将 .ts 文件编译成 .qm 文件,供应用程序在运行时加载。

Linguist用法示例

用途:

  1. 生成 .ts 文件
    使用 lupdate 从源代码中提取可翻译字符串,并生成初始的 .ts 文件。例如:
shell 复制代码
lupdate project.pro -ts translations.ts
  1. 打开翻译文件
    启动 Qt Linguist 并打开 .ts 文件:
shell 复制代码
linguist translations.ts
  1. 编辑翻译
    在 Qt Linguist 主界面中,逐条翻译提取到的字符串。Linguist 界面一般包括以下区域:
  • 原字符串显示区域
  • 翻译输入区域
  • 翻译状态选择
  • 建议和术语库
  • 常见问题提示区
  1. 保存和关闭

    完成翻译后,保存 .ts 文件。翻译完成后,将 .ts 文件交由开发人员生成二进制翻译文件。

  2. 生成 .qm 文件

    使用 lrelease 工具将 .ts 文件编译成 .qm 文件:

shell 复制代码
lrelease translations.ts -qm translations.qm

高级功能

  1. 术语库集成
    通过配置术语库文件,提高翻译一致性。术语库文件通常是 XML 格式,包括术语和相应的翻译。例如:
xml 复制代码
   <term>
     <source>File</source>
     <target>Archivo</target>
   </term>
  1. 批量操作
    Linguist 支持批量查找和替换,适用于大型项目的翻译。

  2. 翻译记忆库

    可以利用翻译记忆库(Translation Memory)进行重复字符串的自动翻译,提高翻译效率。

Linguist作为 Qt 的翻译编辑器,结合lupdatelrelease工具,为 Qt 应用程序提供了完整的本地化解决方案。它通过直观的用户界面和多种辅助功能,使得翻译流程更加高效和有条理,是开发多语言 Qt 应用程序的重要工具之一。通过合理利用Linguist` 的功能,可以确保应用程序的翻译质量和一致性,提升用户的本地化体验。

常见问题

如何复用已翻译内容

使用lupdate重新生成已翻译的.ts即可。

shell 复制代码
lupdate test.pro -ts 已翻译.ts -no-obsolete

合并时如何去掉已过时内容

使用lupdate , 先将单个.ts过时内容删掉,再合并。

shell 复制代码
lupdate test1.pro -ts test1.ts -no-obsolete
shell 复制代码
lupdate test2.pro -ts test2.ts -no-obsolete
shell 复制代码
lconvert -i test1.ts test2.ts -o test.ts -no-obsolete 

屏蔽相关功能、界面时如何去掉相应的翻译项

①手动去掉屏蔽功能、界面中的tr

②手动删掉屏蔽的功能、界面

无论哪种方式,都耗时耗力,有多删误删的情况。

多项目翻译如何应用

①每个项目生成单个.ts,然后合并成一个,在代码main中同一应用。

shell 复制代码
lupdate test1.pro -ts test1.ts -no-obsolete
shell 复制代码
lupdate test2.pro -ts test2.ts -no-obsolete
shell 复制代码
lconvert -i test1.ts test2.ts -o test.ts -no-obsolete 

②直接将多个项目翻译生成到一个ts中。

shell 复制代码
lupdate module1.pro module2.pro -ts main_translations.ts

国际化流程

从0开始国际化

①从0开始国际化,首先需确定源语言(如:中/英文)

②UI设计中添加源语言文本

③根据UI开发设计实现

④开发完成后,使用lupdate生成.ts

⑤给到翻译翻译成其他需要语言版本

⑥翻译完成后应用

在现有支持语言上国际化

确认当前语言是否直接替换成目标语言,还是通过翻译的方式。

比如当前是中文,所有文本都没有tr包裹,无法进行国际化,而目标语言是英文。

首先肯定需要先将所有需要翻译的文本用tr包裹。

这里可以直接在代码中将中文文本直接改成英文的,而无需在单独翻译。

也可以用tr包裹中,用lupdate生成.ts翻译成英文应用。

注意:

在vs中新建的.h、.cpp默认编码是GBK的

建议手动将所有的.h、.cpp用utf-8 bom保存,否则会有乱码问题。

相关推荐
用户805533698032 天前
不止三件套:QObject 属性系统全关键字与运行时反射!
c++·qt
xcyxiner2 天前
DicomViewer (vcpkg Windows和ubuntu编译)7
qt
Quz7 天前
QML Hello World 入门示例
qt
xcyxiner10 天前
DicomViewer (dcmtk读取dcm文件)5
qt
xcyxiner10 天前
DicomViewer (后台线程处理文件)4
qt
xcyxiner11 天前
DicomViewer (添加模型类)3
qt
xcyxiner12 天前
DicomViewer (目录调整) 2
qt
xcyxiner12 天前
dcmtk vtk vtk-dicom(gdcm) 编译(debug) v2
qt
LDR00613 天前
Type-C 快充全面升级!LDR6601 赋能个人护理便携电机,重塑剃须刀 / 理发器新体验
c语言·开发语言
雪碧聊技术13 天前
Tree.js是什么?一文讲透
开发语言·javascript·ecmascript