一、多国语言翻译
在应用开发中,随着产品不断推广,使用应用的人群也在逐渐国际化。原本默认的中文语言总不可避免的需要增加英语甚至更多的语言。而在QT中,则有相对应的QT Linglist即QT自带的语言翻译,其能够自动识别程序中的所有待翻译文字,包括.cpp,.h和.ui的中文本。首先创建一个测试程序(如何创建工程编译运行在此就不过多阐述了),用来演示语言翻译,即如下所示。
在测试程序中.pro添加需要的翻译文件,即一个中文与英文翻译.ts文件(实际中文可不添加在此方便演示)
TRANSLATIONS += Chinese.ts \
English.ts
点击QT中的”工具->外部-> Linguist->更新翻译”,则会自动识别程序中的文本并存储进.ts文件中。接下来用QT Linglist打开需要翻译的文件,并进行对目标文字的翻译。
在English译文添加相应文字翻译,完成“CTRL”+“ENTER”确认后下一个,直到翻译完成保存。点击QT中的”工具->外部-> Linguist->发布翻译”会在工程目录下生成文件名相同的可执行.qm文件,接下在代码中设置按钮触发设置相对应的翻译文件即可。
QTranslator *m_translator = new QTranslator(this);
QString setLanguageQM = ":/English.qm";
bool flag = m_translator->load(setLanguageQM); //加载翻译文件及对应路径
if(!flag) return; //加载失败则退出
qApp->installTranslator(m_translator); //应用新的区域语言设置
ui->retranslateUi(this); //重新翻译界面
接下来设置对应按钮信号槽函数触发语言界面刷新即可。
二、翻译后文本显示超出范围
有的项目控件大小是固定的,当进行文本翻译后,极容易出现翻译文本显示超出控件,导致显示不全的问题,这时候就需要重新设置翻译文本的大小来显示正常。即如图所示,翻译后的文本超出了框的大小。(这个水印不知道怎么取消(捂脸))
这种情况下马上想到就是根据选择设置对应大小如setStylesheet等,重新设置文本大小,但是如果应用的翻译文本对应的控件有成百上千个,阁下又如何面对。
目前已知方法是重新设置样式表,即QSS,根据对应的控件来设置该控件文本的大小,而该样式只有选择加载才会触发。QSS代码实现如下所示。
/*英语版样式表*/
QMainWindow#MainWindow QWidget#centralWidget QPushButton#testBt{
font-size:10px;
}
之所以这样设置与.ui文件控件关系有关,而该QSS设置的控件关系在.ui文件如图。
修改好QSS文件后,下一步就需要将其在设置系统语言为英语时,同时设置英语样式,代码如下所示。
//应用外部QSS样式表
QFile file(m_setLanguageQSS);
if(file.open(QFile::ReadOnly)){
QString styleSheet = QLatin1String(file.readAll());
qApp->setStyleSheet(styleSheet);
file.close();
}else qDebug() << "Failed to open file";
增加样式表设置后的翻译效果:
三、现实情况翻译可能遇到的问题
1.点击QT中的”工具->外部-> Linguist->更新翻译”,.ts不能识别到所有的文本,这种情况则需要手动在文件添加,目前我所尝试过的两种方法(欢迎大神们提出更多idea):
1.1在对应的代码中手动增加未tr(),如测试程序中,代码设置文本内容的部分没有识别到,
如setText("这是一个测试程序")改为setText(tr("这是一个测试程序")),那么再次更新翻译就能识别并添加翻译文本。
1.2有些情况上述方法并不能解决问题,我在实际开发中也遇到过,最终解决方法是直接打开.ts文件,增加对应的代码,例如:
<message>
<location filename="mainwindow.cpp" line="10"/>
<source>这是一个测试</source>
<translation type="unfinished"></translation>
</message>
其中filename是需要增加翻译的文件名,line是翻译文本在该文件的行数,<source></source>中是待翻译的文本,<translation type=""></translation>中type=""添加该文本的翻译,添加保存重新生成.qm文件即可,目前这种方法是直接操作翻译文件,尚未出现不成功的现象。
四、待改进的方面
在QT中尽管使用QSS样式表加载大大简化了样式表设置的流程,避免项目中多处样式表文本大小的设置而导致混乱的情况发生。但由于QSS内容对文本大小的设置,即改变了大小后,只有重新保存编译并加载到对应的环境中,才能观察到大小是否合适,每改变一次就要重新编译,重新加载,重新观察,周而复始也有极大繁琐的工作量。所以说,如果可以实现如同.ui文件中改变文本文字大小后,.ui界面就会实时更新显示的功能,那么就可以进一步省去大量时间。