Qt 国际化

The 国际化 and 本地化 对于应用程序是使应用程序适配不同语言、地区差异及目标市场技术要求的过程。

  • 国际化 意味着使设计应用程序可以适配各种语言和地区,且不用改变工程。
  • 本地化 意味着通过添加特定区域设置组件 (譬如:日期、时间及数字格式) 和翻译文本,使国际化应用程序适配特定地区 (或语言)。

国际化需要的范围从拼写改变到使应用程序能以不同语言运转,和使用不同输入技术、字符编码及表示约定。

Qt 中的所有输入控件和文本绘制方法,有为所有支持语言提供内置支持。内置字体引擎可以正确渲染,同时包含来自各种不同书写系统字符的文本。

了解更多有关信息 见
国际化源代码 编写翻译源代码
配置和部署翻译,及使用现有 Qt 模块翻译 本地化应用程序
使用 Qt 翻译工具 Qt Linguist 手册

以下视频展示如何国际化和本地化简单范例应用程序:

用于国际化的 Qt 类

下列类支持 Qt 应用程序的国际化。

QCollator

根据本地整理算法比较字符串

QCollatorSortKey

可以用于加速字符串整理

QLocale

在数字及其各种语言的字符串表示之间转换

QStringConverter

用于编码和解码文本的基类

QStringDecoder

用于文本基于状态的解码器

QStringEncoder

用于文本基于状态的编码器

QTextCodec

在文本编码间转换

QTextDecoder

基于状态的解码器

QTextEncoder

基于状态的编码器

QTranslator

用于文本输出的国际化支持

见 编写翻译源代码 了解如何在应用程序中使用类的更多有关信息。

语言和书写系统

Qt 支持大多数 语言 今天在使用。

输入控件,譬如 Qt Quick TextInput 类型和 QLineEdit , QTextEdit ,和派生类,及显示控件,譬如 文本 类型和 QLabel 类处理下列不同书写系统的特殊特征:

  • 换行

    某些亚洲语言的书写在单词之间没有空格。断行要么可以出现在任何字符之后 (如:中文、日文及韩文) (有例外),要么可以出现在逻辑单词边界之后 (如:泰文)。

  • 双向书写

    阿拉伯语和希伯来语从右向左书写,除数字和嵌入的英文文本是从左向右书写外。准确行为的定义是在 Unicode 技术附录 #9 .

  • 无间隔 (或变音符号) 譬如:欧洲语言中的重音 (或变音)

    某些语言 (譬如:越南语) 广泛使用这些标记,且某些字符可以同时拥有多个标记,以澄清发音。

  • 连字

    在特殊上下文中,某些字符会被组合字形形成的连字所替换。常见范例是 fl and fi 连字,用于美国和欧洲的书籍排版。

Qt 文本引擎 支持不同 书写系统 工作于所有平台,若有安装用于渲染它们的字体。

不需要知道用于特定语言的有关书写系统,除非想要编写自己的文本输入控件。在某些语言中 (譬如:阿拉伯语,或来自印度次大陆的语言),字形的宽度和形状取决于周围的字符。要在 C++ 代码中考虑这,使用 QTextLayout 。编写输入控件还要求一些脚本知识,将要使用它们。通常,最轻松方式是子类化 QLineEdit or QTextEdit .

编码

编码与应用程序源文件和应用程序读取 (或写入) 的文本文件两者相关。

编码源代码

QML 文档始终以 UTF-8 格式编码。从 Qt 6 起,8 位 UTF-8 也是 Qt C++ 中的主导编码。

The lupdate 工具从应用程序提取 UI 字符串。默认情况下,它期望所有源代码都以 UTF-8 编码。

不管怎样,某些编辑器 (譬如 Visual Studio),默认情况下使用不同编码。避免编码问题的一种办法是将任何源代码限制到 ASCII,并对采用其它字符的可翻译字符串,使用转义序列,例如:

label->setText(tr("F\374r \310lise"));
					

