Django: как объединить перевод и постоянную строку в шаблоне

#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-tags

3. Проблема в том, что структура 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 другому тегу в качестве параметра, но, похоже, элегантного способа сделать это нет. Единственный способ — написать новый тег шаблона, который установит переменную контекста. Кажется уродливым, не так ли?