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

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

Жанры

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

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

Шрифт:

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 }

Мы

также переопределяем функцию changeEvent для вызова retranslateUi при генерации событий LanguageChange. Qt генерирует событие LanguageChange при изменении содержимого объекта QTranslator, который в данный момент используется в QApplication. В нашем приложении это происходит, когда мы вызываем load для appTranslator или qtTranslator либо из функции MainWindow::switchToLanguage, либо из функции MainWindow::changeEvent.

События LanguageChange не следует путать с событиями LocaleChange. Событие LocaleChange генерируется системой и говорит приложению: «Возможно, следует загрузить новый файл перевода». В отличие от него, событие LanguageChange генерируется Qt и говорит виджетам приложения: «Возможно, следует заново выполнить перевод всех ваших строк».

При реализации нами класса MainWindow не нужно было реагировать на событие LanguageChange. Вместо этого мы просто всякий раз вызывали функцию retranslateUi при вызове load для QTranslator.

01 void JournalView::retranslateUi

02 {

03 QStringList labels;

04 labels << tr("Time") << tr("Priority") << tr("Phone Number")

05 << tr("Subject");

06 setHorizontalHeaderLabels(labels);

07 }

Функция retranslateUi заново создает заголовки, используя новый переведенный текст, и этим мы завершаем рассмотрение программного кода, относящегося к переводу созданного вручную виджета. Для виджетов и диалоговых окон, которые разрабатываются при помощи Qt Designer, утилита uic автоматически генерирует функцию, подобную retranslateUi, которая автоматически вызывается в ответ на события LanguageChange.

Перевод приложений

Перевод приложения Qt, которое содержит вызовы tr, состоит из трех этапов:

1. Выполнение утилиты lupdate для извлечения из исходного кода приложения всех видимых пользователем строк.

2. Перевод приложения при помощи Qt Linguist.

3. Выполнение утилиты lrelease для получения двоичных файлов .qm, которые приложение может загружать при помощи объекта QTranslator.

Этапы 1 и 3 выполняются разработчиками приложения. Этап 2 выполняется переводчиками. Эта последовательность

действий может выполняться любое количество раз в ходе разработки приложения и на протяжении всего его жизненного цикла.

В качестве примера мы продемонстрируем перевод приложения Электронная таблица из главы 3 . Приложение уже содержит вызовы tr для всех видимых пользователем строк.

Во-первых, мы должны немного модифицировать файл приложения .pro, указав языки, которые мы собираемся поддерживать. Например, если бы мы хотели поддерживать кроме английского также немецкий и французский, мы бы добавили следующий элемент TRANSLATIONS в файл spreadsheet.pro:

TRANSLATIONS = spreadsheet_de.ts

\ spreadsheet_fr.ts

Здесь мы указали два файла переводов: один для немецкого языка и второй для французского языка.

Эти файлы будут созданы при первом выполнении утилиты lupdate, и затем они будут обновляться при каждом последующем выполнении lupdate.

Эти файлы обычно имеют расширение .ts. Они имеют простой формат XML и не столь компактны, как двоичные файлы .qm, которые «понимают» объекты типа QTranslator. В задачу утилиты lrelease входит преобразование предназначенных для людей файлов .ts в эффективное машинное представление в виде файлов .qm. Между прочим, сокращение .ts означает файл «translation source» (файл с исходным текстом перевода), а .qm — файл «Qt message» (файл сообщений Qt).

Предположим, что мы находимся в каталоге, который содержит исходный код приложения Электронная таблица, и тогда мы можем выполнить утилиту lupdate для spreadsheet.pro, задавая в командной строке следующую команду:

lupdate -verbose spreadsheet.pro

Опция —verbose указывает утилите lupdate на необходимость более интенсивной обратной связи, чем та, которая обеспечивается при нормальном режиме работы. Ниже приводятся сообщения, получения которых следует ожидать в результате работы утилиты:

Updating 'spreadsheet_de.ts'...

Found 98 source texts (98 new and 0 already existing)

Updating 'spreadsheet_fr.ts'...

Found 98 source texts (98 new and 0 already existing)

Все строки, которые задаются в вызовах функции tr в исходном коде приложения, хранятся в файлах .ts (в том числе и псевдоперевод). Сюда также включаются строки из файлов приложения .ui.

По умолчанию утилита lupdate предполагает, что передаваемые функции tr строки используют кодировку Latin-1. Если это не так, мы должны добавить элемент CODECFORTR в файл .pro. Например:

CODECFORTR = EUC-JP

Это должно быть сделано в дополнение к вызову QTextCodec::setCodecForTr из функции приложения main.

Затем в файлы spreadsheet_de.ts и spreadsheet_fr.ts необходимо добавить перевод, выполненный при помощи Qt Linguist.

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

Газлайтер. Том 8

Володин Григорий
8. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 8

На Ларэде

Кронос Александр
3. Лэрн
Фантастика:
фэнтези
героическая фантастика
стимпанк
5.00
рейтинг книги
На Ларэде

Охота на попаданку. Бракованная жена

Герр Ольга
Любовные романы:
любовно-фантастические романы
5.60
рейтинг книги
Охота на попаданку. Бракованная жена

Кай из рода красных драконов

Бэд Кристиан
1. Красная кость
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Кай из рода красных драконов

Хозяйка Проклятой Пустоши. Книга 2

Белецкая Наталья
2. Хозяйка Проклятой Пустоши
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Хозяйка Проклятой Пустоши. Книга 2

Безумный Макс. Поручик Империи

Ланцов Михаил Алексеевич
1. Безумный Макс
Фантастика:
героическая фантастика
альтернативная история
7.64
рейтинг книги
Безумный Макс. Поручик Империи

Потусторонний. Книга 2

Погуляй Юрий Александрович
2. Господин Артемьев
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Потусторонний. Книга 2

Чапаев и пустота

Пелевин Виктор Олегович
Проза:
современная проза
8.39
рейтинг книги
Чапаев и пустота

Солнечный корт

Сакавич Нора
4. Все ради игры
Фантастика:
зарубежная фантастика
5.00
рейтинг книги
Солнечный корт

Лютая

Шёпот Светлана Богдановна
Любовные романы:
любовно-фантастические романы
6.40
рейтинг книги
Лютая

Ведьмак (большой сборник)

Сапковский Анджей
Ведьмак
Фантастика:
фэнтези
9.29
рейтинг книги
Ведьмак (большой сборник)

Наследие Маозари 4

Панежин Евгений
4. Наследие Маозари
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Наследие Маозари 4

Ученик

Губарев Алексей
1. Тай Фун
Фантастика:
фэнтези
5.00
рейтинг книги
Ученик

Начальник милиции. Книга 5

Дамиров Рафаэль
5. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Начальник милиции. Книга 5