【问题标题】:Translation key-based internationalization with Django使用 Django 实现基于翻译键的国际化
【发布时间】:2021-01-04 20:19:10
【问题描述】:

Django 的默认 i18n 系统使用代码语言(例如英语)作为翻译键;翻译成其他语言必须使用该基础语言。例如,在 Django 模板中,您可以编写 {% trans "Hello" %},然后在法语或西班牙语翻译文件中将“Hello”翻译成“Bonjour”或“Hola”。

这有一个重大缺陷:在英语中拼写相同的单词不能在其他语言中进行不同的翻译。例如,如果我在代码的两个位置使用{% trans "Fire" %},其中一个表示燃烧的东西,另一个使用大炮,我将分别需要法语中的“Feu”和“Tirer”;但 Django 的 i18n 迫使我为“火”选择一个翻译。

翻译键模式解决了这个问题:我在代码中使用了诸如 {% trans "campsite.fire" %}{% trans "cannon.fire" %} 之类的翻译键,我在英文翻译文件中将其翻译为“Fire”,在英文翻译文件中分别翻译为“Feu”和“Tirer”法语文件。

这是支持使用 Django 的 i18n 系统吗?如何将变量注入到此类翻译中?

【问题讨论】:

  • Django 使用 po 文件进行翻译。键可以是任何匹配的字符串或短语。示例{% trans "cannon.fire" %} 可以正常工作。
  • 如果我需要在翻译中注入变量呢?看起来它需要“出现”在密钥中才能用于翻译。

标签: django internationalization django-i18n


【解决方案1】:

目前(但很尴尬)的方法是:

  • 使用{% trans "cannon.fire" %}等翻译键

  • 如果我需要使用变量,请使用翻译键后跟变量

    {% blocktrans %}email.password_reset.click_link {{link}}{% endblocktrans %}

    然后在我的翻译中我可以使用链接变量%(link)s

感觉像是一种无意的使用,与文档非常不同。可能有更正式的方式来做到这一点。

【讨论】:

    【解决方案2】:

    是的,这是可能的。键可以是任何匹配的字符串或短语。

    模板.html

    {% trans "cannon.fire" %} 
    {% trans "campsite.fire" %} 
    

    po 文件:

    msgid "cannon.fire"
    msgstr "Tirer"
    
    msgid "campsite.fire"
    msgstr "Feu"
    

    对于翻译中的变量,有blocktranslate标签允许翻译中的变量。

    {% blocktranslate %} hello my name is {{ name }} {% endblocktranslate %}
    

    渲染上下文中的变量翻译也是可能的:

    {% translate myvar %}
    

    【讨论】:

    • 谢谢。请注意,翻译键和变量不是独立的问题。在询问时,翻译键和变量感觉不兼容,我希望有一个包含两者的单一代码示例。然后我想出了我在下面发布的答案,感觉很hacky。有什么想法吗?
    猜你喜欢
    • 2011-02-08
    • 2011-10-22
    • 1970-01-01
    • 1970-01-01
    • 2019-06-08
    • 2017-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多