11

是否有任何帮助模板知道何时使用复数词?

在下面的示例中,如何使模板输出“2 dogs have...”?

编码:

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

模板:

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

6 回答 6

14

我知道这是旧的,但我今天需要它,所以就这样吧。

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=) 选项仅在您不想要标准 +s 行为时才需要。

于 2013-05-21T20:55:44.903 回答
10

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 库是 Alex Sexton 的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();
于 2012-05-30T09:27:07.890 回答
9

如果您使用 Ember 数据,您可以使用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

于 2014-02-20T17:16:47.533 回答
4

看起来你从 wycats 本人那里得到了答案,但我没有看到这个帖子中提到它,所以这里是:

Handlebars.registerHelper('pluralize', function(number, single, plural) {
    if (number === 1) { return single; }
    else { return plural; }
});
于 2012-10-02T20:46:11.457 回答
3

我最近发现这个库http://slexaxton.github.com/Jed/似乎是 JS i18n 的一个不错的工具。我想你可以很容易地通过使用这个库注册一个把手助手来创建你自己的实现。

于 2012-12-05T18:47:16.300 回答
0

我不知道任何 Ember 特定功能可以为您执行此操作。但是,通常当您将一个单词复数时,只有在计数为 1 时才会显示单个版本。

看这个例子: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
于 2012-05-30T01:03:35.287 回答