首先,说明下,本篇内容为qt国际化的进阶版,如果是入门级别的,qt怎么适配国际化,可以看对应的书籍,本篇文章,编写了动态国际化,下面是对应的demo,在开始前,先分享下qt获得当前系统语言的方法,屡试不爽(但是在有的语言环境下获得的也有不准的情况,需要特殊处理)
QLocale local; qInfo() << local.name() << local.uiLanguages().value(0).replace("-", "_");
把中划线换成下划线的原因是qm文件的需要,当时没有使用name 而使用uiLanguage的原因是在繁体还是维语、藏语等name获取的有问题,有不对应的情况;
但是在有的环境下获取为C,需要做特殊处理;因为自己实际项目中截止目前用到的国际化有:简体中文,繁体、正体、英文、维语、藏语,其它的语言环境目前没有用到;
目前uiLanguages能满足自己的实际项目需要;
1.搭建工程:cmake
#cmake所需最低版本
cmake_minimum_required(VERSION 3.7)
#工程名
project(demo)
#查找依赖库
find_package(Qt5 COMPONENTS
Core
Widgets
REQUIRED)
SET(CMAKE_AUTOMOC ON)
#查找文件
file(GLOB SRC_LIST "*.cpp" "*.h")
#生成可执行文件
add_executable(demo ${SRC_LIST})
#find_package(Qt5Core REQUIRED)
#find_package(Qt5Widgets REQUIRED)
#find_package(Qt5Gui REQUIRED)
set(Qt_LIBS
Qt5::Core
Qt5::Widgets
)
#链接目标库
target_link_libraries(
${PROJECT_NAME}
${Qt_LIBS}
)
2.编写代码
#include "widget.h"
#include <QApplication>
#include <QTranslator>
#include <QDebug>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QTranslator qtTranslator;
QString str;
str = "demo-" + QString("zh_CN") + ".qm";
qtTranslator.load(str);
qInfo() << str;
a.installTranslator( &qtTranslator );
Widget w;
w.setTranslate(&qtTranslator);
w.show();
w.resize(500, 500);
return a.exec();
}
#ifndef WIDGET_H
#define WIDGET_H
#include <QWidget>
#include <QHBoxLayout>
#include <QLabel>
#include <QComboBox>
#include <QTranslator>
class Widget :public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = Q_NULLPTR);
~Widget();
void setTranslate(QTranslator *tran);
private Q_SLOTS:
void onComboBoxIndexChanged(int index);
private:
void initUI();
void updateShow();
QHBoxLayout *hLayout;
QLabel *contentsLabel;
QLabel *tipsLabel;
QComboBox *languageCombox;
QTranslator *translator;
};
#endif//WIDGET_H
#include "widget.h"
#include <QDesktopWidget>
#include <QApplication>
#include <QDebug>
Widget::Widget(QWidget *parent)
: QWidget(parent)
{
initUI();
QDesktopWidget *deskdop = QApplication::desktop();
move((deskdop->width() - this->width())/2, (deskdop->height() - this->height())/2);
connect(languageCombox, SIGNAL(currentIndexChanged(int)), this, SLOT(onComboBoxIndexChanged(int)));
}
Widget::~Widget()
{
}
void Widget::setTranslate(QTranslator *tran)
{
translator = tran;
}
void Widget::onComboBoxIndexChanged(int index)
{
switch (index) {
case 0:
translator->load("demo-en_US.qm");
break;
case 1:
translator->load("demo-zh_CN.qm");
break;
default:
translator->load("demo-zh_CN.qm");
break;
}
updateShow();
}
void Widget::initUI()
{
hLayout = new QHBoxLayout;
contentsLabel = new QLabel(tr("I love China"));
tipsLabel = new QLabel(tr("please change language:"));
languageCombox = new QComboBox();
languageCombox->insertItem(0, tr("chinese"));
languageCombox->insertItem(0, tr("english"));
hLayout->addWidget(contentsLabel);
hLayout->addWidget(tipsLabel);
hLayout->addWidget(languageCombox);
setLayout(hLayout);
}
void Widget::updateShow()
{
contentsLabel->setText(tr("I love China"));
tipsLabel->setText(tr("please change language:"));
}
3.效果