Название: Перевод Отправлено: Вудруф от Декабрь 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 кто-нибудь ответить может? |