有段时间使用QT进行国际化处理,现将项目中遇到的问题进行一一总结。
1.获取翻译词条。提取的词条的源文件所在的路径不能有空格,否则在使用lupdate时会提取词条失败。
2.自动化词条提取。提前将lrelease命令写入到批处理文件,然后再通过设置visual studio的自定义生成步骤,在每次编译前自动更新一次。如下图:
3.qt内置控件翻译。在项目中先加载qt自带的翻译文件(具体操作可百度),然后加载项目自己的翻译文件。需要注意的是QFileDialog总是翻译不过来,显示的是系统自带的。原因是在使用QFileDialog时需要修改其option属性,为QFileDialog::DontUseNativeDialog。
用法如下:
方法一:
QString qsFile = QFileDialog::getSaveFileName(this, tr("#Save RFID file "), "", tr("#Data File(*.dat)"),0,QFileDialog::DontUseNativeDialog);
方法二:
QFileDialog::Options options;
options |= QFileDialog::DontUseNativeDialog;
QString selectedFilter;
QString fileName = QFileDialog::getSaveFileName(this,
QString("Save File"),
m_strDefCSVFileName,
QString("csv Files (*.csv)"),
&selectedFilter,
options);
方法三:
QFileDialog* pFileDialog = new QFileDialog(this);
pFileDialog->setOption(QFileDialog::DontUseNativeDialog);
4.文字翻译问题。基本上所有的文字通过使用tr(),都可以正常翻译。但还有些文字是需要使用QCoreApplication::translate()、QT_TR_NOOP() 和QT_TRANSLATE_NOOP()的。详细见qt助手。
说明:在qt自带的助手中搜索以下文字“Internationalization with QT”,重点查看 Use tr() for All Literal Text 这一节。
例如,在项目中预定义了一些错误提示信息,以避免重复写。
可以这么定义:
const char TheSampleIDIsWrong[] = QT_TRANSLATE_NOOP("AlarmMsg","#The sample id is wrong.");
const char SampleIDIsLong[] = QT_TRANSLATE_NOOP("AlarmMsg","#The length of Sample ID is more than 10.");
然后这么使用:
qsInfo =QCoreApplication::translate("AlarmMsg", SampleIDIsLong);
注意:“AlarmMsg”为上下文,其作用相当于类名、命名空间之类的。
5.词条翻译。提取出的翻译词条文件,即.ts文件,可以发给指定翻译人员翻译的。只需要给其单独安装qt 的 Linguist 软件。另外,Linguist是可以同时对同一个文件翻译多种语言的。