Spec-Zone.ru › Wagtail 3

Международная локализация

  • Многоязычное содержимое

    • Обзор
    • Подход Wagtail к многоязычному содержимому

      • Структура страницы
      • Как регистрируются языковые варианты и переводы в базе данных
      • Переведённые главные страницы
      • Обнаружение и маршрутизация языка
    • Настройка

      • Включение международной локализации
      • Настройка доступных языков
      • Включение интерфейса управления языковыми вариантами (необязательно)
      • Добавление префикса языка к URL-адресам
      • Автоматическое определение языка пользователя
      • Настройка маршрутизации/обнаружения языка
    • Рецепты для интернационализированных сайтов

      • Выбор языка/региона
      • Фильтры API для бесголовых сайтов
      • Переводимые фрагменты
    • Процесс перевода

      • Wagtail Localize
  • Альтернативные плагины интернационализации
  • Переводы административной панели Wagtail
  • Изменение языка административной панели Wagtail для каждого пользователя
  • Изменение основного языка вашей установки Wagtail

Многоязычный контент

Обзор

По умолчанию Wagtail предполагает, что весь контент будет создаваться на одном языке. Этот документ описывает, как настроить Wagtail для создания контента на нескольких языках.

Примечание

Wagtail предоставляет инфраструктуру для создания и отображения контента на нескольких языках. Есть два варианта управления переводами разных языков в админском интерфейсе: wagtail.contrib.simple_translation или более продвинутый wagtail-localize (пакет сторонних разработчиков).

Этот документ охватывает только интернационализацию контента, управляемого Wagtail. Для информации о том, как перевести статический контент в файлах шаблонов, JavaScript-коде и т. д., обратитесь к документации по интернационализации Django. Или, если вы создаёте бессерверный сайт, обратитесь к документации используемой вами фреймворка front-end.

Подход Wagtail к многоязычному контенту

Этот раздел объясняет подход Wagtail к интернационализации. Если вы торопитесь, можете перейти к разделу Настройка.

Кратко:

  • Wagtail хранит контент в отдельном дереве страниц для каждого языка
  • Он имеет встроенную Locale модель, и все страницы связаны с Locale с помощью поля внешнего ключа locale
  • Он записывает, какие страницы являются переводами друг друга, используя общий UUID, хранящийся в поле translation_key
  • Он автоматически перенаправляет запросы через переводы домашней страницы сайта
  • Он использует i18n_patterns и LocaleMiddleware Django для определения языка

Структура страницы

Wagtail хранит контент в отдельном дереве страниц для каждого языка.

Например, если у вас есть два сайта на двух языках, то вы увидите четыре домашние страницы на верхнем уровне иерархии страниц в проводнике.

Этот подход также имеет некоторые преимущества для работы редактора:

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

Как языки и переводы записываются в базе данных

Все страницы (и любые фрагменты, для которых включен перевод) имеют поля locale и translation_key

  • locale — это внешний ключ к модели Locale
  • translation_key — это UUID, используемый для поиска переводов фрагмента контента. Переводы одной и той же страницы/фрагмента имеют одинаковое значение в этом поле

Эти два поля имеют ограничение «уникальное вместе», поэтому вы не можете иметь более одного перевода на одном языке.

Переведенные домашние страницы

При настройке сайта в Wagtail вы выбираете домашнюю страницу сайта в поле «корневая страница», и все запросы к корневому URL-адресу этого сайта будут перенаправлены на эту страницу.

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

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

Если Wagtail не может найти домашнюю страницу, соответствующую языку пользователя, он вернётся к странице, выбранной как корневая страница на записи сайта, поэтому вы можете использовать это поле для указания языка по умолчанию для вашего сайта.

Обнаружение языка и маршрутизация

Для определения языка пользователя и добавления префикса к URL-адресам (/en/, /fr-fr/, например), Wagtail разработан для работы со встроенными средствами интернационализации Django, такими как i18n_patterns и LocaleMiddleware. Это означает, что Wagtail должен беспрепятственно работать с любыми другими интернационализированными приложениями Django на вашем сайте.

Языки

