#python #django #templates #translation #string-concatenation
#python #django #шаблоны #перевод #строка-конкатенация
Вопрос:
Я хотел бы передать перевод с переменной в тег шаблона. Я пытаюсь сделать это таким образом:
{% my_tag _("Entries for tag")|add:" '"|add:tag|add:"'" %}
Но это не работает. Есть ли какое-либо решение?
Ответ №1:
Что не так с <span>{% my_tag _("Entries for tag") %} '{{tag}}'</span>
Комментарии:
1. Спасибо за ответ. my_tag выводит некоторый HTML, и мне нужно, чтобы ‘{{tag}}’ был внутри этого HTML.
2. Затем вы должны отправить в
tag
качестве аргумента вашейmy_tag
функции и добавить его в свой код. Тогда это было бы так просто, как{% my_tag _("Entries for tag") tag %}
. Пожалуйста, ознакомьтесь с документацией docs.djangoproject.com/en/dev/howto/custom-template-tags3. Проблема в том, что структура string никак не связана с my_tag . Тег уже принимает несколько аргументов, и первый — это строка, которую я хочу скомпилировать из двух частей. Возможно, завтра я решу использовать три или более частей или даже передать строку какому-нибудь стороннему тегу. Итак, это неправильное решение. Мне нужно подготовить строку, прежде чем передавать ее в тег.
4. Если вы не хотите делать это в html после пользовательского тега и не хотите отправлять его в качестве аргумента, я не знаю, как помочь. Надеюсь, вы либо переосмыслите свою проблему, либо кто-то более опытный может помочь.
5. Спасибо за помощь. Сейчас я пишу {% endmytag %}, чтобы можно было передавать сложный контент, но это не то, чего я действительно хочу.
Ответ №2:
Одним из решений, вероятно, будет:
{% blocktrans with tag=tag %}
<span>Entries for tag</span> '{{ tag }}'
{% endblocktrans %}
Но помещение HTML в переведенные строки — не лучшая идея. Однако гораздо хуже предположить, что вы можете просто объединить перевод английской строки с другой строкой и получить действительное предложение. Вы никогда не можете предположить, что позиция {{ tag }}
внутри предложения будет одинаковой на других языках. Вероятно, для какого-то языка потребуется перевод Lorem ipsum „%(tag)s” dolor sit
.
Но, похоже, вы пытаетесь применить некоторый HTML динамически. Может быть, то, что вы действительно хотите ugettext('Entries for tag %(tag)s')
, — это заглянуть внутрь my_tag
и проанализировать его соответствующим образом (скажем, найти %(tag)s
и добавить немного HTML вокруг него).
Комментарии:
1. Спасибо. Как я уже говорил выше, my_tag (означает тег шаблона ) ничего не знает о тексте, который он получает, о переводах, тегах (означает ключевые слова, такие как «python, django, шаблоны, перевод» для этого вопроса) и т.д. И на самом деле у меня была аналогичная проблема с другим сторонним тегом шаблона раньше. Итак, изменение кода тега шаблона — это не выход. Я хочу знать, как объединить переведенную строку с другой (или лучше перевести строку с переменной), прежде чем передавать ее в любой тег, как это возможно с простыми строками, используя фильтр «добавить».
2. Лучшим решением было бы передать результат тега blocktrans другому тегу в качестве параметра, но, похоже, элегантного способа сделать это нет. Единственный способ — написать новый тег шаблона, который установит переменную контекста. Кажется уродливым, не так ли?