Новость из категории: Информация

Qt Linguist: класс QTranslator и Смена языка интерфейса

Содержание:
1. Функция tr(), утилиты lupdate и lrelease;
2. Класс QTranslator и Смена языка интерфейса (Вы читаете данный раздел);
3. Перевод внутри не наследников и Заключительные штрихи .
Класс QTranslator

Qt Linguist: класс QTranslator и Смена языка интерфейса

В Qt задача перевода возложена на класс QTranslator. У него много функций, но обычно он используется только для загрузки нужного файла с переводом - остальное берет на себя функция QObject::tr().

В Qt есть «предустановленные» файлы перевода - такой перевод относится к разным надписям на стандартных кнопках и тому подобном. Поэтому нам понадобятся два экземпляра класса QTranslator: один для стандартных переводов Qt, а другой - для «пользовательских» переводов.

Эти экземпляры удобно объявить в объявлении класса главного окна:
QTranslator qtTranslator; //для предустановленного перевода QTranslator myappTranslator; //для вашего перевода

В каждый экземпляр QTranslator надо загрузить файл перевода и подключить этот QTranslator к экземпляру QApplication (к нему может быть подключено несколько QTranslator'ов). Вызов лучше всего поместить в конструктор главного окна.

Вот так мы загружаем «предустановленный» в Qt перевод:
qtTranslator.load (QString ("qt_%1").arg (QLocale::system().name()),
QLibraryInfo::location (QLibraryInfo::TranslationsPath));
qApp->installTranslator (&qtTranslator);

Разберем этот пример. В функцию QTranslator.load() надо передать имя файла с переводом. Стандартные QM-файлы перевода из состава самой Qt имеют имена вида qt_имя-локали. qm. Если в load() передать имя без расширения, то load() автоматически подставит расширение qm. Этим мы и воспользуемся.

Qt Linguist: класс QTranslator и Смена языка интерфейса

Итак, при помощи кода:
QString ("qt_%1").arg (QLocale::system().name()

составляется имя файла из префикса «qt_» и 2-буквенного сокращения текущей локали. Кодом:
QLibraryInfo::location (QLibraryInfo::TranslationsPath)

мы указываем, в каком каталоге искать этот файл с переводом (в каталоге Qt, где библиотека хранит файлы переводов). Для загрузки подготовленного лично вами файла переводов вашей программы код намного проще:
myappTranslator.load (":/translations/" + QLocale::system().name()); qApp->installTranslator (&myappTranslator);

То есть мы получаем имя локали, составляем из нее путь к файлу-ресурсу, загружаем его и подключаем экземпляр QTranslator к «системному» экземпляру QApplication, на который указывает переменная qApp.

Смена языка интерфейса

Для смены языка интерфейса на ходу, без перезагрузки программы, надо приложить некоторые усилия.

Во-первых, если вы хотите просто удалить перевод, то надо использовать функцию:
QCoreApplication::removeTranslator (QTranslator *translationFile)

Для смены языка интерфейса надо удалить из памяти старые переводы и затем загрузить новые. При удалении экземпляра переводчика либо загрузке новых файлов перевода возникает событие QEvent::LanguageChange. В каждом виджете надо предусмотреть его обработку, переопределив метод changeEvent(QEvent *event), где фактически «вручную» задать надписи подчиненным виджетам при помощи той же функции tr(). Иначе же, уже созданные, существующие в момент смены языка виджеты, так и не будут переведены на новый язык.

Посмотрите на такой пример (взят из документации Qt):
void MyWidget::changeEvent (QEvent *event)
{
if (e->type() == QEvent::LanguageChange)
{
titleLabel->setText (tr ("Document Title"));
okPushButton->setText (tr ("&OK"));
}
else
QWidget::changeEvent(event);
}

И это для смены перевода всего двух виджетов! Логика подсказывает, что если вам так уж необходимо динамическое переключение языка интерфейса, то следует его выполнить следующим образом: функционально развести создание виджетов и назначение им надписей. Иначе же придется по два раза давать надписи каждому виджету: один раз при его создании, а другой раз - в коде, отвечающем за динамическое переключение языка.

Рейтинг статьи

Оценка
3/5
голосов: 4
Ваша оценка статье по пятибальной шкале:
 
 
   

Поделиться

Похожие новости

Комментарии

^ Наверх