Russian Qt Forum

Qt => Интернационализация, локализация => Тема начата: daimon от Январь 17, 2012, 16:50



Название: Динамический перевод
Отправлено: daimon от Январь 17, 2012, 16:50
как перевести динамически приложение, если текст от виджета я знаю только так

Код
C++ (Qt)
QString str = ui.labelStatus->text();

такой вариант не прокатит
Код
C++ (Qt)
[15:46:27] Дима Корниец: void MyWidget::changeEvent(QEvent *event)
{
  if (e->type() == QEvent::LanguageChange) {
    titleLabel->setText(tr("Document Title"));
    ...
    okPushButton->setText(tr("&OK"));
  } else
    QWidget::changeEvent(event);
}

так происходит ещё и дублирование набивание виджета текстом
сначала в одном месте, потом ещё и здесь и к примеру лейбла на статусе - статусов может быть несколько, откуда я буду знать явно какой именно сейчас нужно заново писать в функции retranslate()!!!!!!!!

кстати ещё может быть проблема и с диалогом, который вызывается по слоту или он после вызова уже будет переведён?
я просто хотел сказать про другие виджеты

можно конечно создать для каждого класса виджетов функцию retranslate(), но тут может потеряться именно тот текст, который я установил в какой-то функции шаблонным образом (с аргументами)


Название: Re: Динамический перевод
Отправлено: Bepec от Январь 19, 2012, 21:22
Эм. вопрос какой то странный. Из темы, я незнаю что хочу, но зато могу извратиться...

Ты не можешь динамически переводить приложение, если текст виджетов меняется произвольно.

Точнее это можно, но нужен какой либо переводчик.

А чем ненравится перевод в tr("")?


Название: Re: Динамический перевод
Отправлено: daimon от Январь 19, 2012, 23:35
Эм. вопрос какой то странный. Из темы, я незнаю что хочу, но зато могу извратиться...

Ты не можешь динамически переводить приложение, если текст виджетов меняется произвольно.

Точнее это можно, но нужен какой либо переводчик.

А чем ненравится перевод в tr("")?

всё просто есть несколько статусов, например "сделано", "сохранено" и т.д., это всё вешается на лейбл (всё к примеру)
так вот после динамической смены языка, я на данный момент не знаю буквально какой у меня текст в лейбле (ведь он ставился по сигналу-слоту) и получается я не могу просто так написать ui.label->setText(tr("ok")) в функции retranslate()


Название: Re: Динамический перевод
Отправлено: Bepec от Январь 20, 2012, 06:56
Я так и не решил эту проблему, в своей программе.

Или в changeEvent, использовать словарь (список перевода), с рус/анг значениями... по другому не вижу выходов.
Со словарем в принципе неплохо. Забил все статусы, все переводы, а потом лишь определяй язык и переустанавливай на виджет.

PS тоже интересует данный вопрос... Возможно есть более изящное решение?


Название: Re: Динамический перевод
Отправлено: Пантер от Январь 20, 2012, 07:34
Я когда-то реализовывал (https://github.com/panter-dsd/QDBFRedactor) динамическую смену языка. Может, что дельное найдете.


Название: Re: Динамический перевод
Отправлено: daimon от Январь 20, 2012, 14:26
Я так и не решил эту проблему, в своей программе.

Или в changeEvent, использовать словарь (список перевода), с рус/анг значениями... по другому не вижу выходов.
Со словарем в принципе неплохо. Забил все статусы, все переводы, а потом лишь определяй язык и переустанавливай на виджет.

PS тоже интересует данный вопрос... Возможно есть более изящное решение?


подробнее про словарь, пожлуйста


Название: Re: Динамический перевод
Отправлено: daimon от Январь 20, 2012, 14:37
Я когда-то реализовывал (https://github.com/panter-dsd/QDBFRedactor) динамическую смену языка. Может, что дельное найдете.
там всё через retranslate() - не то, а диалог перевода нужная штука


Название: Re: Динамический перевод
Отправлено: Bepec от Январь 20, 2012, 14:46
ну словарь аля
Код:
QMap <QString, QString> engRu;
...
//changeLang
ui.label->setText(engRu[ui.label->text()]);

но тогда нид будет делать словари по количеству языков.


Название: Re: Динамический перевод
Отправлено: andrew.k от Январь 20, 2012, 14:57
Где-то же у тебя хранится реальный статус? Енум какой-нибудь.
Или ты статус хранишь в QLabel? )))

Тогда в чем проблемы? После смены языка, вызови еще раз слот который заполняет UI.


Название: Re: Динамический перевод
Отправлено: Bepec от Январь 20, 2012, 18:47
При смене языка, лейбл будет сменен на стандартный статус, находящийся на ui.

А кому хочется, чтобы надпись "Через 5 минут ваш комп взорвётся", сменилась на "Please wait".

Автор собственно и пишет, что у него с этим проблема ;)


Название: Re: Динамический перевод
Отправлено: daimon от Январь 21, 2012, 05:02
Где-то же у тебя хранится реальный статус? Енум какой-нибудь.
Или ты статус хранишь в QLabel? )))

Тогда в чем проблемы? После смены языка, вызови еще раз слот который заполняет UI.

лейбл, просто пример, может быть любой виджет, хранящий текст


Название: Re: Динамический перевод
Отправлено: daimon от Январь 21, 2012, 05:04
ну словарь аля
Код:
QMap <QString, QString> engRu;
...
//changeLang
ui.label->setText(engRu[ui.label->text()]);

но тогда нид будет делать словари по количеству языков.

не покатит, после retranslate должны быть только строки с tr(), тогда перевод сработает для виджета


Название: Re: Динамический перевод
Отправлено: Bepec от Январь 21, 2012, 11:37
Сигнал ChangeLang (не помню) посылается при смене языка. И там уже вступает в действие спокойная схема с мапом.