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 翻譯工具提供的復數形式翻譯規則的摘要。

編寫翻譯源代碼

編寫啓用應用程序本地化的源代碼。