QT程序的国际化

1. 程序运行图

选择不同的语言,则在窗口的下发的Label中显示对应语言的翻译。

international

2. QT国际化的实现

  • 在pro文件中添加对应的语言样本,
    TRANSLATIONS=lang_en.ts\
                                 lang_zh.ts\
                                 lang_la.ts
  • 在程序中对于支持多语言的字符串使用tr函数包含,例如:<source lang="cpp"> label->setText(tr("TXT_HELLO_WORLD", "Hello World"));</source>
  • 编译程序(必须先编译程序)
  • 使用lupdate HelloWorldInternational.pro生成对应的文件
    Info: creating stash file /Users/diwh/qt_study/HelloWorldInternational/.qmake.stash
    Updating 'lang_en.ts'...
    Found 2 source text(s) (2 new and 0 already existing)
    Updating 'lang_zh.ts'...
    Found 2 source text(s) (2 new and 0 already existing)
    Updating 'lang_la.ts'...
    Found 2 source text(s) (2 new and 0 already existing)
    编译后会生成 lang_en.qm、lang_la.qm、lang_zh.qm三个文件。
  • 使用qt自带的工具Linguist (mac 下为Linguist.app)打开,选择打开生成的lang_[en/zh/la].ts。打开时候同时选中三个文件。然后填写对应的翻译文本。
    然后点击菜单 File -> Release All或者先保存,使用命令行lrelease HelloWorldInternational.pro。

Linguist

 

3. 源码

需要注意: 需要将以下函数中的lang修改成项目存放的绝对路径。

[source language="cpp"]
void MainWindow::changeTr(const QString & langCode)
{
//.....
QString qmFileName = "/Users/diwh/qt_study/HelloWorldInternational/lang_" + langCode;
//.....
}
[/source]

pro 文件

[source language="php"]
QT += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = HelloWorldInternational
TEMPLATE = app

TRANSLATIONS=lang_en.ts\
lang_zh.ts\
lang_la.ts

SOURCES += main.cpp\
mainwindow.cpp

HEADERS += mainwindow.h

FORMS += mainwindow.ui
[/source]

mainwindow.h

[source language="cpp"]
#include <QMainWindow>
#include <QComboBox>
#include <QLabel>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
Q_OBJECT

public:
explicit MainWindow(QWidget *parent = 0);
~MainWindow();

private slots:
void changeLang(int index);

private:
void createScreen();
void changeTr(const QString & langCode);
void refreshLabel();

QComboBox *combo; // 用于选择语言
QLabel *label; // 用于显示内容

QWidget *centralWidget; // 用于布局的widget

private:
Ui::MainWindow *ui;
};

[/source]

mainwindow.cpp

[source language="cpp"]
#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QTranslator>
#include <QVBoxLayout>

MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
centralWidget = new QWidget(this);
this->setCentralWidget(centralWidget);

createScreen();
}

void MainWindow::createScreen()
{
combo = new QComboBox;
combo->addItem("English", "en");
combo->addItem("Chinese","zh");
combo->addItem("Latin", "la");

label = new QLabel;
refreshLabel();

QVBoxLayout *layout = new QVBoxLayout;
layout->addWidget(combo,1);
layout->addWidget(label, 5);

centralWidget->setLayout(layout);

connect(combo, SIGNAL(currentIndexChanged(int)),
this, SLOT(changeLang(int)));
}
void MainWindow::refreshLabel()
{
label->setText(tr("TXT_HELLO_WORLD", "Hello World"));
}

void MainWindow::changeLang(int index)
{
QString langCode = combo->itemData(index).toString();
changeTr(langCode);
refreshLabel();
}

void MainWindow::changeTr(const QString &amp;langCode)
{
static QTranslator *translator;
if (translator != NULL)
{
qApp->removeTranslator(translator);
delete translator;

translator = NULL;
}

translator = new QTranslator;
QString qmFileName = "/Users/diwh/qt_study/HelloWorldInternational/lang_" + langCode;
if (translator->load(qmFileName))
{
qApp->installTranslator(translator);
}
}

MainWindow::~MainWindow()
{
delete ui;
}
[/source]

完整工程下载 HelloWorldInternational

发表评论

电子邮件地址不会被公开。 必填项已用*标注