我的经验是,变量翻译在模板中不能单独使用。然而,当变量的内容已知时(我指的是它们不是自由文本,而是您在数据库中设置的一组选择),我找到了一个合适的解决方案。
您需要在视图或过滤器标记中强制进行翻译。
总之:
- 在您的模板中使用
blocktrans
- 强制变量进行翻译
- 您可以在上下文中设置已标记为翻译的变量
- 或使用过滤器进行翻译
- 生成
.po
文件中的翻译
故事是这样的:
views.py
def my_view(request):
return render(request, 'i18n_test.html', {'salutation':"Hola"})
templates/i18n_test.html
...
{% blocktrans %}{{ salutation }}{% endblocktrans %}
...
当我渲染模板时,无论当前语言是什么,它总是显示Hola。
为了强制翻译,在视图中我们需要使用ugettext。
def my_view(request):
return render(request, 'i18n_test.html', {'salutation':ugettext("Hola")})
然而,并非总是能够访问视图。因此,我更喜欢使用像这样的过滤器。
templatetags/i18n_extras.py
@register.filter(name='translate')
def translate(text):
try:
return ugettext(text)
而模板变成了
...
{% blocktrans s=salutation|translate %}{{ s }}{% endblocktrans %}
...
根据当前语言,它会生成Hola, Hello, Ciao, Salut等内容。
缺点是(正如docs所指出的那样),makemessages
不会自动包含这些翻译,因此我们需要手动包括它们。在django.po文件中:
locales/en/django.po
...
msgid "Hola"
msgstr "Hello"
...
django.po
文件中并进行编译。 - Bula