Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
aandrew-me
GitHub Repository: aandrew-me/ytDownloader
Path: blob/main/translations/i18n.js
448 views
1
const {ipcRenderer} = require("electron");
2
3
function normalizeLocale(locale) {
4
if (!locale) return "en";
5
const parts = locale.split("-");
6
const lang = parts[0].toLowerCase();
7
const region = parts[1] ? parts[1].toUpperCase() : null;
8
9
const defaultRegions = {
10
zh: "CN",
11
en: "US",
12
ru: "RU",
13
pt: "BR",
14
fi: "FI",
15
fr: "FR",
16
es: "ES",
17
de: "DE",
18
it: "IT",
19
ja: "JP",
20
ar: "SA",
21
};
22
23
if (!region && defaultRegions[lang]) {
24
return `${lang}-${defaultRegions[lang]}`;
25
}
26
27
return region ? `${lang}-${region}` : lang;
28
}
29
30
async function getLocale() {
31
try {
32
const saved = localStorage.getItem("locale");
33
if (saved) return saved;
34
} catch (e) {}
35
36
let locale = null;
37
try {
38
locale = await ipcRenderer.invoke("get-system-locale");
39
} catch (e) {
40
console.log(e)
41
}
42
43
if (!locale && typeof navigator !== "undefined") {
44
locale =
45
navigator.language ||
46
(navigator.languages && navigator.languages[0]);
47
}
48
49
const normalized = normalizeLocale(locale || "en");
50
51
try {
52
localStorage.setItem("locale", normalized);
53
} catch (e) {}
54
55
return normalized;
56
}
57
58
function I18n() {
59
this.loadedLanguage = {};
60
this.locale = "en";
61
62
this.init = async () => {
63
try {
64
this.locale = await getLocale();
65
this.loadedLanguage = await ipcRenderer.invoke(
66
"get-translation",
67
this.locale
68
);
69
} catch (error) {
70
console.error("Error loading translations:", error);
71
this.loadedLanguage = {};
72
}
73
};
74
75
this.__ = function (phrase) {
76
return this.loadedLanguage[phrase] !== undefined
77
? this.loadedLanguage[phrase]
78
: phrase;
79
};
80
81
this.translatePage = () => {
82
document.querySelectorAll("[data-translate]").forEach((element) => {
83
const key = element.getAttribute("data-translate");
84
element.textContent = this.__(key);
85
});
86
87
document
88
.querySelectorAll("[data-translate-placeholder]")
89
.forEach((element) => {
90
const key = element.getAttribute("data-translate-placeholder");
91
element.placeholder = this.__(key);
92
});
93
94
document
95
.querySelectorAll("[data-translate-title]")
96
.forEach((element) => {
97
const key = element.getAttribute("data-translate-title");
98
element.title = this.__(key);
99
});
100
};
101
102
this.setLocale = async function (newLocale) {
103
const normalized = normalizeLocale(newLocale);
104
localStorage.setItem("locale", normalized);
105
this.loadedLanguage = await ipcRenderer.invoke(
106
"get-translation",
107
normalized
108
);
109
this.locale = normalized;
110
111
this.translatePage();
112
};
113
}
114
115
module.exports = I18n;
116
117