Языки, включенные на сайте, записываются в модели Locale в wagtailcore. Эта модель имеет всего два поля: ID и language_code (хранит тег языка BCP-47, который представляет этот язык).

Записи о языках можно настроить с помощью дополнительного интерфейса управления или создать в оболочке. Возможные значения поля language_code контролируются настройкой WAGTAIL_CONTENT_LANGUAGES

Примечание

Прочитайте это, если вы изменили LANGUAGE_CODE до включения интернационализации

При первоначальной миграции Wagtail создаёт запись Locale для языка, который был установлен в настройке LANGUAGE_CODE во время выполнения миграции. Все страницы будут присвоены этой записи Locale при отключении интернационализации Wagtail.

Если вы изменили LANGUAGE_CODE после обновления до Wagtail 2.11, вам необходимо вручную обновить запись в модели Locale также перед включением интернационализации, так как существующий контент будет присвоен старому коду.

Настройка

В этом разделе мы пройдём минимальную настройку, необходимую для возможности создания контента на нескольких языках.

  • Включение интернационализации
  • Настройка доступных языков
  • Включение интерфейса управления языками (необязательно)
  • Добавление префикса языка к URL-адресам
  • Автоматическое определение языка пользователя
  • Настройка маршрутизации/определения языка

Включение интернационализации

Чтобы включить интернационализацию в Django и Wagtail, установите следующие настройки на True:

# my_project/settings.py

USE_I18N = True
WAGTAIL_I18N_ENABLED = True

Кроме того, возможно, вам захочется включить поддержку локализации Django. Это позволит отображать даты и числа в формате пользователя:

# my_project/settings.py

USE_L10N = True

Настройка доступных языков

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

  • LANGUAGES — это настройка, определяющая, какие языки будут доступны на переднем плане сайта.
  • WAGTAIL_CONTENT_LANGUAGES — это настройка, определяющая, на каких языках можно создавать контент Wagtail.

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

# my_project/settings.py

WAGTAIL_CONTENT_LANGUAGES = LANGUAGES = [
    ('en', "English"),
    ('fr', "French"),
    ('es', "Spanish"),
]

Примечание

Всякий раз, когда WAGTAIL_CONTENT_LANGUAGES изменяется, модель Locale также должна быть обновлена для соответствия.

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

Вы также можете установить эти значения на разные значения. Вы можете сделать это, если хотите иметь некоторую программную локализация (например, форматирование дат или валют), но использовать тот же контент Wagtail в нескольких регионах:

# my_project/settings.py

LANGUAGES = [
    ('en-GB', "English (Great Britain)"),
    ('en-US', "English (United States)"),
    ('en-CA', "English (Canada)"),
    ('fr-FR', "French (France)"),
    ('fr-CA', "French (Canada)"),
]

WAGTAIL_CONTENT_LANGUAGES = [
    ('en-GB', "English"),
    ('fr-FR', "French"),
]

При такой настройке сайт будет доступен на всех языках в первом списке, но в Wagtail будет только два дерева языков.

Все en- языки будут использовать дерево языка «английский», а fr- языки — дерево языка «французский». Различия между каждым языком в группе будут программными. Например: какой формат дат/чисел использовать и какую валюту отображать для цен.

Включение интерфейса управления языками (необязательно)

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

Для включения его добавьте wagtail.locales в INSTALLED_APPS:

# my_project/settings.py

INSTALLED_APPS = [
    # ...
    'wagtail.locales',
    # ...
]

Добавление префикса языка к URL-адресам

Чтобы все деревья страниц обслуживались с одного домена, нам нужно добавить префикс URL для каждого языка.

Для реализации этого мы можем использовать встроенную функцию Django i18n_patterns, которая добавляет префикс языка ко всем URL-шаблонам, переданным в неё. Это активирует код языка, указанный в URL-адресе, и Wagtail учитывает это при определении способа маршрутизации запроса.

В вашем файле urls.py добавьте ядро URL-адресов Wagtail (и любые другие URL-адреса, которые вы хотите перевести) в блок i18n_patterns:

# /my_project/urls.py

...

from django.conf.urls.i18n import i18n_patterns

