QTranslator: Интернационализация в Qt

QTranslator Интернационализация в Qt

Разработаем приложение, которое поддерживает два языка: русский и английский. Чтобы не усложнять задачу, составим его из двух окон. Первое позволит выбрать локаль и ввести имя пользователя. А второе всего лишь отобразит приветствие на основе указанного имени. Получится примерно следующее.

РЕКОМЕНДУЕМ: Обработка ошибок: Защитное программирование

Даем пользователю выбор

Начнем с окна выбора локали и имени пользователя. Мы уже подробно рассматривали создание диалоговых окон в Qt, поэтому в этот раз обойдемся без лишних рассуждений. Файл introdialog.h:

Соответствующая реализация introdialog.cpp:

Обратим внимание на две строки из фрагмента выше:

При инициализации текста меток QLabel мы используем функцию QObject::trUtf8(). Она позволяет ввести текст по умолчанию в кодировке UTF-8. Затем мы займемся его переводом на русский. Важным моментом является то, что строки не должны инициализировать статически. Вызов tfUtf8() должен происходить после установки объекта-переводчика.

Обратите внимание, что мы поместили в комбо-бокс имена локалей ru_RU (русская локаль) и en_US (английская локаль):

Логичным допущением становится то, что по умолчанию выбирается местная системная локаль, которую мы узнаем с помощью QLocale::system().name():

Инициализация перевода

Теперь займемся файлом main.cpp:

До отображения диалогового окна IntroDialog мы создаем объект QTranslator. Он умеет загружать файл перевода с помощью вызова load(). Первым аргументом эта функция-член принимает базовое имя файла перевода, а во втором — путь в файловой системе, где этот файл нужно искать.

Формирование базового имени файла перевода осуществляется в нашей функции generateTrFileName(). Она принимает имя локали, и возвращает строку вида i18ndemo_ru_RU.

Если QTranslator::load() возвращает true, то загрузка файла с переводом прошла успешна, и мы можем установить его для приложения:

Когда пользователь выбирает в диалоговом окне локаль и нажимает OK, мы повторно ее загружаем в уже существующий экземпляр translator‘а:

Далее мы просто создаем и отображаем QLabel с приветственной надписью. Вновь с использованием QObject::trUtf8().

Приложение уже можно запустить, но поскольку у нас нет переводов, то все надписи будут на английском. Что можно считать вполне уместным поведением по умолчанию. Но нас такой вариант не устраивает.

Готовим перевод

Для добавления переводов подправим pro-файл I18nDemo.pro:

Нас интересует переменная TRANSLATIONS, в которой указывается список ts-файлов с переводом. Мы определили всего один: для русского языка. Аналогично можно расширить список на произвольное количество переводов:

Далее необходимо выполнить в консоли команду из каталога проекта:

В результате появится файл: i18ndemo_ru.ts. Это обычный текстовый файл в формате XML. Его можно редактировать в любом текстовом редакторе или с помощью специального приложения Qt Linguist. Воспользуемся вторым вариантом при подготовке русского перевода. Интерфейс приложения достаточно очевиден, поэтому обойдемся без комментариев:

После сохранения содержимое файла i18ndemo_ru.ts станет примерно таким:

Но и это еще не все. После завершения работы над переводом нужно его скомпилировать. Это можно сделать в консоли с помощью следующей команды:

После этого появится соответствующий бинарный файл i18ndemo_ru.qm. Его нужно поместить в каталог с исполняемым файлом нашего проекта. Вот теперь можно считать, что работа окончена. Перевод успешно подключен и будет использоваться в приложении.

Несколько замечаний

  1. Поиск файла перевода довольно интеллектуален. Например, при вызове QTranslator::load() мы указываем имя i18ndemo_ru_RU, а находится i18ndemo_ru.qm. Это связано с тем, что у языков бывают диалекты. В частности, английский может быть американским en_US или британским en_GB. Если не получится найти перевод для project_name_en_GB, то QTranslator попытается загрузить просто project_name_en;
  2. Имеет смысл задуматься о помещении переводов в файл-ресурсов;
  3. Выбранный язык нужно хранить в конфигурационном файле, чтобы пользователю не приходилось выбирать его каждый раз при запуске приложения. Системную локаль в этом вопросе можно рассматривать лишь в качестве отправной точки.

РЕКОМЕНДУЕМ: Разработка через тестирование в Qt

Понравилась статья? Поделиться с друзьями:
Добавить комментарий