mirror of
https://repo.dactyloidae.xyz/Dactyloidae/UXP.git
synced 2026-08-19 02:43:07 +09:00
104 lines
3 KiB
JavaScript
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) {}
|
|
})();
|