# Non-translatable URLs
# Note: if you are using the Wagtail API or sitemaps,
# these should not be added to `i18n_patterns` either
urlpatterns = [
    path('django-admin/', admin.site.urls),

    path('admin/', include(wagtailadmin_urls)),
    path('documents/', include(wagtaildocs_urls)),
]

# Translatable URLs
# These will be available under a language code prefix. For example /en/search/
urlpatterns += i18n_patterns(
    path('search/', search_views.search, name='search'),
    path("", include(wagtail_urls)),
)

Автоматическое определение языка пользователя

После обертывания ваших URL-шаблонов с i18n_patterns, ваш сайт теперь будет отвечать на URL-префиксы. Но сейчас он не будет отвечать на корневой путь.

Чтобы исправить это, нам нужно определить язык браузера пользователя и перенаправить его на лучший префикс языка. Рекомендуемый подход — использовать LocaleMiddleware Django:

# my_project/settings.py

MIDDLEWARE = [
    # ...
    'django.middleware.locale.LocaleMiddleware',
    # ...
]

Настройка маршрутизации/определения языка

Вам не обязательно использовать i18n_patterns или LocaleMiddleware для этого, и вы можете написать свой собственный код, если это необходимо.

Wagtail нужно только, чтобы язык был активирован (используя функцию django.utils.translation.activate Django) перед вызовом представления wagtail.views.serve.

Рецепты для интернационализированных сайтов

Выбор языка/региона

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

Если вы не уверены, что вам это нужно, ознакомьтесь со статьёй https://www.w3.org/International/questions/qa-site-conneg#yyyshortcomings для получения обоснования.

Базовый пример

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

Однако в этом примере будут включены только языки, определённые в WAGTAIL_CONTENT_LANGUAGES, а не любые дополнительные языки, которые могут быть определены в LANGUAGES. Для получения дополнительной информации о значении этих настроек см. Настройка доступных языков.

Если оба параметра установлены на одно и то же значение, этот пример должен хорошо работать для вас; в противном случае перейдите к следующему разделу с более сложным примером, который учитывает это.

