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);}
}