Как вы относитесь к плюрализации в Ember?

Есть ли помощники для создания шаблонов, когда нужно использовать множественные слова?

В приведенном ниже примере, как сделать вывод шаблона "2 собаки имеют..."?

Код:

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

Шаблон:

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

Ответ 1

Я знаю, что это старо, но мне это нужно сегодня, так что вот.

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

Использование:

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

или

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

Параметр множественного числа (p =) необходим только тогда, когда вы не хотите стандартного поведения +.

Ответ 2

Для Ember существует библиотека I18n: zendesk/ember-i18n.

Существует хелпер ручек t, который обрабатывает интернационализацию путем поиска строки из 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.'
};

И вы можете использовать строку в вашем шаблоне Handlebars с помощью:

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

Вышеприведенный код не проверен и просто взят из документации в README.


Другая библиотека JS I18n, которую я нашел, - Алекс Секстон messageformat.js.


Это зависит от сложности вашего приложения, но вы также можете использовать для этого вычисленное свойство, см. http://jsfiddle.net/pangratz666/pzg4c/:

Рули

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

Ответ 3

Если вы используете Ember Data, вы можете использовать Ember.Inflector.

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

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

Вы можете зарегистрировать нового помощника с помощью:

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

Подробнее на http://emberjs.com/api/data/classes/Ember.Inflector.html

Ответ 4

Похоже, что вы получили ответ от самого wycats, но я не видел, чтобы он упоминался в этой теме, так что вот

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

Ответ 5

Недавно я нашел эту библиотеку http://slexaxton.github.com/Jed/, которая кажется хорошим инструментом для JS i18n. Я думаю, вы можете легко создать свою собственную реализацию, зарегистрировав хелпер-дескриптор, используя эту библиотеку.

Ответ 6

Я не знаю никаких специальных функций Ember, которые сделают это для вас. Однако, как правило, когда вы дублируете слово, единственная версия появляется только тогда, когда счетчик равен единице.

Посмотрите это на примере: 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