2012-05-29 29 views
11

¿Hay ayudantes para hacer que las plantillas tengan en cuenta cuándo usar palabras en plural?¿Cómo manejas la pluralización en Ember?

En el siguiente ejemplo, ¿cómo se puede hacer que la salida de la plantilla "2 perros tenga ..."?

El código:

Ember.View.create({dog_count: 2}) 

La plantilla:

{{dog_count}} (dog has)/(dogs have) gone for a walk. 
+1

Tome un vistazo a http://stackoverflow.com/questions/48726/best-javascript-i18n -techniques-ajax-dates-times-numbers-currency – Reactormonk

Respuesta

14

Sé que esto es viejo, pero lo necesitaba hoy, así que aquí va.

Ember.Handlebars.registerBoundHelper('pluralize', function(number, opts) { 
    var single = opts.hash['s']; 
    Ember.assert('pluralize requires a singular string (s)', single); 
    var plural = opts.hash['p'] || single + 's'; 
    return (number == 1) ? single : plural; 
}); 

Uso:

{{questions.length}} {{pluralize questions.length s="Question"}} 

o

{{dog_count}} {{pluralize dog_count s="dog has" p="dogs have"}} gone for a walk. 

El (p =) opción plural sólo es necesario cuando no desea que el comportamiento del estándar + s.

+0

Usted gana el premio por la respuesta simple correcta. Estos otros muchachos lo intentaron mucho, pero eso fue en los días antes de que existiera 'registerBoundHelper'. – hekevintran

+0

Esta no es una buena opción, el enfoque más correcto sería @ Giovanni's. Pero dado que ember-inflector ahora registra un ayudante pluralizado, obtienes esto de la caja (ver https://github.com/stefanpenner/ember-inflector/issues/18). –

+0

He actualizado esto para que funcione en Ember 2.x, [aquí] (https://gist.github.com/finferflu/8eeeff014acec7525f466aa72d0ab560), pero como no sé cómo funcionan los parámetros con nombre, he optó por los parámetros posicionales. ¡Siéntete libre de mejorarlo! – finferflu

0

No sé de ningún Ember funciones específicas que lo hará por usted. Sin embargo, generalmente cuando se pluraliza una palabra, la única versión solo aparece cuando el recuento es uno.

ver esto por ejemplo: http://jsfiddle.net/6VN56/

function pluralize(count, single, plural) { 
    return count + " " + (count == 1 ? single : plural); 
} 

pluralize(1, 'dog', 'dogs') // 1 dog 
pluralize(10, 'dog', 'dogs') // 10 dogs 
pluralize(0, 'dog', 'dogs') // 0 dogs 
10

hay una biblioteca I18n para Ember: zendesk/ember-i18n.

Hay un ayudante manillar t que se ocupa de la internacionalización por buscar la cadena de Em.I18n.translations:

Em.I18n.translations = { 
    'dog.walk.one': '1 dog has gone for a walk.', 
    'dog.walk.other': '{{count}} dogs have gone for a walk.' 
}; 

Y a continuación, puede utilizar la cadena en su plantilla manillares a través de:

{{t dog.walk countBinding="dogCount"}} 

El código arriba no se ha probado y solo se ha tomado de la documentación en el README.


Otra librería JS I18n he encontrado es Alex Sexton de messageformat.js.


Depende de la complejidad de ustedes aplicación, pero también se puede utilizar una propiedad calculada para eso, ver http://jsfiddle.net/pangratz666/pzg4c/:

Manillar:

<script type="text/x-handlebars" data-template-name="dog" > 
    {{dogCountString}} 
</script>​ 

JavaScript:

Ember.View.create({ 
    templateName: 'dog', 
    dogCountString: function() { 
     var dogCount = this.get('dogCount'); 
     var dogCountStr = (dogCount === 1) ? 'dog has' : 'dogs have'; 
     return '%@ %@ gone for a walk.'.fmt(dogCount, dogCountStr); 
    }.property('dogCount') 
}).append(); 
+1

¿No debería ser una mejor solución para crear un ayudante de manillar en lugar de una propiedad calculada directamente? – louiscoquio

+0

Encontré una biblioteca I18n para Ember que tiene un ayudante de manubrio. – pangratz

+0

+1, ¡se ve genial también! – louiscoquio

4

Parece que got an answer from wycats himself, pero no vi que se menciona en este hilo, por lo que aquí está:

Handlebars.registerHelper('pluralize', function(number, single, plural) { 
    if (number === 1) { return single; } 
    else { return plural; } 
}); 
3

poco encontré esta biblioteca http://slexaxton.github.com/Jed/ que parece ser una buena herramienta para la JS i18n. Supongo que puede crear fácilmente su propia implementación registrando un asistente de manubrio utilizando esta biblioteca.

8

Si usa Ember Data puede usar Ember.Inflector.

var inflector = new Ember.Inflector(Ember.Inflector.defaultRules); 

inflector.pluralize('person') //=> 'people' 

Puede registrar un nuevo ayudante para con:

Handlebars.registerHelper('pluralize', function(number, single) { 
    if (number === 1) { return single; } 
    else { 
    var inflector = new Ember.Inflector(Ember.Inflector.defaultRules); 
    return inflector.pluralize(single); 
    } 
}); 

Más detalles en http://emberjs.com/api/data/classes/Ember.Inflector.html

+0

ember-inflector ahora registra un ayudante pluralizado que obtienes de esta forma (ver https://github.com/stefanpenner/ember-inflector/issues/18). –

Cuestiones relacionadas