16

如果我有一个名为 num_countries 的模板变量,要使用 Django 进行复数,我可以编写如下内容:

countr{{ num_countries|pluralize:"y,ies" }}

有没有办法用 jinja2 做这样的事情?(我知道这在 jinja2 中不起作用) jinja2 的替代品是什么?

感谢您的提示!

4

4 回答 4

33

Guy Adini 的回复绝对是要走的路,尽管我认为(或者我可能误用了它)它与Django中的复数过滤器并不完全相同。

因此这是我的实现(使用装饰器注册)

@app.template_filter('pluralize')
def pluralize(number, singular = '', plural = 's'):
    if number == 1:
        return singular
    else:
        return plural

这样,它的使用方式完全相同(嗯,参数以稍微不同的方式传递):

countr{{ num_countries|pluralize:("y","ies") }}
于 2014-03-11T20:35:10.660 回答
15

当前的 Jinja 版本具有i18n 扩展,它添加了不错的翻译和复数标签:

{% trans count=list|length %}
There is {{ count }} {{ name }} object.
{% pluralize %}
There are {{ count }} {{ name }} objects.
{% endtrans %}

即使您实际上没有多种语言版本,您也可以使用它 - 如果您添加其他语言,您将拥有一个不需要更改的体面基础(并非所有语言都通过添加“s”来复数,有些甚至有多个复数形式)。

于 2015-02-11T16:23:31.963 回答
5

根据 Jinja 的文档,没有内置的过滤器可以满足您的需求。您可以轻松地设计一个自定义过滤器来做到这一点,但是:

def my_plural(str, end_ptr = None, rep_ptr = ""):
    if end_ptr and str.endswith(end_ptr):
        return str[:-1*len(end_ptr)]+rep_ptr
    else:
        return str+'s'

然后在您的环境中注册它:

environment.filters['myplural'] = my_plural

您现在可以使用 my_plural 作为 Jinja 模板。

于 2012-07-30T04:55:27.837 回答
-6

您还想检查单词是否已经是复数。这是我的解决方案:

def pluralize(text):
    if text[-1:] !='s':
        return text+'s'
    else: 
        return text

然后将标签注册到您的环境中(这也可以应用于 Django 模板引擎)。

于 2014-01-23T17:42:33.523 回答