Подтвердить что ты не робот

_() ​​или {% trans%} в шаблонах Django?

В шаблонах Django вы можете использовать {{ _("Hello World") }} или {% trans "Hello World" %} для обозначения строк, которые нужно перевести. В документах "официальный" подход выглядит как {% trans %}, но синтаксис _() также упоминается один раз.

Как эти подходы отличаются (кроме синтаксиса) и почему это должно быть предпочтительным, а не другим?

Одно отличие состоит в том, что вы, очевидно, не можете использовать {% trans %} с тегами и фильтрами. Но означает ли это, что я могу просто использовать _() везде, например {{ _("String") }}? Он работает и выглядит намного чище и последовательнее, чем при использовании {% trans "String" %} с автономными строками и _() с тегами и фильтрами.

4b9b3361

Ответ 1

Итак, кажется, что с Django 1.5 технически нет разницы. Внутренний шаблонный шаблон указывает переменную для перевода (путем установки ее атрибута translate) в двух случаях:

  • когда вы делаете {% trans VAR %} (см. TranslateNode) или
  • если имя переменной начинается с _( и заканчивается на ) (см. Variable.__init__).

Позже, когда переменная разрешена, Django обертывает ее ugettext или pgettext, если видит атрибут translate.

Однако, как видно из исходного кода, существуют некоторые соображения гибкости в пользу тега {% trans %}:

  • вы можете сделать {% trans "String" noop %}, который поместит строку для перевода в .po файлы, но на самом деле не будет выводить вывод при рендеринге (нет внутреннего атрибута translate для переменной, no ugettext);
  • вы можете указать контекст сообщения * например {% trans "May" context "verb" %};
  • вы можете поместить переведенное сообщение в переменную для последующего использования * например {% trans "String" as translated_string %}.

* По Django 1.4.

Пожалуйста, не стесняйтесь исправить меня или опубликовать лучший ответ, если я ничего не пропущу.

Ответ 2

Тег Trans template вызывает функцию ugettext(). В Django _() есть псевдоним для ugettext(). Это описано в django docs.