From 98bcc484f02ae4ce7e94634f7ec75caab1b52318 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 | 3 +++
2 files changed, 13 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..fa170b0a 100644
--- a/spec/numberformat.html
+++ b/spec/numberformat.html
@@ -49,6 +49,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 ? Get(_options_, *"numberingSystem"*).
+ 1. If _numberingSystem_ is not *undefined*, set _numberingSystem_ to ? ToString(_numberingSystem_).
+ 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]].