Документация
ОС Аврора 5.1.4

Переводы приложений

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

Нативные приложения для ОС Аврора могут быть локализованы средствами Qt. Переводы приложений хранятся в ts-файлах. При создании проекта приложения по шаблону появится каталог translations с двумя 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.

Процесс перевода Аврора-приложения

Процесс перевода текста в Аврора-приложении выглядит следующим образом:

  1. Обернуть строки для перевода в Qt-функции tr() в C++ и qsTr() в QML. Примеры:

    packageInfo[QStringLiteral("status")] = tr("Installed");
    
    MenuItem {
        text: qsTr("Clear list")
    }
    

    В C++ можно использовать макросы QT_TR_NOOP() и QT_TRANSLATE_NOOP().

    Также можно использовать переводы на основе идентификаторов: qsTrId().

  2. Занести новые строки из кода в ts-файлы. Данное действие отличается в разных системах конфигурации. Для обновления ts-файлов в qmake-проекте нужно запустить инструмент lupdate: Инструменты → Внешние → Linguist → Обновить переводы (lupdate).

    Обновить переводы (lupdate)

    В cmake-конфигурации вместо запуска инструмента следует собрать проект.

  3. Перевести строки в 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 у строк;
  • сравнение/сортировка строк;
  • названия городов/стран;
  • различные календарные системы;
  • границы слов и предложений;
  • строки в верхнем и нижнем регистре;
  • направление текста (справа налево в некоторых локалях).

Мы используем cookies для персонализации сайта и его более удобного использования. Вы можете запретить cookies в настройках браузера.

Пожалуйста ознакомьтесь с политикой использования cookies.