Qt 界面实现多国语言的切换实例是本文要介绍的内容,一直认为Qt界面相对于还是很好实现的一种开发。多国语界面的实现,在MFC中是很别扭的。以前在作MFC时,实现多国语言的界面,只有把资源文件做成各个语言的资源DLL,在程序启动时,根据选择判断选择载入哪个DLL来获取资源。MFC的资源也是分语言的,在创建资源的时候要选择,但是这样的实现还有有弊端。最根本的原因是MFC的资源文件不是Unicode编码的,而是不同语言的本地码,至少VC6是这样的。这样在中文系统中载入日文的资源,界面出现的是乱码。

Qt内部采用的全Unicode编码,这从根本上保证了多国语界面实现的正确性和便捷性。Qt本身提供的linguist工具,就是来实现这个翻译过程的。实现多国语的步骤大体上说来有这么几步:

1、在需要被翻译的字符串前面标识tr,如QString str=tr(“hello,world!”); ,这很重要,因为翻译工具会把源码中tr标识的字符串提取出来,翻译成其他语言,如果没有用tr标识的,不会被工具提取。在界面中输入的文字,默认已经是加上tr的了,所以在翻译时也能看见。

点击(此处)折叠或打开

  1. ui->pushButton_CN->setText(tr("Chinese"));
  2. ui->pushButton_DE->setText(tr("Germen"));
  3. ui->pushButton_EN->setText(tr("English"));
  4. ui->pushButton->setText(tr("Switch"));
  5. ui->radioButton_CN->setText(tr("Chinese"));
  6. ui->radioButton_DE->setText(tr("Germen"));
  7. ui->radioButton_EN->setText(tr("English"));
  8. setWindowTitle(tr("MainWindow"));

建议:在程序中的字符串使用英文,汉语等通过多国语翻译来实现,而不要采取把汉字写在代码中。

2、在工程文件***.pro中,添加一项 TRANSLATIONS +=    ***.ts  ****.ts 扩展名为.ts是翻译的源文件,表示生成这几个文件。一般我们会在命名中把区域加进去,更好的注释这些文件是用于什么语言的,比如中文大多会这样命名 myapp_zh_CN.ts, zh_CN表示的就是中国。

点击(此处)折叠或打开

  1. TRANSLATIONS+=cn.ts \
  2. de.ts \
  3. en.ts

3、使用lupdate工具提取翻译源文件, 命令是这样的  #lupdate ***.pro ,或者通过Qt Creator的图形界面来生成***.ts文件。lupdate会解析***.pro即工程文件,生成TRANSLATIONS中的 ***.ts 几个文件,这些文件可以被linguist工具打开,按照提示一个一个的翻译成需要的文件,然后保存就OK,

linguist的使用很简单,一看界面基本就会了。上面提到的这些工具都是Qt自带的。

4、使用lrelease工具发布翻译文件的二进制文件,这样在程序运行时载入会大大的加快速度。使用方式是#lrelease ***.pro,或者通过Qt Creator的图形界面来生成***.qm文件。这个工具会提示你多少语句被翻译,多少被忽略了等。生成的文件是 ***.qm,于同名的 ***.ts只是换了一个扩展名。而这才是我们程序需要使用到的文件。

5、使用***.qm文件。关于这个,我想还是摘抄书上的原文来说明一下:

切换语言分为两种情况:
   方法1:手动导入XXX.qm文件,在更新tr("XXX")的文件。如果有子窗口的话,子窗口通过模式对话框显示,子窗口翻译可以更新;如果用非模式对话框,子窗口翻译无法更新

1. 程序载入的时候,根据当前的区域设置,自动选择语言包(.qm),即可;

2. 要求在程序运行过程中动态切换语言,需要

