【Qt】Qt国际化【转】
简介
Qt国际化属于Qt高级中的一部分,本想着放到后面来说,上节刚好介绍了Qt Linguist,趁热打铁就一起了解下。
对于绝大多数的应用程序,在刚启动时,需要加载默认的语言(或最后一次设置的语言)。在使用的过程中,我们也不需要重启应用程序而实现语言的动态切换。这样的话,易用性就非常好了。
多语言切换
要进行多语言的切换,需要执行以下步骤:
对用户可见的文本信息全部使用tr()进行封装
提供用户可以用来切换语言的一种方法。
对于每一个窗口部件或者对话框,重写changeEvent事件,当事件类型为QEvent::LanguageChange时,翻译文本进行重新调用(为了简单我把它放在一个单独的函数translateUI()中)。
源码分析
我们来看一个简单的示例:主界面、设置界面,设置界面可根据选择不同语言下拉选项实现语言的动态切换!
为了简单起见,这里只给出关键代码(源码下载请参考最下面下载地址):
设置界面:setting_dialog.h
typedef enum{
UI_ZH,
UI_EN
}LANGUAGE;
Q_DECLARE_METATYPE(LANGUAGE)
设置界面:setting_dialog.cpp
language_combo_box->addItem("chinese", QVariant::fromValue(UI_ZH));
language_combo_box->addItem("english", QVariant::fromValue(UI_EN));
qRegisterMetaType<LANGUAGE>("LANGUAGE");
connect(language_combo_box, static_cast<void (QComboBox::*)(int)>(&QComboBox::currentIndexChanged), this, &SettingDialog::onIndexChanged);
void SettingDialog::changeEvent(QEvent *event)
{
switch (event->type())
{
case QEvent::LanguageChange:
translateUI();
break;
default:
QDialog::changeEvent(event);
}
}
void SettingDialog::translateUI()
{
this->setWindowTitle(tr("setting dialog"));
info_label->setText(tr("no brothers no programming"));
language_label->setText(tr("language"));
language_combo_box->setItemText(UI_ZH, tr("chinese"));
language_combo_box->setItemText(UI_EN, tr("english"));
}
void SettingDialog::onIndexChanged()
{
LANGUAGE language = language_combo_box->currentData().value<LANGUAGE>();
emit switchLanguage(language);
}
主界面:MainWidget.cpp
connect(setting_dialog, &SettingDialog::switchLanguage, this, &MainWidget::switchLanguage);
void MainWidget::translateUI()
{
this->setWindowTitle(tr("main widget"));
welcome_label->setText(tr("welcome to Qt") + QString("26197884/26188347"));
setting_button->setText(tr("setting"));
ok_button->setText(tr("ok"));
cancel_button->setText(tr("cancel"));
}
void MainWidget::setLanguage(LANGUAGE current_language)
{
this->current_language = current_language;
}
void MainWidget::setTranslator(QTranslator* translator)
{
this->translator = translator;
}
void MainWidget::changeEvent(QEvent *event)
{
switch (event->type())
{
case QEvent::LanguageChange:
translateUI();
break;
default:
QWidget::changeEvent(event);
}
}
void MainWidget::switchLanguage(LANGUAGE language)
{
QString language_qm;
switch(language)
{
case UI_ZH:
language = UI_ZH;
language_qm = QString(":/qm/main_widget_zh");
break;
case UI_EN:
language = UI_EN;
language_qm = QString(":/qm/main_widget_en");
break;
default:
language = UI_ZH;
language_qm = QString(":/qm/main_widget_zh");
}
if(current_language != language)
{
current_language = language;
translator->load(language_qm);
Util::writeInit(QString("./user.ini"), QString("language"), QString::number(language, 10));
}
}
main.cpp
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QString language_value;
QString language_suffix = QString("zh");
LANGUAGE language = UI_ZH;
bool is_read = Util::readInit(QString("./user.ini"), QString("language"), language_value);
if(is_read)
{
language = (LANGUAGE)language_value.toInt();
if(language == UI_EN)
{
language_suffix = QString("en");
}
}
QTranslator translator;
translator.load(QString(":/qm/main_widget_") + language_suffix);
app.installTranslator(&translator);
MainWidget main_widget;
main_widget.setTranslator(&translator);
main_widget.setLanguage(language);
main_widget.show();
return app.exec();
}
流程:
进入main(),首先加载默认的语言(或最后一次设置的语言),然后显示主界面。
当打开设置界面后,首先加载当前选择的语言,然后通过下拉设置语言选项来进行语言切换(设置界面的switchLanguage信号关联到主界面的switchLanguage槽中),然后将当前的语言进行保存。
语言切换后,首先会进入changeEvent函数,判断当事件类型为QEvent::LanguageChange时,就会执行translateUI函数进行文本重新显示。
注:
Q_DECLARE_METATYPE:如果要使自定义类型或其他非QMetaType内置类型在QVariant中使用,必须使用该宏 。
qRegisterMetaType:如果非QMetaType内置类型要在信号与槽中使用。
添加翻译源
为了方便,这里只介绍中、英文之间的切换。
在pro中添加:
TRANSLATIONS = Resource/main_widget_zh.ts \
Resource/main_widget_en.ts
选择:工具->外部->Qt语言家->更新翻译,则会生成对应的ts文件。
翻译
使用Qt Linguist打开要翻译的ts文件,对翻译源进行相应语言的翻译。
可参考:Qt Linguist介绍
发布翻译
选择:文件->发布,就会生成对应的qm文件。
加载翻译文件
使用QTranslator来加载生成的qm文件,就可以让程序显示指定的语言。
QTranslator translator;
translator.load(":/qm/main_widget_zh");
app.installTranslator(&translator);
源码下载
原文作者:一去丶二三里
作者博客:去作者博客空间
【Qt】Qt国际化【转】的更多相关文章
- 使用 PySide2 开发 Maya 插件系列三:qt语言国际化(internationalization)
使用 PySide2 开发 Maya 插件系列三:qt语言国际化(internationalization) 前言: 这是 qt for python 的语言国际化,基于 UI 的,python 也有 ...
- Qt... configure: error: Qt (>= Qt 2.2.2) (headers…
转载:http://blog.chinaunix.net/uid-23733724-id-290980.html 昨天开始在自己的fedora12下装qt~ 但是按照教程在/opt/Embed ...
- Qt, QT/E, Qtopia 的区别
转自Qt, QT/E, Qtopia 的区别 Qt泛指Qt的所有桌面版本,比如Qt/X11,Qt Windows,Qt Mac等.由于Qt最早是在Linux中随着KDE流行开来的,因此通常很多人说的Q ...
- QT QT creator QTsdk的区别
Qt是一个跨平台的C++图形用户界面应用程序框架.它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能.Qt是完全面向对象的,很容易扩展,并且允许真正地组件编程. QT Creator 跨平台 ...
- QT,QT SDK, QT Creator 区别
Qt是一个跨平台的C++图形用户界面应用程序框架.(不仅仅是C++,还包括QML,Qquick,html5)它提供给应用程序开发者建立艺术级的图形用户界面所需的所用功能.Qt是完全面向对象的,很容易扩 ...
- Qt之国际化(系统文本-QMessageBox按钮、QLineEdit右键菜单等)
简介 使用Qt的时候,经常会遇到英文问题,例如:QMessageBox中的按钮.QLineEdit.QSpinBox.QScrollBar中的右键菜单等.通常情况下,我们软件都不会是纯英文的,那么如何 ...
- Qt之国际化
简介 Qt国际化属于Qt高级中的一部分,本想着放到后面来说,上节刚好介绍了Qt Linguist,趁热打铁就一起了解下. 对于绝大多数的应用程序,在刚启动时,需要加载默认的语言(或最后一次设置的语言) ...
- (三)Qt语言国际化
Vs 2010+ Qt5 实现语言国际化 创建一个工程,cpp代码如下: 1.创建工程 #include "languageinternationalized.h" #includ ...
- 配置CLion管理Qt项目国际化支持
随着Qt 6的发布,cmake也正式宣告接管qmake的工作了. 在之前的一篇博客里我介绍了如何使用cmake管理你的qt项目,不过有一点我没有讲,那就是对国际化(i18n)的处理. 今天我们就来介绍 ...
- qt 程序国际化
http://www.cnblogs.com/hujian/archive/2012/08/10/2631488.html
随机推荐
- Maven-编译打包
1. 打包时忽略测试阶段 mvn clean mvn package -DskipTests
- Handsontable 学习笔记-Methods
Handson: 亲自实践 先给出数据源和基本配置: var data =[ ["A1","B1","C1","D1"] ...
- 【Android 界面效果33】二级listview列表
今天来实现以下大众点评客户端的横向listview二级列表,先看一下样式. 这种横向的listview二级列表在手机软件上还不太常见,但是使用过平板的都应该知道,在平板上市比较常见的.可能是因为平板屏 ...
- 安卓Design包之CollapsingToolbarLayout(可折叠的工具栏布局)的简单使用
转自: CollapsingToolbarLayout的使用 注意:使用前需要添加Design依赖包,使用toolbar时需要隐藏标题头 CollapsingToolbarLayout作用是提供了一个 ...
- Oracle基础(十) DML数据操作
一.DML数据操作语言 主要用于检索.插入和修改数据库信息.它是最常用的SQL命令,如INSERT(插入).UPDATE(更新).SELECT(选择).DELETE(删除). 1.INSERT插入语句 ...
- Oracle 11g R2 for Win7旗舰版(64位)的安装步骤
1.下载Oracle 11g R2 for Windows的版本 下载地址:http://www.oracle.com/technetwork/database/enterprise-edition/ ...
- ORACLE中大数据量查询实现优化
大数据量查询,对数据库开发者来说,性能问题往往是最需要费尽心机的,借此总结自己优化此类问题的心得与大家分享,以免大家走更多的弯路. 1.使用主键临时表 大数据量表关联查询,是性能开销的主要原因.通过主 ...
- 如何取消IE“已限制此网页运行可以访问计算机的脚本或ActiveX控件
在本地调试html页,如果其中包含js或flash,IE经常会提示“IE已限制此网页运行可以访问计算机的脚本或ActiveX控件”.虽然IE出于安全考虑阻止本地脚本运行这个做法没错,但作为程序开发者来 ...
- JNA结构体参数传递,Java数组
JNA以结构体数组为参数进行调用: ////// C++ // student 结构体定义 typedef struct { int age; char name[20]; }Student; // ...
- [转]美国的软件公司是什么样?---- 以Fog Creek为例
作者: 阮一峰 日期: 2009年2月15日 Joel写过一篇文章,关于软件公司如何雇到优秀的程序员. 他说,软件公司的头等大事,就是找到第一流的人才.不同于其他行业,软件是一种纯智力产品,你有什么样 ...