forked from r11a/homeii-music-flow
-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathindex.js
More file actions
114 lines (98 loc) · 3.41 KB
/
Copy pathindex.js
File metadata and controls
114 lines (98 loc) · 3.41 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
import en from "./en.js?v=5.8.1-9e122c742b";
import da from "./da.js?v=5.8.1-0a8ed58837";
import es from "./es.js?v=5.8.1-f080039ddc";
import fr from "./fr.js?v=5.8.1-012da49900";
import he from "./he.js?v=5.8.1-da05e2083c";
import it from "./it.js?v=5.8.1-6e7aaa258a";
import lt from "./lt.js?v=5.8.1-dbcade157a";
import zh from "./zh.js?v=5.8.1-f14b2e9162";
export const DEFAULT_LANGUAGE = "en";
export const DICTIONARIES = Object.freeze({
en,
da,
es,
fr,
he,
it,
lt,
zh,
});
export const RTL_LANGUAGE_CODES = Object.freeze(["he"]);
export const LANGUAGE_OPTIONS = Object.freeze([
{ value: "auto", label: "Auto" },
{ value: "en", label: "English" },
{ value: "da", label: "Dansk" },
{ value: "es", label: "Espa\u00f1ol" },
{ value: "fr", label: "Fran\u00e7ais" },
{ value: "he", label: "\u05e2\u05d1\u05e8\u05d9\u05ea / Hebrew" },
{ value: "it-IT", label: "Italiano" },
{ value: "lt", label: "Lithuanian / Lietuvi\u0173" },
{ value: "zh-CN", label: "\u7b80\u4f53\u4e2d\u6587 / Simplified Chinese" },
]);
export const SUPPORTED_LANGUAGE_CODES = Object.freeze(Object.keys(DICTIONARIES));
const ENGLISH_TEXT_TO_KEY = Object.freeze(
Object.entries(en).reduce((acc, [key, value]) => {
if (typeof value === "string" && acc[value] == null) acc[value] = key;
return acc;
}, {}),
);
function baseLanguageCode(value) {
return String(value || "")
.trim()
.toLowerCase()
.replace("_", "-")
.split("-")[0];
}
export function normalizeLanguageCode(value, fallback = DEFAULT_LANGUAGE) {
const candidate = baseLanguageCode(value);
if (!candidate || candidate === "auto") return fallback;
return DICTIONARIES[candidate] ? candidate : fallback;
}
export function detectLanguage({
configLanguage,
hass,
doc = globalThis.document,
nav = globalThis.navigator,
} = {}) {
const configured = String(configLanguage || "").trim().toLowerCase();
if (configured && configured !== "auto") {
return normalizeLanguageCode(configured, DEFAULT_LANGUAGE);
}
const candidates = [
hass?.locale?.language,
hass?.language,
doc?.documentElement?.lang,
nav?.language,
...(Array.isArray(nav?.languages) ? nav.languages : []),
];
for (const candidate of candidates) {
const normalized = normalizeLanguageCode(candidate, "");
if (normalized) return normalized;
}
return DEFAULT_LANGUAGE;
}
export function isRtlLanguage(value) {
return RTL_LANGUAGE_CODES.includes(baseLanguageCode(value));
}
export function keyForEnglishText(text) {
return ENGLISH_TEXT_TO_KEY[String(text || "")] || "";
}
function interpolate(template, params = {}) {
return String(template).replace(/\{([a-zA-Z0-9_]+)\}/g, (match, key) => (
params[key] == null ? match : String(params[key])
));
}
export function translate(language, key, params = {}, fallback = "") {
const normalized = normalizeLanguageCode(language, DEFAULT_LANGUAGE);
const dictionary = DICTIONARIES[normalized] || en;
const template = dictionary[key] ?? en[key] ?? fallback ?? key;
return interpolate(template, params);
}
export function translateText(language, englishText, params = {}, fallback = englishText) {
const key = keyForEnglishText(englishText);
if (!key) return interpolate(fallback ?? englishText, params);
return translate(language, key, params, fallback ?? englishText);
}
export function createTranslator(language) {
return (key, params = {}, fallback = "") => translate(language, key, params, fallback);
}