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?
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With