Qt 多語言支持


簡介

Qt 多語言支持很強大,很好用。

首先要強調的是程序中需要翻譯的字符串最好都用 tr("message") 這種形式,這里的 "message" 就是需要翻譯的字符串,統一用英文來表示,也就是說開發過程中程序的默認語言是英文,

開發完成后,用 Qt 多語言工具將程序翻譯成不同的語言。

需要用到的工具就是 Qt 自帶的 lupdate, lrelease, linguist 這3個,不同的二進制發布版本會存放在不同的安裝目錄。

例如我的編譯器版本是 mingw53_32,那么它們存放的路徑如下:

D:\Qt\Qt5.11.1\5.11.1\mingw53_32\bin\lupdate.exe
D:\Qt\Qt5.11.1\5.11.1\mingw53_32\bin\linguist.exe
D:\Qt\Qt5.11.1\5.11.1\mingw53_32\bin\lrelease.exe

如果沒有把這個 bin 路徑添加到系統的 PATH 路徑,那么就需要填寫完整的路徑來啟動可執行文件。

三個工具的作用

  1. lupdate 工具用來提取程序中由 tr() 等函數包含的帶翻譯的字符串到一個文本文件 proXXX_zh_CN.ts 中,例如這里需要翻譯成中文簡體,開發過程中需要用到此 ts 文件;
  2. linguist 工具會打開上一步的 ts 文件,然后讓開發人員翻譯,例如 "hello world" 翻譯成中文,需要填寫對應的單詞表,如果不填寫,那么就不會產生翻譯,程序最終輸出的就是原始的 "hello world";
  3. lrelease 工具會把上一步的 ts 文件轉換為 QM 文件,例如 proXXX_zh_CN.qm,這個文件才是應用讀取的翻譯文件,發布應用程序應當提供這個文件。

一個簡單的 helloworld 程序

命令行程序,開發完成后,需要翻譯的字符串就是這一行代碼中的字符串:

qDebug().noquote() << QObject::tr("hello world") << endl;

翻譯過程,大致步驟如下:
0. 用默認語言(例如英語)開發應用;

  1. 應用開發完成,用 lupdate 工具提取待翻譯的字符串到 TS 文件,用 linguist 工具打開 TS 文件,翻譯文本;
  2. 翻譯完成用 lrelease 工具把 TS 文件轉換為 QM 文件;
  3. 程序中加載 QM 文件,並安裝翻譯對象。
  4. 打包發布應用程序。

手把手示例

0. 用默認語言開發應用

新建一個控制台應用 helloworld,用 qDebug() 輸出一句話即可。

1. 用工具 lupdate 提取待翻譯的字符串生成 ts 文件,並用 linguist 工具打開並翻譯

這一連串的動作,我用腳本實現了,代碼如下:

:: @ECHO OFF
SET LUPDATE_BIN=D:\Qt\Qt5.11.1\5.11.1\mingw53_32\bin\lupdate.exe
SET LINGUIST_BIN=D:\Qt\Qt5.11.1\5.11.1\mingw53_32\bin\linguist.exe
SET PRO_NAME=helloworld.pro
SET TS_FILENAME=helloworld_zh_CN.ts

START %LUPDATE_BIN% -pro %PRO_NAME% -ts %TS_FILENAME%

START %LINGUIST_BIN% %TS_FILENAME%

EXIT

功能很簡單,首先設置 lupdatelinguist 工具路徑,然后根據項目設置工程的文件名字和需要翻譯的文件名字,然后啟動程序,第一步生成 TS 文件,第二步用 linguist 打開剛剛生成的 TS 文件。

在這個應用中只有一個單詞需要翻譯,示例如下:

2. 翻譯完成,用 lrelease 工具把 TS 文件轉換為 QM 文件

這個動作我也用腳本實現了,代碼如下:

:: convert *.ts to *.qm file.
SET LRELEASE_BIN=D:\Qt\Qt5.11.1\5.11.1\mingw53_32\bin\lrelease.exe
SET TS_FILENAME=helloworld_zh_CN.ts
SET QM_FILENAME=helloworld_zh_CN.qm

