问题描述
Django 的默认 i18n 系统使用代码语言(例如英语)作为翻译键;翻译成其他语言必须用该基本语言编写。例如,在 Django 模板中,您可以编写 {% trans "Hello" %}
,然后在法语或西班牙语翻译文件中将“Hello”翻译成“Bonjour”或“Hola”。
这有一个主要缺陷:在英语中拼写相同的单词不能在其他语言中进行不同的翻译。例如,如果我在代码的两个地方使用 {% trans "Fire" %}
,其中一个表示燃烧的东西,另一个使用大炮,我将分别需要法语中的“Feu”和“Tirer”;但是 Django 的 i18n 迫使我为“Fire”选择一个翻译。
翻译键模式解决了这个问题:我在我的代码中使用了诸如 {% trans "campsite.fire" %}
和 {% trans "cannon.fire" %}
之类的翻译键,我在英文翻译文件中将它们翻译为“Fire”,并翻译为“Feu”和“分别在法语文件中。
这是支持使用 Django 的 i18n 系统吗?我如何将变量注入到这样的翻译中?
解决方法
我目前(但很尴尬)的工作方式是:
-
使用翻译键,例如
{% trans "cannon.fire" %}
-
如果我需要使用一个变量,使用一个翻译键后跟一个变量:
{% blocktrans %}email.password_reset.click_link {{link}}{% endblocktrans %}
然后在我的翻译中我可以使用链接变量作为
%(link)s
感觉像是无意的使用,与文档非常不同。可能有更官方的方法来做到这一点。
,是的,这是可能的。键可以是任何匹配的字符串或短语。
模板.html
Running MyGeneric<System.String>
Running MyGeneric<System.Int32[]>
po 文件:
{% trans "cannon.fire" %}
{% trans "campsite.fire" %}
对于翻译中的变量,有 blocktranslate 标签允许翻译中的变量。
msgid "cannon.fire"
msgstr "Tirer"
msgid "campsite.fire"
msgstr "Feu"
也可以在渲染上下文中翻译变量:
{% blocktranslate %} hello my name is {{ name }} {% endblocktranslate %}