Skip to content

语言切换QTranslator

使用 qt 实现动态语言切换很方便。只需要利用 Qt5LinguistTools 生成一个.ts 文件(多个语言需要多个.ts 文件),让后使用 QtLinguist 软件打开.ts 文件,填充翻译,发布为.qm 文件。

让后动态读取.qm 就可以了。cmake/qmake 下如如何配置 Qt5LinguistTools 可以看下边两个简单的案例。

需要翻译的文本应该用 tr 把文本包含起来。

QString QObject::tr(const char *sourceText, const char *disambiguation = Q_OBJECT, int n = Q_OBJECT)

需要翻译的界面应该在属性下设置为可以翻译

更新和发布翻译

设置翻译文本,选择 Qt5LinguistTools

  • qmake
QT       += core gui
greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = untitled
TEMPLATE = app

DEFINES += QT_DEPRECATED_WARNINGS
CONFIG += c++11
SOURCES += \
        main.cpp
RESOURCES += \
    resource.qrc

TRANSLATIONS += en.ts

qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target
#include <QDebug>
#include <QTranslator>
#include <QApplication>

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);
    QTranslator translator;
    translator.load(":/new/prefix1/en.qm");
    qApp->installTranslator(&translator);
    qDebug() << QObject::tr("hell word");
    qApp->removeTranslator(&translator);
    qDebug() << QObject::tr("hell word");
    qApp->installTranslator(&translator);
    qDebug() << QObject::tr("hell word");
    return 0;
}
  • camke
cmake_minimum_required(VERSION 3.1)

project(untitled)

set(CMAKE_INCLUDE_CURRENT_DIR ON)
set(CMAKE_AUTOMOC ON)
set(CMAKE_AUTOUIC ON)
set(CMAKE_AUTORCC ON)
set(CMAKE_CXX_STANDARD 14)
option(BUILD_SHARED_LIBS "" OFF)

find_package(Qt5 REQUIRED COMPONENTS Core Gui Widgets Sql Test Xml Network Concurrent)
find_package(Qt5LinguistTools)

set(Resource
    resource.qrc)

set(translate
    resource.qrc)

qt5_create_translation(Translate
    main.cpp
    dialog.ui
    en.ts)

add_executable(${PROJECT_NAME}
    ${Translate}
    ${Resource}
    dialog.cpp
    dialog.h
    dialog.ui
    main.cpp)

target_link_libraries(
    ${PROJECT_NAME}
    Qt5::Core
    Qt5::Gui
    Qt5::Widgets
    Qt5::Sql
    Qt5::Xml
    Qt5::Network
    Qt5::Concurrent)
#include <QTranslator>
#include <QApplication>
#include <QDebug>
#include "dialog.h"

int main(int argc, char *argv[]) {
    QApplication a(argc, argv);
    QTranslator translator;
    translator.load(":/en.qm");
    qApp->installTranslator(&translator);
    qDebug() << QObject::tr("hell word");
    qApp->removeTranslator(&translator);
    qDebug() << QObject::tr("hell word");
    Dialog w;
    w.exec();
    return 0;
}
#ifndef DIALOG_H
#define DIALOG_H

#include <QDialog>

namespace Ui {
    class Dialog;
}

class QTranslator;

class Dialog : public QDialog {
    Q_OBJECT

  public:
    explicit Dialog(QWidget *parent = nullptr);
    ~Dialog();
  protected:
//    void changeEvent(QEvent *);
  private slots:
    void on_pushButton_clicked();

  private:
    Ui::Dialog *ui;
    QTranslator *translator_;
};

#endif // DIALOG_H
#include "dialog.h"
#include "ui_dialog.h"
#include <QTranslator>
#include <QDebug>
#include <QLibraryInfo>

Dialog::Dialog(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Dialog) {
    ui->setupUi(this);
    translator_ = new QTranslator();
}

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

void Dialog::on_pushButton_clicked() {
    static bool is_en = 0;
    if(!is_en) {
        qApp->removeTranslator(translator_);
        translator_ = new QTranslator();
        translator_->load(":/en.qm");
        qApp->installTranslator(translator_);
        ui->retranslateUi(this);
    } else {
        qApp->removeTranslator(translator_);
        ui->retranslateUi(this);
    }
    is_en = !is_en;
}