使用Jinja2和Django在模板中对数字进行L10N定位

时间:2015-02-20 20:13:25

标签: django jinja2

我试图让Jinja2(和Django,通过django-jinja)本地化一个数字,例如。 123456变为123,456(当然,取决于区域设置,为123.456)。我已经阅读了关于这个主题的所有文档,并且找不到任何实际可行的文档。使用标准DTL,可以做到:

{% localize on %}{{ some_number }}{% endlocalize %}

这在使用常规Django模板的项目中工作正常,但当然,在Jinja2中不起作用。我提到这样可以正常工作,因为可以排除任何涉及settings.py USE_L10N False {{ gettext("%(num)d", num=some_number) }}}的内容。

我已经尝试了以下内容,所有这些都基于我发现的文档:

  • {% trans num=some_number %}{{ num }} {% endtrans %} - 输出数字,不带逗号或本地化。
  • {{ _(some_number|string) }} - 正如django-jinja documentation所建议的那样 - 输出数字,没有逗号或本地化。
  • {{ some_number|localize }} - 输出数字,不带逗号或本地化。
  • localize - {{1}}不是有效的过滤器。

那么,如何使用Jinja2轻松正确地对数字进行本地化?

2 个答案:

答案 0 :(得分:0)

想出来。 Jinja2似乎没有自己处理本地化,但django-jinja包含一个包含django.contrib.humanize.templatetags的内置贡献。根据{{​​3}},如果启用了L10n,则使用|intcomma过滤器来遵循格式本地化。

要使用它,请在django_jinja.contrib._humanize中将INSTALLED_APPS添加到settings.py

INSTALLED_APPS += ('django_jinja.contrib._humanize',)

然后在模板中,只需使用|intcomma过滤器:

{{ some_number|intcomma }}

答案 1 :(得分:0)

尽管这是一个古老的问题,但我遇到同样的问题,发现该解决方案无需大量编辑就可以实现。 Here是为jinja2模板实现L10n的库。您可以将其与您的应用程序集成,例如

TEMPLATES = [
    {
        'BACKEND': 'django.template.backends.jinja2.Jinja2',
        'DIRS': [],
        'APP_DIRS': True,
        'OPTIONS': {
            'extensions': [
                'jdj_tags.extensions.DjangoStatic',
                'jdj_tags.extensions.DjangoI18n',
                'jdj_tags.extensions.DjangoL10n',
            ]
        },
    },
}