Qt之动态语言切换

QT GUI提供了语言动态转换的机制并辅以相应的工具实现界面的多语言实时动态切换功能。

一、         语言切换的实质

当界面上有一个地方需要显示字符串strA时,在代码中对这个字符串做一个标记,当程序执行到这个标记时会去一个翻译文件中找到这个标记对应的内容,然后将此内容实际的显示到界面。所以,要实现语言切换必须做到:

1、在代码中对需要做语言切换的地方要有标记;

2、有对应的翻译文件供应用程序加载。

二、         语言切换步骤

1、 在写代码时,对需要实现多语言的字符串用tr修饰符修饰,起到标记作用,具有做法参见例程;

2、 制作翻译文件。制作方法见下面例程;

3、 在代码中实现切换语言的地方实现翻译文件的加载以及界面字符的更新显示。

三、         动态语言切换demo程序制作

1、编写代码如下:

[plain]  view plain copy
  1. <span style="font-size:24px;">Ltest.pro   
  2. </span>  
  3. #-------------------------------------------------  
  4. #  
  5. # Project created by QtCreator 2011-12-21T20:08:07  
  6. #  
  7. #-------------------------------------------------  
  8.   
  9. QT       += core gui  
  10.   
  11. TARGET = Ltest  
  12. TEMPLATE = app  
  13.   
  14.   
  15. SOURCES += main.cpp\  
  16.         mainwindow.cpp  
  17.   
  18. HEADERS  += mainwindow.h  
  19.   
  20. <span style="font-size:24px;">TRANSLATIONS = chinese.ts\  
  21.                english.ts</span>  
[plain]  view plain copy
  1. <span style="font-size:24px;">main.cpp</span>  
[plain]  view plain copy
  1. #include <QtGui/QApplication>  
  2. #include "mainwindow.h"  
  3.   
  4. int main(int argc, char *argv[])  
  5. {  
  6.     QApplication a(argc, argv);  
  7.     MainWindow w;  
  8.     w.show();  
  9.   
  10.     return a.exec();  
  11. }  
[plain]  view plain copy
  1. <span style="font-size:24px;">MainWindow.h</span>  
[plain]  view plain copy
  1. #ifndef MAINWINDOW_H  
  2. #define MAINWINDOW_H  
  3.   
  4. #include <QtGui>  
  5. #include <QMainWindow>  
  6.   
  7.   
  8. class MainWindow : public QMainWindow  
  9. {  
  10.     Q_OBJECT  
  11.   
  12. public:  
  13.     explicit MainWindow(QWidget *parent = 0);  
  14.     ~MainWindow();  
  15.     void updateUi();  
  16. private:  
  17.     QPushButton *m_pBtnChange;  
  18.     bool m_bChinese;  
  19. public:  
  20.     QTranslator *m_pTranslator;  
  21. public slots:  
  22.     void ChangeLanguage();  
  23. };  
  24.   
  25. #endif // MAINWINDOW_H  
[plain]  view plain copy
  1. <span style="font-size:24px;">MainWindow.cpp</span>  
[plain]  view plain copy
  1.    
[plain]  view plain copy
  1. #include "mainwindow.h"  
  2.   
  3. MainWindow::MainWindow(QWidget *parent) :  
  4.     QMainWindow(parent),  
  5.     m_pBtnChange(NULL),  
  6.     m_bChinese(true),  
  7.     m_pTranslator(NULL)  
  8. {  
  9.     m_pTranslator = new QTranslator;  
  10.   
  11.     m_pBtnChange = new QPushButton(this);  
  12.     connect(m_pBtnChange,SIGNAL(clicked()),this,SLOT(ChangeLanguage()));  
  13.   
  14.     ChangeLanguage();  
  15. }  
  16.   
  17. MainWindow::~MainWindow()  
  18. {  
  19.   
  20. }  
  21. void MainWindow::updateUi()  
  22. {  
  23.  <span style="font-size:24px;">   setWindowTitle(tr("Main Frame"));  
  24.     m_pBtnChange -> setText(tr("change"));  
  25. </span><span style="font-size:13px;">}  
  26. </span>void MainWindow::ChangeLanguage()  
  27. {  
  28.     QString exePath = QApplication::applicationDirPath();  
  29.     QString QmName;  
  30.     QTranslator Translator;  
  31.   
  32.     if(m_bChinese)  
  33.     {  
  34.        m_bChinese = false;  
  35.        QmName = <span style="font-size:24px;">"chinese.qm";  
  36. </span>    }  
  37.     else  
  38.     {  
  39.        m_bChinese = true;  
  40.        QmName = <span style="font-size:24px;">"english.qm";  
  41. </span>    }  
  42.   
  43.     if( m_pTranslator->load(QmName,exePath) )  
  44.     {  
  45.         <span style="font-size:24px;">qApp ->installTranslator(m_pTranslator);  
  46. </span>    }  
  47.   
  48.     <span style="font-size:24px;">updateUi();  
  49. </span>}  


 

2、翻译文件制作(分三步走)

第一步、生成*.ts可读的翻译文件。方法很多,这样用Qt 4.7.7 Command Prompt调用lupdate命令生成。

 

一段时间后提示完成:

生成结果如下:

第二步、由翻译人员逐文件逐翻译点进行翻译。工具很多,这里演示使用Qt自带的Linguist。

第三步、某个*.ts文件翻译完成后,Release生成*.qm文件:

 

生成结果如下:

3、将生成的*.qm文件放置在代码中预置的地方,至此完毕。例程中qm文件和   应用程序处在同级目录。

初始化加载中文:

点击“切换语言”后,变成英文,再次点击“Shift Language”后又切回中文:

四、注意事项

1、 所以要翻译的字符都用tr函数进行包含;

2、 tr函数包含的字符显示内容在有对应的翻译文件并这个翻译文件被加载的情况下是无效的,显示的内容为翻译文件对应的内容;

3、 代码不能在装有加密软件的环境中生成,否则在进行翻译文件制作时lupdate找不到tr函数包含的字符串;

4、 尽量将界面字符显示的语句整合到一个函数中,在需要切换语言时在加载翻译文件后只需要调用这个函数,再次刷新界面字符显示即可。

符显示内容在有对应的翻译文件并这个翻译文件被加载的情况下是无效的,显示的内容为翻译文件对应的内容;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值