Шаблоны 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 для привязки), мне пришлось бы повторно передать строку для каждого языка.
Есть ли лучшие альтернативы?
Ответы
Ответ 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.
Но это сложный вопрос - что делать с частичными фрагментами, которые требуют перевода (например, в вашем случае).