Qt 国际化

应用的国际化与本地化是针对不同语言、区域差异和技术要求对应用进行适配的过程。

  • 国际化意味着设计一个应用,使其能够适应不同的语言和地区,而无需进行工程更改。
  • 本地化意味着通过添加特定于区域的语言组件(如日期、时间和数字格式)和翻译文本来适配国际化的应用程序。

国际化的需求从拼写更改到使应用能够在多种语言中运行,使用不同的输入技术、字符编码和呈现约定。

Qt 中所有输入控件和文本绘制方法都内置了对所有支持语言的内置支持。内置的字体引擎能够同时正确渲染包含各种不同书写系统字符的文本。

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

以下视频展示了如何国际化并本地化一个简单的示例应用

Qt 国际化类

以下类支持 Qt 应用的国际化。

QCollator

根据本地化的排序算法比较字符串

QCollatorSortKey

可用于加快字符串排序

QLocale

在不同语言之间转换数字及其字符串表示形式

QStringConverter

编码和解码文本的基类

QStringDecoder

基于状态的文本解码器

QStringEncoder

基于状态的文本编码器

QTextCodec

文本编码之间的转换

QTextDecoder

基于状态的解码器

QTextEncoder

基于状态的编码器

QTranslator

文本输出的国际化支持

有关如何在应用程序中使用这些类,请参阅编写翻译源代码

语言和书写系统

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

输入控件,如 Qt Quick 的TextInput类型以及QLineEditQTextEdit及其派生类,以及显示控件,如Text类型和QLabel类,处理以下不同书写系统的特殊功能

  • 换行

    某些亚洲语言在单词之间没有空格书写。换行可能在任何字符(存在例外)之后发生,如中文、日文和韩文,或者在同一逻辑单词边界之后发生,如泰文。

  • 双向书写

    阿拉伯语和希伯来语是从右到左书写的,但数字和嵌入的英文文本是从左到右书写的。具体的编写行为在《Unicode 技术附录 #9》中有定义。

  • 非空格或变音符号,例如欧洲语言中的重音标记或变音符号。

    某些语言,如越南语,广泛使用这些符号,某些字符可能同时带有多个符号以澄清发音。

  • 连字符号

    在特殊语境中,一些字符对的组合将替换为结合的符号形成连字符号。常见的例子是在美欧书籍排版中使用的 flfi 连字符号。

Qt的文本引擎支持所有平台上不同的书写系统,前提是已安装对应的字体。

除非您想编写自己的文本输入控件,否则不需要了解特定语言的编写系统。在有些语言中,如阿拉伯语或来自南亚次大陆的语言,符号的宽度和形状会根据周围字符的变化。要在C++代码中考虑到这一点,请使用QTextLayout。编写输入控件还需要了解它们将使用的脚本。通常,最简单的方法是继承QLineEditQTextEdit

编码

编码对于应用程序源文件以及应用程序读取或编写的文本文件都相关。

源代码编码

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

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()设置文本流的公共编码。

如果您需要一些其他旧版编码,请使用来自Qt5Compat模块的QTextCodec类。

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

应用程序可能偶尔需要除了默认本地8位编码之外的其他编码。例如,一个位于Cyrillic 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位编码,同时在QTextStream中提供了Unicode选项。
  • 一些较旧的Unix发行版仅对某些区域设置提供部分支持。例如,即使你有/usr/share/locale/ja_JP.EUC目录,除非安装了日文字体且该目录完整,否则无法显示日语文本。为了获得最佳结果,请使用系统供应商提供的完整区域设置。

Linux

  • Qt提供完整的Unicode支持,包括输入法、字体、剪贴板和拖放。
  • 所有现代Linux发行版中的文件系统都使用UTF-8进行编码。文件I/O默认使用UTF-8。

Windows

  • Qt提供完整的Unicode支持,包括输入法、字体、剪贴板、拖放和文件名。
  • 文件I/O默认使用Latin1,同时在QTextStream中提供Unicode选项。然而,即使在一个没有高级协议的情况下,Unicode标准规定的顺序是大端字节序,某些Windows程序也不理解大端字节序的Unicode文本文件。

本地化应用程序

将Qt和Qt Quick应用程序本地化为多种语言。

Qt Linguist示例

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

Qt Linguist 手册

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

基于文本ID的翻译

基于文本ID的国际化支持,适用于需要大量目标语言和大量待翻译文本的大规模项目

复数形式的翻译规则

Qt翻译工具产生的复数形式的翻译规则概述。

编写翻译源代码

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

© 2024 Qt公司有限公司。此处包含的文档贡献物的版权属于各自的所有者。此处提供的文档根据自由软件基金会发布的GNU自由文档许可协议第1.3版的条款进行许可。Qt及其相应商标是芬兰或其他国家的Qt有限公司的商标。所有其他商标均为各自所有者的财产。