QT多语言切换方法

本文详细介绍了如何在软件开发中设置所需语言,通过Linguist生成和管理翻译文件(.ts和.qm),以及在代码中正确使用QTranslator实现控件和文本的翻译。重点涉及语言配置、文件加载和注意事项。
摘要由CSDN通过智能技术生成

一、设置需要的语言

pro文件中加入需要的语言(名字自定义)后缀是.ts

二、生成翻译的.ts文件

点击工具->外部->linguist->Update Translations生成或者更新工程相应的语言文件

生成后工程目录会出现相应的.ts文件

 

三、通过linguist翻译文件

通过Linguist打开上面生成的所有语言文件(.ts), Linguist版本与编译工具必须一致

打开所有.ts文件

编写对应语言的翻译。

需要注意的:控件需要是可翻译属性,当然默认就是可翻译不管也OK

代码里设置的字符需要使用tr()

四、发布生成.qm文件

点击工具->外部->linguist->Release Translations生成.qm文件。

生成后再工程目录会有对应的.qm文件。

五、控件及代码文字的翻译注意事项

1,控件字符需要是可翻译属性

2,软件里设置控件字符需要使用tr()函数

3,需要引入头文件 #include <QTranslator>

4,路径问题,打包后.qm文件路径需要和代码对应,当然,有能力可以遍历文件夹找这个文件。

六、加载语言文件切换语言

示例代码:

MainWindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QDebug>
#include <QMessageBox>
#include <QStringListModel>
#include <QFile>
#include <QFileInfo>

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    QSettings *configIni = new QSettings("Config.ini", QSettings::IniFormat);   //有就打开,没有就创建一个
    QString Language = configIni->value("/Config/Language").toString();         //查询配置的语言类型
    if(Language == ""){ //如果未设置则根据系统语言来设置一个
        qDebug()<<QLocale().language();
        if(QLocale().language() == QLocale::English){
            configIni->setValue("/Config/Language", "EN");
        }
        else if(QLocale().language() == QLocale::Chinese){
            configIni->setValue("/Config/Language", "CN");
        }
        else{
            configIni->setValue("/Config/Language", "EN");                      //其他语言一律默认为英语
        }
    }

    translator_ = new QTranslator();
    Language = configIni->value("/Config/Language").toString();                 //再次获取语言配置
    QString strPath = QCoreApplication::applicationDirPath();
    qDebug()<<Language;
    if(Language == "EN")
    {
        qDebug()<<translator_->load(strPath + "/english.qm");//导入.qm文件
    }
    else if(Language == "CN")
    {
        qDebug()<<translator_->load(strPath + "/chinese.qm");
    }

    qApp->installTranslator(translator_);                   //装载翻译文件
    delete configIni;   //释放掉
    /**************************************************/

    ui->setupUi(this);
    if(Language == "CN"){
        ui->calendarWidget->setLocale(QLocale::Chinese);    //控件自带翻译的用自带翻译
        ui->calendarWidget_2->setLocale(QLocale::Chinese);
    }
    else if(Language == "EN"){
        ui->calendarWidget->setLocale(QLocale::English);
        ui->calendarWidget_2->setLocale(QLocale::English);
    }
    QStringList list;
    list.append(tr("苹果"));  //代码设置的文字需要用tr()函数
    list.append(tr("香蕉"));
    list.append(tr("橘子"));
    list.append(tr("草莓"));
    QStringListModel *listmodel = new QStringListModel(list);
    ui->listView->setModel(listmodel);
    ui->pushButton_4->setToolTip(tr("Set Chinese"));    //英文翻译过长可以使用这个,可以鼠标放上去就显示这些注释
    ui->pushButton_3->setToolTip(tr("Set English"));
}

MainWindow::~MainWindow()
{
    delete ui;
}


void MainWindow::on_pushButton_3_clicked()  //设置为中文的案件回调,触发重启来加载语言
{
    QSettings *configIni = new QSettings("Config.ini", QSettings::IniFormat);
    configIni->setValue("/Config/Language", "EN");
    qDebug()<<configIni->value("/Config/Language").toString();
    delete configIni;
    qApp->exit(777);    //重启,传入777在main.cpp中处理
}

void MainWindow::on_pushButton_4_clicked()  //设置为中文的案件回调,触发重启来加载语言
{
    QSettings *configIni = new QSettings("Config.ini", QSettings::IniFormat);
    configIni->setValue("/Config/Language", "CN");
    qDebug()<<configIni->value("/Config/Language").toString();
    delete configIni;
    qApp->exit(777);    //重启,传入777在main.cpp中处理
}





MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTranslator>
#include <QLocale>
#include <QSettings>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private slots:
    void on_pushButton_3_clicked();

    void on_pushButton_4_clicked();

private:
    Ui::MainWindow *ui;
    QTranslator *translator_;
};
#endif // MAINWINDOW_H

main.cpp

#include "mainwindow.h"

#include <QApplication>
#include <QProcess>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();
    int e = a.exec();
    if(e == 777)    //传入777则认为是重启,否则就不启动
    {
        QProcess::startDetached(qApp->applicationFilePath(), QStringList());
        return 0;
    }
    return e;
}

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值