Шаблоны Django: лучшая практика для перевода текстового блока с HTML в нем - PullRequest
31 голосов
/ 09 января 2011

В шаблонах 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-класс для якоря), мне пришлось бы перевести строку для каждого языка.*

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

Ответы [ 3 ]

20 голосов
/ 09 января 2011

С документы :

Невозможно смешать переменную шаблона внутри строки внутри {% 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 в вашей функции просмотра. Это исключает его из вашей переведенной строки.

11 голосов
/ 09 января 2011

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

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

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

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

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

8 голосов
/ 04 февраля 2012

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

В этом случае вы можете избежать использования любого 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.

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

...