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); //刷新界面字符串    
}

 

posted @ 2020-05-16 15:15  李家的小猴子  阅读(2122)  评论(0编辑  收藏  举报