Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: TrimS от Февраль 05, 2014, 12:40



Название: QTranslator не переводит
Отправлено: TrimS от Февраль 05, 2014, 12:40
Есть глобальная текстовая переменная. Пытаюсь её перевести на другой язык - не переводится ничего. :(
Минимальный тестовый пример:
Код:
QString aaa = QObject::tr(QT_TR_NOOP("Hello"));

int MainFunc( int argc, char *argv[] )
{
QApplication app(argc, argv);

QTranslator translator;
bool is = translator.load("appcenter_ru.qm", app.applicationDirPath());
QApplication::installTranslator(&translator);

QLabel lbl(aaa);
lbl.show();

return app.exec();
}
Файл перевода лежит рядом с бинарником, переменная is равна true. Тоесть всё сделал правильно.
Не переводит!
В чём может быть причина и как сделать, чтобы переводило?


Название: Re: QTranslator не переводит
Отправлено: GreatSnake от Февраль 05, 2014, 12:47
Дык, элементарно же - строка aaa, создаётся до translator.
И зачем там QT_TR_NOOP ???


Название: Re: QTranslator не переводит
Отправлено: TrimS от Февраль 05, 2014, 13:01
Спасибо! Точно, проблема в том, что он создаётся до строки.
Но тогда получается, что невозможно использовать глобальные строковые константы - ибо если даже транслятор сделать глобальным - то это не даст гарантию, что он проинициализируется первым.
Как обычно эта проблема решается в рамках Qt? Согдаётся отдельная функция, которая инициализирует глобальные переменные?


Название: Re: QTranslator не переводит
Отправлено: GreatSnake от Февраль 05, 2014, 13:05
Как обычно эта проблема решается в рамках Qt?
А причём здесь Qt ???


Название: Re: QTranslator не переводит
Отправлено: TrimS от Февраль 05, 2014, 13:59
Как при чём Qt? При том, что обычные походы работы с глобальными переменными не работают. К примеру:
Код:
QString aaa;

void initdd()
{
aaa = QObject::tr("Hello");
}

int MainFunc( int argc, char *argv[] )
{
QApplication app(argc, argv);

DDDDD ddd(&app);
initdd();

QPushButton button(aaa);
bool c1 = QObject::connect(&button, SIGNAL(pressed()), &ddd, SLOT(ChangeLang()));
button.show();

return app.exec();
}
Код:
class DDDDD : public QObject
{
Q_OBJECT

public:
DDDDD(QObject *parent = 0);
DDDDD(QApplication* app_);
~DDDDD();

public slots:
void ChangeLang();

private:
QTranslator translator;
QApplication* app;
};

void DDDDD::ChangeLang()
{
bool is = translator.load("appcenter_ru.qm", app->applicationDirPath());
app->installTranslator(&translator);
}

При таком раскладе не переводится текст кнопки при клике. Хотя (!) транслятор создан до присвоения значения к aaa. Вопрос в том как работать с глобальными строковыми переменными, которые требуют перевода?


Название: Re: QTranslator не переводит
Отправлено: GreatSnake от Февраль 05, 2014, 14:05
Хм..., как всё запущено.
Т.е. то, что загрузка словаря делается после вызова транслятора значения совсем не имеет ???
И откуда взялась уверенность, что после загрузки все строки автоматом перегрузятся?


Название: Re: QTranslator не переводит
Отправлено: TrimS от Февраль 05, 2014, 15:11
Ну.....стараюсь разобраться.

Время загрузки словаря имеет значение? Хм, пока не видел об этом примечания в доке.
Уверенность оттуда, что формально я выполнил все требования - обернул строку, создал транслятор, загрузил, установил - по идее должно перевести, по крайней мере я не нашёл информации, что что-то ещё надо сделать.

А как же тогда делать перевод приложения при выборе в пункте меню языка? Если не ошибаюсь Qt позволяет сделать такой финт.


Название: Re: QTranslator не переводит
Отправлено: kambala от Февраль 05, 2014, 16:28
значения статических переменных вычисляются до входа в main(), а загрузить файл перевода статически невозможно

креатор подставляет новый перевод после перезапуска. но можно делать и динамически: для этого нужно загружать другой файл перевода и повторно присваивать строки


Название: Re: QTranslator не переводит
Отправлено: GreatSnake от Февраль 05, 2014, 16:55
Время загрузки словаря имеет значение? Хм, пока не видел об этом примечания в доке.
Уверенность оттуда, что формально я выполнил все требования - обернул строку, создал транслятор, загрузил, установил - по идее должно перевести, по крайней мере я не нашёл информации, что что-то ещё надо сделать.
С чего это должно, если транслятор был задействован после создания строки ???
И что такое "обернул строку"?

Цитировать
А как же тогда делать перевод приложения при выборе в пункте меню языка? Если не ошибаюсь Qt позволяет сделать такой финт.
Динамический перевод (http://www.doc.crossplatform.ru/qt/4.7.x/internationalization.html#dynamic-translation).

значения статических переменных вычисляются до входа в main()
Наверное, следует сказать, что это верно при объявлении переменной в главном скопе файла)


Название: Re: QTranslator не переводит
Отправлено: TrimS от Февраль 05, 2014, 21:46
Спасибо, понял.
Жаль, что кучу работы нужно делать руками - кроме переинициализации глобальных переменных ещё и переопределять все GUI классы с отловом QEvent::LanguageChange и переустановкой текста.
Мне казалось, что Qt механизм в этом плане более продвинутый, а так он предоставляет только самые базовые примитивы транслятора.


Название: Re: QTranslator не переводит
Отправлено: GreatSnake от Февраль 06, 2014, 14:30
Чтобы иметь "такой продвинутый Qt механизм" нужно как минимум каким-то образом взаимно связать QString с QTranslator и не терять эту связь при копировании.
Такие сложности никому не нужны.
К тому же на лету менять язык основной массе не нужно.