Index: src/js/i18n.js |
diff --git a/src/js/i18n.js b/src/js/i18n.js |
index 3be9ed385a0b8e16c7ddae9878c38c2822fb8db3..43eba159d5707f01c4c2c5907fe78cefc54c5f93 100644 |
--- a/src/js/i18n.js |
+++ b/src/js/i18n.js |
@@ -24,6 +24,7 @@ var GlobalIntl = global.Intl; |
var GlobalIntlDateTimeFormat = GlobalIntl.DateTimeFormat; |
var GlobalIntlNumberFormat = GlobalIntl.NumberFormat; |
var GlobalIntlCollator = GlobalIntl.Collator; |
+var GlobalIntlPluralRules = utils.ImportNow("PluralRules"); |
var GlobalIntlv8BreakIterator = GlobalIntl.v8BreakIterator; |
var GlobalNumber = global.Number; |
var GlobalRegExp = global.RegExp; |
@@ -34,6 +35,7 @@ var InstallGetter = utils.InstallGetter; |
var InternalArray = utils.InternalArray; |
var MaxSimple; |
var ObjectHasOwnProperty = utils.ImportNow("ObjectHasOwnProperty"); |
+var ObjectKeys = global.Object.keys; |
var OverrideFunction = utils.OverrideFunction; |
var patternSymbol = utils.ImportNow("intl_pattern_symbol"); |
var resolvedSymbol = utils.ImportNow("intl_resolved_symbol"); |
@@ -138,7 +140,8 @@ var AVAILABLE_LOCALES = { |
'collator': UNDEFINED, |
'numberformat': UNDEFINED, |
'dateformat': UNDEFINED, |
- 'breakiterator': UNDEFINED |
+ 'breakiterator': UNDEFINED, |
+ 'pluralrules': UNDEFINED, |
}; |
/** |
@@ -204,7 +207,7 @@ var SERVICE_RE = UNDEFINED; |
function GetServiceRE() { |
if (IS_UNDEFINED(SERVICE_RE)) { |
SERVICE_RE = |
- new GlobalRegExp('^(collator|numberformat|dateformat|breakiterator)$'); |
+ new GlobalRegExp('^(' + %_Call(ArrayJoin, ObjectKeys(AVAILABLE_LOCALES), '|') + ')$'); |
} |
return SERVICE_RE; |
} |
@@ -1106,6 +1109,103 @@ function compare(collator, x, y) { |
AddBoundMethod(GlobalIntlCollator, 'compare', compare, 2, 'collator', false); |
+function PluralRulesConstructor() { |
+ var locales = arguments[0]; |
+ var options = arguments[1]; |
+ |
+ if (IS_UNDEFINED(options)) { |
+ options = {}; |
+ } |
+ |
+ var getOption = getGetOption(options, 'pluralrules'); |
+ |
+ var locale = resolveLocale('pluralrules', locales, options); |
+ |
+ var internalOptions = {}; |
+ defineWEProperty(internalOptions, 'type', getOption( |
+ 'type', 'string', ['cardinal', 'ordinal'], 'cardinal')); |
+ |
+ SetNumberFormatDigitOptions(internalOptions, options, 0, 3); |
+ |
+ var requestedLocale = locale.locale; |
+ var resolved = %object_define_properties({}, { |
+ type: {value: internalOptions.type, writable: true}, |
+ locale: {writable: true}, |
+ maximumFractionDigits: {writable: true}, |
+ minimumFractionDigits: {writable: true}, |
+ minimumIntegerDigits: {writable: true}, |
+ requestedLocale: {value: requestedLocale, writable: true}, |
+ }); |
+ if (HAS_OWN_PROPERTY(internalOptions, 'minimumSignificantDigits')) { |
+ defineWEProperty(resolved, 'minimumSignificantDigits', UNDEFINED); |
+ } |
+ if (HAS_OWN_PROPERTY(internalOptions, 'maximumSignificantDigits')) { |
+ defineWEProperty(resolved, 'maximumSignificantDigits', UNDEFINED); |
+ } |
+ defineWEProperty(resolved, 'pluralCategories', []); |
+ var pluralRules = %CreatePluralRules(requestedLocale, internalOptions, |
+ resolved); |
+ |
+ %MarkAsInitializedIntlObjectOfType(pluralRules, 'pluralrules'); |
+ pluralRules[resolvedSymbol] = resolved; |
+ |
+ return pluralRules; |
+} |
+%SetCode(GlobalIntlPluralRules, PluralRulesConstructor); |
+ |
+InstallFunction(GlobalIntlPluralRules.prototype, 'resolvedOptions', |
+ function() { |
+ if (!%IsInitializedIntlObjectOfType(this, 'pluralrules')) { |
+ throw %make_type_error(kIncompatibleMethodReceiver, |
+ 'Intl.PluralRules.prototype.resolvedOptions', |
+ this); |
+ } |
+ var locale = getOptimalLanguageTag(this[resolvedSymbol].requestedLocale, |
+ this[resolvedSymbol].locale); |
+ |
+ var result = { |
+ locale: locale, |
+ type: this[resolvedSymbol].type, |
+ minimumIntegerDigits: this[resolvedSymbol].minimumIntegerDigits, |
+ minimumFractionDigits: this[resolvedSymbol].minimumFractionDigits, |
+ maximumFractionDigits: this[resolvedSymbol].maximumFractionDigits, |
+ }; |
+ |
+ if (HAS_OWN_PROPERTY(this[resolvedSymbol], 'minimumSignificantDigits')) { |
+ defineWECProperty(result, 'minimumSignificantDigits', |
+ this[resolvedSymbol].minimumSignificantDigits); |
+ } |
+ |
+ if (HAS_OWN_PROPERTY(this[resolvedSymbol], 'maximumSignificantDigits')) { |
+ defineWECProperty(result, 'maximumSignificantDigits', |
+ this[resolvedSymbol].maximumSignificantDigits); |
+ } |
+ |
+ defineWECProperty(result, 'pluralCategories', |
+ this[resolvedSymbol].pluralCategories); |
+ |
+ return result; |
+ } |
+); |
+ |
+InstallFunction(GlobalIntlPluralRules, 'supportedLocalesOf', |
+ function(locales) { |
+ return supportedLocalesOf('pluralrules', locales, arguments[1]); |
+ } |
+); |
+ |
+InstallFunction(GlobalIntlPluralRules.prototype, 'select', |
+ function(value) { |
+ if (!%IsInitializedIntlObjectOfType(this, 'pluralrules')) { |
+ throw %make_type_error(kIncompatibleMethodReceiver, |
+ 'Intl.PluralRules.prototype.select', |
+ this); |
+ } |
+ |
+ return %PluralRulesSelect(this, TO_NUMBER(value) + 0); |
+ } |
+); |
+ |
/** |
* Verifies that the input is a well-formed ISO 4217 currency code. |
* Don't uppercase to test. It could convert invalid code into a valid one. |