使用 Qt 实现国际化
应用程序的国际化和本地化是使应用程序适应不同语言、地区差异和目标市场技术要求的过程。
国际化的需要包括从拼写更改到使应用程序能在不同语言下运行,以及使用不同的输入技术、字符编码和表现惯例。
Qt 中的所有输入控件和文本绘制方法都为所有支持的语言提供内置支持。内置字体引擎可同时正确渲染包含各种不同书写系统字符的文本。
有关 | 查看 |
---|---|
源代码国际化 | 编写翻译源代码 |
配置和部署翻译,以及使用现有的 Qt 模块翻译 | 本地化应用程序 |
使用 Qt 翻译工具 | Qt Linguist 手册 |
以下视频展示了如何对一个简单的示例应用程序进行国际化和本地化:
用于国际化的 Qt 类
以下类支持 Qt 应用程序的国际化。
根据本地化整理算法比较字符串 | |
可用于加快字符串校对速度 | |
在各种语言的数字及其字符串表示之间进行转换 | |
编码和解码文本的基类 | |
基于状态的文本解码器 | |
基于状态的文本编码器 | |
文本编码之间的转换 | |
基于状态的解码器 | |
基于状态的编码器 | |
文本输出的国际化支持 |
有关如何在应用程序中使用这些类的更多信息,请参阅为翻译编写源代码。
语言和书写系统
Qt XML 支持目前使用的大多数languages 。
输入控件(如Qt Quick TextInput 类型和QLineEdit,QTextEdit 和派生类)以及显示控件(如Text 类型和QLabel 类)可处理不同书写系统的以下特殊功能:
- 换行
一些亚洲语言在书写时单词之间没有空格。换行可以出现在任何字符之后(例外情况除外),如中文、日文和韩文;也可以出现在逻辑单词边界之后,如泰文。
- 双向书写
阿拉伯语和希伯来语从右向左书写,但数字和嵌入式英文文本从左向右书写。具体行为在统一码技术附件 #9 中定义。
- 非间距或关键标记,如欧洲语言中的重音或元音
有些语言(如越南语)大量使用这些标记,有些字符可以同时使用一个以上的标记来澄清发音。
- 连字符
在特殊情况下,一些成对的字符会被一个组合字形取代,形成一个连字符。常见的例子是美国和欧洲书籍排版中使用的
fl
和fi
连字符。
Qt XML 的文本引擎支持不同的writing systems ,如果安装了用于渲染它们的字体,它们可在所有平台上使用。
除非您想编写自己的文本输入控件,否则无需了解特定语言中使用的书写系统。在某些语言(如阿拉伯语或印度次大陆语言)中,字形的宽度和形状会随周围字符的变化而变化。要在 C++ 代码中考虑到这一点,请使用QTextLayout 。编写输入控件还需要对将要使用的脚本有一定的了解。通常,最简单的方法是对QLineEdit 或QTextEdit 进行子类化。
编码
编码既与应用程序源文件有关,也与应用程序读取或写入的文本文件有关。
源代码编码
QML 文档总是以 UTF-8 格式编码。自 Qt 6 起,8 位UTF-8也是 Qt C++ 的主要编码。
lupdate
工具可从您的应用程序中提取用户界面字符串。默认情况下,它希望所有源代码都以 UTF-8 编码。
不过,有些编辑器(如 Visual Studio)默认使用不同的编码。避免编码问题的方法之一是将源代码限制为 ASCII 编码,并对包含其他字符的可翻译字符串使用转义序列:
label->setText(tr("F\374r \310lise"));
QString::toUtf8() 会以 UTF-8 编码返回文本,如果文本完全是 ASCII 编码,则会保留Unicode信息,同时看起来像纯 ASCII 编码。要将 Unicode 转换为本地 8 位编码,请使用QString::toLocal8Bit() 。在 Unix 系统上,这相当于toUtf8()
。在 Windows 系统上,则使用系统当前的代码页。
要将 UTF-8 和本地 8 位编码转换为QString ,请使用QString::fromUtf8() 和QString::fromLocal8Bit() 方便函数。
编码文本输入/输出
使用QTextStream::setEncoding() 为文本流设置常用编码。
如果需要其他传统编码,请使用 Qt5Compat 模块中的QTextCodec 类。
当应用程序启动时,机器的本地语言将决定外部 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 运行的某些操作系统和窗口系统对 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 支持,包括输入法、字体、剪贴板和拖放。
- 在所有现代 Linux 发行版上,文件系统都以 UTF-8 编码。文件 I/O 默认为 UTF-8。
视窗
- Qt 提供全面的 Unicode 支持,包括输入法、字体、剪贴板、拖放和文件名。
- 文件 I/O 默认为 Latin1,Unicode 选项为QTextStream 。不过,有些 Windows 程序无法理解大端 Unicode 文本文件,尽管在没有更高级协议的情况下,这是 Unicode 标准所规定的顺序。
相关主题
将 Qt 和Qt Quick 应用程序本地化为多种语言。 | |
使用Qt Linguist 使您的 Qt 应用程序国际化 | |
使用 Qt 翻译工具:lupdate、lrelease 和 lrelease。Qt Linguist | |
基于文本 ID 的国际化为具有许多目标本地化语言和许多需要翻译的文本的大型项目提供支持 | |
Qt 翻译工具生成的复数形式翻译规则摘要。 | |
编写实现应用程序本地化的源代码。 |
© 2025 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.