From 39259586577645a782719635ab87b2fdb2d88a44 Mon Sep 17 00:00:00 2001 From: Daniel Ehrenberg Date: Wed, 13 Sep 2017 19:11:29 +0200 Subject: [PATCH] Normative: Add calendar and numberingSystem options This patch allows calendar and numberingSystem to be specified in the options bag of the DateTimeFormat and NumberFormat constructors. One use case for these options would be, when working with locales which have two numbering systems and calendars in use--the UA default may be the non-Western one, but in some contexts, it may be appropriate to use the Western one. Currently, without the patch, it would be necessary to parse the BCP 47 language tag in the application, but Intl provides no library to do so. For example, this all occurs in this bug: https://bugzilla.mozilla.org/show_bug.cgi?id=1370086 This patch validates the calendar and numbering system by comparing them to the grammar allowed for Unicode extension tags, per the resolution documented at https://github.com/tc39/ecma402/pull/175#issuecomment-367507610 Related bug: #105 . This patch leaves out "collation" because of a lack of clear use cases. --- spec/datetimeformat.html | 10 ++++++++++ spec/numberformat.html | 7 +++++++ 2 files changed, 17 insertions(+) diff --git a/spec/datetimeformat.html b/spec/datetimeformat.html index 2519a1cc..0af22d15 100644 --- a/spec/datetimeformat.html +++ b/spec/datetimeformat.html @@ -73,12 +73,22 @@

InitializeDateTimeFormat ( _dateTimeFormat_, _locales_, _options_ )

The abstract operation InitializeDateTimeFormat accepts the arguments _dateTimeFormat_ (which must be an object), _locales_, and _options_. It initializes _dateTimeFormat_ as a DateTimeFormat object. This abstract operation functions as follows:

+

+ The following algorithm refers to UTS 35's Unicode Locale Identifier grammar. +

+ 1. Let _requestedLocales_ be ? CanonicalizeLocaleList(_locales_). 1. Let _options_ be ? ToDateTimeOptions(_options_, `"any"`, `"date"`). 1. Let _opt_ be a new Record. 1. Let _matcher_ be ? GetOption(_options_, `"localeMatcher"`, `"string"`, « `"lookup"`, `"best fit"` », `"best fit"`). 1. Set _opt_.[[localeMatcher]] to _matcher_. + 1. Let _calendar_ be ? GetOption(_options_, `"calendar"`, `"string"`, *undefined*, *undefined*). + 1. If _calendar_ does not match `type`, throw a *RangeError* exception. + 1. Set _opt_.[[ca]] to _calendar_. + 1. Let _numberingSystem_ be ? GetOption(_options_, `"numberingSystem"`, `"string"`, *undefined*, *undefined*). + 1. If _numberingSystem_ does not match `type`, throw a *RangeError* exception. + 1. Set _opt_.[[nu]] to _numberingSystem_. 1. Let _hour12_ be ? GetOption(_options_, `"hour12"`, `"boolean"`, *undefined*, *undefined*). 1. Let _hourCycle_ be ? GetOption(_options_, `"hourCycle"`, `"string"`, « `"h11"`, `"h12"`, `"h23"`, `"h24"` », *undefined*). 1. If _hour12_ is not *undefined*, then diff --git a/spec/numberformat.html b/spec/numberformat.html index 979c8f53..07a72880 100644 --- a/spec/numberformat.html +++ b/spec/numberformat.html @@ -40,6 +40,10 @@

InitializeNumberFormat ( _numberFormat_, _locales_, _options_ )

The abstract operation InitializeNumberFormat accepts the arguments _numberFormat_ (which must be an object), _locales_, and _options_. It initializes _numberFormat_ as a NumberFormat object. The following steps are taken:

+

+ The following algorithm refers to UTS 35's Unicode Locale Identifier grammar. +

+ 1. Let _requestedLocales_ be ? CanonicalizeLocaleList(_locales_). 1. If _options_ is *undefined*, then @@ -49,6 +53,9 @@

InitializeNumberFormat ( _numberFormat_, _locales_, _options_ )

1. Let _opt_ be a new Record. 1. Let _matcher_ be ? GetOption(_options_, `"localeMatcher"`, `"string"`, « `"lookup"`, `"best fit"` », `"best fit"`). 1. Set _opt_.[[localeMatcher]] to _matcher_. + 1. Let _numberingSystem_ be ? GetOption(_options_, `"numberingSystem"`, `"string"`, *undefined*, *undefined*). + 1. If _numberingSystem_ does not match `type`, throw a *RangeError* exception. + 1. Set _opt_.[[nu]] to _numberingSystem_. 1. Let _localeData_ be %NumberFormat%.[[LocaleData]]. 1. Let _r_ be ResolveLocale(%NumberFormat%.[[AvailableLocales]], _requestedLocales_, _opt_, %NumberFormat%.[[RelevantExtensionKeys]], _localeData_). 1. Set _numberFormat_.[[Locale]] to _r_.[[locale]].