简介

Qt国际化属于Qt高级中的一部分,本想着放到后面来说,上节刚好介绍了Qt Linguist,趁热打铁就一起了解下。

对于绝大多数的应用程序,在刚启动时,需要加载默认的语言(或最后一次设置的语言)。在使用的过程中,我们也不需要重启应用程序而实现语言的动态切换。这样的话,易用性就非常好了。

多语言切换

要进行多语言的切换,需要执行以下步骤:

  1. 对用户可见的文本信息全部使用tr()进行封装

  2. 提供用户可以用来切换语言的一种方法。

  3. 对于每一个窗口部件或者对话框,重写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();
}

流程:

  1. 进入main(),首先加载默认的语言(或最后一次设置的语言),然后显示主界面。

  2. 当打开设置界面后,首先加载当前选择的语言,然后通过下拉设置语言选项来进行语言切换(设置界面的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之国际化的更多相关文章

  1. 使用 PySide2 开发 Maya 插件系列三:qt语言国际化(internationalization)

    使用 PySide2 开发 Maya 插件系列三:qt语言国际化(internationalization) 前言: 这是 qt for python 的语言国际化,基于 UI 的,python 也有 ...

  2. Qt之国际化(系统文本-QMessageBox按钮、QLineEdit右键菜单等)

    简介 使用Qt的时候,经常会遇到英文问题,例如:QMessageBox中的按钮.QLineEdit.QSpinBox.QScrollBar中的右键菜单等.通常情况下,我们软件都不会是纯英文的,那么如何 ...

  3. (三)Qt语言国际化

    Vs 2010+ Qt5 实现语言国际化 创建一个工程,cpp代码如下: 1.创建工程 #include "languageinternationalized.h" #includ ...

  4. 配置CLion管理Qt项目国际化支持

    随着Qt 6的发布,cmake也正式宣告接管qmake的工作了. 在之前的一篇博客里我介绍了如何使用cmake管理你的qt项目,不过有一点我没有讲,那就是对国际化(i18n)的处理. 今天我们就来介绍 ...

  5. qt 程序国际化

    http://www.cnblogs.com/hujian/archive/2012/08/10/2631488.html

  6. Qt学习之路: 国际化(上)

      原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 .作者信息和本声明.否则将追究法律责任.http://devbean.blog.51cto.com/448512/244689 2D ...

  7. Qt国际化(Q_DECLARE_TR_FUNCTIONS() 宏给非Qt类添加翻译支持,以前没见过QTextEncoder和QTextDecoder和QLibraryInfo::location()和QEvent::LanguageChange)

    Internationalization with Qt 应用程序的国际化就是使得程序能在国际间可用而不仅仅是在本国可用的过程. Relevant Qt Classes andAPIs 以下的类支持Q ...

  8. QT国际化,中英文等多语言界面显示的方法

    在网上学习了一下QT的国际化使用方法,最后将自己试成功的方法总结例如以下: 当中遇到的问题有:生成的ts文件里 代码中的中文 有的不显示,有的显示乱码.   步骤1: 生成.ts文件,在pro项目文件 ...

  9. qt翻译和国际化的探讨。

    这段时间一直都在怼qt的国际化,以前也接触过国际化,但是感觉不是那么的深刻,这次是因为一个项目要做一个国际化的版本,代码里面是不能出现中文的,所以就翻译了一下.qt用的是4.8.6 64位的,IDE( ...

随机推荐

  1. PHP 性能分析第一篇: Xhprof & Xhgui 介绍

    [前言]这是国外知名博主 Davey Shafik所撰写的 PHP 应用性能分析系列的第一篇,阅读第二篇可深入了解 xhgui,第三篇则关注于性能调优实践. 什么是性能分析? 性能分析是衡量应用程序在 ...

  2. javascript和swf在网页中交互的一些总结

    Javascript和swf在网页中交互一般可有以下几种情况: 1.swf和这些调用的javascript在同域 2.swf和这些调用的javascript在不同域,比如加载远程的swf然后call别 ...

  3. (转)Maximum subarray problem--Kadane’s Algorithm

    转自:http://kartikkukreja.wordpress.com/2013/06/17/kadanes-algorithm/ 本来打算自己写的,后来看到上述链接的博客已经说得很清楚了,就不重 ...

  4. 获取及管理Android 手机运营商及状态

    主要类 TelephonyManager: telephonyManager.getCellLocation();//获得服务区 telephonyManager.getCellId();//获得服务 ...

  5. ExtJs之Ext.util.TextMetrics

    <!DOCTYPE html> <html> <head> <title>ExtJs</title> <meta http-equiv ...

  6. 多线程系列 线程池ThreadPool

    上一篇文章我们总结了多线程最基础的知识点Thread,我们知道了如何开启一个新的异步线程去做一些事情.可是当我们要开启很多线程的时候,如果仍然使用Thread我们需要去管理每一个线程的启动,挂起和终止 ...

  7. 问题:-[UIViewController _loadViewFromNibNamed:bundle:] loaded the "BlueView" nib but the view outlet was not set.

    问题:-[UIViewController _loadViewFromNibNamed:bundle:] loaded the "BlueView" nib but the vie ...

  8. Linux命令-cp

    cp命令用于复制文件到目录 参数 -r 递归持续复制(用于目录) 参数 -p 保留原始文件属性 参数 -d 若对象为链接文件,保留该链接文件的属性 参数 -a 相当于以上三者之和(-pdr) [roo ...

  9. left join查询结果大于原始数据

    left join onon后面一定是一个主键或者是一个值为唯一的字段吗  on后面关联的条件如果是1对1的数量就不变,如果是1对多的数量就会增加 追问: 问题就在这,我1对多了 追答: 通常的做法是 ...

  10. 唯一区别是不会去取emptyText 的值,没有选选择选项的时候返回是空字符串

    combox取值以及赋值的方法 function getValue() { //注意:以下这两种取值方法都会存在一个问题: 当combox设置成能输入并有只能提示的时候,当输入的不是备选项时,或到的v ...