Рубрики
Без рубрики

Wagtail Многоязычный и интернационализация

WordPress – это хорошо известная система управления контентом. Клиенты часто связываются нами и спрашивают, могли бы ли мы … Теги от вагуста, многоязычного, интернационализации, Python.

WordPress – это хорошо известная система управления контентом. Клиенты часто связываются с нами и спрашивают, сможем ли мы построить веб-сайт для них, используя WordPress. Хотя это хорошее решение для простых проектов, мы часто признаем, что наши клиенты имеют очень настраиваемые требования, которые требуют другого, более надежного решения.

Вот где Wagtail вступает в игру. Wagtail – это Python/Django Powered Powered Source Source System Management для создания высококачественных веб-сайтов и веб-приложений.

Веб-сайты часто имеют международную аудиторию. Процесс подачи переведенного контента для читателя часто упоминается как «интернационализация» (I18N) или «многоязычная» поддержка. В этом сообщении мы хотим продемонстрировать, как мы приближаемся к многоязычному языку в наших веб-проектах, используя Wagtail.

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

Решение, изложенное в этой статье, было в значительной степени вдохновлена Официальная документация И это Сообщение блога . Он используется в производстве на множественные проекты, которые мы построили, поэтому он был тестирован с бою и является проверенным решением. Официальный блог Австрийских авиалиний и Codista.com (да, Наш собственный веб-сайт ) – два примера, используя это решение.

При приближении к многоязычной поддержке вам в основном есть два варианта:

  1. Дублируя поля на вашей модели
  2. Дублировать вашу дерево страницы

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

class BlogPostPage(Page):
    title_de = models.CharField(max_length=255)
    title_en = models.CharField(max_length=255)

    body_en = StreamField(...)
    body_de = StreamField(...)

    # Language-independent fields don't need to be duplicated
    hero_image = models.ForeignKey(
        "wagtailimages.Image",
        null=True,
        blank=True,
        on_delete=models.SET_NULL,
        related_name="+",
    )

Мы пробовали этот подход и не были очень довольны этим. В основном из-за трех причин:

  1. Вам нужна какая-то логика для доступа к правильному поле в шаблоне на основе запрошенного языка. Больше логики, означает потенциально больше ошибок.
  2. Страница будет подаваться под тем же слизком, независимым от языка. В основном вы хотите, чтобы слизняк отражал язык содержания, потому что он даст вам дополнительные бонусные баллы SEO.
  3. Модели страницы становятся довольно громоздкими для обслуживания. Необходимое дублировать каждое поле, для которого вы хотите иметь перевод, в основном удваивает количество переменных ваших страниц. Больше кода, означает потенциально больше ошибок.

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

Поэтому мы решили пойти по маршруту дублирования дерева страницы, что очень хорошо работает для нас. Дублирование дерева страницы имеет некоторые очень убедительные преимущества:

  1. Вы получаете красиво маршрутизируемые интернационализированные URL + Smugs из (Wagtail) Box
  2. Вы храните свои модели страницы и вашу логику Backend Slim и Tidy
  3. Нет необходимости на пользовательской логике для доступа к правильному переводу поле, поскольку вы просто делаете то, что вы всегда делаете: рендеринг шаблона страницы с именно поля страницы, которые вы хотите рендер
  4. Редактирование страницы проще для редакторов контента, поскольку у них есть меньше полей в представлении администратора для заполнения и проверки.

Недостатки:

  1. Вы должны дублировать дерево страницы.

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

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

class LanguageRedirectionPage(Page):
    """Redirects the user to the language specfic home page"""

    parent_page_types = []

    def serve(self, request):
        # This will only return a language that is in the LANGUAGES Django setting
        language = translation.get_language_from_request(request)
        home_page = HomePage.objects.get(language=language)
        return HttpResponseRedirect(home_page.get_url())

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

Кроме того, ваш Главная страница нужно знать свой язык. Вот пример для определения Язык :

class HomePage(Page):

    language = models.CharField(
        max_length=5,
        choices=getattr(settings, "LANGUAGES"),
        help_text=_("indicates the language this page serves as the main home page"),
        unique=True,
    )

    hero_title = models.CharField(max_length=250, blank=True, null=True)
    hero_intro = models.TextField(_("Hero Intro"), blank=True, null=True)

    parent_page_types = ["cms.LanguageRedirectionPage"]

    class Meta:
        verbose_name = _("Home Page")
        verbose_name_plural = _("Home Pages")

Важно отметить, что только Главная страница нужно знать его язык. Все страницы ниже знают это неявно, потому что они являются детьми языковых Главная страница Отказ Это в основном все для начала начать многоязычную поддержку в следующем проекте Walwail.

Дублированные деревья страницы – ваш друг, потому что:

  • Они решают конкретный вопрос SEO для вас: предоставление уникальных слизней для уникального контента
  • Вы получаете почти все из коробки бесплатно, если вы дублируете дерево страницы!

Оригинал: “https://dev.to/codista_/wagtail-multi-language-and-internationalization-2gkf”