django翻译模板中的变量内容

时间:2011-07-01 10:45:42

标签: django internationalization translation

我正在使用{%trans%}模板标记。 Django文档说:

  

{%trans%}模板标记转换为常量字符串(用单引号或双引号括起来)或变量内容:

     
    

{%trans“这是标题。” %}     {%trans myvar%}

  

https://docs.djangoproject.com/en/1.3/topics/i18n/internationalization/#trans-template-tag

我发现无法执行{%trans myvar%},因为myvar在运行makemessages命令后根本不会显示在django.po文件中。

我使用它错了吗?有人可以帮我这个吗?

8 个答案:

答案 0 :(得分:28)

在这种情况下,您可以使用blocktrans模板标记:

{% blocktrans %} This is the title: {{ myvar }} {% endblocktrans %}

答案 1 :(得分:18)

{% trans myvar %}只是有效。因此,请检查您的PO文件,以确保myvar的值在PO msgid中。

<title>{% trans myvar %}</title>

例如,如果myvar包含"Some Publisher",您可以在PO文件中写下以下内容:

msgid "Some Publisher"
msgstr "কিছু প্রকাশক"

还要确保你已经跑了:

python manage.py compilemessages

答案 2 :(得分:7)

Django无法猜出该变量中的内容,因此您必须通过添加英语(msgid)和本地化(msgstr)字符串来自行翻译。

答案 3 :(得分:5)

我的经验是,变量翻译在模板中不起作用。但是,当变量的内容已知时,我找到了一个合适的解决方案(我的意思是它们不是自由文本,而是您在数据库中设置的一组选项)。

您需要在视图或过滤器标记中强制翻译

总结一下:

  1. 在模板中使用blocktrans
  2. 强制转换变量
    • 您可以在已标记为transtalion的上下文中设置变量
    • 或使用过滤器进行翻译
  3. .po档案
  4. 中生成翻译

    故事是这样的:

    <强> views.py

    def my_view(request):
        return render(request, 'i18n_test.html', {'salutation':"Hola"})
    

    <强>模板/ 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文件中:

    <强>区域设置/ EN / django.po

    ...
    msgid "Hola"
    msgstr "Hello"
    ...
    

答案 4 :(得分:1)

你可以在python代码中翻译变量,如settings.SITE_NAME

from django.conf import settings
from django.utils.translation import ugettext_lazy as _

def processor004(request):
 my_dict = {
    'site_id004': settings.SITE_ID,
    'site_name004': _(settings.SITE_NAME),
    'installed_apps004': settings.INSTALLED_APPS,
    'embedded_widget004': settings.EMBEDDED_WIDGET,
    'base_template004': settings.BASE_TEMPLATE,
}

return my_dict

答案 5 :(得分:0)

这是一个复杂优雅的解决方案,如果您要从模型字段中翻译值,这可能有所帮助:http://django-modeltranslation.readthedocs.org

&#34; Modeltranslation

modeltranslation应用程序用于将现有Django模型的动态内容转换为任意数量的语言,而无需更改原始模型类。&#34;

答案 6 :(得分:0)

对我来说,这发生在我的Django项目目录之外的TEMPLATES.DIRS时。将模板提取到项目目录中解决了这个问题。

答案 7 :(得分:0)

制作自己的标签

from django.utils.translation import ugettext as _

@register.simple_tag
def trans2(tr, *args, **kwargs):
    # print(':', kwargs)
    trans = _(tr)
    trans_str = trans.format(**kwargs)
    return trans_str
模板中的

{% trans2 columns_once.res_data.message with value=columns_once.res_data.recommend%}

在django.po

#: default_content.py:136
msgid "_audit_recommend_speed"
msgstr "Рекомендованная скорость до {value} сек"