在此模板中使用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
的目的。
答案 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.expirationDays
,positivePlurals
是您的正面短语,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"
}
}