Qt 之国际化

作者: 一去、二三里
个人微信号: iwaleon
微信公众号: 高效程序员

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); 

源码下载

  • 24
    点赞
  • 77
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 25
    评论
Qt中实现国际化和多语言切换需要以下步骤: 1. 在Qt项目中创建一个“ts”文件,用于存储翻译后的资源。可以使用Qt自带的工具“Qt Linguist”来创建和编辑这些文件。 2. 在Qt项目中使用Qt的翻译API来翻译界面元素。例如,使用tr()函数来标记需要翻译的字符串。 3. 使用lupdate工具来生成一个“.ts”文件,其中包含需要翻译的所有字符串。 4. 使用Qt Linguist编辑器来翻译这些字符串,并将它们保存到“.ts”文件中。 5. 使用lrelease工具来生成一个二进制的翻译文件“qm”文件,其中包含翻译后的资源。 6. 在Qt项目中加载这些翻译文件,并在运行时切换语言。 下面是一个简单的示例代码,演示如何在Qt中实现多语言切换: ```cpp #include <QApplication> #include <QTranslator> int main(int argc, char *argv[]) { QApplication app(argc, argv); // 加载翻译文件 QTranslator translator; translator.load("myapp_zh.qm"); app.installTranslator(&translator); // 设置界面元素的翻译 QLabel label(tr("Hello World!")); label.show(); return app.exec(); } ``` 在上面的例子中,我们使用了QTranslator类来加载翻译文件,并使用installTranslator()函数将其安装到应用程序中。我们还使用了tr()函数来标记需要翻译的字符串。 当应用程序启动时,它将自动加载当前系统语言对应的翻译文件。如果用户切换语言,我们只需要重新加载对应的翻译文件即可。 希望这可以帮助你实现Qt中的国际化和多语言切换

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 25
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一去丶二三里

有收获,再打赏!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值