Django templates: Best practice for translating text block with HTML in it
django, django-templates, gettext, internationalization
Solution
From the docs:
It's not possible to mix a template variable inside a string within {% trans %}. If your translations require strings with variables (placeholders), use {% blocktrans %} instead.
Then under `blocktrans`:
To translate a template expression -- say, accessing object attributes or using template filters -- you need to bind the expression to a local variable for use within the translation block. Examples:
{% blocktrans with article.price as amount %}
That will cost $ {{ amount }}.
{% endblocktrans %}
{% blocktrans with value|filter as myvar %}
This will have {{ myvar }} inside.
{% endblocktrans %}
This way your translated strings have the placeholders. In your case:
{% blocktrans with login_object.anchor as anchor %}
Please {{ anchor|safe }}log in</a> in order to use MyApplicationName.
{% endblocktrans %}
You will need to generate the text that goes in `anchor` in your view function. This keeps it out of your translated string.
Problem
In Django templates, how would I translate a block that contains HTML? For example: ``` {% trans "Please" %} <a href="{% url login %}?next={{ currentUrlPath }}"> {% trans "log in" %} </a> {% trans "in order to use MyApplicationName." %} ``` Splitting up translated strings allows me to change the HTML in the template at any time, but I guess it would make more sense to put it into a single translation string, like so: ``` {% url login as loginUrl %} {% blocktrans %} Please <a href="{{ loginUrl }}?next={{ currentUrlPath }}"> log in </a> in order to use MyApplicationName. {% endblocktrans %} ``` But then the HTML markup is in the translation string, i.e. if I wanted to change the HTML (e.g. CSS class for the anchor), I'd have to retranslate the string for each language. Are there any better alternatives?