Question

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!

Was it helpful?

Solution

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.

OTHER TIPS

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") }}

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).

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).

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top