_() or {% trans %} in Django templates?

DjangoInternationalizationDjango TemplatesTranslation

Django Problem Overview


In Django templates, you can use either {{ _("Hello World") }} or {% trans "Hello World" %} to mark strings to be translated. In docs, the “official” approach seems to be the {% trans %} tag, but the _() syntax is mentioned too once.

How these approaches differ (except syntax) and why should be one preferable rather than the other?

One difference is that you obviously can't use {% trans %} with tags and filters. But does that mean that I can just use _() everywhere, like {{ _("String") }}? It works and looks much cleaner and more consistent than using {% trans "String" %} with standalone strings and _() with tags and filters.

Django Solutions


Solution 1 - Django

So it seems that there's technically no difference as of Django 1.5. Template engine internally marks a variable for translation (by setting its translate attribute) in two cases:

Later, when the variable is being resolved, Django wraps it with ugettext or pgettext if it sees the translate attribute.

However, as can be seen from source code, there are some flexibility considerations in favor of {% trans %} tag:

  • you can do {% trans "String" noop %}, which will put the string for translation into .po files, but won't actually translate the output when rendering (no internal translate attribute on variable, no ugettext call);
  • you can specify message context*, like {% trans "May" context "verb" %};
  • you can put translated message into a variable for later use*, like {% trans "String" as translated_string %}.

* As of Django 1.4.

Please feel free to correct me or post a better answer in case I'm missing anything.

Solution 2 - Django

The trans template tag calls the ugettext() function. In Django _() is an alias to ugettext(). This is covered in the django docs.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionAnton StrogonoffView Question on Stackoverflow
Solution 1 - DjangoAnton StrogonoffView Answer on Stackoverflow
Solution 2 - DjangogagamilView Answer on Stackoverflow