点击(此处)折叠或打开

  1. void MainWindow::loadLanguage()
  2. {
  3. QTranslator translator;
  4. bool b = false;
  5. b = translator.load(":/Lan/cn");
  6. qApp->installTranslator(&translator);
  7. ui->radioButton_CN->setChecked(true);
  8. RefreshUI();
  9. }
  10. void MainWindow::RefreshUI()
  11. {
  12. ui->pushButton_CN->setText(tr("Chinese"));
  13. ui->pushButton_DE->setText(tr("Germen"));
  14. ui->pushButton_EN->setText(tr("English"));
  15. ui->pushButton->setText(tr("Switch"));
  16. ui->radioButton_CN->setText(tr("Chinese"));
  17. ui->radioButton_DE->setText(tr("Germen"));
  18. ui->radioButton_EN->setText(tr("English"));
  19. setWindowTitle(tr("MainWindow"));
  20. }

点击(此处)折叠或打开

  1. void MainWindow::loadLanguage()
  2. {
  3. QTranslator translator;
  4. bool b = false;
  5. b = translator.load(":/Lan/cn");
  6. qApp->installTranslator(&translator);
  7. ui->radioButton_CN->setChecked(true);
  8. RefreshUI();
  9. }
  10. void MainWindow::RefreshUI()
  11. {
  12. ui->pushButton_CN->setText(tr("Chinese"));
  13. ui->pushButton_DE->setText(tr("Germen"));
  14. ui->pushButton_EN->setText(tr("English"));
  15. ui->pushButton->setText(tr("Switch"));
  16. ui->radioButton_CN->setText(tr("Chinese"));
  17. ui->radioButton_DE->setText(tr("Germen"));
  18. ui->radioButton_EN->setText(tr("English"));
  19. setWindowTitle(tr("MainWindow"));
  20. }

方法2:手动导入XXX.qm文件,通过ui文件,当调用qApp->installTranslator(&translator);时就会给ui文件发送的 QEvent :: LanguageChange 事件,通过调用ui->ui->retranslateUi()来更新tr("XXX")字段
需要说明的时, 一般我们使用设计器来设计 界面 UI,也就是程序源码中我们看到的 ***.ui文件,在载入翻译器后,我们应该调用 ui->retranslateUi() ,这个函数实际上就是把 界面 控件的text重新载入一遍,可以在 ui_***.cpp中看到该函数的实现。

