django blocktrans и i18n в шаблонах

У меня проблема i18n в django:

Это отлично работает:

{% trans cat.name %}  

cat.name будет переведено

Но это не работает:

{% blocktrans with cat.name|slugify as cat_slug %}{{ cat_slug }}{% endblocktrans %}  

cat.name не переводится

Если я поменяю фильтр:

{% blocktrans with cat.name|capfirst as cat_slug %}{{ cat_slug }}{% endblocktrans %}  

Я вижу, что фильтр работает, но перевода нет...


person Julien    schedule 28.11.2009    source источник


Ответы (4)


Я только начинаю знакомиться с интернационализацией Django, но думаю, вы неправильно понимаете, как тег {% blocktrans %} обрабатывает заполнители.

Суть blocktrans заключается в том, чтобы разрешить перевод текста вокруг заполнителей. Он ничего не переведет внутри {{...}}.

Если вы посмотрите на сгенерированный файл .po, вы увидите следующий код шаблона:

{% blocktrans %}This is my variable: {{variable}}{% endblocktrans %}

Будет преобразовано во что-то вроде следующего:

msgid:"This is my variable: %s"

Я не думаю, что вы можете перевести переменную в теге blocktrans. Вероятно, вы можете создавать постоянные строки с помощью {% blocktrans with _("string") as x %}{{x}}{% endblocktrans %}, но я не могу понять, зачем вам это нужно.

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

person Tom    schedule 21.12.2009

Это работает:

{% filter slugify %}{% trans cat.name %}{% endfilter %}
person Julien    schedule 28.11.2009
comment
Мне это тоже помогло: я хотел linebreaksbr перевести текст. - person Matthew Schinckel; 29.10.2015

Как заметил Том, blocktrans сохранит то, что вы поместили в оператор with, вместо того, чтобы переводить его. Что вам нужно сделать, так это использовать with перед переводом. В вашем примере это будет выглядеть так:

{% with cat_slug=cat.name|slugify %}
    {% trans cat_slug %}
{% endwith %}

P.S. Я знаю, что отвечаю на 6-летний вопрос, но я пару раз сталкивался с этой точной ситуацией и не видел ТАКОГО вопроса/ответа, который бы ее обрабатывал.

person Matt Wilson    schedule 08.07.2015

{% blocktrans with cat.name as cat_slug %}{{ cat_slug|capfirst }}{% endblocktrans %}

?

РЕДАКТИРОВАТЬ: вы были правы, документ говорит, что фильтр должен быть помещен в блоктранс

person akh    schedule 28.11.2009
comment
похоже вар не переводится {%blocktrans with cat.name as cat_slug %}{{ cat_slug }}{% endblocktrans %} это тоже не переводится... - person Julien; 29.11.2009