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]].