QT应用程序中多国翻译与翻译文字适配

一、多国语言翻译

       在应用开发中,随着产品不断推广,使用应用的人群也在逐渐国际化。原本默认的中文语言总不可避免的需要增加英语甚至更多的语言。而在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界面就会实时更新显示的功能,那么就可以进一步省去大量时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值