QT GUI提供了语言动态转换的机制并辅以相应的工具实现界面的多语言实时动态切换功能。
一、 语言切换的实质
当界面上有一个地方需要显示字符串strA时,在代码中对这个字符串做一个标记,当程序执行到这个标记时会去一个翻译文件中找到这个标记对应的内容,然后将此内容实际的显示到界面。所以,要实现语言切换必须做到:
1、在代码中对需要做语言切换的地方要有标记;
2、有对应的翻译文件供应用程序加载。
二、 语言切换步骤
1、 在写代码时,对需要实现多语言的字符串用tr修饰符修饰,起到标记作用,具有做法参见例程;
2、 制作翻译文件。制作方法见下面例程;
3、 在代码中实现切换语言的地方实现翻译文件的加载以及界面字符的更新显示。
三、 动态语言切换demo程序制作
1、编写代码如下:
- <span style="font-size:24px;">Ltest.pro
- </span>
- #-------------------------------------------------
- #
- # Project created by QtCreator 2011-12-21T20:08:07
- #
- #-------------------------------------------------
- QT += core gui
- TARGET = Ltest
- TEMPLATE = app
- SOURCES += main.cpp\
- mainwindow.cpp
- HEADERS += mainwindow.h
- <span style="font-size:24px;">TRANSLATIONS = chinese.ts\
- english.ts</span>
- <span style="font-size:24px;">Ltest.pro
- </span>
- #-------------------------------------------------
- #
- # Project created by QtCreator 2011-12-21T20:08:07
- #
- #-------------------------------------------------
- QT += core gui
- TARGET = Ltest
- TEMPLATE = app
- SOURCES += main.cpp\
- mainwindow.cpp
- HEADERS += mainwindow.h
- <span style="font-size:24px;">TRANSLATIONS = chinese.ts\
- english.ts</span>
- <span style="font-size:24px;">main.cpp</span>
- <span style="font-size:24px;">main.cpp</span>
- #include <QtGui/QApplication>
- #include "mainwindow.h"
- int main(int argc, char *argv[])
- {
- QApplication a(argc, argv);
- MainWindow w;
- w.show();
- return a.exec();
- }
- #include <QtGui/QApplication>
- #include "mainwindow.h"
- int main(int argc, char *argv[])
- {
- QApplication a(argc, argv);
- MainWindow w;
- w.show();
- return a.exec();
- }
- <span style="font-size:24px;">MainWindow.h</span>
- <span style="font-size:24px;">MainWindow.h</span>
- #ifndef MAINWINDOW_H
- #define MAINWINDOW_H
- #include <QtGui>
- #include <QMainWindow>
- class MainWindow : public QMainWindow
- {
- Q_OBJECT
- public:
- explicit MainWindow(QWidget *parent = 0);
- ~MainWindow();
- void updateUi();
- private:
- QPushButton *m_pBtnChange;
- bool m_bChinese;
- public:
- QTranslator *m_pTranslator;
- public slots:
- void ChangeLanguage();
- };
- #endif // MAINWINDOW_H
- #ifndef MAINWINDOW_H
- #define MAINWINDOW_H
- #include <QtGui>
- #include <QMainWindow>
- class MainWindow : public QMainWindow
- {
- Q_OBJECT
- public:
- explicit MainWindow(QWidget *parent = 0);
- ~MainWindow();
- void updateUi();
- private:
- QPushButton *m_pBtnChange;
- bool m_bChinese;
- public:
- QTranslator *m_pTranslator;
- public slots:
- void ChangeLanguage();
- };
- #endif // MAINWINDOW_H
- <span style="font-size:24px;">MainWindow.cpp</span>
- <span style="font-size:24px;">MainWindow.cpp</span>
- #include "mainwindow.h"
- MainWindow::MainWindow(QWidget *parent) :
- QMainWindow(parent),
- m_pBtnChange(NULL),
- m_bChinese(true),
- m_pTranslator(NULL)
- {
- m_pTranslator = new QTranslator;
- m_pBtnChange = new QPushButton(this);
- connect(m_pBtnChange,SIGNAL(clicked()),this,SLOT(ChangeLanguage()));
- ChangeLanguage();
- }
- MainWindow::~MainWindow()
- {
- }
- void MainWindow::updateUi()
- {
- <span style="font-size:24px;"> setWindowTitle(tr("Main Frame"));
- m_pBtnChange -> setText(tr("change"));
- </span><span style="font-size:13px;">}
- </span>void MainWindow::ChangeLanguage()
- {
- QString exePath = QApplication::applicationDirPath();
- QString QmName;
- QTranslator Translator;
- if(m_bChinese)
- {
- m_bChinese = false;
- QmName = <span style="font-size:24px;">"chinese.qm";
- </span> }
- else
- {
- m_bChinese = true;
- QmName = <span style="font-size:24px;">"english.qm";
- </span> }
- if( m_pTranslator->load(QmName,exePath) )
- {
- <span style="font-size:24px;">qApp ->installTranslator(m_pTranslator);
- </span> }
- <span style="font-size:24px;">updateUi();
- </span>}
- #include "mainwindow.h"
- MainWindow::MainWindow(QWidget *parent) :
- QMainWindow(parent),
- m_pBtnChange(NULL),
- m_bChinese(true),
- m_pTranslator(NULL)
- {
- m_pTranslator = new QTranslator;
- m_pBtnChange = new QPushButton(this);
- connect(m_pBtnChange,SIGNAL(clicked()),this,SLOT(ChangeLanguage()));
- ChangeLanguage();
- }
- MainWindow::~MainWindow()
- {
- }
- void MainWindow::updateUi()
- {
- <span style="font-size:24px;"> setWindowTitle(tr("Main Frame"));
- m_pBtnChange -> setText(tr("change"));
- </span><span style="font-size:13px;">}
- </span>void MainWindow::ChangeLanguage()
- {
- QString exePath = QApplication::applicationDirPath();
- QString QmName;
- QTranslator Translator;
- if(m_bChinese)
- {
- m_bChinese = false;
- QmName = <span style="font-size:24px;">"chinese.qm";
- </span> }
- else
- {
- m_bChinese = true;
- QmName = <span style="font-size:24px;">"english.qm";
- </span> }
- if( m_pTranslator->load(QmName,exePath) )
- {
- <span style="font-size:24px;">qApp ->installTranslator(m_pTranslator);
- </span> }
- <span style="font-size:24px;">updateUi();
- </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、 尽量将界面字符显示的语句整合到一个函数中,在需要切换语言时在加载翻译文件后只需要调用这个函数,再次刷新界面字符显示即可。
符显示内容在有对应的翻译文件并这个翻译文件被加载的情况下是无效的,显示的内容为翻译文件对应的内容;