点击(此处)折叠或打开

  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. MainWindow::MainWindow(QWidget *parent) :
  4. QMainWindow(parent),
  5. ui(new Ui::MainWindow)
  6. {
  7. ui->setupUi(this);
  8. // Refresh();
  9. initial();
  10. }
  11. MainWindow::~MainWindow()
  12. {
  13. delete ui;
  14. lan.close();
  15. }
  16. void MainWindow::initial()
  17. {
  18. m_lan_flag = LAN_EN;
  19. m_translator.load(":/Lan/en");
  20. ui->radioButton_EN->setChecked(true);
  21. qApp->installTranslator(&m_translator);
  22. RefreshUI();
  23. }
  24. void MainWindow::RefreshUI()
  25. {
  26. ui->pushButton_CN->setText(tr("Chinese"));
  27. ui->pushButton_DE->setText(tr("Germen"));
  28. ui->pushButton_EN->setText(tr("English"));
  29. ui->pushButton->setText(tr("Switch"));
  30. ui->radioButton_CN->setText(tr("Chinese"));
  31. ui->radioButton_DE->setText(tr("Germen"));
  32. ui->radioButton_EN->setText(tr("English"));
  33. setWindowTitle(tr("MainWindow"));
  34. }
  35. void MainWindow::on_pushButton_EN_clicked()
  36. {
  37. m_lan_flag = LAN_EN;
  38. autoLoadLanguage();
  39. }
  40. void MainWindow::on_pushButton_CN_clicked()
  41. {
  42. m_lan_flag = LAN_CN;
  43. // ui->radioButton_CN->setChecked(true);
  44. autoLoadLanguage();
  45. }
  46. void MainWindow::on_pushButton_DE_clicked()
  47. {
  48. m_lan_flag = LAN_DE;
  49. autoLoadLanguage();
  50. }
  51. void MainWindow::on_pushButton_clicked()
  52. {
  53. // Method 1: Load language direct
  54. loadLanguage();
  55. // Method 2: Auto load language by QEvent::LanguageChange
  56. // autoLoadLanguage();
  57. }
  58. void MainWindow::on_radioButton_CN_clicked()
  59. {
  60. m_lan_flag = LAN_CN;
  61. ui->radioButton_CN->setChecked(true);
  62. autoLoadLanguage();
  63. }
  64. void MainWindow::on_radioButton_EN_clicked()
  65. {
  66. m_lan_flag = LAN_EN;
  67. ui->radioButton_EN->setChecked(true);
  68. autoLoadLanguage();
  69. }
  70. void MainWindow::on_radioButton_DE_clicked()
  71. {
  72. m_lan_flag = LAN_DE;
  73. ui->radioButton_DE->setChecked(true);
  74. autoLoadLanguage();
  75. }
  76. void MainWindow::loadLanguage()
  77. {
  78. QTranslator translator;
  79. bool b = false;
  80. b = translator.load(":/Lan/cn");
  81. qApp->installTranslator(&translator);
  82. ui->radioButton_CN->setChecked(true);
  83. // Method A: model dialog, translate is success in sub dialog
  84. //lan.exec();
  85. // Method B: model dialog, translate is success in sub dialog
  86. lan.show();
  87. lan.raise();
  88. lan.activateWindow();
  89. }
  90. void MainWindow::autoLoadLanguage()
  91. {
  92. switch(m_lan_flag)
  93. {
  94. case LAN_CN:
  95. //m_translator.load(QString("../LanguageChange/Lan/cn")); // Use qm file by relative address
  96. m_translator.load(QString(":/Lan/cn")); // Use lan.qrc to load language
  97. break;
  98. case LAN_EN:
  99. m_translator.load(QString(":/Lan/en"));
  100. break;
  101. case LAN_DE:
  102. m_translator.load(QString(":/Lan/de"));
  103. break;
  104. }
  105. qApp->installTranslator(&m_translator);
  106. }
  107. // Method 2: Use ChangeEvent to retranslateUi
  108. void MainWindow::changeEvent(QEvent *event)
  109. {
  110. if(event->type() == QEvent::LanguageChange)
  111. ui->retranslateUi(this);
  112. else
  113. QWidget::changeEvent(event);
  114. }

6,导入XXX.qm文件,
1) 可以通过XXX.qrc文件导入,但是通过XXX.qrc文件导入的话,每次qm文件有修改或更新,需要从新导入

2) 也可以通过相对或绝对路径指定。

点击(此处)折叠或打开

  1. case LAN_CN:
  2. //m_translator.load(QString("../LanguageChange/Lan/cn")); // Use qm file by relative address

7、在帮助文档中,关于 QTranslator::load有这样一句话。

The data is not copied. The caller must be able to guarantee that data will not be deleted or modifiled.

这段话明确的说明了,QTranslator在load以后,并没有把qm文件中的数据拷贝一份,而是在需要的时候去查询字符串。如果qm在这期间被删除或修改,对程序都是有影响的。扩展开来,QTranslator必须保证要一直有效,如果在函数中定义的局部变量,函数结束后就自动释放掉了,那么翻译工作就不能正常进行。所以建议在private中定义个成员变量 QTranslator* app_translator;来确保整个翻译工作的正确性。

程序主要代码和运行效果

XXX.pro 文件

点击(此处)折叠或打开

  1. QT += core gui
  2. greaterThan(QT_MAJOR_VERSION, 4): QT += widgets
  3. TARGET = LanguageChange
  4. TEMPLATE = app
  5. SOURCES += main.cpp\
  6. mainwindow.cpp \
  7. languagewidget.cpp
  8. HEADERS += mainwindow.h \
  9. languagewidget.h
  10. FORMS += mainwindow.ui \
  11. languagewidget.ui
  12. RESOURCES += lan.qrc
  13. TRANSLATIONS+=cn.ts \
  14. de.ts \
  15. en.ts