{# make sure these are at the top of the file #}
{% load i18n wagtailcore_tags %}

{% if page %}
    {% for translation in page.get_translations.live %}
        {% get_language_info for translation.locale.language_code as lang %}
        <a href="{% pageurl translation %}" rel="alternate" hreflang="{{ language_code }}">
            {{ lang.name_local }}
        </a>
    {% endfor %}
{% endif %}

Давайте разберём это:

{% if page %}
    ...
{% endif %}

Если это часть общего шаблона, он может использоваться в ситуациях, когда объект страницы недоступен, например, при ответах с ошибкой 404, поэтому убедитесь, что у нас есть страница, прежде чем продолжать.

{% for translation in page.get_translations.live %}
    ...
{% endfor %}

Этот for блок перебирает все опубликованные переводы текущей страницы.

{% get_language_info for translation.locale.language_code as lang %}

Это встроенный тэг Django, который получает информацию о языке перевода. Для получения дополнительной информации см. get_language_info() в документации Django.

<a href="{% pageurl translation %}" rel="alternate" hreflang="{{ language_code }}">
    {{ lang.name_local }}
</a>

Это добавляет ссылку на перевод. Мы используем {{ lang.name_local }} для отображения имени региона в его собственном языке. Мы также добавляем rel и hreflang атрибуты к тэгу <a> для SEO.

Обработка регионов, которые разделяют контент

Вместо перебора страниц этот пример перебирает все настроенные языки и находит страницу для каждого из них. Это работает лучше, чем приведенный выше Базовый пример на сайтах, которые имеют дополнительные Django LANGUAGES с общим контентом Wagtail.

Для работы этого примера необходимо добавить обработчик контекста django.template.context_processors.i18n Django в настройку TEMPLATES:

# myproject/settings.py

TEMPLATES = [
    {
        # ...
        'OPTIONS': {
            'context_processors': [
                # ...
                'django.template.context_processors.i18n',
            ],
        },
    },
]

Теперь сам пример:

{% for language_code, language_name in LANGUAGES %}
    {% get_language_info for language_code as lang %}

    {% language language_code %}
        <a href="{% pageurl page.localized %}" rel="alternate" hreflang="{{ language_code }}">
            {{ lang.name_local }}
        </a>
    {% endlanguage %}
{% endfor %}

Давайте разберём это тоже:

{% for language_code, language_name in LANGUAGES %}
    ...
{% endfor %}

Этот for блок перебирает все настроенные языки на сайте. Переменная LANGUAGES взята из обработчика контекста django.template.context_processors.i18n.

{% get_language_info for language_code as lang %}

Делает ровно то же самое, что и предыдущий пример.

{% language language_code %}
    ...
{% endlanguage %}

Этот тэг language взят из библиотеки тэгов Django i18n . Он меняет активный язык только для кода, содержащегося внутри него.

<a href="{% pageurl page.localized %}" rel="alternate" hreflang="{{ language_code }}">
    {{ lang.name_local }}
</a>

Единственное отличие тэга <a> здесь от тэга <a> в предыдущем примере заключается в том, как мы получаем URL страницы: {% pageurl page.localized %}.

У всех экземпляров страниц в Wagtail есть атрибут .localized , который извлекает перевод страницы на текущем активном языке. Именно поэтому мы активировали язык ранее.

Ещё одно отличие здесь заключается в том, что если одна и та же переведённая страница используется в двух регионах, Wagtail сгенерирует правильный URL для страницы на основе текущего активного региона. Это ключевое различие между этим примером и предыдущим, так как предыдущий может получить только URL страницы в её языке по умолчанию.

Фильтры API для бессерверных сайтов

Для бессерверных сайтов API Wagtail поддерживает два дополнительных фильтра для интернационализированных сайтов:

  • ?locale= Фильтрует страницы по заданному региону
  • ?translation_of= Фильтрует страницы, чтобы включить только переводы данной страницы с заданным идентификатором

Для получения дополнительной информации см. Специальные фильтры для интернационализированных сайтов.

Переводимые фрагменты

Вы можете сделать фрагмент переводимым, сделав его наследником wagtail.models.TranslatableMixin. Например:

# myapp/models.py

from django.db import models

from wagtail.models import TranslatableMixin
from wagtail.snippets.models import register_snippet


@register_snippet
class Advert(TranslatableMixin, models.Model):
    name = models.CharField(max_length=255)

Модель TranslatableMixin добавляет поля locale и translation_key в модель.

Преобразование фрагментов с имеющимися данными в переводимые

Для фрагментов с существующими данными невозможно просто добавить TranslatableMixin, создать миграцию и запустить её. Это связано с тем, что поля locale и translation_key являются обязательными, и translation_key требует уникального значения для каждого экземпляра.

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

Это необходимо только в том случае, если в базе данных есть записи. Итак, если модель пуста, вы можете сразу добавить TranslatableMixin и пропустить это.

Шаг 1: Добавление BootstrapTranslatableMixin в модель

Это добавит два поля без ограничений:

# myapp/models.py

from django.db import models

from wagtail.models import BootstrapTranslatableMixin
from wagtail.snippets.models import register_snippet


@register_snippet
class Advert(BootstrapTranslatableMixin, models.Model):
    name = models.CharField(max_length=255)

    # if the model has a Meta class, ensure it inherits from
    # BootstrapTranslatableMixin.Meta too
    class Meta(BootstrapTranslatableMixin.Meta):
        verbose_name = 'adverts'

Запустите python manage.py makemigrations myapp для генерации миграции схемы.

Шаг 2: Создание миграции данных

Создайте миграцию данных с помощью следующей команды:

python manage.py makemigrations myapp --empty

Это сгенерирует новую пустую миграцию в папке migrations приложения. Откройте эту миграцию и добавьте BootstrapTranslatableModel для каждой модели для загрузки данных в этом приложении:

from django.db import migrations
from wagtail.models import BootstrapTranslatableModel

class Migration(migrations.Migration):
    dependencies = [
        ('myapp', '0002_bootstraptranslations'),
    ]

    # Add one operation for each model to bootstrap here
    # Note: Only include models that are in the same app!
    operations = [
        BootstrapTranslatableModel('myapp.Advert'),
    ]

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

Шаг 3: Изменение BootstrapTranslatableMixin на TranslatableMixin

Теперь, когда у нас есть миграция, заполняющая необходимые поля, мы можем заменить BootstrapTranslatableMixin на TranslatableMixin , у которого есть все ограничения:

# myapp/models.py

from wagtail.models import TranslatableMixin  # Change this line

@register_snippet
class Advert(TranslatableMixin, models.Model):  # Change this line
    name = models.CharField(max_length=255)

    class Meta(TranslatableMixin.Meta):  # Change this line, if present
        verbose_name = 'adverts'
Шаг 4: Запуск makemigrations для генерации миграций схемы, а затем миграция!

Запустите makemigrations для генерации миграции схемы, добавляющей ограничения в базу данных, а затем запустите migrate для выполнения всех миграций:

python manage.py makemigrations myapp
python manage.py migrate

При запросе выбора исправления для поля «locale» с nullable изменением на не-nullable выберите вариант «Пропустить на сейчас» (так как это было обработано миграцией данных).

Процесс перевода

Как упоминалось в начале, Wagtail предоставляет wagtail.contrib.simple_translation.

Модуль simple_translation предоставляет пользовательский интерфейс, который позволяет пользователям копировать страницы и переводимые фрагменты на другой язык.

  • Создаются копии на языке источника (не переведены)
  • Копии страниц находятся в статусе черновика

Редакторам контента необходимо перевести контент и опубликовать страницы.

Чтобы включить, добавьте "wagtail.contrib.simple_translation" в INSTALLED_APPS и запустите python manage.py migrate для создания разрешений submit_translation. В админке Wagtail перейдите в настройки и предоставьте некоторым пользователям или группам разрешение «Может отправлять переводы».

Примечание

Simple Translation необязателен. Его можно заменить сторонними пакетами. Например, более продвинутым wagtail-localize.

Wagtail Localize

В рамках первоначальной работы по реализации интернационализации для Wagtail core мы также создали пакет переводов под названием wagtail-localize. Он поддерживает перевод страниц в Wagtail, используя файлы PO, машинное переложение и внешнюю интеграцию с переводческими сервисами.

Github: https://github.com/wagtail/wagtail-localize

Альтернативные плагины интернационализации

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

  • Wagtailtrans
  • wagtail-modeltranslation

Для сравнения этих вариантов см. пост в блоге AccordBox Как поддерживать несколько языков в CMS Wagtail.

Переводы админки Wagtail

Админ-панель Wagtail переведена на множество языков. Список доступных переводов можно найти на странице Transifex Wagtail: https://www.transifex.com/torchbox/wagtail/. (Обратите внимание: если вы используете старую версию Wagtail, эта страница может неточно отражать доступные вам языки).

Если ваш язык отсутствует на этой странице, вы можете легко внести свой вклад, добавив новые языки или исправив ошибки. Зарегистрируйтесь и отправьте изменения на Transifex. Обновления переводов обычно объединяются в официальный релиз в течение месяца после отправки.

Изменение языка админки Wagtail для каждого пользователя

Авторизованные пользователи могут установить свой предпочтительный язык в /admin/account/. По умолчанию Wagtail предоставляет список языков с охватом перевода >= 90%. Этот список можно переопределить с помощью настройки WAGTAILADMIN_PERMITTED_LANGUAGES.

В случае, если разрешено только ноль или один язык, форма будет скрыта.

Если пользователь не выбрал язык, будет использован язык LANGUAGE_CODE.

Изменение основного языка вашей установки Wagtail

По умолчанию язык Wagtail — en-us (американский английский). Вы можете изменить его, настроив несколько настроек Django:

  • Убедитесь, что USE_I18N установлено в значение True
  • Установите LANGUAGE_CODE на основной язык вашего сайта

Если для вашего языка есть перевод, интерфейс администрирования Wagtail теперь должен быть на выбранном вами языке.

© 2014-present Torchbox Ltd and individual contributors.
All rights are reserved.
Licensed under the BSD License.
https://docs.wagtail.org/en/v3.0.3/advanced_topics/i18n.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API