craftApprentice
craftApprentice

Reputation: 2777

How to pluralize a name in a template with jinja2?

If I have a template variable called num_countries, to pluralize with Django I could just write something like this:

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

Is there a way to do something like this with jinja2? (I do know this doesn't work in jinja2) What's the jinja2 alternative to this?

Thanks for any tip!

Upvotes: 22

Views: 11419

Answers (4)

ThiefMaster
ThiefMaster

Reputation: 318468

Current Jinja versions have the i18n extension which adds decent translation and pluralization tags:

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

You can use this even if you don't actually have multiple language versions - and if you ever add other languages you'll have a decent base which requires no changes (not all languages pluralize by adding an 's' and some even have multiple plural forms).

Upvotes: 17

Filipe Pina
Filipe Pina

Reputation: 2239

Guy Adini's reply is definitely the way to go, though I think (or maybe I misused it) it is not exactly the same as pluralize filter in Django.

Hence this was my implementation (using decorator to register)

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

This way, it is used exactly the same way (well, with parameters being passed in a slightly different way):

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

Upvotes: 36

garbanzio
garbanzio

Reputation: 846

You also want to check if the word is already plural. Here is my solution:

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

Then register the tag to your environment (this can be applied to the Django templating engine too).

Upvotes: -6

Guy Adini
Guy Adini

Reputation: 5494

According to Jinja's documentation, there is no built in filter which does what you want. You can easily design a custom filter to do that, however:

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'

and then register it in your environment:

environment.filters['myplural'] = my_plural

You can now use my_plural as a Jinja template.

Upvotes: 5

Related Questions