qmPath);
qtTranslator->load(QString("qt_") + QTextCodec::locale(),
qmPath);
retranslateStrings();
}
return QMainWindow::event(event);
}
Если пользователь изменит региональные настройки во время работы приложения, то будет произведена попытка загрузить соответствующий файл с переводом и последующим вызовом retranslateStrings() будет обновлен интерфейс приложения.
В любом случае, событие передается обработчику событий предка, поскольку базовый класс так же может быть заинтересован в получении события LocaleChange.
На этом мы завершаем обзор класса MainWindow и переходим к одному из виджетов главного окна -- JournalView, чтобы показать, какие изменения необходимо внести, чтобы он так же поддерживал возможность изменения языка во время работы приложения.
JournalView::JournalView(QWidget *parent, const char *name)
: QListView(parent, name)
{
...
retranslateStrings();
}
Класс JournalView порожден от класса QListView. В конце конструктора класса вызывается его метод retranslateStrings(). Это очень похоже на то, что мы делали в классе главного окна.
bool JournalView::event(QEvent *event)
{
if (event->type() == QEvent::LanguageChange)
retranslateStrings();
return QListView::event(event);
}
Обработчик событий виджета вызывает retranslateStrings(), при поступлении события LanguageChange.
Qt генерирует событие LanguageChange, при изменении содержимого QTranslator. В нашем приложении эта ситуация возникает, когда вызывается функция load(), для загрузки файлов перевода в appTranslator и qtTranslator.
Не следует путать события LanguageChange и LocaleChange. Событие LocaleChangeкак бы говорит приложению: "Необходимо загрузить другой файл с переводом", а событие LanguageChange: "Необходимо выполнить перевод всех строк".
В классе MainWindow у нас не возникало необходимости реагировать на событиеLanguageChange, поскольку функция retranslateStrings() итак вызывалась сразу же вслед за загрузкой нового файла перевода.
void JournalView::retranslateStrings()
{
for (int i = columns() - 1; i >= 0; --i)
removeColumn(i);
addColumn(tr("Time"));
addColumn(tr("Priority"));
addColumn(tr("Phone Number"));
addColumn(tr("Subject"));
}
Функция retranslateStrings() пересоздает заголовки столбцов в QListView, с новыми надписями в них. Для этого, сначала все заголовки удаляются, а потом создаются новые. Эта операция воздействует только на заголовки столбцов и никак не влияет на содержимое QListView.
Для диалогов и виджетов, создаваемых в визуальном построителе Qt Designer, утилита uic сама создает функции, похожие на retranslateStrings(), которая автоматически вызывается в ответ на событие LanguageChange. Все что нам остается сделать -- это загрузить соответствующий файл с переводом, когда пользователь изменяет язык приложения.
15.4. Перевод существующих приложений.
Перевод Qt-приложений, которые содержат в себе вызовы tr(), выполняется в три приема;
1. Утилитой lupdate извлекаются все строки из исходного текста приложения.
2. Выполняется перевод строк, с помощью утилиты Qt Linguist.
3. С помощью утилиты lrelease создается двоичный файл .qm с переводом, который потом может быть загружен приложением.
Пункты 1 и 3 выполняются разработчиком приложения. Пункт 2 -- переводчиком. Этот процесс может повторяться неоднократно, в ходе разработки и эксплуатации приложения.
В качестве примера, рассмотрим процесс перевода приложения Spreadsheet, которое было написано нами в Главе 3. Оно уже содержит все необходимые вызовы tr().
Прежде всего, необходимо внести изменения в файл проекта .pro, чтобы указать -- какие языки будут поддерживаться приложением. Допустим, что мы собираемся включить поддержку немецкого, французского и русского языков, дополнительно к английскому, тогда необходимо в файл spreadsheet. pro добавить разделTRANSLATIONS:
TRANSLATIONS = spreadsheet_de. ts \
spreadsheet_fr. ts \
spreadsheet_ru. ts
Здесь мы указали три файла переводов: для немецкого, французского и русского языков. Эти файлы будут созданы при первом запуске утилиты lupdate, а на последующих запусках будут просто дополняться.
Обычно исходные файлы с переводом имеют расширение .ts. Они записываются в формате XML и потому занимают больше места на диске, чем скомпилированные файлы с переводом .qm. Для тех, кому это интересно -- .ts означает "translation source" (исходный текст перевода), а .qm -- "Qt message".
Допустим, что мы уже находимся в каталоге с исходными текстами приложения Spreadsheet. Теперь запускаем lupdate из командной строки:
lupdate - verbose spreadsheet. pro
Ключ -verbose -- необязательный. Он просто заставляет lupdate выводить более подробную информацию в ходе своей работы. Ниже приведен примерный вывод, полученный во время работы утилиты:
Updating spreadsheet_de. ts...
0 known, 101 new and 0 obsoleted messages
Updating spreadsheet_fr. ts...
0 known, 101 new and 0 obsoleted messages
Updating spreadsheet_ru. ts...
0 known, 101 new and 0 obsoleted messages
Каждая строка, которая "завернута" в вызов tr(), заносится в .ts, с пустым местом для перевода. Строки, которые находятся в файле .ui, так же включаются в исходный файл перевода.
По-умолчанию, lupdate предполагает, что все строки, завернутые в вызовы tr(), набраны в кодировке Latin-1. Если это не так, необходимо указать элемент CODEC в файле .pro, например так:
CODEC = EUC-JP
Это необходимо делать в дополнение к вызову QTextCodec::setCodecForTr() в приложении.
Перевод, в файлы spreadsheet_de. ts, spreadsheet_fr. ts и spreadsheet_ru. ts, добавляется переводчиком, с помощью утилиты Qt Linguist.
Чтобы запустить Qt Linguist, в среде Windows, выберите пункт Qt 3.2.x | Qt Linguist в меню Пуск, в среде Unix -- наберите команду linguist. Затем, с помощью менюFile|Open, откройте файл с исходным текстом перевода.
С левой стороны главного окна Qt Linguist находится список контекстов переводов. Для Spreadsheet существуют следующие контексты: "FindDialog", "GoToCellDialog", "MainWindow", "SortDialog" и "Spreadsheet". В верхней части с правой стороны находится список строк для текущего контекста. Каждая строка отображается вместе с переводом и флагом Done ("Готово"). В средней области, с правой стороны, вводится текст перевода для текущей строки. И внизу находится список переводов, автоматически предлагаемых утилитой Qt Linguist.
По окончании работы над переводом, файл .ts необходимо преобразовать в файл .qm. Для этого, в приложении Qt Linguist выберите пункт меню File|Release. Обычно, после перевода нескольких строк, выполняются пробные запуски приложения, с созданным файлом .qm, чтобы визуально оценить качество перевода.

