概述
用于语言的切换,翻译工作。
pro文件包含
#路径自己定
TRANSLATIONS = $$PWD/bin/lang/zh_En.ts \
$$PWD/bin/lang/zh_Ch.ts
OTHER_FILES += $$PWD/bin/lang/zh_En.ts \
$$PWD/bin/lang/zh_Ch.ts
头文件
#ifndef LANGUAGE_MANAGER_H_
#define LANGUAGE_MANAGER_H_
#include <QMap>
#include <QString>
class QTranslator;
typedef enum _LanguageType
{
LANGUAGE_TYPE_ENGLISH,
LANGUAGE_TYPE_CHINESE
}LanguageType;
class LanguageManager
{
public:
static LanguageManager *m_instance;
static LanguageManager *getInstance();
protected:
LanguageManager();
public:
void initTranslator();
bool addTranslator(const QString &languageKey, const QString &languageValue);
bool installTranslator(const QString &languageKey);
bool installTranslator(const LanguageType &language);
private:
QMap<QString, QTranslator*> m_languageMap;
QString m_currentLanguageStr;
};
#endif//LANGUAGE_MANAGER_H_
定义
#include "LanguageManager.h"
#include <QTranslator>
#include <QApplication>
LanguageManager *LanguageManager::m_instance = nullptr;
LanguageManager *LanguageManager::getInstance()
{
if( nullptr == m_instance)
{
m_instance = new LanguageManager();
}
return m_instance;
}
LanguageManager::LanguageManager()
{
initTranslator();
}
void LanguageManager::initTranslator()
{
addTranslator("zh_En", "lang/zh_En.qm");
addTranslator("zh_Ch", "lang/zh_Ch.qm");
}
bool LanguageManager::addTranslator(const QString &languageKey, const QString &languageValue)
{
if(m_languageMap[languageKey] == nullptr)
{
QTranslator * translator = new QTranslator();
if( translator->load(languageValue) )
{
m_languageMap[languageKey] = translator;
}
else {
return false;
}
}
return true;
}
bool LanguageManager::installTranslator(const QString &languageKey)
{
QTranslator *translator = m_languageMap[languageKey];
if( translator )
{
qApp->removeTranslator(m_languageMap[m_currentLanguageStr]);
if(qApp->installTranslator( translator ))
{
m_currentLanguageStr = languageKey;
return true;
}
else {
qApp->installTranslator(m_languageMap[m_currentLanguageStr]);
return false;
}
}
else {
return false;
}
}
bool LanguageManager::installTranslator(const LanguageType &language)
{
switch (language) {
case LANGUAGE_TYPE_ENGLISH:
installTranslator("zh_En");
break;
case LANGUAGE_TYPE_CHINESE:
installTranslator("zh_Ch");
break;
}
return true;
}
使用说明

1:main: LanguageManager::getInstance()->installTranslator(LanguageType::LANGUAGE_TYPE_CHINESE);
2:将要翻译的内容放置到 tr(), QT_TRANSLATE_NOOP等(具体使用查看帮助文档)内部。
3:翻译通知
1) 可以放到 changeEvent事件中 (覆盖,且存在这类事件?)
protected:
void changeEvent(QEvent* event);
switch (event->type())
{
case QEvent::LanguageChange:
this->retranslateUi(this);
m_btnTest->setText(tr("test Btn"));
break;
default:
break;
}
2) 可以使用其他方式,比如,将需要被通知的类进行管理起来,改变后广播式通知即可