【Qt】Qt国际化【转】
来源:互联网 发布:java方法声明无效 编辑:程序博客网 时间:2024/05/17 22:11
简介
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】Qt国际化【转】
- Qt 国际化 (转)
- Qt 国际化[转]
- qt国际化
- Qt 国际化
- qt国际化
- Qt国际化
- Qt国际化
- QT国际化
- QT国际化
- Qt国际化
- Qt国际化
- QT国际化
- qt国际化
- QT 国际化
- Qt国际化
- qt 国际化
- qt 国际化
- 第1章 Activity的生命周期和启动模式 1.1 Activity的声明周期全面分析
- 【Qt】Qt Assistant介绍【转】
- WebService基于Eclipse的客户端代码生成
- 【Qt】Qt Linguist介绍【转】
- 【Linux 优化篇】之 linux服务器的性能能分析与优化
- 【Qt】Qt国际化【转】
- 【Qt】Qt实战一二三【转】
- 【Qt】Qt国际化(系统文本-QMessageBox按钮、QLineEdit右键菜单等)【转】
- 【Qt】Qt之密码框不可选中、复制、粘贴、无右键菜单等【转】
- 【Qt】Qt之重启应用程序【转】
- 沿海信标台站rbn-dgps的文献综述
- 【Qt】Qt之Tab键切换焦点顺序【转】
- 【Qt】QDialog之屏蔽Esc键【转】
- 【Qt】Qt之自定义搜索框【转】