@pure-ds/core 0.7.38 → 0.7.39
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/custom-elements.json +77 -4
- package/dist/types/public/assets/pds/components/pds-locale.d.ts +10 -0
- package/dist/types/public/assets/pds/components/pds-locale.d.ts.map +1 -0
- package/package.json +1 -1
- package/public/assets/pds/components/pds-live-edit.js +10 -458
- package/public/assets/pds/components/pds-locale.js +1132 -0
- package/public/assets/pds/vscode-custom-data.json +10 -0
package/custom-elements.json
CHANGED
|
@@ -1405,7 +1405,6 @@
|
|
|
1405
1405
|
"type": {
|
|
1406
1406
|
"text": "string"
|
|
1407
1407
|
},
|
|
1408
|
-
"default": "\"Submit\"",
|
|
1409
1408
|
"attribute": "submit-label"
|
|
1410
1409
|
},
|
|
1411
1410
|
{
|
|
@@ -1415,7 +1414,6 @@
|
|
|
1415
1414
|
"type": {
|
|
1416
1415
|
"text": "string"
|
|
1417
1416
|
},
|
|
1418
|
-
"default": "\"Reset\"",
|
|
1419
1417
|
"attribute": "reset-label"
|
|
1420
1418
|
},
|
|
1421
1419
|
{
|
|
@@ -1543,7 +1541,6 @@
|
|
|
1543
1541
|
"type": {
|
|
1544
1542
|
"text": "string"
|
|
1545
1543
|
},
|
|
1546
|
-
"default": "\"Submit\"",
|
|
1547
1544
|
"fieldName": "submitLabel"
|
|
1548
1545
|
},
|
|
1549
1546
|
{
|
|
@@ -1551,7 +1548,6 @@
|
|
|
1551
1548
|
"type": {
|
|
1552
1549
|
"text": "string"
|
|
1553
1550
|
},
|
|
1554
|
-
"default": "\"Reset\"",
|
|
1555
1551
|
"fieldName": "resetLabel"
|
|
1556
1552
|
},
|
|
1557
1553
|
{
|
|
@@ -2812,6 +2808,83 @@
|
|
|
2812
2808
|
}
|
|
2813
2809
|
]
|
|
2814
2810
|
},
|
|
2811
|
+
{
|
|
2812
|
+
"kind": "javascript-module",
|
|
2813
|
+
"path": "public/assets/pds/components/pds-locale.js",
|
|
2814
|
+
"declarations": [
|
|
2815
|
+
{
|
|
2816
|
+
"kind": "class",
|
|
2817
|
+
"description": "Locale switcher component.\r\n\r\nThe component only persists canonical 5-letter locale tags (`xx-YY`),\r\nfor example `en-US` and `nl-NL`.",
|
|
2818
|
+
"name": "PdsLocale",
|
|
2819
|
+
"members": [
|
|
2820
|
+
{
|
|
2821
|
+
"kind": "method",
|
|
2822
|
+
"name": "whenReady",
|
|
2823
|
+
"description": "Resolves once the first availability check is complete.",
|
|
2824
|
+
"return": {
|
|
2825
|
+
"type": {
|
|
2826
|
+
"text": "Promise<boolean>"
|
|
2827
|
+
}
|
|
2828
|
+
}
|
|
2829
|
+
},
|
|
2830
|
+
{
|
|
2831
|
+
"kind": "field",
|
|
2832
|
+
"name": "available",
|
|
2833
|
+
"description": "Whether locale switching is currently available.",
|
|
2834
|
+
"return": {
|
|
2835
|
+
"type": {
|
|
2836
|
+
"text": "boolean"
|
|
2837
|
+
}
|
|
2838
|
+
},
|
|
2839
|
+
"readonly": true
|
|
2840
|
+
},
|
|
2841
|
+
{
|
|
2842
|
+
"kind": "method",
|
|
2843
|
+
"name": "refresh",
|
|
2844
|
+
"description": "Re-detect available locales and re-render.",
|
|
2845
|
+
"return": {
|
|
2846
|
+
"type": {
|
|
2847
|
+
"text": "Promise<boolean>"
|
|
2848
|
+
}
|
|
2849
|
+
}
|
|
2850
|
+
}
|
|
2851
|
+
],
|
|
2852
|
+
"events": [
|
|
2853
|
+
{
|
|
2854
|
+
"name": "pds-locale:ready",
|
|
2855
|
+
"type": {
|
|
2856
|
+
"text": "CustomEvent"
|
|
2857
|
+
},
|
|
2858
|
+
"description": "Emitted after locale availability is resolved."
|
|
2859
|
+
}
|
|
2860
|
+
],
|
|
2861
|
+
"attributes": [
|
|
2862
|
+
{
|
|
2863
|
+
"type": {
|
|
2864
|
+
"text": "string"
|
|
2865
|
+
},
|
|
2866
|
+
"description": "Accessible label for the locale radio group.",
|
|
2867
|
+
"name": "data-label"
|
|
2868
|
+
}
|
|
2869
|
+
],
|
|
2870
|
+
"superclass": {
|
|
2871
|
+
"name": "HTMLElement"
|
|
2872
|
+
},
|
|
2873
|
+
"tagName": "pds-locale",
|
|
2874
|
+
"customElement": true
|
|
2875
|
+
}
|
|
2876
|
+
],
|
|
2877
|
+
"exports": [
|
|
2878
|
+
{
|
|
2879
|
+
"kind": "custom-element-definition",
|
|
2880
|
+
"name": "pds-locale",
|
|
2881
|
+
"declaration": {
|
|
2882
|
+
"name": "PdsLocale",
|
|
2883
|
+
"module": "public/assets/pds/components/pds-locale.js"
|
|
2884
|
+
}
|
|
2885
|
+
}
|
|
2886
|
+
]
|
|
2887
|
+
},
|
|
2815
2888
|
{
|
|
2816
2889
|
"kind": "javascript-module",
|
|
2817
2890
|
"path": "public/assets/pds/components/pds-omnibox.js",
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"pds-locale.d.ts","sourceRoot":"","sources":["../../../../../../public/assets/pds/components/pds-locale.js"],"names":[],"mappings":";;;;;;;YAyec,MAAM"}
|
package/package.json
CHANGED
|
@@ -1631,475 +1631,27 @@ function setStoredConfig(nextConfig) {
|
|
|
1631
1631
|
} catch (e) {}
|
|
1632
1632
|
}
|
|
1633
1633
|
|
|
1634
|
-
function normalizeLocaleTag(locale) {
|
|
1635
|
-
return String(locale || "").trim().toLowerCase();
|
|
1636
|
-
}
|
|
1637
|
-
|
|
1638
|
-
let __startupLocalizationLocales = null;
|
|
1639
|
-
let __startupLocalizationLocalesPromise = null;
|
|
1640
|
-
|
|
1641
|
-
const LOCALE_PROBE_CANDIDATES = [
|
|
1642
|
-
"en", "nl", "de", "fr", "es", "it", "pt", "sv", "no", "da", "fi",
|
|
1643
|
-
"pl", "cs", "sk", "sl", "hu", "ro", "bg", "hr", "sr", "ru", "uk",
|
|
1644
|
-
"tr", "el", "he", "ar", "fa", "hi", "ja", "ko", "zh", "zh-cn", "zh-tw",
|
|
1645
|
-
];
|
|
1646
|
-
|
|
1647
|
-
function toBaseLocale(locale) {
|
|
1648
|
-
const normalized = normalizeLocaleTag(locale);
|
|
1649
|
-
if (!normalized) return "";
|
|
1650
|
-
return normalized.split("-")[0] || normalized;
|
|
1651
|
-
}
|
|
1652
|
-
|
|
1653
|
-
function isLocalizationActive() {
|
|
1654
|
-
const configLocalization =
|
|
1655
|
-
PDS?.currentConfig?.localization && typeof PDS.currentConfig.localization === "object"
|
|
1656
|
-
? PDS.currentConfig.localization
|
|
1657
|
-
: null;
|
|
1658
|
-
|
|
1659
|
-
const runtimeState =
|
|
1660
|
-
typeof PDS?.getLocalizationState === "function"
|
|
1661
|
-
? PDS.getLocalizationState()
|
|
1662
|
-
: null;
|
|
1663
|
-
|
|
1664
|
-
const hasRuntimeProvider = Boolean(runtimeState?.hasProvider);
|
|
1665
|
-
|
|
1666
|
-
const hasConfigProvider = Boolean(
|
|
1667
|
-
configLocalization?.provider ||
|
|
1668
|
-
typeof configLocalization?.translate === "function" ||
|
|
1669
|
-
typeof configLocalization?.loadLocale === "function" ||
|
|
1670
|
-
typeof configLocalization?.setLocale === "function"
|
|
1671
|
-
);
|
|
1672
|
-
|
|
1673
|
-
const hasConfigMessages = Boolean(
|
|
1674
|
-
configLocalization?.messages &&
|
|
1675
|
-
typeof configLocalization.messages === "object" &&
|
|
1676
|
-
Object.keys(configLocalization.messages).length > 0
|
|
1677
|
-
);
|
|
1678
|
-
|
|
1679
|
-
const hasRuntimeMessages = Boolean(
|
|
1680
|
-
runtimeState?.messages &&
|
|
1681
|
-
typeof runtimeState.messages === "object" &&
|
|
1682
|
-
Object.keys(runtimeState.messages).length > 0
|
|
1683
|
-
);
|
|
1684
|
-
|
|
1685
|
-
return hasRuntimeProvider || hasConfigProvider || hasConfigMessages || hasRuntimeMessages;
|
|
1686
|
-
}
|
|
1687
|
-
|
|
1688
|
-
function isLocaleBundle(bundle) {
|
|
1689
|
-
if (!bundle || typeof bundle !== "object" || Array.isArray(bundle)) {
|
|
1690
|
-
return false;
|
|
1691
|
-
}
|
|
1692
|
-
|
|
1693
|
-
return Object.values(bundle).some((value) => {
|
|
1694
|
-
if (typeof value === "string") return true;
|
|
1695
|
-
return Boolean(value && typeof value === "object" && typeof value.content === "string");
|
|
1696
|
-
});
|
|
1697
|
-
}
|
|
1698
|
-
|
|
1699
|
-
function normalizeMessageBundle(bundle) {
|
|
1700
|
-
if (!bundle || typeof bundle !== "object" || Array.isArray(bundle)) {
|
|
1701
|
-
return {};
|
|
1702
|
-
}
|
|
1703
|
-
|
|
1704
|
-
const normalized = {};
|
|
1705
|
-
Object.entries(bundle).forEach(([key, value]) => {
|
|
1706
|
-
if (typeof value === "string") {
|
|
1707
|
-
normalized[key] = value;
|
|
1708
|
-
return;
|
|
1709
|
-
}
|
|
1710
|
-
|
|
1711
|
-
if (value && typeof value === "object" && typeof value.content === "string") {
|
|
1712
|
-
normalized[key] = value.content;
|
|
1713
|
-
}
|
|
1714
|
-
});
|
|
1715
|
-
|
|
1716
|
-
return normalized;
|
|
1717
|
-
}
|
|
1718
|
-
|
|
1719
|
-
function getLocalizationProviderLoader(configLocalization) {
|
|
1720
|
-
if (!configLocalization || typeof configLocalization !== "object") return null;
|
|
1721
|
-
|
|
1722
|
-
return (
|
|
1723
|
-
(typeof configLocalization?.loadLocale === "function"
|
|
1724
|
-
? configLocalization.loadLocale
|
|
1725
|
-
: null) ||
|
|
1726
|
-
(typeof configLocalization?.provider?.loadLocale === "function"
|
|
1727
|
-
? configLocalization.provider.loadLocale
|
|
1728
|
-
: null) ||
|
|
1729
|
-
(typeof configLocalization?.setLocale === "function"
|
|
1730
|
-
? configLocalization.setLocale
|
|
1731
|
-
: null) ||
|
|
1732
|
-
(typeof configLocalization?.provider?.setLocale === "function"
|
|
1733
|
-
? configLocalization.provider.setLocale
|
|
1734
|
-
: null)
|
|
1735
|
-
);
|
|
1736
|
-
}
|
|
1737
|
-
|
|
1738
|
-
function buildLocaleProbeList({ defaultLocale, runtimeState, knownLocales }) {
|
|
1739
|
-
const candidates = new Set();
|
|
1740
|
-
|
|
1741
|
-
const normalizedDefault = normalizeLocaleTag(defaultLocale);
|
|
1742
|
-
if (normalizedDefault) {
|
|
1743
|
-
candidates.add(normalizedDefault);
|
|
1744
|
-
}
|
|
1745
|
-
|
|
1746
|
-
if (Array.isArray(runtimeState?.loadedLocales)) {
|
|
1747
|
-
runtimeState.loadedLocales.forEach((locale) => {
|
|
1748
|
-
const normalized = normalizeLocaleTag(locale);
|
|
1749
|
-
if (normalized) {
|
|
1750
|
-
candidates.add(normalized);
|
|
1751
|
-
candidates.add(toBaseLocale(normalized));
|
|
1752
|
-
}
|
|
1753
|
-
});
|
|
1754
|
-
}
|
|
1755
|
-
|
|
1756
|
-
if (Array.isArray(knownLocales)) {
|
|
1757
|
-
knownLocales.forEach((locale) => {
|
|
1758
|
-
const normalized = normalizeLocaleTag(locale);
|
|
1759
|
-
if (normalized) {
|
|
1760
|
-
candidates.add(normalized);
|
|
1761
|
-
candidates.add(toBaseLocale(normalized));
|
|
1762
|
-
}
|
|
1763
|
-
});
|
|
1764
|
-
}
|
|
1765
|
-
|
|
1766
|
-
if (typeof navigator !== "undefined" && Array.isArray(navigator.languages)) {
|
|
1767
|
-
navigator.languages.forEach((locale) => {
|
|
1768
|
-
const normalized = normalizeLocaleTag(locale);
|
|
1769
|
-
if (normalized) {
|
|
1770
|
-
candidates.add(normalized);
|
|
1771
|
-
candidates.add(toBaseLocale(normalized));
|
|
1772
|
-
}
|
|
1773
|
-
});
|
|
1774
|
-
}
|
|
1775
|
-
|
|
1776
|
-
LOCALE_PROBE_CANDIDATES.forEach((locale) => {
|
|
1777
|
-
const normalized = normalizeLocaleTag(locale);
|
|
1778
|
-
if (normalized) {
|
|
1779
|
-
candidates.add(normalized);
|
|
1780
|
-
candidates.add(toBaseLocale(normalized));
|
|
1781
|
-
}
|
|
1782
|
-
});
|
|
1783
|
-
|
|
1784
|
-
candidates.delete("");
|
|
1785
|
-
return Array.from(candidates).sort((a, b) => a.localeCompare(b));
|
|
1786
|
-
}
|
|
1787
|
-
|
|
1788
|
-
function bundlesDifferFromOrigin(originBundle, candidateBundle) {
|
|
1789
|
-
const originEntries = normalizeMessageBundle(originBundle);
|
|
1790
|
-
const candidateEntries = normalizeMessageBundle(candidateBundle);
|
|
1791
|
-
|
|
1792
|
-
const originKeys = Object.keys(originEntries);
|
|
1793
|
-
const candidateKeys = Object.keys(candidateEntries);
|
|
1794
|
-
if (!originKeys.length || !candidateKeys.length) {
|
|
1795
|
-
return false;
|
|
1796
|
-
}
|
|
1797
|
-
|
|
1798
|
-
return originKeys.some((key) => {
|
|
1799
|
-
if (!Object.prototype.hasOwnProperty.call(candidateEntries, key)) return false;
|
|
1800
|
-
return String(candidateEntries[key]) !== String(originEntries[key]);
|
|
1801
|
-
});
|
|
1802
|
-
}
|
|
1803
|
-
|
|
1804
|
-
function collectLocalesFromMessageRows(source, locales) {
|
|
1805
|
-
if (!source || typeof source !== "object" || Array.isArray(source)) return;
|
|
1806
|
-
|
|
1807
|
-
Object.values(source).forEach((row) => {
|
|
1808
|
-
if (!row || typeof row !== "object" || Array.isArray(row)) return;
|
|
1809
|
-
if (typeof row.content === "string") return;
|
|
1810
|
-
|
|
1811
|
-
Object.entries(row).forEach(([localeKey, translatedValue]) => {
|
|
1812
|
-
const normalized = normalizeLocaleTag(localeKey);
|
|
1813
|
-
if (!normalized) return;
|
|
1814
|
-
|
|
1815
|
-
const hasValue =
|
|
1816
|
-
typeof translatedValue === "string" ||
|
|
1817
|
-
Boolean(
|
|
1818
|
-
translatedValue &&
|
|
1819
|
-
typeof translatedValue === "object" &&
|
|
1820
|
-
typeof translatedValue.content === "string"
|
|
1821
|
-
);
|
|
1822
|
-
|
|
1823
|
-
if (hasValue) {
|
|
1824
|
-
locales.add(normalized);
|
|
1825
|
-
}
|
|
1826
|
-
});
|
|
1827
|
-
});
|
|
1828
|
-
}
|
|
1829
|
-
|
|
1830
|
-
function collectLocalesFromLocaleBundles(source, locales) {
|
|
1831
|
-
if (!source || typeof source !== "object" || Array.isArray(source)) return;
|
|
1832
|
-
|
|
1833
|
-
Object.entries(source).forEach(([localeKey, bundle]) => {
|
|
1834
|
-
const normalized = normalizeLocaleTag(localeKey);
|
|
1835
|
-
if (!normalized) return;
|
|
1836
|
-
if (!isLocaleBundle(bundle)) return;
|
|
1837
|
-
locales.add(normalized);
|
|
1838
|
-
});
|
|
1839
|
-
}
|
|
1840
|
-
|
|
1841
|
-
function collectLocalesFromConfiguredList(source, locales) {
|
|
1842
|
-
if (!Array.isArray(source)) return;
|
|
1843
|
-
|
|
1844
|
-
source.forEach((localeValue) => {
|
|
1845
|
-
const normalized = normalizeLocaleTag(localeValue);
|
|
1846
|
-
if (normalized) {
|
|
1847
|
-
locales.add(normalized);
|
|
1848
|
-
}
|
|
1849
|
-
});
|
|
1850
|
-
}
|
|
1851
|
-
|
|
1852
|
-
async function detectStartupLocalizationLocales() {
|
|
1853
|
-
const locales = new Set();
|
|
1854
|
-
|
|
1855
|
-
const configLocalization =
|
|
1856
|
-
PDS?.currentConfig?.localization && typeof PDS.currentConfig.localization === "object"
|
|
1857
|
-
? PDS.currentConfig.localization
|
|
1858
|
-
: null;
|
|
1859
|
-
|
|
1860
|
-
const defaultLocale = normalizeLocaleTag(configLocalization?.locale);
|
|
1861
|
-
if (defaultLocale) {
|
|
1862
|
-
locales.add(defaultLocale);
|
|
1863
|
-
}
|
|
1864
|
-
|
|
1865
|
-
collectLocalesFromConfiguredList(configLocalization?.locales, locales);
|
|
1866
|
-
collectLocalesFromConfiguredList(configLocalization?.provider?.locales, locales);
|
|
1867
|
-
|
|
1868
|
-
if (locales.size >= 2) {
|
|
1869
|
-
return Array.from(locales).sort((a, b) => a.localeCompare(b));
|
|
1870
|
-
}
|
|
1871
|
-
|
|
1872
|
-
const runtimeState =
|
|
1873
|
-
typeof PDS?.getLocalizationState === "function"
|
|
1874
|
-
? PDS.getLocalizationState()
|
|
1875
|
-
: null;
|
|
1876
|
-
const runtimeDefaultLocale = normalizeLocaleTag(runtimeState?.locale);
|
|
1877
|
-
if (runtimeDefaultLocale) {
|
|
1878
|
-
locales.add(runtimeDefaultLocale);
|
|
1879
|
-
}
|
|
1880
|
-
|
|
1881
|
-
const messageSources = [
|
|
1882
|
-
configLocalization?.messages,
|
|
1883
|
-
configLocalization?.messagesByLocale,
|
|
1884
|
-
configLocalization?.i18n,
|
|
1885
|
-
configLocalization?.translations,
|
|
1886
|
-
configLocalization?.provider?.messages,
|
|
1887
|
-
configLocalization?.provider?.messagesByLocale,
|
|
1888
|
-
configLocalization?.provider?.i18n,
|
|
1889
|
-
configLocalization?.provider?.translations,
|
|
1890
|
-
];
|
|
1891
|
-
|
|
1892
|
-
messageSources.forEach((source) => {
|
|
1893
|
-
collectLocalesFromMessageRows(source, locales);
|
|
1894
|
-
collectLocalesFromLocaleBundles(source, locales);
|
|
1895
|
-
});
|
|
1896
|
-
|
|
1897
|
-
const localeListFromRows = Array.from(locales).sort((a, b) => a.localeCompare(b));
|
|
1898
|
-
if (localeListFromRows.length >= 2) {
|
|
1899
|
-
return localeListFromRows;
|
|
1900
|
-
}
|
|
1901
|
-
|
|
1902
|
-
const providerLoader = getLocalizationProviderLoader(configLocalization);
|
|
1903
|
-
const runtimeLoadLocale =
|
|
1904
|
-
typeof PDS?.loadLocale === "function" ? PDS.loadLocale.bind(PDS) : null;
|
|
1905
|
-
|
|
1906
|
-
if (typeof providerLoader !== "function" && typeof runtimeLoadLocale !== "function") {
|
|
1907
|
-
return localeListFromRows;
|
|
1908
|
-
}
|
|
1909
|
-
|
|
1910
|
-
const originLocale =
|
|
1911
|
-
normalizeLocaleTag(configLocalization?.locale) ||
|
|
1912
|
-
normalizeLocaleTag(runtimeState?.locale) ||
|
|
1913
|
-
"en";
|
|
1914
|
-
|
|
1915
|
-
locales.add(originLocale);
|
|
1916
|
-
|
|
1917
|
-
let originBundle = normalizeMessageBundle(runtimeState?.messages || configLocalization?.messages);
|
|
1918
|
-
if (!Object.keys(originBundle).length) {
|
|
1919
|
-
try {
|
|
1920
|
-
let loadedOrigin = null;
|
|
1921
|
-
|
|
1922
|
-
if (typeof runtimeLoadLocale === "function") {
|
|
1923
|
-
loadedOrigin = await Promise.resolve(runtimeLoadLocale(originLocale));
|
|
1924
|
-
} else {
|
|
1925
|
-
loadedOrigin = await Promise.resolve(
|
|
1926
|
-
providerLoader({
|
|
1927
|
-
locale: originLocale,
|
|
1928
|
-
defaultLocale: originLocale,
|
|
1929
|
-
reason: "startup-locale-detect-origin",
|
|
1930
|
-
loadedLocales: Array.from(locales),
|
|
1931
|
-
messages: {},
|
|
1932
|
-
load: true,
|
|
1933
|
-
})
|
|
1934
|
-
);
|
|
1935
|
-
}
|
|
1936
|
-
|
|
1937
|
-
originBundle = normalizeMessageBundle(loadedOrigin);
|
|
1938
|
-
} catch (error) {}
|
|
1939
|
-
}
|
|
1940
|
-
|
|
1941
|
-
const probeLocales = buildLocaleProbeList({
|
|
1942
|
-
defaultLocale: originLocale,
|
|
1943
|
-
runtimeState,
|
|
1944
|
-
knownLocales: Array.from(locales),
|
|
1945
|
-
});
|
|
1946
|
-
|
|
1947
|
-
for (const candidateLocale of probeLocales) {
|
|
1948
|
-
if (!candidateLocale || candidateLocale === originLocale) {
|
|
1949
|
-
continue;
|
|
1950
|
-
}
|
|
1951
|
-
|
|
1952
|
-
try {
|
|
1953
|
-
let candidateBundle = null;
|
|
1954
|
-
|
|
1955
|
-
if (typeof runtimeLoadLocale === "function") {
|
|
1956
|
-
candidateBundle = await Promise.resolve(runtimeLoadLocale(candidateLocale));
|
|
1957
|
-
} else {
|
|
1958
|
-
candidateBundle = await Promise.resolve(
|
|
1959
|
-
providerLoader({
|
|
1960
|
-
locale: candidateLocale,
|
|
1961
|
-
defaultLocale: originLocale,
|
|
1962
|
-
reason: "startup-locale-detect-probe",
|
|
1963
|
-
loadedLocales: Array.from(locales),
|
|
1964
|
-
messages: {},
|
|
1965
|
-
load: true,
|
|
1966
|
-
})
|
|
1967
|
-
);
|
|
1968
|
-
}
|
|
1969
|
-
|
|
1970
|
-
if (bundlesDifferFromOrigin(originBundle, candidateBundle)) {
|
|
1971
|
-
locales.add(candidateLocale);
|
|
1972
|
-
if (locales.size >= 2) {
|
|
1973
|
-
break;
|
|
1974
|
-
}
|
|
1975
|
-
}
|
|
1976
|
-
} catch (error) {}
|
|
1977
|
-
}
|
|
1978
|
-
|
|
1979
|
-
return Array.from(locales).sort((a, b) => a.localeCompare(b));
|
|
1980
|
-
}
|
|
1981
|
-
|
|
1982
|
-
async function getStartupLocalizationLocales() {
|
|
1983
|
-
if (Array.isArray(__startupLocalizationLocales)) {
|
|
1984
|
-
return [...__startupLocalizationLocales];
|
|
1985
|
-
}
|
|
1986
|
-
|
|
1987
|
-
if (__startupLocalizationLocalesPromise) {
|
|
1988
|
-
const inFlight = await __startupLocalizationLocalesPromise;
|
|
1989
|
-
return [...inFlight];
|
|
1990
|
-
}
|
|
1991
|
-
|
|
1992
|
-
__startupLocalizationLocalesPromise = detectStartupLocalizationLocales()
|
|
1993
|
-
.then((locales) => {
|
|
1994
|
-
__startupLocalizationLocales = Array.isArray(locales) ? locales : [];
|
|
1995
|
-
return __startupLocalizationLocales;
|
|
1996
|
-
})
|
|
1997
|
-
.catch(() => {
|
|
1998
|
-
__startupLocalizationLocales = [];
|
|
1999
|
-
return __startupLocalizationLocales;
|
|
2000
|
-
})
|
|
2001
|
-
.finally(() => {
|
|
2002
|
-
__startupLocalizationLocalesPromise = null;
|
|
2003
|
-
});
|
|
2004
|
-
|
|
2005
|
-
const resolved = await __startupLocalizationLocalesPromise;
|
|
2006
|
-
return [...resolved];
|
|
2007
|
-
}
|
|
2008
|
-
|
|
2009
|
-
function localeOptionLabel(locale) {
|
|
2010
|
-
const normalized = normalizeLocaleTag(locale);
|
|
2011
|
-
if (!normalized) return "";
|
|
2012
|
-
|
|
2013
|
-
try {
|
|
2014
|
-
const currentDocLang =
|
|
2015
|
-
normalizeLocaleTag(document.documentElement?.getAttribute?.("lang")) || "en";
|
|
2016
|
-
const displayNames = new Intl.DisplayNames([currentDocLang], {
|
|
2017
|
-
type: "language",
|
|
2018
|
-
});
|
|
2019
|
-
const named = displayNames.of(normalized);
|
|
2020
|
-
if (named && String(named).trim()) {
|
|
2021
|
-
return named;
|
|
2022
|
-
}
|
|
2023
|
-
} catch (error) {}
|
|
2024
|
-
|
|
2025
|
-
return normalized;
|
|
2026
|
-
}
|
|
2027
|
-
|
|
2028
|
-
function localeOptionAlias(locale) {
|
|
2029
|
-
const normalized = normalizeLocaleTag(locale);
|
|
2030
|
-
if (!normalized) return "";
|
|
2031
|
-
|
|
2032
|
-
const base = toBaseLocale(normalized);
|
|
2033
|
-
if (!base) return normalized;
|
|
2034
|
-
return base.slice(0, 2);
|
|
2035
|
-
}
|
|
2036
|
-
|
|
2037
|
-
function localeMatches(selectedLocale, activeLocale) {
|
|
2038
|
-
const selected = normalizeLocaleTag(selectedLocale);
|
|
2039
|
-
const active = normalizeLocaleTag(activeLocale);
|
|
2040
|
-
if (!selected || !active) return false;
|
|
2041
|
-
return selected === active || toBaseLocale(selected) === toBaseLocale(active);
|
|
2042
|
-
}
|
|
2043
|
-
|
|
2044
1634
|
async function buildQuickLanguageSelector() {
|
|
2045
1635
|
if (typeof document === "undefined") return null;
|
|
2046
|
-
if (!isLocalizationActive()) return null;
|
|
2047
|
-
|
|
2048
|
-
const detectedLocales = await getStartupLocalizationLocales();
|
|
2049
|
-
if (detectedLocales.length < 2) return null;
|
|
2050
1636
|
|
|
2051
|
-
const languageGroup = document.createElement("
|
|
1637
|
+
const languageGroup = document.createElement("label");
|
|
2052
1638
|
languageGroup.className = "stack-xs";
|
|
1639
|
+
languageGroup.hidden = true;
|
|
2053
1640
|
|
|
2054
1641
|
const languageText = document.createElement("span");
|
|
2055
1642
|
languageText.setAttribute("data-label", "");
|
|
2056
1643
|
languageText.textContent = msg("Language");
|
|
2057
1644
|
|
|
2058
|
-
const
|
|
2059
|
-
|
|
2060
|
-
|
|
2061
|
-
|
|
2062
|
-
|
|
2063
|
-
|
|
2064
|
-
detectedLocales[0];
|
|
2065
|
-
|
|
2066
|
-
const radioName = `pds-live-language-${Date.now()}`;
|
|
2067
|
-
|
|
2068
|
-
detectedLocales.forEach((locale) => {
|
|
2069
|
-
const optionLabel = document.createElement("label");
|
|
2070
|
-
|
|
2071
|
-
const optionInput = document.createElement("input");
|
|
2072
|
-
optionInput.type = "radio";
|
|
2073
|
-
optionInput.name = radioName;
|
|
2074
|
-
optionInput.value = locale;
|
|
2075
|
-
optionInput.checked = localeMatches(locale, activeDocumentLang);
|
|
2076
|
-
|
|
2077
|
-
const optionText = document.createElement("span");
|
|
2078
|
-
const fullLocaleLabel = localeOptionLabel(locale);
|
|
2079
|
-
const localeAlias = localeOptionAlias(locale) || fullLocaleLabel;
|
|
2080
|
-
|
|
2081
|
-
optionText.textContent = localeAlias.toUpperCase();
|
|
2082
|
-
if (fullLocaleLabel) {
|
|
2083
|
-
optionLabel.title = fullLocaleLabel;
|
|
2084
|
-
optionText.title = fullLocaleLabel;
|
|
2085
|
-
optionInput.setAttribute("aria-label", `${fullLocaleLabel} (${localeAlias})`);
|
|
1645
|
+
const localeSelector = document.createElement("pds-locale");
|
|
1646
|
+
localeSelector.setAttribute("data-label", msg("Language"));
|
|
1647
|
+
localeSelector.addEventListener(
|
|
1648
|
+
"pds-locale:ready",
|
|
1649
|
+
(event) => {
|
|
1650
|
+
languageGroup.hidden = !Boolean(event?.detail?.available);
|
|
2086
1651
|
}
|
|
1652
|
+
);
|
|
2087
1653
|
|
|
2088
|
-
|
|
2089
|
-
languageFieldset.appendChild(optionLabel);
|
|
2090
|
-
});
|
|
2091
|
-
|
|
2092
|
-
languageFieldset.addEventListener("change", (event) => {
|
|
2093
|
-
const selected = event.target;
|
|
2094
|
-
if (!(selected instanceof HTMLInputElement)) return;
|
|
2095
|
-
if (selected.type !== "radio") return;
|
|
2096
|
-
|
|
2097
|
-
const nextLocale = normalizeLocaleTag(selected.value);
|
|
2098
|
-
if (!nextLocale) return;
|
|
2099
|
-
document.documentElement.setAttribute("lang", nextLocale);
|
|
2100
|
-
});
|
|
2101
|
-
|
|
2102
|
-
languageGroup.append(languageText, languageFieldset);
|
|
1654
|
+
languageGroup.append(languageText, localeSelector);
|
|
2103
1655
|
return languageGroup;
|
|
2104
1656
|
}
|
|
2105
1657
|
|