Dactyloidae/browser/internaluserscripts/bundled-scripts/intl-displaynames-polyfill.user.js
2026-07-13 08:48:40 -07:00

104 lines
3 KiB
JavaScript

// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at http://mozilla.org/MPL/2.0/.
// ==UserScript==
// @name Intl.DisplayNames Polyfill (minimal)
// @namespace internal-userscripts
// @description Provides a minimal Intl.DisplayNames implementation for environments without native support.
// @match *://*/*
// @grant none
// @run-at document-start
// ==/UserScript==
(function () {
"use strict";
if (typeof Intl !== "object" || typeof Intl.DisplayNames === "function") {
return;
}
var STYLE_VALUES = { long: true, short: true, narrow: true };
var TYPE_VALUES = { language: true, region: true, script: true, currency: true };
var FALLBACK_VALUES = { code: true, none: true };
function canonicalizeLocales(locales) {
if (typeof Intl.getCanonicalLocales === "function") {
return Intl.getCanonicalLocales(locales);
}
if (locales == null) {
return [];
}
if (Array.isArray(locales)) {
return locales.map(function (loc) { return String(loc); });
}
return [String(locales)];
}
function defaultLocale() {
try {
if (typeof Intl.DateTimeFormat === "function") {
return Intl.DateTimeFormat().resolvedOptions().locale;
}
} catch (e) {}
if (typeof navigator !== "undefined" && navigator.language) {
return String(navigator.language);
}
return "en-US";
}
function DisplayNames(locales, options) {
if (!(this instanceof DisplayNames)) {
throw new TypeError("Intl.DisplayNames must be called with new");
}
options = options || {};
var type = options.type;
if (type == null) {
throw new TypeError("Intl.DisplayNames requires a type option");
}
type = String(type);
if (!TYPE_VALUES[type]) {
throw new RangeError("Invalid type");
}
var style = options.style == null ? "long" : String(options.style);
if (!STYLE_VALUES[style]) {
throw new RangeError("Invalid style");
}
var fallback = options.fallback == null ? "code" : String(options.fallback);
if (!FALLBACK_VALUES[fallback]) {
throw new RangeError("Invalid fallback");
}
var localeList = canonicalizeLocales(locales);
this._locale = localeList.length ? localeList[0] : defaultLocale();
this._style = style;
this._type = type;
this._fallback = fallback;
}
DisplayNames.supportedLocalesOf = function (locales) {
return canonicalizeLocales(locales);
};
DisplayNames.prototype.resolvedOptions = function () {
return {
locale: this._locale,
style: this._style,
type: this._type,
fallback: this._fallback,
};
};
DisplayNames.prototype.of = function (code) {
if (this._fallback === "none") {
return undefined;
}
return String(code);
};
Intl.DisplayNames = DisplayNames;
try {
window.__internalUserscriptsIntlDisplayNamesPolyfill = true;
} catch (e) {}
})();