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

Зрелый интерфейс на Qt Linguist

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

Когда созревает сыр, его употребляют в пищу. Когда созревает программа, ей, как правило, приличествует обзавестись некоторыми возможностями, присущими зрелым приложениям. Начну с такой актуальной для большинства программ задачи, как перевод интерфейса на другой язык.

Сразу оговорюсь, что не буду использовать слова вроде «интернационализация» и «локализация». За кальку «локализация» впервые ухватились медики: «локализация боли» и тому подобное.

Следом потянулись компьютерные люди, разумея под «локализацией» перевод на родной язык. Соответственно, под «интернационализацией» они подразумевают перевод на множество языков, не только на родной.

Так вот, задачу перевода можно решить разными способами, и наиболее популярны здесь gettext и встроенные в Qt средства (впрочем, никто не мешает вам создать свой движок перевода - это не так уж сложно).

Поскольку речь идет о Qt, воспользуемся ее же средствами.

Функция tr()

Процесс перевода осуществляется в несколько этапов. Первый - на уровне исходника на C++. В Qt есть функция tr(), а точнее - статичная функция:
QObject::tr (const char *sourceText, const char *disambiguation = 0, int n = -1)

В ее параметре надо передать строковое значение, которое вы хотите перевести. Например:
QLabel *l = new QLabel (tr ("hello"));

В этом примере строка "hello" будет «помечена» для перевода. Более того, когда подсистема переводов Qt при помощи той же функции tr() найдет эту строку, то подставит нужный текст перевода. Если, конечно, всё правильно подготовить.



Итак, все строки, которые мы хотим перевести, помещаем как параметры tr():
QLabel *l1 = new QLabel (tr ("hello")); QLabel *l2 new QLabel (tr ("world"));

Утилиты lupdate и lrelease

В состав Qt входит утилита lupdate. Она, анализируя файлы исходника, создает текстовые файлы перевода, в формате Qt TS XML и кодировке UTF-8. Эти файлы можно изменять в обычном текстовом редакторе, но удобнее использовать специальную программу - Qt Linguist (запускается командой linguist).

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

Итак, TS-файлы - для правки перевода, а результат их компиляции, QM-файлы - для загрузки. Файлы обоих типов следует включать в дистрибутив исходника. Для распространения программы в бинарном виде TS-файлы уже не нужны, а вот QM - понадобятся.

Где хранить эти файлы? Как программа найдет их в системе? Чтобы не задумываться о том, где в такой-то операционной системе (либо отдельном дистрибутиве Linux) следует искать вспомогательные файлы, я советую использовать систему ресурсов Qt.

Файлы-ресурсы внедряются непосредственно в исполняемый бинарный файл, и местоположение таких файлов всегда и всюду одинаково, а для доступа к ним надо лишь предварить путь префиксом «:/». Скажем, вот так:
":/translations/ru.qm"

Как всё это воплотить в жизнь? Поставим для примера следующую задачу: есть интерфейс, изначально на английском языке, а мы хотим сделать (и затем обновлять) переводы на русский и немецкий.

Создадим в корне исходника пустой каталог translations. Теперь в файл проекта (.pro) добавим строки:
TRANSLATIONS = translations/ru.ts translations/de.ts

Это значит, что когда мы дадим команду:
$ lupdate имя-файла-проекта.pro

утилита lupdate пройдется по исходникам на предмет поиска функции tr(), и по результатам поиска создаст файлы ru.ts и de.ts, изначально без перевода (но с пустыми местами, куда надо вставить свои переводы строк). Когда вы добавите туда переведенные строки, каждый последующий вызов lupdate будет лишь обновлять эти файлы, не затирая уже переведенные строки.

Названия «ru» и «de» я выбрал неслучайно - это сокращенные имена локалей. Во время работы программы мы, получив имя текущей локали, сможем по нему составить имя требуемого файла с переводом.

Но вернемся к делу: еще не завершена работа с файлом проекта (*.pro). Добавляем содержимое каталога translations в DISTFILES, чтобы при выполнении команды make dist файлы перевода были включены в дистрибутив:
DISTFILES += translations/*

Теперь в '.pro-файле укажем файл ресурса, используемый программой. В нашем примере пусть это будет test.qrc:
RESOURCES += test.qrc

Простейший файл ресурса в данном случае выглядит так:


translations/ru.qm
translations/de.qm


Это значит, что внутри программы мы сможем обращаться к файлам ресурса по путям :/translations/ru.qm и :/translations/de.qm, как если бы они были частью обычной файловой системы.

Подготовительный этап завершен.

Поместите в своем исходнике строки, которые хотите перевести, в параметр макроса tr(). Запустите lupdate.
В Qt Linguist загрузите TS-файл и сделайте несколько пробных переводов строк. Затем сохраните TS-файл, и выберите пункт «Скомпилировать» либо воспользуйтесь командой:
$ lrelease имя-файла-проекта.pro

Должны получиться QM-файлы. Выполните:
$ qmake
$ make
$ make dist

Так вы сможете удостовериться, что файлы перевода включены в архив-дистрибутив исходника.
Перейдем к следующему этапу - автоматической загрузке в программе нужного (по текущей локали) перевода.

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

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

Поделиться

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

Комментарии

^ Наверх