2012-05-29 14 views
11

Esistono aiutanti per rendere i modelli consapevoli di quando utilizzare parole al plurale?Come gestite la pluralizzazione in Ember?

Nell'esempio seguente, come si genera l'output del modello "2 cani hanno ..."?

Il codice:

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

Il modello:

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

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

risposta

14

So che questo è vecchio, ma ne avevo bisogno oggi, quindi ecco qui.

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

Usage:

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

o

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

Il plurale (p =) opzione è necessaria solo quando non si desidera che il comportamento standard + s.

+0

Hai vinto il premio per la risposta semplice corretta. Questi altri ragazzi ci hanno provato, ma quello era nei giorni prima che esistesse "registerBoundHelper". – hekevintran

+0

Questa non è una buona opzione, l'approccio più corretto sarebbe @ Giovanni. Ma dal momento che ember-inflector registra ora un helper pluralizzato, questo viene fuori dalla scatola (vedi https://github.com/stefanpenner/ember-inflector/issues/18). –

+0

L'ho aggiornato per funzionare in Ember 2.x, [qui] (https://gist.github.com/finferflu/8eeeff014acec7525f466aa72d0ab560), ma poiché non so come funzionano i parametri denominati, ho optato per i parametri posizionali. Sentiti libero di migliorarlo! – finferflu

0

non so di eventuali funzioni specifiche tempora che lo farà per voi. Tuttavia, generalmente quando pluralizzi una parola, la versione singola appare solo quando il conteggio è uno.

vedere questo per un esempio: 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

C'è una biblioteca I18n per Ember: zendesk/ember-i18n.

C'è un aiutante manubrio t che gestisce l'internazionalizzazione, cercando fino stringa dalla 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.' 
}; 

e quindi è possibile utilizzare la stringa nel modello Manubrio tramite:

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

Il codice sopra non è stato testato e appena preso dalla documentazione nello README.


Un'altra libreria JS I18n ho trovato è Alex Sexton di messageformat.js.


Essa dipende dalla complessità di voi app, ma è anche possibile utilizzare una proprietà calcolata per questo, vedi http://jsfiddle.net/pangratz666/pzg4c/:

Manubrio:

<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

non dovrebbe una soluzione migliore per creare direttamente un helper manubrio invece di una proprietà calcolata? – louiscoquio

+0

Ho trovato una libreria I18n per Ember che ha un assistente manubrio. – pangratz

+0

+1, sembra troppo bello! – louiscoquio

4

sembra che si got an answer from wycats himself, ma non l'ho visto menzionato in questa discussione, ecco che è:

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

Recentemente ho trovato questa libreria http://slexaxton.github.com/Jed/ che sembra essere un buon strumento per JS i18n. Immagino che tu possa facilmente creare la tua implementazione registrando un helper manubri usando questa libreria.

8

Se si utilizzano i dati di rame, è possibile utilizzare Ember.Inflector.

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

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

È possibile registrare un nuovo helper 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); 
    } 
}); 

Maggiori dettagli a http://emberjs.com/api/data/classes/Ember.Inflector.html

+0

ember-inflector registra ora un pluralize helper stesso che ottieni questo fuori dalla scatola (vedi https://github.com/stefanpenner/ember-inflector/issues/18). –

Problemi correlati