Всё описанное в данной статье присутствует в документации, правда разбросано по нескольким разделам.
Первым делом в шаблон всегда подключается библиотека тегов для интернационализации:
{% load i18n %}
Строки, подлежащие переводу. Первая в общем контексте, вторая в указанном:
{% trans "item" %}
{% trans "item" context "goods" %}
Строка, содержащая ссылку:
{% url 'admin:index' as admin_url %}
{% trans '<a href="{{ admin_url }}">{{ admin_url }}</a>' %}
Обратите внимание на то, что однажды вычисленные url можно использовать неограниченное количество раз в переводимой строке.
Перевод блока текста:
{% blocktrans %}
<p>London is a capital of a Great Britain.</p>
<p>And many of other countries on this planet.</p>
{% endblocktrans %}
Блочный тег также поддерживает контекст перевода:
{% blocktrans ... context="breadcrumbs" %}...{% endblocktrans %}
Блочный тег может работать с переменными:
{% blocktrans with one=var_1|upper two=var_2|lower %}
{{ one }} and {{ two }}
{% endblocktrans %}
Блочный тег предоставляет возможность учитывать количество:
{% blocktrans count counter=obj.days %}day{% plural %}days{% endblocktrans %}
Иногда требуется использовать переводимую строку в качестве аргументов других тегов. Это можно сделать с помощью сокращения _()
, которое поддерживается системой шаблонов:
{% with txt=_('home') %}{{ txt|upper }}{% endwith %}
Но данный подход не позволит указать контекст. Добавить контекст можно так:
{% trans "home" context "breadcrumbs" as menu_home %}{{ menu_home|upper }}
Надеюсь, вам это поможет.
Документация Django рекомендует строки писать в нижнем регистре, а потом приводить их в нужный вид с помощью фильтров upper
, lower
и capfirst
. В большинстве случаев этот подход себя оправдывает. Ярким примером является стандартная админка.
А теперь домашнее задание:
Есть простое слово "мороженое". Надо выводить его как "Мороженое" в шаблоне. Кажется, что
{% trans "icecream" as icecream %}{{ icecream|capfirst }}
будет правильным решением. Но что делать, если вам надо также делать перевод на датский? Дело в том, что там "мороженое" пишется как "ijs", а с большой буквы будет "IJs". Да! Именно две заглавных буквы!