1. 程序运行图
选择不同的语言,则在窗口的下发的Label中显示对应语言的翻译。
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。
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 &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