Мультиязычность

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

Организация файлов #

Для создания мультиязычного проекта создайте отдельные директории для каждого языка, например, src/en и src/ru. В конфиге проекта укажите каждую такую директорию как корень отдельного документа.

В поле primary укажите, какой вариант документации считается основным. Понятие основного документа важно для версионирования текста. Если поле primary опущено, основным считается самый первый документ, описанный в конфиге.

Пример конфига мультиязычного проекта:

primary: ru
languages:
  en:
    title: Documentation
    paths:
      root: src/en
      include: ['**/*.md']
  ru:
    title: Документация
    paths:
      root: src/ru
      include: ['**/*.md']

В текущей реализации в поле primary следует указывать не название языка, а идентификатор документа (см. Проекты и тома). Так, в проекте с двухуровневой структурой конфига вам может потребоваться написать primary: ru/admin-manual вместо primary: ru. Это поведение изменится в будущем.

Переключение языка в HTML #

При разработке HTML-темы для Собираки рекомендуется позволить пользователю быстро переходить к версиям текущей страницы на других языках. Ниже приведён пример реализации такого переключения.

{% set translations = project.get_all_translations(page) %}
{% if translations | length > 1 %}
  <ul class='translations'>
    {% for translation in translations %}
    
      {% if translation is sameas page %}
        {% set name = Language.from_part1(translation.document.lang).name %}
        <li>{{ name }}</li>
        
      {% else %}
        {% set url = builder.make_internal_url(translation, page=page) %}
        {% set name = Language.from_part1(translation.document.lang).name %}
        <li><a href='{{ url }}'>{{ name }}</a></li>
        
      {% endif %}
      
    {% endfor %}
  </ul>
{% endif %}

В примере используется метод project.get_all_translations(). Он перебирает все документы с таким же кодовым именем, как у текущего документа, и в каждом из них находит страницу с таким же путём, как у текущей страницы. Сама текущая страница также попадает в возвращаемый список. В примере проверяется, что в списке более одного элемента, то есть для страницы существуют языковые версии, кроме текущей.

Чтобы отличить текущую страницу от остальных, используется стандартная проверка sameas в Jinja. Название языка текущей страницы отображается простым текстом без ссылки. Названия остальных страниц отображаются как ссылки на эти страницы.

Полные названия языков формируются с помощью библиотеки iso639. Например, для кода “ru” сформируется название “Russian”.

Ссылки на страницы формируются с помощью метода make_internal_url() класса WebBuilder, который является частью Собираки.

Версионирование текста #

При работе над мультиязычным проектом важно следить за актуальностью всех переводов каждого текста. Собирака не может самостоятельно определить актуальность текста или актуализировать его, но в её состав входит команда check_translations, которая помогает автору документации отслеживать свою работу.

Работа команды предполагает, что:

  • один из языков проекта считается основным (см. поле primary конфига);
  • в исходных файлах страниц указываются версии текста (см. поле version метаданных).

При внесении критичных изменений в оригинал обязательно увеличивайте его мажорную версию. Например, если вы добавили описание новой функциональности в оригинал, ранее имевший версию 2.4, замените её на 3.0. Благодаря этому Собирака будет знать, что переводы, написанные на основе версии оригинала 2.4, могли устареть.

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

При внесении в оригинал или перевод косметических правок, таких как исправление грамматических ошибок, увеличивайте минорную версию, не меняя мажорную. Например, если вы убрали лишнюю запятую в оригинале или переводе, имевшем версию 3.0, замените её на 3.1.