Normative: Add Intl.Locale.prototype.variants#960
Conversation
| 1. Perform ? RequireInternalSlot(_loc_, [[InitializedLocale]]). | ||
| 1. Let _variantsString_ be GetLocaleVariants(_loc_.[[Locale]]). | ||
| 1. Let _variantsList_ be StringSplitToList(_variantsString_, *"-"*). | ||
| 1. Return CreateArrayFromList(_variantsList_). |
There was a problem hiding this comment.
- @anba Should this also state the order need to be in alphabetical order ?
See the order discussion in
https://unicode.org/reports/tr35/#Canonical_Unicode_Locale_Identifiers
There was a problem hiding this comment.
It might benefit from a note, but nothing more—alphabetization is already required by use of CanonicalizeUnicodeLocaleId in the Intl.Locale constructor.
|
If we do this, then how about setting variants in option bag them? |
Good question, and I think the answer is "yes". This also interacts with the design question about representing variants as an array of strings or as a single dash-separated string, and I'm increasingly inclined towards the latter. |
|
TG2 discussion, focused on the motivation: https://github.com/tc39/ecma402/blob/main/meetings/notes-2025-04-03.md#normative-add-localeprototypegetvariants-960 |
|
In accord with #960 (comment) and TG2 discussion, this will be exposed as a string-returning |
c001a65 to
a606142
Compare
|
This reached consensus in TC39 plenary. |
| 1. Let _variants_ be GetLocaleVariants(_baseName_). | ||
| 1. Let _variants_ be ? GetOption(_options_, *"variants"*, ~string~, ~empty~, GetLocaleVariants(_baseName_)). | ||
| 1. If _variants_ is not *undefined*, then | ||
| 1. If _variants_ cannot be matched by the <code>unicode_variant_subtag</code> Unicode locale nonterminal, throw a *RangeError* exception. |
There was a problem hiding this comment.
unicode_variant_subtag matches a single variant subtag. That means new Intl.Locale("kl-tunumiit-kleinsch") will now always throw a RangeError. Probably needs StringSplitToList(variants, "-") and then check unicode_variant_subtag on all elements of the returned List.
…nst a subtag sequence Fixes tc39#960
https://bugs.webkit.org/show_bug.cgi?id=294755 Reviewed by Yusuke Suzuki. tc39/ecma402#960 added `Intl.Locale.prototype.variants` to the ECMAScript specification. The test262 test suite has also been updated [1]. This patch implements `Intl.Locale.prototype.variants` for JSC. [1]: tc39/test262#4474 * JSTests/stress/intl-locale-prototype-variants.js: Added. (shouldBe): (shouldThrow): * JSTests/test262/expectations.yaml: * Source/JavaScriptCore/runtime/CommonIdentifiers.h: * Source/JavaScriptCore/runtime/IntlLocale.cpp: (JSC::LocaleIDBuilder::overrideLanguageScriptRegionVariants): (JSC::IntlLocale::initializeLocale): (JSC::IntlLocale::variants): (JSC::LocaleIDBuilder::overrideLanguageScriptRegion): Deleted. * Source/JavaScriptCore/runtime/IntlLocale.h: * Source/JavaScriptCore/runtime/IntlLocalePrototype.cpp: (JSC::JSC_DEFINE_CUSTOM_GETTER): Canonical link: https://commits.webkit.org/296467@main
https://tc39.es/ecma402/#sec-Intl.Locale.prototype.variants Added to the spec by tc39/ecma402#960 Test code added in tc39/test262#4474 feature https://chromestatus.com/feature/4709921706868736 I2P https://groups.google.com/a/chromium.org/g/blink-dev/c/NCT4pPJ_Uz8/m/G62K-m6CAgAJ Bug: 450083673 Change-Id: I49a4af9f9e75a18efb3b67f546f971d4c24e0bb0 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/7018878 Reviewed-by: Leszek Swirski <leszeks@chromium.org> Reviewed-by: Olivier Flückiger <olivf@chromium.org> Commit-Queue: Frank Tang <ftang@chromium.org> Cr-Commit-Position: refs/heads/main@{#103188}
https://tc39.es/ecma402/#sec-Intl.Locale.prototype.variants Added to the spec by tc39/ecma402#960 Test code added in tc39/test262#4474 feature https://chromestatus.com/feature/4709921706868736 I4DT https://groups.google.com/a/chromium.org/g/blink-dev/c/i6QEHcH_fiI/m/4xUyZbSvAAAJ Bug: 450083673 Change-Id: I987b3066726323550d098222e50da999c145495c Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/7064530 Commit-Queue: Frank Tang <ftang@chromium.org> Reviewed-by: Rezvan Mahdavi Hezaveh <rezvan@chromium.org> Cr-Commit-Position: refs/heads/main@{#103233}
### TL;DR Added the `variants` property to `Intl.Locale` and improved documentation for `CanonicalizeLocaleList`. ### What changed? - Added the `variants` getter to the `Intl.Locale` class that returns variant subtags joined with hyphens in alphabetical order - Added detection for the `variants` property in the `shouldPolyfill` function - Added comprehensive tests for the new `variants` property with various locale scenarios - Enhanced documentation in `intl-getcanonicallocales` with ECMA-402 spec references for better clarity ### How to test? - Run the new test cases that verify the `variants` property works correctly: - Returns `undefined` for locales without variants - Returns the variant string for locales with a single variant - Returns hyphen-joined variants in alphabetical order for locales with multiple variants - Handles various locale formats with scripts, extensions, and numeric variants ### Why make this change? This change implements the `variants` property that was added to ECMA-402 via PR #960 to align with other subtag accessors. The property provides access to the variant subtags of a locale, which was previously missing from the implementation. This brings the polyfill in line with the latest ECMA-402 specification. References: - https://tc39.es/ecma402/#sec-Intl.Locale.prototype.variants - tc39/ecma402#960 - tc39/ecma402#900
https://tc39.es/ecma402/#sec-Intl.Locale.prototype.variants Added to the spec by tc39/ecma402#960 Test code added in tc39/test262#4474 feature https://chromestatus.com/feature/4709921706868736 I4DT https://groups.google.com/a/chromium.org/g/blink-dev/c/i6QEHcH_fiI/m/4xUyZbSvAAAJ I2S https://groups.google.com/a/chromium.org/g/blink-dev/c/-IH8qyT_7bQ/m/K8ymVPNvBQAJ API Owner LGTMs: chrishtr@, foolip@, miketaylr@ Bug: 450083673 Change-Id: I2623f0fb28863dd8c3f31eeade19ecf5015c33d5 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/7108520 Commit-Queue: Frank Tang <ftang@chromium.org> Reviewed-by: Leszek Swirski <leszeks@chromium.org> Cr-Commit-Position: refs/heads/main@{#106371}

Fixes #900
test262 PR: tc39/test262#4474