const {ipcRenderer} = require("electron"); function normalizeLocale(locale) { if (!locale) return "en"; const parts = locale.split("-"); const lang = parts[0].toLowerCase(); const region = parts[1] ? parts[1].toUpperCase() : null; const defaultRegions = { zh: "CN", en: "US", ru: "RU", pt: "BR", fi: "FI", fr: "FR", es: "ES", de: "DE", it: "IT", ja: "JP", ar: "SA", }; if (!region && defaultRegions[lang]) { return `${lang}-${defaultRegions[lang]}`; } return region ? `${lang}-${region}` : lang; } async function getLocale() { try { const saved = localStorage.getItem("locale"); if (saved) return saved; } catch (e) {} let locale = null; try { locale = await ipcRenderer.invoke("get-system-locale"); } catch (e) { console.log(e) } if (!locale && typeof navigator !== "undefined") { locale = navigator.language || (navigator.languages && navigator.languages[0]); } const normalized = normalizeLocale(locale || "en"); try { localStorage.setItem("locale", normalized); } catch (e) {} return normalized; } function I18n() { this.loadedLanguage = {}; this.locale = "en"; this.init = async () => { try { this.locale = await getLocale(); this.loadedLanguage = await ipcRenderer.invoke( "get-translation", this.locale ); } catch (error) { console.error("Error loading translations:", error); this.loadedLanguage = {}; } }; this.__ = function (phrase) { return this.loadedLanguage[phrase] !== undefined ? this.loadedLanguage[phrase] : phrase; }; this.translatePage = () => { document.querySelectorAll("[data-translate]").forEach((element) => { const key = element.getAttribute("data-translate"); element.textContent = this.__(key); }); document .querySelectorAll("[data-translate-placeholder]") .forEach((element) => { const key = element.getAttribute("data-translate-placeholder"); element.placeholder = this.__(key); }); document .querySelectorAll("[data-translate-title]") .forEach((element) => { const key = element.getAttribute("data-translate-title"); element.title = this.__(key); }); }; this.setLocale = async function (newLocale) { const normalized = normalizeLocale(newLocale); localStorage.setItem("locale", normalized); this.loadedLanguage = await ipcRenderer.invoke( "get-translation", normalized ); this.locale = normalized; this.translatePage(); }; } module.exports = I18n;