VS中设置Qt多语言界面
一、多语言界面设计概述
1.在程序设计阶段,程序代码中每一个用户可见的字符串都用tr()函数封装,以便Qt提取界面字符串,用于生成翻译资源文件。用UI设计器可视化设计窗体时统一用一种语言。
2.在项目配置文件.pro文件中设置需要导出的翻译文件.ts文件,使用lupdate工具扫描项目文件中需要翻译的字符串,并生成翻译文件。
3.使用Qt的Linguist程序打开生成的翻译文件,将程序中的字符串翻译为需要的语言,如将所有中文字符串翻译成英文。
4.使用lrelease工具编译翻译好的翻译文件,生成更为紧凑的“.qm”文件,实现不同的语言界面。
二、tr()函数的使用
为了让qt可以提取用户可见的字符串,需要对每个字符串使用tr()函数封装。tr()是QObject的一个静态函数,在使用了Q_OBJECT宏定义的类或QObject的子类中,都可以直接使用tr()函数,否则需要使用QObject::tr()调用。或者在类定义中用Q_DECLARE_TR_FUNCTIONS宏把tr()函数添加到类中之后,再直接调用tr()函数。
定义:QString QObject::tr(const char *sourceText, const char *disambiguation = Q_NULLPTR, int n = -1);
其中,sourceText是源字符串, disambiguation是为翻译者提供额外信息的字符串,用于对一些容易混淆的地方作说明。
注意事项:
- 尽量使用常量字符串,不要使用字符串变量。以下使用lupdate工具提取项目中的字符串时,将不能提取“不能删除记录”这个字符串。
char *errorStr = "不能删除记录"; QString str2 = tr(errorStr);
- 使用字符串变量时,需要用Qt_TR_NOOP()宏进行标记。
const char *cities[4] = { Qt_TR_NOOP("Beijing"), Qt_TR_NOOP("Shanghai"), Qt_TR_NOOP("Qingdao"), Qt_TR_NOOP("Wuhan") }; for(int i = 0; i < 4; i++) comboBox->addItem(tr(cities[i]));
- tr()不能使用拼接的动态字符串。
//错误 LabCellPos->setText(tr("第" + QString::number(current.row()) + "行")); //正确 LabCellPos->setText(tr("第 %1 行").arg(current.row()));
- Qt_NO_CAST_FROM_ASCII的作用。在一个需要翻译为多语言的应用程序中,如果编写程序时忘了对某个字符串使用tr()函数,lupdate生成的翻译资源文件就会遗漏这个字符串。为了避免这种疏忽错误,可以在项目配置文件(.pro文件)中添加如下的定义。
DEFINES += Qt_NO_CAST_FROM_ASCII
三:VS项目中配置多语言步骤
步骤:
1.创建项目,对用到的每个字符串以上规则的前提下加入tr()函数。
2.右击项目,点击Qt中的Create New Traslation File
(sample_zh.ts和sample_en.ts)创建英文和中文的ts文件
3.右击sample_zh.ts或者sample_en.ts,使用lupdate生成翻译的资源文件
4.使用Qt Linguist翻译ts文件
5.右击sample_zh.ts或者sample_en.ts,使用lrelease在项目源程序目录下生成qm文件sample_zh.qm或者sample_en.qm
四:调用翻译文件改变界面语言
case1:
启动项目时获取系统语言,改变界面语言:
__CheckLocale()获取系统语言。参考链接:https://www.cnblogs.com/foreversdf/p/12900497.html
std::string locale = __CheckLocale(); if (locale.find("zh") != std::string::npos || locale.find("CN") != std::string::npos) { m_translator.load("translations/sample_zh"); m_translatorQt.load("translations/qt_zh_CN"); qApp->installTranslator(&m_translator); qApp->installTranslator(&m_translatorQt); } else { m_translator.load("translations/sample_en"); m_translatorQt.load("translations/qt_en"); qApp->installTranslator(&m_translator); qApp->installTranslator(&m_translatorQt); }
case2:
动态切换语言,对于大型软件来说不推荐动态切换语言,一般都需要重启后进行设置。
void MainWindow::on_actionChinese_triggered() { qApp->removeTranslator(m_translator); delete trans; m_translator= new Qtranslator; m_translator->load("translatsions/sample_zh"); qApp->installTranslator(m_translator); ui->retranslateUi(this); //刷新界面字符串 } void MainWindow::on_actionEnglish_triggered() { qApp->removeTranslator(m_translator); delete trans; m_translator= new Qtranslator; m_translator->load("translatsions/sample_en"); qApp->installTranslator(m_translator); ui->retranslateUi(this); //刷新界面字符串 }