Qt实现多语言切换 - Qt语言家

前言

为了支持国际化最关键的地方是制作多国语言包,然后再实现动态切换。QT里面既可以采用命令行也可以采用Qt Creator的界面操作来生成,这里我们利用Qt Creator来生成多国语言包。
基本流程是

  1. 生成ts文件;
  2. 生成qm文件;
  3. 最后通过QTranslator类来加载qm文件,实现多语言包的切换。

注意:为了更全面地实现多语言包,在程序中所有涉及到界面中的按钮或者菜单中的文字显示,都必须使用 QObject::tr("…") 的方式将显示的内容包裹起来,这样做的原因是:只有添加了QObject::tr()的标记,生成ts文件的时候程序才会认为被QObject::tr()包裹的地方是需要制作多语言的,从而在ts中预留出位置。

1. 生成ts文件

1.1 在pro文件中添加

TRANSLATIONS = languages/lang_English.ts \
               languages/lang_Chinese.ts

在pro文件中,加入说明,其中“lang_English.ts”与“llang_Chinses.ts”为设置语言文件的名称,这里使用中文与英语两种语言,当你需要其他更多的语言时,添加多个语言文档即可。
注:languages文件夹需事先创建。

1.2 语言文字在程序中说明

为了Qt识别你在程序中需要语言准换的文字,需要将需要转换的文字使用QObject::tr(“…”) 进行标记,否则程序中并不能对其进行识别。例如:

qDebug()<<tr("Output Info: ")<<tr("Language - English");

而在ui窗口直接进行添加一些插件中的语言,一般默认可以识别进行翻译的。如果我们想将其关掉,可以选择插件的属性,将toolTip中“可翻译的”直接取消勾选即可。
在这里插入图片描述

1.3 生成ts文件

执行【工具】–>【外部】–>【Qt语言家】–>【更新翻译(lupdate)】,如下图所示,执行完成后languages目录下会自动生成lang_English.ts和lang_Chinese.ts文件。
在这里插入图片描述

1.4 修改ts文件

利用Qt中自带的Linguist打开刚刚生成的st文件,根据相应的语言,进行语言转换。
lang_Chinese.ts
在这里插入图片描述lang_English.ts
在这里插入图片描述

2 生成qm文件

ts文件翻译结束以后,点击保存,然后在Qt Creator中,使用:工具->外部->Qt预言家->部署翻译(lrelease),就会生成需要的qm文件。
在这里插入图片描述

3 加载qm语言包

将生成的qm文件复制到发布版本中相应的位置,然后在程序中加载

void MainWindow::loadLanguage(const QString langflag)
{
    if(langflag.isEmpty())
        return;

    QString langqmfilepath;

    if(langflag.compare("en") == 0)
    {
        langqmfilepath = qApp->applicationDirPath() + QString("/languages/lang_English.qm");
    }
    else if(langflag.compare("zh") == 0)
    {
        langqmfilepath = qApp->applicationDirPath() + QString("/languages/lang_Chinese.qm");
    }

    if(QFile(langqmfilepath).exists())
    {
        m_translator->load(langqmfilepath);
        qApp->installTranslator(m_translator);
    }
    else
        qDebug()<<"[houqd] authclient language file does not exists ...";

	//重新刷新界面
    ui->retranslateUi(this);

}

其中,m_translator即为QTranslator实例,在类的构造函数中赋值:m_translator = new QTranslator;实现过程很简单,就是取得语言包的绝对路径,然后利用QTranslator来加载它,再利用qApp->installTranslator(m_translator)来安装,最后还应该将显示界面重新显示一次进行更新。
主界面可以直接借助ui->retranslateUi(this)进行重新设置界面显示,但是这个只能更新当前页面,其余浮动页面并不能直接显示出来。需要按照以下格式将每一个需要显示的页面添加相应的程序。
示例
myDialog.h

void changeEvent(QEvent *event);

myDialog.cpp

void myDialog::changeEvent(QEvent *event)
{
    QDialog::changeEvent(event);
    switch (event->type())
    {
    case QEvent::LanguageChange:
        ui->retranslateUi(this);
        break;
    default:
        break;

    }
}

示例参见:https://gitee.com/null_712_5588/CSDNBlogDemo/tree/master/QtLanguageSwitchTest

  • 4
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值