Подтвердить что ты не робот

Шаблоны Django: лучшая практика для перевода текстового блока с HTML в него

В шаблонах Django, как бы я перевел блок, содержащий HTML? Например:

{% trans "Please" %}
    <a href="{% url login %}?next={{ currentUrlPath }}">
        {% trans "log in" %}
    </a>
{% trans "in order to use MyApplicationName." %}

Разделение переведенных строк позволяет мне изменить HTML в шаблоне в любое время, но я думаю, что было бы более целесообразно поместить его в одну строку перевода, например:

{% url login as loginUrl %}
{% blocktrans %}
    Please
    <a href="{{ loginUrl }}?next={{ currentUrlPath }}">
        log in
    </a>
    in order to use MyApplicationName.
{% endblocktrans %}

Но тогда разметка HTML находится в строке перевода, т.е. если я хотел бы изменить HTML (например, класс CSS для привязки), мне пришлось бы повторно передать строку для каждого языка.

Есть ли лучшие альтернативы?

4b9b3361

Ответ 1

Из документов:

Невозможно смешать переменную шаблона внутри строки внутри {% trans%}. Если для ваших переводов требуются строки с переменными (заполнители), вместо этого используйте {% blocktrans%}.

Тогда под blocktrans:

Чтобы преобразовать выражение шаблона - например, получить доступ к атрибутам объекта или использовать фильтры шаблонов - вам нужно привязать выражение к локальной переменной для использования в блоке трансляции. Примеры:

{% blocktrans with article.price as amount %}
That will cost $ {{ amount }}.
{% endblocktrans %}

{% blocktrans with value|filter as myvar %}
This will have {{ myvar }} inside.
{% endblocktrans %}

Таким образом, ваши переведенные строки имеют заполнители. В вашем случае:

{% blocktrans with login_object.anchor as anchor %}
    Please {{ anchor|safe }}log in</a> in order to use MyApplicationName.
{% endblocktrans %}

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

Ответ 2

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

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

Майк Де Симон делает правильную рекомендацию, я бы сделал только одну настройку:

{% blocktrans with login_object.anchor_attr as anchor_attr %}
    Please <a {{ anchor_attr|safe }}>log in</a> in order to use MyApplicationName.
{% endblocktrans %}

Сохраняет HTML в строке перевода. Без открывающего тега в строке он может легко выглядеть как ошибка в строке.

Ответ 3

Я могу предложить удобное решение только для частичных фрагментов, которые являются постоянными для любого перевода.

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

@register.filter( name='safewrap' )
def safewrap( val, arg ):
    return val.format( arg )
safewrap.is_safe = True

...

{% blocktrans with sum2="<a href='mysite.com/offer'>{0}</a>"|safewrap:sum %}
    It costs {{sum2}} dollars.
{% endblocktrans %}

Итак, в вашем файле .po у вас есть:

It costs %(sum2)s dollars.

Но это сложный вопрос - что делать с частичными фрагментами, которые требуют перевода (например, в вашем случае).