Russian Qt Forum

Qt => Интернационализация, локализация => Тема начата: Вудруф от Декабрь 08, 2005, 09:05



Название: Перевод
Отправлено: Вудруф от Декабрь 08, 2005, 09:05
Я полистал форум и всё равно не понял, как динамически изменить язык.

Сделал следующим образом:
   //Find language files
   QDir dir (QCoreApplication::applicationDirPath() + "/../translations");
   QStringList fileNames = dir.entryList (QStringList ("app_*.qm"), QDir::Files, QDir::Name);
   //Creating acts
   defaultLanguageAct = new QAction ("English", languageGroup);
   defaultLanguageAct -> setCheckable (true);
   connect (defaultLanguageAct, SIGNAL (triggered()), SLOT (setDefaultlanguage()));
   defaultLanguageAct -> setWhatsThis (tr ("Set english language"));
   for (int i = 0; i < fileNames.size(); ++i)
   {
      QTranslator translator;
      translator.load (dir.absoluteFilePath (fileNames));
      QAction *current = new QAction (translator.translate ("Language", "English"), languageGroup);
      current -> setCheckable (true);
      current -> setWhatsThis (translator.translate ("Language", "Set english language"));
      languageActs.push_back (current);
      qmFileForAction.insert (std::pair <QAction*, QString> (current, translator.translate ("Language", "en")));
   }
   //Connecting language acts
   for (unsigned int i = 0; i < languageActs.size(); ++i)
      connect (languageActs, SIGNAL (triggered()), SLOT (languageChanged()));

Далее при смене языка:
   QCoreApplication::instance() -> removeTranslator (applicationTranslator);
   applicationTranslator -> load (QCoreApplication::applicationDirPath() + "/../translations/lang_" + qmFileForAction[languageGroup -> checkedAction()]);
   QCoreApplication::instance() -> installTranslator (applicationTranslator);

Нажимаю на Русский, файл app_ru.qt загружается, а интерфейс не меняется!
Что делать?


Название: Перевод
Отправлено: Вудруф от Декабрь 08, 2005, 09:07
И ещё вопрос: Как загрузить файл qt_ru.qm и где он вообще находится?


Название: Перевод
Отправлено: joktar от Декабрь 08, 2005, 14:26
После загрузке файла нужно вызывать retranslateUi()
qt_ru.qm генерится lupdate/lrelease


Название: Перевод
Отправлено: L.Marvell от Декабрь 08, 2005, 14:41
А зачем такие сложности с путями при загрузке файлов? Если просто делать translator->load(filename), то прога попытается найти файл перевода в своей директории. Если же переводы находятся в дир-я проги/translations, тогда translator->load(filename, "translations").
По поводу того, что перевод не срабатывает. А интерфейс разрабатывался в дизайнере? Если да, тогда после загрузки транслятора еще нужно сделать ui->retranslateUi()


Название: Перевод
Отправлено: Вудруф от Декабрь 09, 2005, 13:33
Ошибка найдена... Файлы назывались "app_*.qm", а загружать пытался "lang_.qm"
Что вверху и видно :)

Под qt_ru.qm подразумевался файл с переводами самой Qt... Где его найти?

добавлено спустя 21 минуту:

 И всё равно это проблему не решило..
QCoreApplication::instance() -> installTranslator (applicationTranslator);
После выполнения этой строки ничего не переводится, хотя
applicationTranslator -> translate ("Language", "English") возвращает "Русский", т.е. он был загружен... Ничего не понимаю.

Дизайн делался руками, поэтому видимо функция retranslateUi не нужна...


Название: Перевод
Отправлено: L.Marvell от Декабрь 09, 2005, 18:45
Нужно писать свою функцию аля retranslateStrings(). Сейчас в точности не вспомню всю кухню, если интересует, завтра напишу более детально.


Название: Перевод
Отправлено: Dendy от Декабрь 09, 2005, 19:09
Установка транслятора имеет єффект только если она делается перед получением данньlх из транстятора. Фактически заменяется хеш для переводимьlх строк. Визуальньlе и все остальньlе елементьl управления для повьlшения скорости работьl хранят в себе результат, полученньlй из хеша, а не сам ключ. Поєтому после заменьl транслятора необходимо переполучить заново все данньlе из нового хеша. Для UI-форм єто делается с помощью retranslateUi( QWidget * ), для всех остальньlх случаев (например, создание форм руцями в коде) нужно реализовьlвать механизмьl заменьl строк/картинок самому.


Название: Перевод
Отправлено: Вудруф от Декабрь 10, 2005, 19:20
Да это всё понятно. Всё равно не работало... :)
А проблема нашлась в следующем:
Не работает:
namespace myNamespace
{
   class MainWindow : public QMainWindow
   {
      Q_OBJECT
Работает:
class MainWindow : public QMainWindow
{
   Q_OBJECT

Весьма странно, вам не кажется?

добавлено спустя 4 минуты:

 Да, кстати, про перевод самой Qt кто-нибудь ответить может?