使用 Django 进行基于翻译键的国际化

问题描述

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 %}