Примеры из гугла не помогают они все однообразны и просты. Написал пробный класс, простите, получилось много, но короче уже некуда. Получается, что перевод работает только с локальными строками «главного класса» того, что запущен из майн. При чем ели в майн заменить LangTest на PureClass то он все равно не будет переводится.
QT += core gui
TARGET = LangTest
TEMPLATE = app
SOURCES += main.cpp\
LangTest.cpp \
PureClass.cpp \
LangPack.cpp
HEADERS += LangTest.h \
PureClass.h \
LangPack.h
FORMS += LangTest.ui
TRANSLATIONS = local_en.ts \
local_ru.ts
CODEC = UTF-8
CODECFORTR = UTF-8
CODECFORSRC = UTF-8
#ifndef LANGPACK_H
#define LANGPACK_H
#include <QObject>
class LangPack : public QObject
{
Q_OBJECT
public:
explicit LangPack();
//static const char *S1, *S2;
struct _t{
const char *S1;
_t():
S1(QT_TR_NOOP_UTF8("Глобальная строка"))
{}
};
static _t PACK1;
signals:
public slots:
};
#endif // LANGPACK_H
#ifndef LANGTEST_H
#define LANGTEST_H
#include <QMainWindow>
#include "PureClass.h"
#include <QTranslator>
namespace Ui {
class LangTest;
}
class LangTest : public QMainWindow
{
Q_OBJECT
public:
explicit LangTest(QWidget *parent = 0);
~LangTest();
void setT(QTranslator *T);
private slots:
void on_pushButton_clicked();
void on_pushButton_2_clicked();
private:
Ui::LangTest *ui;
PureClass PC;
QTranslator *Translator;
QString t;
void changeEvent(QEvent *e);
public:
const char *main_str;
};
#endif // LANGTEST_H
#ifndef PURECLASS_H
#define PURECLASS_H
#include <QString>
#include <QWidget>
#include <QEvent>
class PureClass : QWidget
{
public:
PureClass();
QString t;
void changeEvent(QEvent *e);
const char *local_str;
};
#endif // PURECLASS_H
#include <QtGui/QApplication>
#include "LangTest.h"
#include <QTranslator>
#include <QTextCodec>
int main(int argc, char *argv[])
{
QTextCodec::setCodecForTr(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));
QApplication a(argc, argv);
QTranslator T;
a.installTranslator(&T);
LangTest w;
w.setT(&T);
qDebug("(from main) loaded en = %d",T.load("local_en.qm"));
w.show();
return a.exec();
}
#include "LangPack.h"
LangPack::_t LangPack::PACK1;
//const char *LangPack::S1 = QT_TR_NOOP("Глобальная строка");
//tr() cannot be called without context
LangPack::LangPack()
{
}
#include "PureClass.h"
#include "LangPack.h"
PureClass::PureClass() :
local_str(QT_TR_NOOP_UTF8("Локальная строка"))
{
}
void PureClass::changeEvent(QEvent *e){
if (e->type() == QEvent::LanguageChange){
t = tr(LangPack::PACK1.S1);
qDebug("PureClass::changeEvent: %s",t.toAscii().constData());
t = tr(local_str);
qDebug("PureClass::changeEvent: %s",t.toAscii().constData());
}
#include "LangTest.h"
#include "LangPack.h"
#include "ui_LangTest.h"
LangTest::LangTest(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::LangTest),
main_str(QT_TR_NOOP_UTF8("Локальная строка главного класса"))
{
ui->setupUi(this);
}
LangTest::~LangTest()
{
delete ui;
}
void LangTest::on_pushButton_clicked()
{
qDebug("loaded en = %d",Translator->load("local_en.qm"));
}
void LangTest::setT(QTranslator *T){
Translator = T;
}
void LangTest::on_pushButton_2_clicked()
{
qDebug("loaded ru = %d",Translator->load("local_ru.qm"));
}
void LangTest::changeEvent(QEvent *e){
if (e->type() == QEvent::LanguageChange){
t = tr(LangPack::PACK1.S1);
qDebug("LangTest::changeEvent: %s",t.toAscii().constData());
t = tr(main_str);
qDebug("LangTest::changeEvent: %s",t.toAscii().constData());
}
}
И вот что получилось (нажал на кнопки на форме...)
Fontconfig warning: "/etc/fonts/conf.d/50-user.conf", line 9: reading configurations from ~/.fonts.conf is deprecated.
(from main) loaded en = 1
LangTest::changeEvent: Глобальная строка
LangTest::changeEvent: Local string from general class
PureClass::changeEvent: Глобальная строка
PureClass::changeEvent: Локальная строка
loaded ru = 1
LangTest::changeEvent: Глобальная строка
LangTest::changeEvent: Локальная строка главного класса
PureClass::changeEvent: Глобальная строка
PureClass::changeEvent: Локальная строка
loaded en = 1
LangTest::changeEvent: Глобальная строка
LangTest::changeEvent: Local string from general class
PureClass::changeEvent: Глобальная строка
PureClass::changeEvent: Локальная строка