主窗口代码

点击(此处)折叠或打开

  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. MainWindow::MainWindow(QWidget *parent) :
  4. QMainWindow(parent),
  5. ui(new Ui::MainWindow)
  6. {
  7. ui->setupUi(this);
  8. // Refresh();
  9. initial();
  10. }
  11. MainWindow::~MainWindow()
  12. {
  13. delete ui;
  14. lan.close();
  15. }
  16. void MainWindow::initial()
  17. {
  18. m_lan_flag = LAN_EN;
  19. m_translator.load(":/Lan/en");
  20. ui->radioButton_EN->setChecked(true);
  21. qApp->installTranslator(&m_translator);
  22. RefreshUI();
  23. }
  24. void MainWindow::RefreshUI()
  25. {
  26. ui->pushButton_CN->setText(tr("Chinese"));
  27. ui->pushButton_DE->setText(tr("Germen"));
  28. ui->pushButton_EN->setText(tr("English"));
  29. ui->pushButton->setText(tr("Switch"));
  30. ui->radioButton_CN->setText(tr("Chinese"));
  31. ui->radioButton_DE->setText(tr("Germen"));
  32. ui->radioButton_EN->setText(tr("English"));
  33. setWindowTitle(tr("MainWindow"));
  34. }
  35. void MainWindow::on_pushButton_EN_clicked()
  36. {
  37. m_lan_flag = LAN_EN;
  38. ui->radioButton_EN->setChecked(true);
  39. autoLoadLanguage();
  40. }
  41. void MainWindow::on_pushButton_CN_clicked()
  42. {
  43. m_lan_flag = LAN_CN;
  44. ui->radioButton_CN->setChecked(true);
  45. autoLoadLanguage();
  46. }
  47. void MainWindow::on_pushButton_DE_clicked()
  48. {
  49. m_lan_flag = LAN_DE;
  50. ui->radioButton_DE->setChecked(true);
  51. autoLoadLanguage();
  52. }
  53. void MainWindow::on_pushButton_clicked()
  54. {
  55. // Method 1: Load language direct
  56. //loadLanguage();
  57. // Method 2: Auto load language by QEvent::LanguageChange
  58. autoLoadLanguage();
  59. }
  60. void MainWindow::on_radioButton_CN_clicked()
  61. {
  62. m_lan_flag = LAN_CN;
  63. ui->radioButton_CN->setChecked(true);
  64. autoLoadLanguage();
  65. }
  66. void MainWindow::on_radioButton_EN_clicked()
  67. {
  68. m_lan_flag = LAN_EN;
  69. ui->radioButton_EN->setChecked(true);
  70. autoLoadLanguage();
  71. }
  72. void MainWindow::on_radioButton_DE_clicked()
  73. {
  74. m_lan_flag = LAN_DE;
  75. ui->radioButton_DE->setChecked(true);
  76. autoLoadLanguage();
  77. }
  78. void MainWindow::loadLanguage()
  79. {
  80. QTranslator translator;
  81. bool b = false;
  82. b = translator.load(":/Lan/cn");
  83. qApp->installTranslator(&translator);
  84. ui->radioButton_CN->setChecked(true);
  85. // Method A: model dialog, translate is success in sub dialog
  86. //lan.exec();
  87. // Method B: model dialog, translate is success in sub dialog
  88. lan.show();
  89. lan.raise();
  90. lan.activateWindow();
  91. }
  92. void MainWindow::autoLoadLanguage()
  93. {
  94. switch(m_lan_flag)
  95. {
  96. case LAN_CN:
  97. //m_translator.load(QString("../LanguageChange/Lan/cn")); // Use qm file by relative address
  98. m_translator.load(QString(":/Lan/cn")); // Use lan.qrc to load language
  99. break;
  100. case LAN_EN:
  101. m_translator.load(QString(":/Lan/en"));
  102. break;
  103. case LAN_DE:
  104. m_translator.load(QString(":/Lan/de"));
  105. break;
  106. }
  107. qApp->installTranslator(&m_translator);
  108. lan.show();
  109. lan.raise();
  110. lan.activateWindow();
  111. }
  112. // Method 2: Use ChangeEvent to retranslateUi
  113. void MainWindow::changeEvent(QEvent *event)
  114. {
  115. if(event->type() == QEvent::LanguageChange)
  116. ui->retranslateUi(this);
  117. else
  118. QWidget::changeEvent(event);
  119. }

