Джанго многоязычный сайт - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь создать многоязычный веб-сайт, который будет получать контент из БД на основе выбранного языка.Для этого я использую i18n_patterns и поэтому могу легко получить выбранный язык, используя get_language() в представлении.

Прямо сейчас мои модели выглядят так (упрощенно):

class Article(models.Model):
    author = models.CharField("Author", max_length=255)

class ArticleText(models.Model):
    id = models.OneToOneField(Article, on_delete=models.CASCADE, primary_key=True)
    en = models.TextField("English")
    fr = models.TextField("French")

Моя идея (основанная на исследовании SO) заключалась в том, что я буду хранить текст статьи в другом месте, связывая еепервичный ключ к фактическому первичному ключу Article.

Модель Article содержит только общую информацию (дату публикации, автора и т. д.), которая одинакова для всех языков.Однако я не совсем уверен, как получить доступ к данным из моего шаблона.Прямо сейчас я использую:

context["articles"] = models.Content.objects.select_related("id")

Затем я могу получить доступ к различным полям в моем шаблоне, используя

{% for article in articles %}
<h3>{{ article.author }} - {{ article.fr }}</h3>
{% endfor %}

Однако я хочу, чтобы язык ({{ article.$LANGUAGE }}) менялся в зависимости отвыбранный язык.Что-то вроде

{{ article.$get_current_language }}  --> {{ article.fr }}

Я думаю, я мог бы сделать следующее в шаблоне:

{% if get_current_language == en %}
    {{ article.en }}
{% elif get_current_language == fr %}
    {{ article.fr }}
{% endif %}

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

Могу ли япереосмысление вещей, и я должен просто использовать блок if в шаблоне, или есть лучший способ сделать это?

1 Ответ

0 голосов
/ 12 декабря 2018

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

Подробное описание кода о том, как написать собственный фильтр, см. В Django docs: Написание пользовательских шаблонных тегов и фильтров .

А вот пример кода, с которого можно начать:

from django import template
from django.template.defaultfilters import stringfilter

register = template.Library()

@register.filter
def localize(value, arg):
    """Returns appropriate language version 
    of the given article.

    value: the article
    arg: the current language code
    """

    article = value
    lang = arg

    try:
        # `getattr` will call `article.en` or `article.fr`
        # depending on the value of `lang`
        text = getattr(article, lang)
    except AttributeError:
        # if this code runs, this means that 
        # the `article` doesn't have a version
        # for the given `lang`

        # so, return a default version
        text = article.en

    return text 

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


Когда вы прочитали документы о том, где разместить приведенный выше код, вы можете это сделать.используйте этот фильтр:

{% get_current_language as LANG %}

{{ article|localize:LANG }}
...