使用带有ng-pluralize的布尔表达式

时间:2015-03-26 12:26:51

标签: angularjs

在此模板中使用ng-pluralize

Your subscription <span ng-pluralize count="::vm.account.subscription.expirationDays" 
                             when="{ '-1': 'has expired!', 
                                     '0': 'expires today!', 
                                     'one': 'expires tomorrow.', 
                                     'other': 'expires in {} days.'}"></span>

产生以下结果:

Expiration Days     Label
-1                  Your subscription has expired!
0                   Your subscription expires today!
1                   Your subscription expires tomorrow!
X                   Your subscription expires in X days.

但是,只要订阅到期 2天前就会中断

是否可以将布尔表达式定义为when子句,以便

vm.account.subscription.expirationDays < 0 === 'has expired!'

目前我不得不在另一个元素中处理过期的标签,这种标签违背了使用ng-pluralize的目的。

1 个答案:

答案 0 :(得分:1)

看起来你的情景虽然可能很常见,但对于ngPluralize来说太复杂了。我也怀疑它会改变,因为ngPluralize基于&#34;复数类别&#34;: http://unicode.org/repos/cldr-tmp/trunk/diff/supplemental/language_plural_rules.html

问题在于en-US,Angular的默认语言环境,只定义了类别&#34; one&#34;和&#34;其他&#34;。任何不属于这些类别的内容都是明确定义的(或由$locale.pluralCat推断)。

立即找到适用于您的方案的三个最佳选项是:

1)最简单的就是拥有两个对象:

when="count >=0 ? positivePlurals : negativePlurals"

当然,$scope.count = vm.account.subscription.expirationDayspositivePlurals是您的正面短语,negativePlurals是您的否定短语。

2)在指令中包含支持多个或自定义复数规则(例如i18next)的本地化库,并使用它。我对流行的angular-translate不太熟悉,但乍一看似乎并不支持自定义复数规则。但是,它确实允许插值逻辑,所以你可能会放弃它。

3)写一个类似于支持的ngPluralize的指令(&#34; -other&#34;,&#34; x&#34;,&#34;其他&# 34)。 ngPluralize的来源可用here。它可能就像在L211修改语句一样简单,类似于:

var countIsNaN = isNaN(count);
var countIsNegative = count < 0;

if (!countIsNaN && !(count in whens)) {
  // If an explicit number rule such as 1, 2, 3... is defined, just use it.
  // Otherwise, check it against pluralization rules in $locale service.
  count = $locale.pluralCat(count - offset);
  if(countIsNegative){
    count = '-'+count; // "-one", "-other"
  }
}