新建Qt项目,使用tr对所有要展示的QString做包装

代码如下:
pro文件:

  1. BIN_RELEASE = $$PWD/bin/Release
  2. BIN_DEBUG = $$PWD/bin/Debug
  3. QT += core gui widgets
  4. CONFIG += ordered debug_and_release
  5. CONFIG(debug, debug|release) {
  6. TARGET = pcsd
  7. TEMPLATE = app
  8. DESTDIR = $$BIN_DEBUG
  9. } else {
  10. TARGET = pcs
  11. TEMPLATE = app
  12. DESTDIR = $$BIN_RELEASE
  13. }
  14. TRANSLATIONS += language_zh.ts \
  15. language_en.ts
  16. SOURCES += main.cpp\
  17. QtGlobalizationDemo.cpp
  18. HEADERS += \
  19. QtGlobalizationDemo.h
  20. FORMS += \
  21. QtGlobalizationDemo.ui

头文件

  1. ///////////////////////////////头文件////////////////////////////////////////////
  2. #ifndef QTGLOBALIZATIONDEMO_H
  3. #define QTGLOBALIZATIONDEMO_H
  4. #include <QMainWindow>
  5. namespace Ui {
  6. class QtGlobalizationDemo;
  7. }
  8. class QTranslator;
  9. class QtGlobalizationDemo : public QMainWindow
  10. {
  11. Q_OBJECT
  12. public:
  13. enum LanguageIds
  14. {
  15. UI_UNINIT = -1,
  16. UI_ZN = 0,
  17. UI_EN = 1,
  18. };
  19. public:
  20. explicit QtGlobalizationDemo(QWidget *parent = 0);
  21. ~QtGlobalizationDemo();
  22. void initTranslator(QTranslator *trans);
  23. protected slots:
  24. void onSwitchLanguage(int ids);
  25. private:
  26. void updateText();
  27. bool loadLanguage(const QString &languageFile);
  28. private:
  29. Ui::QtGlobalizationDemo *ui;
  30. int m_languageIds;
  31. QTranslator* m_translator;
  32. };
  33. #endif // QTGLOBALIZATIONDEMO_H

源文件:

  1. ///////////////////////////////源文件////////////////////////////////////////////
  2. #include "QtGlobalizationDemo.h"
  3. #include "ui_QtGlobalizationDemo.h"
  4. #include <QString>
  5. #include <QTranslator>
  6. #include <QDir>
  7. #include <QDebug>
  8. QtGlobalizationDemo::QtGlobalizationDemo(QWidget *parent)
  9. : QMainWindow(parent)
  10. , ui(new Ui::QtGlobalizationDemo)
  11. , m_languageIds(UI_UNINIT)
  12. , m_translator(NULL)
  13. {
  14. ui->setupUi(this);
  15. updateText();
  16. connect(ui->switchLang, SIGNAL(currentIndexChanged(int)), this, SLOT(onSwitchLanguage(int)));
  17. }
  18. QtGlobalizationDemo::~QtGlobalizationDemo()
  19. {
  20. delete ui;
  21. }
  22. void QtGlobalizationDemo::initTranslator(QTranslator *trans)
  23. {
  24. m_translator = trans;
  25. }
  26. void QtGlobalizationDemo::onSwitchLanguage(int ids)
  27. {
  28. QString language;
  29. switch (ids) {
  30. case UI_ZN:
  31. language = QString("resource/language_zh");
  32. break;
  33. case UI_EN:
  34. language = QString("resource/language_en");
  35. break;
  36. default:
  37. language = QString("resource/language_zh");
  38. break;
  39. }
  40. if (m_languageIds != ids) {
  41. loadLanguage(language);
  42. m_languageIds = ids;
  43. }
  44. }
  45. void QtGlobalizationDemo::updateText()
  46. {
  47. ui->curLag->setText(tr("Language"));
  48. ui->content->setWordWrap(true);
  49. ui->content->setText(tr("Young idler, an old beggar."));
  50. setWindowTitle(tr("Qt international programming code test"));
  51. if (ui->switchLang->count() <= 0) {
  52. ui->switchLang->insertItem(UI_ZN, tr("Chinese"));
  53. ui->switchLang->insertItem(UI_EN, tr("English"));
  54. } else {
  55. ui->switchLang->setItemText(UI_ZN, tr("Chinese"));
  56. ui->switchLang->setItemText(UI_EN, tr("English"));
  57. }
  58. }
  59. bool QtGlobalizationDemo::loadLanguage(const QString &languageFile)
  60. {
  61. if (languageFile.isNull()) {
  62. return false;
  63. }
  64. if (m_translator == NULL) {
  65. return false;
  66. }
  67. qApp->removeTranslator(m_translator);
  68. if (m_translator->load(languageFile)) {
  69. qApp->installTranslator(m_translator);
  70. updateText();
  71. return true;
  72. } else {
  73. qDebug() << "------->> load language file error." << languageFile;
  74. }
  75. return false;
  76. }

制作ts文件

首先,必须再pro文件中加入如下代码:

  1. TRANSLATIONS += language_zh.ts \
  2. language_en.ts

然后生成ts文件
操作步骤:工具->外部->qt语言家->更新翻译
Qt国际化 - 图1
Qt国际化 - 图2

生成qm文件

操作:使用Qt linguist.exe工具打开刚才生成的ts文件,编辑翻译:
Qt国际化 - 图3
编辑完成后,保存,发布:
Qt国际化 - 图4
这时候,我们就能再ts文件所在目录下发现生成了的qm文件
Qt国际化 - 图5
我们代码中load这个文件,就可以实现国际化的切换

总结:

  • 首先,新建项目,在pro文件中编辑生成ts文件的路径

  • 在代码中要显示的字符串都用tr()包含

  • 使用Qt工具里面的更新翻译,生成ts文件

  • 使用Qt工具linguist.exe 打开ts文件,进行翻译,最后发布生成qm文件

  • 把这个qm文件放到程序exe路径下

  • 代码中使用QTranslator加载这个qm文件,使用qApp->installTranslator(QTranslator * messageFile)方法安装翻译文件