Рисунок 15.2. Qt Linguist в действии.
Чтобы перегенерировать все файлы .qm сразу, необходимо запустить утилиту командной строки lrelease:
lrelease - verbose spreadsheet. pro
Предположим, что мы сделали перевод на русский язык 19-ти строк, причем установили признак Done для 17-ти из них. В этом случае мы получим от lrelease примерно такой вывод:
Updating spreadsheet_de. qm...
0 finished, 0 unfinished and 101 untranslated messages
Updating spreadsheet_fr. qm...
0 finished, 0 unfinished and 101 untranslated messages
Updating spreadsheet_ru. qm...
17 finished, 2 unfinished and 82 untranslated messages
Непереведенные строки, при пробном запуске приложения, будут отображаться на языке оригинала. Флаг Done никак не используется утилитой lrelease, он предназначен исключительно для переводчика, чтобы напоминать о том, какие строки имеют окончательный перевод, а какие требуют уточнения.
В случае внесения изменений в исходный код приложения, содержимое файлов .tsможет "устареть". Чтобы этого не происходило нужно всякий раз запускать утилитуlupdate, добавлять перевод для вновь появляющихся строк и пересобирать файлы. qm. Некоторые команды разработчиков синхронизируют перевод так часто, насколько это только возможно, другие предпочитают дождаться окончательного релиза приложения и только тогда приступают к переводу.
Утилиты lupdate и Qt Linguist достаточно "умны". Переведенные строки, необходимость в которых уже отпала, все равно сохраняются в исходных файлах с переводами, на тот случай, если они могут понадобиться в будущем. При обновлении файлов .ts, утилита lupdate использует интеллектуальный алгоритм объединения, который помогает избежать лишней работы по переводу одинаковых строк в различных контекстах.
За дополнительной информацией о программах Qt Linguist, lupdate и lrelease, обращайтесь к справочному руководству Qt Linguist, которое доступно по адресу:http://doc. /3.2/linguist-manual. html. Это руководство содержит полное описание пользовательского интерфейса программы и пошаговый самоучитель для программистов.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 |


