Qt linguist что это
Перейти к содержимому

Qt linguist что это

Qt Linguist Manual

Qt provides excellent support for translating Qt C++ and Qt Quick applications into local languages. Release managers, translators, and developers can use Qt tools to accomplish their tasks.

Release managers bear the overall responsibility for the release of the application. Typically, they coordinate the work of developers and translators. They can use the lupdate tool to synchronize source code and translations and the lrelease tool to create run-time translation files for use by the released application.

Translators can use the Qt Linguist tool to translate text in applications. No computer knowledge beyond the ability to start a program and use a text editor or word processor is required.

Developers must create Qt applications that are able to use translated text. They should also help translators identify the context in which phrases appear. Developers can use tutorials to learn about their tasks.

For more information about the supported languages and writing systems, see Internationalization with Qt.

Table of Contents

© 2022 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.

15.4. Перевод существующих приложений.

Утилитой lupdate извлекаются все строки из исходного текста приложения.

Выполняется перевод строк, с помощью утилиты Qt Linguist .

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

В качестве примера, рассмотрим процесс перевода приложения Spreadsheet, которое было написано нами в Главе 3. Оно уже содержит все необходимые вызовы tr().

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

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

Обычно исходные файлы с переводом имеют расширение .ts. Они записываются в формате XML и потому занимают больше места на диске, чем скомпилированные файлы с переводом .qm. Для тех, кому это интересно — .ts означает "translation source" (исходный текст перевода), а .qm — "Qt message".

Допустим, что мы уже находимся в каталоге с исходными текстами приложения Spreadsheet. Теперь запускаем lupdate из командной строки:

Ключ -verbose — необязательный. Он просто заставляет lupdate выводить более подробную информацию в ходе своей работы. Ниже приведен примерный вывод, полученный во время работы утилиты: Каждая строка, которая "завернута" в вызов tr(), заносится в .ts, с пустым местом для перевода. Строки, которые находятся в файле .ui, так же включаются в исходный файл перевода.

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

Это необходимо делать в дополнение к вызову 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: Предположим, что мы сделали перевод на русский язык 19-ти строк, причем установили признак Done для 17-ти из них. В этом случае мы получим от lrelease примерно такой вывод: Непереведенные строки, при пробном запуске приложения, будут отображаться на языке оригинала. Флаг Done никак не используется утилитой lrelease, он предназначен исключительно для переводчика, чтобы напоминать о том, какие строки имеют окончательный перевод, а какие требуют уточнения.

В случае внесения изменений в исходный код приложения, содержимое файлов .ts может "устареть". Чтобы этого не происходило нужно всякий раз запускать утилиту lupdate, добавлять перевод для вновь появляющихся строк и пересобирать файлы .qm. Некоторые команды разработчиков синхронизируют перевод так часто, насколько это только возможно, другие предпочитают дождаться окончательного релиза приложения и только тогда приступают к переводу.

Утилиты lupdate и Qt Linguist достаточно "умны". Переведенные строки, необходимость в которых уже отпала, все равно сохраняются в исходных файлах с переводами, на тот случай, если они могут понадобиться в будущем. При обновлении файлов .ts, утилита lupdate использует интеллектуальный алгоритм объединения, который помогает избежать лишней работы по переводу одинаковых строк в различных контекстах.

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

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

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

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

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

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

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

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

В ее параметре надо передать строковое значение, которое вы хотите перевести. Например:

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

Итак, все строки, которые мы хотим перевести, помещаем как параметры tr():

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

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

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

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

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

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

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

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

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

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

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

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

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

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *