首页 > 代码库 > tr()和国际化
tr()和国际化
如果我们程序需要翻译成另外一种语言,那么Qt Linguist 和Qt的翻译工具已经为我们解决这个问题,它提供了一套解决方案,它们提供了如何组织和处理翻译后字符串的方法。
为了准备进行代码翻译,需要使用QObject::tr()函数,来包含需要翻译的字符串,当将其作用于非静态函数时,他会将QMetaObject所提供对象的类名进行翻译,作为要翻译字符串分组的“上下文”
tr()函数有两个作用:
它使的QT的lupate工具可以提取所有可翻译的字符串
如果翻译文件可用,并且语言已经被选中,该函数就会返回翻译后的字符串
如果没有可以使用的翻译文件,那么tr()函数返回原始字符串
注意:确保每个可翻译的字符串都完全在tr()函数内部,并且编译时刻被进行提取,这个是非常重要的,对于带参数的字符串,可以使用QString::arg()函数来将参数放置在翻译过的字符串中:
label->setText(tr("%1 + %2 = %3")) .arg(para1) .arg(para2) .arg(para3)
具体步骤:
在pro文件中添加:
TRANSLATIONS = $$PWD/lang/chinese.ts \ $$PWD/lang/english.ts
2. 方法 一>使用Qt的终端使用lupdate pro文件名,生成翻译文件chinese.ts和english.ts
方法 二>工具->外部->Qt语言家->更新翻译,将生成翻译文件chinies.ts和english.ts
3.使用Qt Linguist编辑*.ts文件,来进行翻译工作
4. 方法 一>使用Qt的终端使用lrelease命令
方法 二>在Qt Linguist找到“发布”,就可以根据*.ts生成*.qm文件,他们可以有应用程序来载入其翻译
方法 三>工具->外部->Qt语言家->部署翻译,将生成语言文件qm
5. 加载翻译文件
QTranslator translator; translator.load("cn.qm"); qApp->installTranslator(&translator);
用QT实现多国语言支持有两种情况:
第一种:使用UI编辑器来自动生成界面,这种方式实现多语系的动态切换很容易。
void MainWindow::changeLanguage(const ELangType& langType) { switch(langType) { case ELangType_Chinese: { this->languageState = ELangType_Chinese; this->translator.load("chinese") ; qApp->installTranslator(&(this->translator)); break; } case ELangType_English: { this->languageState = ELangType_English; this->translator.load("english") ; qApp->installTranslator(&(this->translator)); break; } default: { break; } } }
这个函数是实现语言动态切换,其中languageType是用来记录当前语言的状态,qApp是QApplication对象,我们只需使用QTranslator加载不同的文件就可以实现多语系的动态切换。
第二种:不使用UI编辑器,自己通过亲自编程来设计应用程序界面,这种方式实现多语系动态切换比较繁琐,注意不是难;
void MainWindow::changeLanguage(const ELangType& langType) { switch(langType) { case ELangType_Chinese: { this->languageState = ELangType_Chinese; this->translator.load("chinese") ; this->pOwner->installTranslator(&(this->translator)); break; } case ELangType_English: { this->languageState = ELangType_English; this->translator.load("english") ; this->pOwner->installTranslator(&(this->translator)); break; } default: { break; } } this->labelname->setText(tr("name")); this->labeltel->setText(tr("tel")); ........ }
因此这个特别麻烦,每个界面都要进行类似这样的操作,一般我会在每个界面使用一个retranslateUi()函数,把所有的
要翻译的控件放到里面,每次翻译的时候调用下就可以了
注意:第一个方法没有再次从新设置tr(),原因如下
void MainWindow::changeEvent(QEvent *e) { QMainWindow::changeEvent(e); switch (e->type()) { case QEvent::LanguageChange: ui->retranslateUi(this);//这里实现语言翻译器的更新。 ....... }
tr()和国际化