Переводы приложений
Интернационализация и локализация приложения — это процессы адаптации приложения к различным языкам, региональным различиям и техническим требованиям целевого рынка. Интернационализация подразумевает разработку программного приложения таким образом, чтобы оно могло быть адаптировано к различным языкам и регионам без технических изменений. Локализация означает адаптацию интернационализированного программного обеспечения для конкретного региона или языка путем добавления компонентов, специфичных для данной локали (таких как форматы даты, времени и чисел) и перевода текста.
Нативные приложения для ОС Аврора могут быть локализованы средствами Qt. Переводы приложений хранятся в ts-файлах. При создании проекта приложения по шаблону появится каталог translations с двумя ts-файлами, содержащими вариант текстов по умолчанию и переводы для русского языка.
По умолчанию язык (локаль) для приложения берётся из системы. Но также локаль можно переключать внутри приложения.
- Перевод названия приложения
- Конфигурация приложения
- Процесс перевода Аврора-приложения
- ts-файлы
- Что следует локализировать
Перевод названия приложения
Название приложения, отображаемое пользователю в списке приложений, может быть локализовано в desktop-файле. Для этого нужно задать значение переменной Name, указав в квадратных скобках язык, на который осуществляется перевод. Пример:
Name=Push Receiver
Name[ru]=Получение пушей
Конфигурация приложения
qmake
Чтобы переводить приложение средствами Qt, в pro-файле приложения должна
быть подключена библиотека auroraapp_i18n
, а ts-файлы перечислены в переменной TRANSLATIONS
.
Пример:
CONFIG += auroraapp_i18n
TRANSLATIONS += \
translations/ru.auroraos.PushReceiver.ts \
translations/ru.auroraos.PushReceiver-ru.ts \
Если приложение создается по шаблону, данная конфигурация будет создана вместе с ним.
Новые ts-файлы следует создавать в том же каталоге translations и указывать в списке
для переменной TRANSLATIONS
.
Язык указывается в конце имени ts-файла через дефис.
Например, для приложения ru.auroraos.PushReceiver
файл с русскоязычными переводами будет
называться ru.auroraos.PushReceiver-ru.ts.
Помимо ts-файлов с переводами для конкретных языков, имеется и файл для переводов по умолчанию. Он используется в тех случаях, когда для локали на устройстве нет собственного файла с переводами. Имя такого файла совпадает с именем приложения и является префиксом для имён остальных ts-файлов: ru.auroraos.PushReceiver.ts.
cmake
Чтобы переводить приложение средствами Qt, в CMakeLists.txt приложения
должна быть подключена библиотека auroraapp_i18n
и ts-файлы.
В отличие от qmake в cmake новые переводы или изменения добавляются на этапе сборки проекта. Поэтому в CMakeLists.txt данный процесс должен быть описан.
pkg_search_module(AURORA auroraapp_i18n REQUIRED)
...
file(GLOB TS_FILES "translations/*.ts")
...
set(TRANSLATION_SOURCES_FILES
${SOURCES_FILES}
${QML_FILES}
)
set(GEN_TS_PATH ${CMAKE_CURRENT_BINARY_DIR}/gen_translations)
foreach(_ts_file ${TS_FILES})
file(COPY ${_ts_file} DESTINATION ${GEN_TS_PATH})
endforeach()
file(GLOB GEN_TS_FILES "${GEN_TS_PATH}/*.ts")
add_custom_target(update_translations)
foreach(_ts_file ${GEN_TS_FILES})
get_filename_component(_ts_name ${_ts_file} NAME_WE)
add_custom_command(
OUTPUT ${_ts_file}
DEPENDS ${TRANSLATION_SOURCES_FILES}
COMMAND ${Qt5_LUPDATE_EXECUTABLE}
ARGS ${TRANSLATION_SOURCES_FILES} -ts ${_ts_file}
COMMAND ${CMAKE_COMMAND} -E copy
ARGS ${_ts_file} ${CMAKE_CURRENT_SOURCE_DIR}/translations
)
add_custom_target(translate_${_ts_name} DEPENDS ${_ts_file})
add_dependencies(update_translations translate_${_ts_name})
endforeach()
qt5_add_translation(TRANSLATION_QM_FILES ${GEN_TS_FILES})
...
add_executable(${PROJECT_NAME}
${SOURCES_FILES}
${ICON_FILES}
${QML_FILES}
${TS_FILES}
${PROJECT_NAME}.desktop
rpm/${PROJECT_NAME}.spec
${TRANSLATION_QM_FILES}
${MD_FILES}
)
Если приложение создается по шаблону, аналогичная конфигурация будет создана вместе с ним. Новые ts-файлы следует создавать в том же каталоге translations.
Важно, что названия файлов не должны совпадать с полным названием проекта
(название организации + название приложения).
Рекомендуемый вариант — назвать ts-файлы по имени приложения.
Например, для проекта ru.auroraos.ApplicationTemplate
файлы могут называться
ApplicationTemplate-en.ts и ApplicationTemplate-ru.ts.
Язык указывается в конце имени ts-файла через дефис.
Например, для приложения ru.auroraos.ApplicationTemplate
файл с русскоязычными переводами будет
называться ApplicationTemplate-ru.ts.
Процесс перевода Аврора-приложения
Процесс перевода текста в Аврора-приложении выглядит следующим образом:
-
Обернуть строки для перевода в Qt-функции
tr()
в C++ иqsTr()
в QML. Примеры:packageInfo[QStringLiteral("status")] = tr("Installed");
MenuItem { text: qsTr("Clear list") }
В C++ можно использовать макросы
QT_TR_NOOP()
иQT_TRANSLATE_NOOP()
.Также можно использовать переводы на основе идентификаторов:
qsTrId()
. -
Занести новые строки из кода в ts-файлы. Данное действие отличается в разных системах конфигурации. Для обновления ts-файлов в qmake-проекте нужно запустить инструмент lupdate: Инструменты → Внешние → Linguist → Обновить переводы (lupdate).
В cmake-конфигурации вместо запуска инструмента следует собрать проект.
-
Перевести строки в ts-файлах. Для этого можно воспользоваться инструментом Qt Linguist (не поставляется с Аврора IDE, нужно устанавливать отдельно). Также можно изменить ts-файлы вручную.
После того, как ts-файлы будут готовы, можно запускать приложение. Тексты в нем будут отображены на языке, выбранном на устройстве при условии, что для данного языка существует ts-файл с готовыми переводами.
Если ts-файла для локали на устройстве нет, будут загружены переводы из ts-файла по умолчанию.
ts-файлы
Формат файла TS — это простой читаемый человеком формат XML.
Корневым тегом является TS
, в его атрибуте language
указывается язык, для которого предназначены
переводы.
Пример ts-файла:
<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE TS>
<TS version="2.1" language="ru">
<context>
<name>ApplicationController</name>
<message>
<location filename="../src/applicationcontroller.cpp" line="92"/>
<source>Open app</source>
<translation>Открыть приложение</translation>
</message>
<message>
<location filename="../src/applicationcontroller.cpp" line="99"/>
<source>Push Receiver</source>
<translation>Получение пушей</translation>
</message>
</context>
<context>
<name>MainPage</name>
<message>
<location filename="../qml/pages/MainPage.qml" line="191"/>
<source>Clear list</source>
<translation>Очистить список</translation>
</message>
</context>
</TS>
Тег context
содержит внутри все текстовые строки, находящиеся в одном и том же файле исходного
кода.
Имя соответствующего C++-файла или QML-компонента
указывается в name
.
Конкретные переводимые строки описываются в тегах message
.
location
указывает на место строки в коде, source
содержит исходную строку,
translation
содержит перевод.
При обновлении ts-файлов через lupdate новые строки будут появляться с заготовками для переводов,
помеченных атрибутом type
со значением unfinished
:
<message>
<location filename="../qml/pages/PositioningPage.qml" line="39"/>
<source>Coordinate</source>
<translation type="unfinished"></translation>
</message>
Если задать для такой строки перевод и оставить атрибут прежним, то перевод не будет отображаться в интерфейсе приложения, так как он считается незаконченным.
Готовый перевод следует отметить, например, убрав type="unfinished"
:
<message>
<location filename="../qml/pages/PositioningPage.qml" line="39"/>
<source>Coordinate</source>
<translation>Координата</translation>
</message>
Подробнее об особенностях переводов можно узнать в документации Qt Linguist.
Что следует локализировать
Локализация не ограничивается переводом приложения. Многие другие элементы также зависят от локали и должны быть приняты во внимание, например:
- форматирование даты и времени, 12/24-часовой формат;
- форматирование чисел (например,
.
или,
для плавающей точки); - первый день недели (например, в некоторых локалях это воскресенье);
- форматирование валюты;
- перевод может содержать множественное/единственное число. Следует использовать %n;
- перевод может содержать изменяющиеся значения.
Следует использовать пронумерованные аргументы
%1
,%2
у строк; - сравнение/сортировка строк;
- названия городов/стран;
- различные календарные системы;
- границы слов и предложений;
- строки в верхнем и нижнем регистре;
- направление текста (справа налево в некоторых локалях).