2012-07-30 21 views
11

Si tengo una variable de plantilla llamada NUM_COUNTRIES, pluralizar con Django tan sólo pudiera escribir algo como esto:¿Cómo pluralizar un nombre en una plantilla con jinja2?

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

¿Hay una manera de hacer algo como esto con Jinja2? (Sé que esto no funciona en jinja2) ¿Cuál es la alternativa de jinja2 a esto?

¡Gracias por cualquier consejo!

Respuesta

3

De acuerdo con la documentación de Jinja, no hay built in filter que haga lo que desee. Usted puede diseñar fácilmente un custom filter de hacer eso, sin embargo:

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' 

y luego registrarlo en su entorno:

environment.filters['myplural'] = my_plural 

Ahora se puede utilizar como una plantilla my_plural Jinja.

-6

También querrá comprobar si la palabra ya es plural. Aquí está mi solución:

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

continuación, se registra la etiqueta de su entorno (esto se puede aplicar a motor de plantillas de Django también).

+5

Así no es como funciona la pluralización. – poxip

21

La respuesta de Guy Adini es definitivamente el camino a seguir, aunque creo (o tal vez lo utilicé mal) no es exactamente lo mismo que pluralizar el filtro en Django.

De ahí que este era mi aplicación (en el decorador para registrarse)

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

De esta manera, se utiliza exactamente de la misma manera (así, con los parámetros que se pasa de una manera ligeramente diferente):

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

Parece que no hay necesidad de punto y coma cuando se usa un filtro personalizado con argumentos. Al menos no hay ninguna pista para ello en la v.2.8 [documentación] de jinja2 (http://jinja.pocoo.org/docs/dev/api/#writing-filters). Supongo que su ejemplo debería arreglarse así: 'countr {{num_countries | pluralize (" y "," ies ")}}' – vrs

+0

21, 31, 41 país, 11 países – Suor

+0

Usaría 'number% 100 in {1 , 21,31,41,51,61,71,81,91} ' – Suor

11

versiones actuales Jinja tienen la i18n extension que añade etiquetas de traducción y de pluralización decente:

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

Puede usarlo incluso si no tiene versiones en varios idiomas, y si alguna vez agrega otros idiomas, tendrá una base decente que no requiere cambios (no todos los idiomas se pueden agregar al agregar una 's' y algunos incluso tener múltiples formas plurales).

Cuestiones relacionadas