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

編寫翻譯源代碼

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