The 国际化 and 本地化 对于应用程序是使应用程序适配不同语言、地区差异及目标市场技术要求的过程。
国际化需要的范围从拼写改变到使应用程序能以不同语言运转,和使用不同输入技术、字符编码及表示约定。
Qt 中的所有输入控件和文本绘制方法,有为所有支持语言提供内置支持。内置字体引擎可以正确渲染,同时包含来自各种不同书写系统字符的文本。
| 了解更多有关信息 | 见 |
|---|---|
| 国际化源代码 | 编写翻译源代码 |
| 配置和部署翻译,及使用现有 Qt 模块翻译 | 本地化应用程序 |
| 使用 Qt 翻译工具 | Qt Linguist 手册 |
以下视频展示如何国际化和本地化简单范例应用程序:
下列类支持 Qt 应用程序的国际化。
| 根据本地整理算法比较字符串 | |
| 可以用于加速字符串整理 | |
| 在数字及其各种语言的字符串表示之间转换 | |
| 用于编码和解码文本的基类 | |
| 用于文本基于状态的解码器 | |
| 用于文本基于状态的编码器 | |
| 在文本编码间转换 | |
| 基于状态的解码器 | |
| 基于状态的编码器 | |
| 用于文本输出的国际化支持 |
见 编写翻译源代码 了解如何在应用程序中使用类的更多有关信息。
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 应用程序不需要太担心特定平台的局限性。
/usr/share/locale/ja_JP.EUC
目录,无法显示日文文本,除非安装日文字体且目录完整。最佳效果,是使用来自系统供应商的完整区域设置。
| 将 Qt 和 Qt Quick APP 本地化成多种语言。 | |
| 使用 Qt Linguist 国际化 Qt 应用程序 | |
| 使用 Qt 翻译工具:lupdate、lrelease、和 Qt Linguist | |
| 基于文本 ID 的国际化,为具有很多目标区域设置和很多要翻译文本的大型工程提供支持 | |
| 由 Qt 翻译工具提供的复数形式翻译规则的摘要。 | |
| 编写启用应用程序本地化的源代码。 |