_ () ​​или {% trans%} в шаблонах Django? - PullRequest
40 голосов
/ 21 сентября 2011

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

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

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

Ответы [ 2 ]

44 голосов
/ 03 октября 2011

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

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

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

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

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

* Начиная с Django 1.4.

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

1 голос
/ 21 сентября 2011

Тег шаблона trans вызывает функцию ugettext () .В Django _ () является псевдонимом ugettext () .Это описано в документах Django .

...