Russian Qt Forum
Ноябрь 23, 2024, 02:11 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Перевод  (Прочитано 6724 раз)
Вудруф
Гость
« : Декабрь 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 загружается, а интерфейс не меняется!
Что делать?
Записан
Вудруф
Гость
« Ответ #1 : Декабрь 08, 2005, 09:07 »

И ещё вопрос: Как загрузить файл qt_ru.qm и где он вообще находится?
Записан
joktar
Гость
« Ответ #2 : Декабрь 08, 2005, 14:26 »

После загрузке файла нужно вызывать retranslateUi()
qt_ru.qm генерится lupdate/lrelease
Записан
L.Marvell
Гость
« Ответ #3 : Декабрь 08, 2005, 14:41 »

А зачем такие сложности с путями при загрузке файлов? Если просто делать translator->load(filename), то прога попытается найти файл перевода в своей директории. Если же переводы находятся в дир-я проги/translations, тогда translator->load(filename, "translations").
По поводу того, что перевод не срабатывает. А интерфейс разрабатывался в дизайнере? Если да, тогда после загрузки транслятора еще нужно сделать ui->retranslateUi()
Записан
Вудруф
Гость
« Ответ #4 : Декабрь 09, 2005, 13:33 »

Ошибка найдена... Файлы назывались "app_*.qm", а загружать пытался "lang_.qm"
Что вверху и видно Улыбающийся

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

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

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

Дизайн делался руками, поэтому видимо функция retranslateUi не нужна...
Записан
L.Marvell
Гость
« Ответ #5 : Декабрь 09, 2005, 18:45 »

Нужно писать свою функцию аля retranslateStrings(). Сейчас в точности не вспомню всю кухню, если интересует, завтра напишу более детально.
Записан
Dendy
Гость
« Ответ #6 : Декабрь 09, 2005, 19:09 »

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

Да это всё понятно. Всё равно не работало... Улыбающийся
А проблема нашлась в следующем:
Не работает:
namespace myNamespace
{
   class MainWindow : public QMainWindow
   {
      Q_OBJECT
Работает:
class MainWindow : public QMainWindow
{
   Q_OBJECT

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

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

 Да, кстати, про перевод самой Qt кто-нибудь ответить может?
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 5.051 секунд. Запросов: 21.