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 翻译工具提供的复数形式翻译规则的摘要。

编写翻译源代码

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