Читаем QT 4: программирование GUI на С++ полностью

Вместо жесткого кодирования поддерживаемых приложением языков мы создаем один пункт меню для каждого файла .qm, расположенного в каталоге приложения translations. Для простоты мы предполагаем, что для английского языка также имеется файл .qm. Можно поступить по-другому и вызывать функцию clear для объектов QTranslator, когда пользователь выбирает английский язык.

Определенную трудность составляет представление удобных названий языкам файлами .qm. Просто использование сокращений «en» для английского языка или «de» для немецкого языка, основанное на названии файла .qm, выглядит не лучшим образом и может запутать некоторых пользователей. Решение, которое используется функцией createLanguageMenu, состоит в «переводе» строки «English» (английский язык) в контексте «MainWindow». Эта строка должна принимать значение «Deutsch» при переводе на немецкий язык, «Francais» при переводе на французский язык и «♦♦♦» при переводе на японский язык.

Мы создаем по одному помечаемому пункту меню QAction на каждый язык и храним локальное имя в его элементе данных. Мы добавляем их в объект QActionGroup, чтобы всегда мог быть помечен только один пункт меню Language. Когда пользователь выбирает какую-то команду из группы, объект QActionGroup генерирует сигнал triggered(QAction *), который связан с switchLanguage.

01 void MainWindow::switchLanguage(QAction *action)

02 {

03 QString locale = action->data.toString;

04 appTranslator.load("callcenter_" + locale, qmPath);

05 qtTranslator.load("qt_" + locale, qmPath);

06 retranslateUi;

07 }

Слот switchLanguage вызывается, когда пользователь выбирает язык из меню Language. Мы загружаем файлы перевода приложения и библиотеки Qt и затем вызываем функцию retranslateUi для нового перевода всех строк главного окна.

В системе Windows в качестве альтернативы меню Language можно использовать обработку событий LocaleChange — события этого типа генерируются Qt при обнаружении изменения среды локализации. Событие этого типа существует на всех платформах, поддерживаемых Qt, но фактически они генерируются только в системе Windows, когда пользователь изменяет системные настройки локализации (при задании параметров региона и языка на Панели управления). Для обработки событий LocaleChange мы можем переопределить функцию QWidget::changeEvent следующим образом:

01 void MainWindow::changeEvent(QEvent *event)

02 {

03 if (event->type == QEvent::LocaleChange) {

04 appTranslator.load("callcenter_"

05 + QLocale::system.name, qmPath);

06 qtTranslator.load("qt_" + QLocale::system.name, qmPath);

07 retranslateUi;

08 }

09 QMainWindow::changeEvent(event);

10 }

Если пользователь переключается на другую локализацию во время выполнения приложения, мы пытаемся загрузить файлы перевода, соответствующие новой локализации, и вызываем функцию retranslateUi для обновления интерфейса пользователя. Во всех случаях мы передаем событие функции базового класса changeEvent, поскольку один из наших классов тоже может быть заинтересован в обработке событий LocaleChange или других событий.

На этом мы закончили наш обзор программного кода класса MainWindow. Теперь мы рассмотрим программный код одного из классов—виджетов приложения, а именно класса JournalView, чтобы определить, какие изменения потребуются для обеспечения поддержки им динамического перевода.

01 JournalView::JournalView(QWidget *parent)

02 : QTableWidget(parent)

03 {

04 retranslateUi;

05 }

Класс JournalView является подклассом QTableWidget. В конце конструктора мы вызываем закрытую функцию retranslateUi для перевода строк виджета. Это напоминает то, что мы делали для класса MainWindow.

01 void JournalView::changeEvent(QEvent *event)

02 {

03 if (event->type == QEvent::LanguageChange)

04 retranslateUi;

05 QTableWidget::changeEvent(event);

06 }

Перейти на страницу:
Нет соединения с сервером, попробуйте зайти чуть позже