QString::toUtf8 () 返回以 UTF-8 编码的文本,保留 Unicode 信息当看起来像纯 ASCII 时,若文本完全是 ASCII。要把 Unicode 转换成本地 8 位编码,使用 QString::toLocal8Bit ()。在 Unix 系统,这相当于 toUtf8() 。在 Windows,使用系统的当前代码页。

转换自 UTF-8 和转换本地 8 位编码到 QString ,使用 QString::fromUtf8 () 和 QString::fromLocal8Bit () 方便函数。

编码文本的输入/输出

使用 QTextStream::setEncoding () 为文本流设置常见编码。

若需要某些其它遗留编码,使用 QTextCodec 类来自 Qt5Compat 模块。

当应用程序启动时,机器的区域设置确定了用于外部 8 位数据的 8 位编码。 QTextCodec::codecForLocale () 返回可以用于在此区域设置编码,和 Unicode 之间转换的编解码器。

应用程序可能偶尔要求编码,而不是默认的本地 8 位编码。例如,在西里尔 KOI8-R 区域设置 (事实上的俄罗斯标准区域设置) 的应用程序可能需要以 ISO 8859-5 编码输出西里尔。为了这的代码将是:

QString string = ...; // some Unicode text
QTextCodec *codec = QTextCodec::codecForName("ISO 8859-5");
QByteArray encodedString = codec->fromUnicode(string);
					

以下代码演示从 ISO 8859-5 西里尔字母到 Unicode 的转换:

QByteArray encodedString = ...; // some ISO 8859-5 encoded text
QTextCodec *codec = QTextCodec::codecForName("ISO 8859-5");
QString string = codec->toUnicode(encodedString);
					

支持编码的完整列表,见 QTextCodec 文档编制。

操作和窗口系统

Qt 运行的某些 OS (操作系统) 和窗口系统,仅有限支持 Unicode。可用于底层系统的支持级别对 Qt 在这些平台提供的支持有一定影响,尽管一般而言 Qt 应用程序不需要太担心特定平台的局限性。

Unix/X11

  • Qt 隐藏面向区域设置的字体和输入法,并提供 Unicode 输入和输出。
  • 大多数 Unix 变体默认使用譬如 UTF-8 的文件系统约定。所有 Qt 文件函数都允许 Unicode,但会把文件名转换成本地 8 位编码,因为这是 Unix 的约定。
  • 文件 I/O 默认为本地 8 位编码,采用 Unicode 选项在 QTextStream .
  • 一些较旧的 Unix 分发, 仅部分支持某些区域设置。例如,即使拥有 /usr/share/locale/ja_JP.EUC 目录,无法显示日文文本,除非安装日文字体且目录完整。最佳效果,是使用来自系统供应商的完整区域设置。

Linux

  • Qt 提供完整 Unicode 支持,包括输入法、字体、剪贴板及拖放。
  • 文件系统以 UTF-8 编码,在所有现代 Linux 分布。文件 I/O 默认为 UTF-8。

Windows

  • Qt 提供完整 Unicode 支持,包括输入法、字体、剪贴板、拖放和文件名。
  • 文件 I/O 默认为 Latin1,采用 Unicode 选项在 QTextStream 。不管怎样,某些 Windows 程序不理解大端 Unicode 文本文件,即使这是 Unicode 标准在缺乏更高级别协议下规定的次序。

本地化应用程序

将 Qt 和 Qt Quick APP 本地化成多种语言。

Qt Linguist 范例

使用 Qt Linguist 国际化 Qt 应用程序

Qt Linguist 手册

使用 Qt 翻译工具:lupdate、lrelease、和 Qt Linguist

基于文本 ID 的翻译

基于文本 ID 的国际化,为具有很多目标区域设置和很多要翻译文本的大型工程提供支持

复数形式翻译规则

由 Qt 翻译工具提供的复数形式翻译规则的摘要。

编写翻译源代码

编写启用应用程序本地化的源代码。