QT国际化

QT国际化是指将一个软件应用程序的界面、文本、日期、数字等元素转化为不同的语言和文化习惯的过程。这使得软件能够在不同的国家和地区使用,并且可以根据用户的语言和地区提供本地化的使用体验。

一、国际化流程

1、创建.ts文件。

Visual Studio中使用Qt Visual Studio Add-in创建ts文件。步骤:

1.1)右键单击工程,弹出菜单。

1.2)选择"Create New Translation File..."选项,弹出对话框,创建ts文件,就在程序目录下生成了ts文件。可以根据不同国家语言生成多个ts文件。

2、生成.pro文件。

从Visual Studio项目生成(Qt Visual Studio Add-in生成.pro文件)。步骤:

2.1)右键单击工程,弹出菜单。

2.2)选择"Create basic .pro File..."选项,弹出Export Poject对话框。

2.3)取消勾选"Create .pri File"选项,点击"OK"按键,就在程序目录下生成对应的.pro文件。

2.4)如果生成pro文件中没有TRANSLATIONS文件,可以手工加上。比如:

TRANSLATIONS += test_cn.ts \
               test_en.ts

3、使用lupdate更新ts文件。

使用lupdate工具从源代码中抽取需要翻译的字符串。比如:

lupdate d:\test.pro

提取的字符串主要是:源代码中tr函数的字符串,.ui的字符串。

3.1)在.h或.cpp中需要界面显示的字符串,统一用tr。使用tr函数提取字符串。tr()函数是QObject类的一个static函数,其签名如下:

static QString tr(const char *sourceText, const char *comment = 0, int n = -1);

QString greeting = tr("Hello,World!");

3.2)界面(.ui文件)要显示的字符串,都用英文表示。

3.3)翻译复数形式,比如英语,很多名词的单复数形式是不相同的,为了解决这个问题,Qt在tr()函数中提供了一个参数n。请看如下代码:

     int n = messages.count(); 
     showMessage(tr("%n message(s) saved", "", n));

对于n的值的不同,Qt会翻译成不同的文字,例如:

n 翻译结果

0 0 message saved

1 1 message saved

2 2 messages saved

5 5 messages saved

4、编辑.ts文件。

使用Qt Linguist工具进行翻译。

打开Qt Linguist工具,在菜单上选择"文件"->"打开"。选择.ts文件。

打开ts文件后看到的界面如下:

翻译对应的字符串。

当翻译完毕所有文本时,前面会出现"?"标记,这表示翻译了,但是翻译者没确认此项翻译是否通过,单击问号变成绿色的"√"即可。

翻译完成后,记得全部保存一下。

5、转换.ts文件到.qm文件。

使用lrelease工具,将翻译后的ts文件转换成实际使用的qm文件。

lrelease d:\test_en.ts -qm d:\test_en.dm

6、QTranslator加载翻译文件。

注意:使用tr的每个文件或ui文件对应的h和cpp文件,需要在文件开头增加一行代码。

#pragma execution_chatacter_set("utf-8")

二、示例

#include <QApplication>
#include <QPushButton>
#include <QTranslator>
 
int main(int argc, char *argv[]) {
    QApplication app(argc, argv);
 
    QTranslator translator;
    if (translator.load(QString("test_") + QLocale::system().name())) {
        app.installTranslator(&translator);
    }
 
    QPushButton button(QObject::tr("Hello, World!"));
    button.resize(200, 60);
    button.show();
 
    return app.exec();
}

三、ts文件乱码

遇到lupdate生成的.ts文件出现乱码的情况, 通常是由于字符编码设置不匹配导致的。lupdate默认使用utf-8编码,但如果你的源代码或Qt Creator的设置使用了不同的编码,这可能会导致乱码。

解决方法:

1、确保源代码使用utf-8编码。检查并确保源代码文件(包括.cpp、.h、.ui等文件)使用的是utf-8编码。你可以在文本编辑器中查看和更改文件编码。

2、在Qt Creator编码环境下,设置Qt Creator编码。

Qt Creator默认使用UTF-8编码,如果项目文件或源代码文件使用了其他编码,就可能导致中文乱码。因此,我们需要在Qt Creator的设置中,确保所有文件都使用UTF-8编码。操作步骤:

2.1)打开Qt Creator,选择菜单栏中的"工具(Tools)"->"选项(Options)"。

2.2)在弹出的选项窗口中,选择"文本编辑器(Text Editor)"->"行为(Behavior)"->"文件编码(File Encodings)"。

2.3)确保"默认编码(Default encoding)"设置为"UTF-8"。

3、在Visual Studio编码环境下,配置vs的编码,只能单个文件配置。操作步骤:

3.1)选择并打开一个文件。

3.2)光标在文件内容上,在菜单上选择"文件"->"高级保存选项",选择UTF-8编码,点击"确定"按钮即可。

四、不重启程序,自动切换语言。

监听QEvent::LanguageChange事件,当切换翻译器时会在底层发出一个LanguageChange事件,所有的需要改变文本的窗口都监听这个事件。

示例代码:

在窗口中重写 bool event(QEvent *event)

bool MainWindow::event(QEvent *event)
{
    if(event->type() == QEvent::LanguageChange)
    {
        ui->retranslateUi(this); //重新翻译UI界面
    }
 
    return QWidget::event(event);
}

在加载新的语言时,先移除已绑定的语言。

void MainWindow::slotCurrentTextChanged(const QString &str)
{
    static QTranslator* translator;
    if (translator != NULL)
    {
        //先移除已绑定的语言
        qApp->removeTranslator(translator);
        delete translator;
        translator = NULL;
    }
    translator = new QTranslator;
 
    if(str == "English")
    {
        translator->load("D:/test_en.qm");
        qApp->installTranslator(translator);
    }
}
相关推荐
糯诺诺米团11 小时前
Qt|QWidget窗口支持旋转
开发语言·qt
SunkingYang11 小时前
qt中如何判断字符串是否为数字,整数,浮点数?
qt·方法·数字·整数·浮点数·判断字符串
꧁坚持很酷꧂11 小时前
Qt天气预报系统设计界面布局第四部分右边
开发语言·qt
-凌凌漆-15 小时前
【Qt】QLabel同时显示图片和文字,图片作为背景,文字显示在上层
qt
Chris·Bosh15 小时前
QT:控件属性及常用控件(1)------核心控件及属性
开发语言·c++·qt
咬光空气1 天前
Qt 5.14.2 学习记录 —— 사 信号与槽机制(1)
开发语言·qt·学习
吃不饱的得可可2 天前
【Qt】主窗口
开发语言·qt
You can do more2 天前
Qt qtcreator配置cmake
qt
yuanbenshidiaos2 天前
QT-------绘图
开发语言·数据库·qt
繁星蓝雨3 天前
Qt实现使用TCP与RS485串口设备通信————附带详细实践方法
qt·modbus·modbus tcp·rs485·modbus rtu