子窗口代码

点击(此处)折叠或打开

  1. #include "languagewidget.h"
  2. #include "ui_languagewidget.h"
  3. languageWidget::languageWidget(QDialog *parent) :
  4. QDialog(parent),
  5. ui(new Ui::languageWidget)
  6. {
  7. ui->setupUi(this);
  8. m_lan_flag = LAN_EN;
  9. RefreshUI();
  10. }
  11. languageWidget::~languageWidget()
  12. {
  13. delete ui;
  14. }
  15. void languageWidget::RefreshUI()
  16. {
  17. ui->pushButton_CN->setText(tr("Chinese"));
  18. ui->pushButton_EN->setText(tr("English"));
  19. ui->pushButton_GE->setText(tr("Germen"));
  20. setWindowTitle(tr("Form"));
  21. }
  22. void languageWidget::on_pushButton_EN_clicked()
  23. {
  24. m_lan_flag = LAN_EN;
  25. autoLoadLanguage();
  26. }
  27. void languageWidget::on_pushButton_CN_clicked()
  28. {
  29. m_lan_flag = LAN_CN;
  30. autoLoadLanguage();
  31. }
  32. void languageWidget::on_pushButton_GE_clicked()
  33. {
  34. m_lan_flag = LAN_DE;
  35. autoLoadLanguage();
  36. }
  37. void languageWidget::setlanguage(int language)
  38. {
  39. m_lan_flag = language;
  40. }
  41. void languageWidget::autoLoadLanguage()
  42. {
  43. switch(m_lan_flag)
  44. {
  45. case LAN_CN:
  46. //m_translator.load(QString("../LanguageChange/Lan/cn")); // Use qm file by relative address
  47. m_translator.load(QString(":/Lan/cn")); // Use lan.qrc to load language
  48. break;
  49. case LAN_EN:
  50. m_translator.load(QString(":/Lan/en"));
  51. break;
  52. case LAN_DE:
  53. m_translator.load(QString(":/Lan/de"));
  54. break;
  55. }
  56. qApp->installTranslator(&m_translator);
  57. }
  58. // Method 2: Use ChangeEvent to retranslateUi
  59. void languageWidget::changeEvent(QEvent *event)
  60. {
  61. if(event->type() == QEvent::LanguageChange)
  62. ui->retranslateUi(this);
  63. else
  64. QWidget::changeEvent(event);
  65. }

子窗口弹出

语言自动切换

本文转自:
http://blog.chinaunix.net/uid-20570485-id-4418782.html