START %LRELEASE_BIN% %TS_FILENAME% -qm %QM_FILENAME%

3. 修改代碼,程序中加載 QM 文件

這個步驟才是重點,划分為以下幾個小步驟:

  1. 頭文件包含 #include <QTranslator>,注意在 PRO 文件中添加這一句話 TRANSLATIONS = helloworld_zh_CN.ts
  2. 新建一個 QTranslator translator_zh_CN 示例,然后加載QM文件,相關代碼如下:
    QTranslator translator_zh_CN;

    // [1] tries to load a file called helloworld_zh_CN.qm
    //translator_zh_CN.load("helloworld_zh_CN"); // not work
    translator_zh_CN.load(":/translations/helloworld_zh_CN");

這里的 QM 文件我是添加到 QRC 文件中,所以引用的路徑是以 :/prefix/filename 形式。

QRC 文件如何使用以后再說。

  1. 安裝翻譯語言,一句話搞定 app.installTranslator(&translator_zh_CN);

4. 發布應用程序

不是本文重點,以后再說。

附上源文件

helloworld.pro 內容如下:

QT -= gui

CONFIG += c++11 console
CONFIG -= app_bundle

# The following define makes your compiler emit warnings if you use
# any feature of Qt which as been marked deprecated (the exact warnings
# depend on your compiler). Please consult the documentation of the
# deprecated API in order to know how to port your code away from it.
DEFINES += QT_DEPRECATED_WARNINGS

# You can also make your code fail to compile if you use deprecated APIs.
# In order to do so, uncomment the following line.
# You can also select to disable deprecated APIs only up to a certain version of Qt.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
        main.cpp

# [3] add this file to the project.
TRANSLATIONS = helloworld_zh_CN.ts

RESOURCES += \
    helloworld.qrc

main.cpp 內容如下:

#include <QCoreApplication>
// it MUST be included if you want to support multiple languages.
#include <QTranslator>

#include <QObject>
#include <QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication app(argc, argv);
    QTranslator translator_zh_CN;

    // [1] tries to load a file called helloworld_zh_CN.qm
    //translator_zh_CN.load("helloworld_zh_CN"); // not work
    translator_zh_CN.load(":/translations/helloworld_zh_CN");

    // [2] install the translator
    app.installTranslator(&translator_zh_CN);
    qDebug().noquote() << QObject::tr("hello world") << endl;

    return app.exec();
}

helloworld.qrc 內容如下:

<RCC>
    <qresource prefix="/translations">
        <file alias="helloworld_zh_CN">helloworld_zh_CN.qm</file>
    </qresource>
</RCC>

最后是調用 lupdate, linguistlrelease 的腳本.

lupdate_helloworld.bat 內容如下:

:: @ECHO OFF
SET LUPDATE_BIN=D:\Qt\Qt5.11.1\5.11.1\mingw53_32\bin\lupdate.exe
SET LINGUIST_BIN=D:\Qt\Qt5.11.1\5.11.1\mingw53_32\bin\linguist.exe
SET PRO_NAME=helloworld.pro
SET TS_FILENAME=helloworld_zh_CN.ts

START %LUPDATE_BIN% -pro %PRO_NAME% -ts %TS_FILENAME%

START %LINGUIST_BIN% %TS_FILENAME%

EXIT

lrelease_helloworld.bat 內容如下:

:: convert *.ts to *.qm file.
SET LRELEASE_BIN=D:\Qt\Qt5.11.1\5.11.1\mingw53_32\bin\lrelease.exe
SET TS_FILENAME=helloworld_zh_CN.ts
SET QM_FILENAME=helloworld_zh_CN.qm

START %LRELEASE_BIN% %TS_FILENAME% -qm %QM_FILENAME%

聲明

歡迎轉載,請注明出處和作者,同時保留聲明。
作者:LinTeX9527
出處:https://www.cnblogs.com/LinTeX9527/p/10988561.html
本博客的文章如無特殊說明,均為原創,轉載請注明出處。如未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM