Чтение онлайн

на главную - закладки

Жанры

QT 4: программирование GUI на С++

Саммерфилд Марк

Шрифт:

Рассмотренная ранее функция createMenus вызывала функцию createLanguageMenu для заполнения меню Language списком языков:

01 void MainWindow::createLanguageMenu

02 {

03 languageMenu = new QMenu(this);

04 languageActionGroup = new QActionGroup(this);

05 connect(languageActionGroup, SIGNAL(triggered(QAction *)),

06 this, SLOT(switchLanguage(QAction *)));

07 QDir dir(qmPath);

08 QStringList fileNames = dir.entryList(QStringList("callcenter_*.qm"));

09 for (int i = 0; i < fileNames.size; ++i) {

10 QString locale = fileNames[i];

11 locale.remove(0, locale.indexOf('_') + 1);

12 locale.truncate(locale.lastIndexOf('.'));

13 QTranslator translator;

14 translator.load(fileNames[i], qmPath);

15 QString language = translator.translate("MainWindow",

16 "English");

17 QAction *action = new QAction(tr("&%1 %2")

18 .arg(i + 1).arg(language), this);

19 action->setCheckable(true);

20 action->setData(locale);

21 languageMenu->addAction(action);

22 languageActionGroup->addAction(action);

23 if (language == "English")

24 action->setChecked(true);

25 }

26 }

Вместо

жесткого кодирования поддерживаемых приложением языков мы создаем один пункт меню для каждого файла .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, чтобы определить, какие изменения потребуются для обеспечения поддержки им динамического перевода.

Поделиться:
Популярные книги

Атаман царского Спецназа

Корчевский Юрий Григорьевич
Боевая фантастика Ю. Корчевского
Фантастика:
боевая фантастика
попаданцы
альтернативная история
6.00
рейтинг книги
Атаман царского Спецназа

Ваше Сиятельство 3

Моури Эрли
3. Ваше Сиятельство
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Ваше Сиятельство 3

Виконт, который любил меня

Куин Джулия
2. Бриджертоны
Любовные романы:
исторические любовные романы
9.13
рейтинг книги
Виконт, который любил меня

Эпоха Опустошителя. Том IX

Павлов Вел
9. Вечное Ристалище
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Эпоха Опустошителя. Том IX

Четники. Королевская армия

Тимофеев Алексей Юрьевич
Документальная литература:
биографии и мемуары
публицистика
5.00
рейтинг книги
Четники. Королевская армия

Древесный маг Орловского княжества 13

Павлов Игорь Васильевич
13. Орловское княжество
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Древесный маг Орловского княжества 13

Ученик

Первухин Андрей Евгеньевич
1. Ученик
Фантастика:
фэнтези
6.20
рейтинг книги
Ученик

Неучтенный элемент. Том 5

NikL
5. Антимаг. Вне системы
Фантастика:
фэнтези
5.00
рейтинг книги
Неучтенный элемент. Том 5

Мажор. Дилогия.

Соколов Вячеслав Иванович
Фантастика:
боевая фантастика
8.05
рейтинг книги
Мажор. Дилогия.

Телохранитель Генсека. Том 2

Алмазный Петр
2. Медведев
Фантастика:
попаданцы
альтернативная история
6.25
рейтинг книги
Телохранитель Генсека. Том 2

Простолюдин

Рокотов Алексей
1. Путь князя
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Простолюдин

Последний Паладин. Том 10

Саваровский Роман
10. Путь Паладина
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Последний Паладин. Том 10

Последний Паладин

Саваровский Роман
1. Путь Паладина
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Последний Паладин

Граф Книга третья

Первухин Андрей Евгеньевич
10. Ученик
Фантастика:
фэнтези
попаданцы
5.25
рейтинг книги
Граф Книга третья