Qt多语言实现和动态切换(国际化)相关推荐

  1. QT实现多国语言的动态切换

    摘要:本文论述了如何使用QT实现程序的多语系支持以及多语系的动态切换. 前沿 我们生活中用到的程序大多都是支持单一语言的,比如在中国我们用到的软件大多是汉语的,也有很少部分使用的是英语的,但是很少有软 ...

  2. QT 中英文切换-国际化(解决部分翻译不起作用的问题)

    中英文切换-国际化 1.先看效果 2.核心代码(重新赋值刷新翻译文本) 2.0 pro文件配置 2.1 构造函数 2.2 两个按钮点击事件 3.翻译文件的生成与配置 4. 参考链接 1.先看效果 2. ...

  3. QML程序实现动态切换多语言

    原文地址::https://zhuanlan.zhihu.com/p/40815590 Qt程序中实现多语言有Qt自己的一套机制,然而目前在5.9版本下该机制无法在程序运行期间动态切换语言.本文向大家 ...

  4. R语言plotly包可视化线图(line plot)、使用restyle参数自定义设置可视化结果中线条的颜色、使用按钮动态切换线条的颜色(change line color with button)

    R语言plotly包可视化线图(line plot).使用restyle参数自定义设置可视化结果中线条的颜色.使用按钮动态切换线条的颜色(change line color with button i ...

  5. APP,实现多国语言动态切换

    网上一个辅助类,找不到原博主文章链接,这里就直接贴出辅助类代码(自己再优化了一下).公司项目APP要支持13种语言,如下: 1.工具类 import android.content.Context; ...

  6. Android(国际化)多语言的实现和切换

    1.直接创建  常用的values目录对应的国家和地区 中文(中国):values-zh-rCN 中文(台湾):values-zh-rTW 中文(香港):values-zh-rHK 英语(美国):va ...

  7. 用C语言画出动态的图片,Qt通过图片组绘制动态图片

    本文实例为大家分享了Qt通过图片组绘制动态图片的具体代码,供大家参考,具体内容如下 任务实现: 通过定时器的使用来依次调用资源文件中的静态图片文件,从而达到是图片中内容动起来的效果: 效果实现: 实现 ...

  8. QT 多语言 字库 编码 文字方向相关问题

    QT是支持多语言的,能够支持不同语言的动态切换,不同语言对应的编码格式转换,不同语言字体使用不同字库进行显示. 编码 QT对于字符串的处理使用了基本类型QString,它将所有传递给它的字符串或者字符 ...

  9. c语言增加动态分配的存储空间吗,C语言 关于内存动态分配问题

    全局变量:分配到 内存的静态区. 局部变量(非静态):分配到 内存的动态区.在存储区中称为栈(stack) 临时数据(C允许内存动态分配区域):存放在自由空间区,称为堆区(heap) 内存动态分配 得 ...

最新文章

  1. angular轮播图
  2. 「后端小伙伴来学前端了」Element修改默认样式 | 记录自己学习前端踩坑日记
  3. 软件开发向大数据开发过渡_如何过渡到开发人员关系职业
  4. RHEL5.8系统裁减(内含做小Linux前的准备工作)
  5. 微信小程序开发实战——模块化
  6. CSS3实践之路(四):文本特效
  7. 1小时学会jQuery,全程无废话,直接上代码
  8. nbu备份oracle中途停止,NBU异构还原Oracle完整备份的一些总结
  9. 传感器系列之4.6雨滴传感器
  10. iphone 最具人气的论坛,网站,博客等
  11. 【操作系统】HRT任务和SRT任务(实时系统中的硬实时系统和软实时系统)
  12. tomcat启动成功并能运行项目,但无法显示那只小猫
  13. 内蒙古电大计算机考试成绩查询成绩查询,2021年网络教育7月统考成绩查询时间及入口...
  14. 【机器学习】常见问题
  15. 虚幻引擎 Unreal Engine 详细笔记 根据谌嘉诚视频无遗漏总结 快速上手
  16. apache默认端口号是多少
  17. 理解Play框架线程池
  18. 【ESD专题】ESD和EOS有什么差异?
  19. Socket 系统调用深入研究(TCP协议的整个通信过程)
  20. 艾永亮:打造超级产品,互联网公司的风水转到哪儿了?

热门文章

  1. KBP206-ASEMI整流桥KBP206
  2. 连夜下架杨笠代言的Intel,扯下了科技圈“男孩俱乐部”的遮羞布
  3. moment基本使用
  4. momentjs常用封装
  5. 【codevs 2913】建筑抢修
  6. 第十二届蓝桥杯(2021年)模拟赛 Python组(第一期) 题目+个人解答
  7. 《iOS Human Interface Guidelines》——iCloud
  8. 79-Java案例:斗地主游戏
  9. 项目实战——匹配系统(中)
  10. iPhone完整截屏