LINUX.ORG.RU

Qt перевод. Как работает тр?


0

1

Примеры из гугла не помогают они все однообразны и просты. Написал пробный класс, простите, получилось много, но короче уже некуда. Получается, что перевод работает только с локальными строками «главного класса» того, что запущен из майн. При чем ели в майн заменить 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();
}
Почему то так не получается, lupdate не парсит эту строку
#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: Локальная строка
Без того варнинга (на другой ОС) тоже самое.

тред не читал, переводы делаются с англиского на другие, а не с русского.

UVV ★★★★★
()

Кстати вот это S1(QT_TR_NOOP_UTF8(«Глобальная строка»)) в Лингвисте выглядит как знаки вопроса. Но только она.

И как сделать чтобы русский корректно отображался в окне исходного кода Лингвиста? В окне переменных все ок.

LinuxDebian ★★★★
() автор топика
Ответ на: комментарий от UVV

Это пистон что ле?

Нет, это плюсы.

Зацени, что я нашёл для тебя

Сейчас почитаю

LinuxDebian ★★★★
() автор топика

А как запускался lupdate?

Ты ему указал, где и что брать?

lupdate <src_dir> -extensions cpp -ts <blah-blah>

Примерно так должно быть...

braboar ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.