Russian Qt Forum

Qt => Интернационализация, локализация => Тема начата: serg_hd от Апрель 29, 2010, 18:10



Название: [решено] Частичный перевод
Отправлено: serg_hd от Апрель 29, 2010, 18:10
Решил попробовать linguist, всё перевёл, qm-файл получил и подключил его:
Код
C++ (Qt)
QTranslator translator;
translator.load("langs/lang_ru");
app.installTranslator(&translator);
 
Перевелось частично, в основном диалоговые окна.
Splashscreen, tabs и многое другое не перевелось.
ui_mainwindow.h не использую, гуй писался с нуля руками, все tr() в коде с ключами для перевода стоят на своих местах это 100% (перепроверил неск. раз). В чём может быть причина?


Название: Re: Частичный перевод
Отправлено: serg_hd от Апрель 29, 2010, 18:48
Заметил, что перевелось только то, что создавалось динамически - т.е. после запуска приложения. Весь текст, который в инициализации у классов не переводится.


Название: Re: Частичный перевод
Отправлено: kibsoft от Апрель 29, 2010, 19:12
Ответа не знаю, но скажу что недавно у меня такое приключилось: изначально программа была вся на русском (с tr() все), а потом решил на англ сделать, но изменил все в исходниках(т.к. русский не нужен), потом запускаю в Linux, открываю FileDialog, там возникает ошибка (не хватает Xine вроде) и в этот момент некоторые пункты меню (о чудо) и несколько кнопок сами переводятся на русский...до сих пор удивлен..


Название: Re: Частичный перевод
Отправлено: Kolobok от Апрель 29, 2010, 19:18
Главное окно создаешь до подключения транслятора?


Название: Re: Частичный перевод
Отправлено: serg_hd от Апрель 29, 2010, 19:21
Главное окно создаешь до подключения транслятора?
нет, после:
Код
C++ (Qt)
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
QApplication::setStyle("cleanlooks");
QApplication::setWindowIcon(QIcon(QPixmap(":/images/webcruiser.png")));
QTextCodec *tc = QTextCodec::codecForName("utf-8");
QTextCodec::setCodecForTr(tc);
QTextCodec::setCodecForCStrings(tc);
QTextCodec::setCodecForLocale(tc);
 
QTranslator translator;
translator.load("langs/lang_ru");
app.installTranslator(&translator);
 
MainForm mainForm;
 
return app.exec();
}
 
Если до, то не будет переводится даже то, что переводится на данный момент.


Название: Re: Частичный перевод
Отправлено: serg_hd от Апрель 29, 2010, 19:42
каким образом реализовывать метод retranslateUi()?


Название: Re: Частичный перевод
Отправлено: Kolobok от Апрель 29, 2010, 19:47
каким образом реализовывать метод retranslateUi()?

Определить метод retranslateUi().
В реализацию запихать все tr().
В event() ловить QEvent::LanguageChange.


Название: Re: Частичный перевод
Отправлено: serg_hd от Апрель 29, 2010, 19:53
каким образом реализовывать метод retranslateUi()?

Определить метод retranslateUi().
В реализацию запихать все tr().
В event() ловить QEvent::LanguageChange.
А можно по-подробнее пожалст?
В реализацию запихать все tr(). - как именно, может есть пример?
В event() ловить QEvent::LanguageChange - мне это не надо, язык только русский. Делаю для того, чтобы не было русского текста в коде.
Где потом вызывать retranslateUi(), перед или после создания гуя?


Название: Re: Частичный перевод
Отправлено: Kolobok от Апрель 29, 2010, 20:20
Хороший стиль - писать программу готовой к смене языков, даже если предполагается использовать только один.

Цитировать
В реализацию запихать все tr(). - как именно, может есть пример?
Код:
void MyWiget::retranslateUi()
{
  label1->setText( tr( "My label" ) );
  ...
}

Цитировать
Где потом вызывать retranslateUi(), перед или после создания гуя?

В event() при получении QEvent::LanguageChange.

Цитировать
мне это не надо, язык только русский. Делаю для того, чтобы не было русского текста в коде.

Тогда тебе ничего этого не надо. Убери русский язык из кода, переведи лингвистом и всё. QTextCodec тоже убери.


Название: Re: Частичный перевод
Отправлено: serg_hd от Апрель 29, 2010, 20:24
Тогда тебе ничего этого не надо. Убери русский язык из кода, переведи лингвистом и всё. QTextCodec тоже убери.
Так перевёл же, не цепляется перевод никак! Частично только переводит - весь тот текст, который не был назначен при инициализации.


Название: Re: Частичный перевод
Отправлено: Kolobok от Апрель 29, 2010, 20:39
Код:

int main(int argc, char *argv[])
{
 QApplication app(argc, argv);
 
 QTranslator translator;
 translator.load("langs/lang_ru");
 app.installTranslator(&translator);

 QLabel *label = new QLabel( tr( "My label" ) );
 label->show();
 
 MainForm mainForm;
 
 return app.exec();
}

Обнови перевод. Перекомпилируй полностью. Что в QLabel?

translator.load("langs/lang_ru") что возвращает?


Название: Re: Частичный перевод
Отправлено: serg_hd от Апрель 29, 2010, 20:56
Разобрался (не без помощи sendevent).
main():
Код
C++ (Qt)
int main(int argc, char *argv[])
{
...
QTranslator qtTranslator;
qtTranslator.load("qt_" + QLocale::system().name(), QLibraryInfo::location(QLibraryInfo::TranslationsPath));
app.installTranslator(&qtTranslator);
 
QTranslator translator;
translator.load("langs/lang_ru");
app.installTranslator(&translator);
 
MainForm mainForm;
 
return app.exec();
}
 

Мой gui-класс:
Код
C++ (Qt)
void Gui::changeEvent(QEvent* event)
{
if (event->type() == QEvent::LanguageChange)
 this->retranslateUi();
QWidget::changeEvent(event);
}
 
void Gui::retranslateUi()
{
this->startButton.setText(QApplication::translate("Gui", "START"));  //и так все виджеты
}