2012-05-29 14 views
11

Czy są jakieś pomocnice w tworzeniu szablonów, w których można używać słów w liczbie mnogiej?Jak radzisz sobie z pluralizacją w Ember?

W poniższym przykładzie, jak zrobić wyjście szablonu „2 psy mają ...”?

Kod:

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

Szablon:

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

Spójrz na http://stackoverflow.com/questions/48726/best-javascript-i18n -techniques-ajax-daty-czasy-liczby-waluty – Reactormonk

Odpowiedz

14

Wiem, że to jest stare, ale potrzebowałem go dzisiaj, więc tutaj idzie.

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

Zastosowanie:

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

lub

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

mnoga (p =) opcją jest konieczne tylko wtedy, gdy nie chcesz zachowanie Standard + S.

+0

Wygrywasz nagrodę za prawidłową prostą odpowiedź. Ci inni próbowali ciężko, ale to było w czasach zanim istniało 'registerBoundHelper'. – hekevintran

+0

To nie jest dobra opcja, bardziej poprawne podejście byłoby @ Giovanni's. Ale ponieważ ember-inflector teraz rejestruje sam pluralizujący helper, dostajesz to po wyjęciu z pudełka (zobacz https://github.com/stefanpenner/ember-inflector/issues/18). –

+0

Zaktualizowałem to do pracy w Ember 2.x, [tutaj] (https://gist.github.com/finferflu/8eeeff014acec7525f466aa72d0ab560), ale ponieważ nie wiem jak działają tam wymienione parametry, mam wybrał parametry pozycyjne. Możesz to poprawić! – finferflu

0

Nie znam żadnej Ember specyficznych funkcji, które zrobi to za Ciebie. Jednak generalnie, gdy liczba słów jest pluralizowana, pojedyncza wersja pojawia się tylko wtedy, gdy liczy się jeden.

Zobacz to na przykład: 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

Jest bibliotekę I18n dla Ember: zendesk/ember-i18n.

Jest pomocnikiem kierownica t które obsługuje internacjonalizację patrząc w górę ciąg od 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.' 
}; 

a następnie można użyć ciąg w szablonie kierownicy poprzez:

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

kodu powyżej jest niesprawdzony i właśnie wzięty z dokumentacji w README.


Innym JS I18n biblioteki znalazłem jest Alex Sexton na messageformat.js.


To zależy od złożoności Ciebie aplikacja, ale można również użyć właściwości obliczoną na to, patrz http://jsfiddle.net/pangratz666/pzg4c/:

Kierownice:

<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

czyż nie powinno to być lepszym rozwiązaniem do stworzenia pomocnika kierownicy zamiast obliczonej nieruchomości bezpośrednio? – louiscoquio

+0

Znalazłem bibliotekę I18n dla Ember, która ma pomocnika kierownicy. – pangratz

+0

+1, też wygląda świetnie! – louiscoquio

4

Wygląda na to got an answer from wycats himself, ale nie widzę go wymienić w tym wątku, więc tutaj jest:

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

Niedawno znalazłem tej biblioteki http://slexaxton.github.com/Jed/, który wydaje się być miłym narzędziem JS i18n. Sądzę, że możesz całkiem łatwo stworzyć własną implementację, rejestrując pomocnika kierownicy, korzystając z tej biblioteki.

8

Jeśli używasz Ember Data, możesz użyć Ember.Inflector.

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

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

można zarejestrować nowego pomocnika z:

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

Więcej szczegółów na http://emberjs.com/api/data/classes/Ember.Inflector.html

+0

Ember-inflector teraz rejestruje sam pomocnika, a otrzymasz go po wyjęciu z pudełka (patrz: https://github.com/stefanpenner/ember-inflector/issues/18). –

Powiązane problemy