mirror of
https://github.com/QwIT-Development/firka-extension.git
synced 2026-06-12 03:41:39 +02:00
192 lines
5.6 KiB
JavaScript
192 lines
5.6 KiB
JavaScript
(function () {
|
|
let currentLanguage = "hu";
|
|
let translations = {};
|
|
|
|
async function setLanguage(language) {
|
|
try {
|
|
currentLanguage = language;
|
|
|
|
await storageManager.set("languagePreference", language);
|
|
|
|
localStorage.setItem("languagePreference", language);
|
|
|
|
await loadTranslations(language);
|
|
applyTranslations();
|
|
|
|
window.dispatchEvent(
|
|
new CustomEvent("languageChanged", {
|
|
detail: { language: language },
|
|
}),
|
|
);
|
|
|
|
chrome.runtime
|
|
.sendMessage({
|
|
action: "languageChanged",
|
|
language: language,
|
|
})
|
|
.catch(() => {});
|
|
} catch (error) {}
|
|
}
|
|
|
|
async function loadTranslations(language) {
|
|
try {
|
|
const url = chrome.runtime.getURL(`i18n/${language}.json`);
|
|
const response = await fetch(url);
|
|
if (!response.ok) {
|
|
throw new Error(
|
|
`Failed to load ${language}.json - Status: ${response.status}`,
|
|
);
|
|
}
|
|
translations = await response.json();
|
|
} catch (error) {
|
|
if (language !== "hu") {
|
|
try {
|
|
const fallbackUrl = chrome.runtime.getURL("i18n/hu.json");
|
|
const response = await fetch(fallbackUrl);
|
|
translations = await response.json();
|
|
} catch (fallbackError) {}
|
|
}
|
|
}
|
|
}
|
|
|
|
function applyTranslations() {
|
|
const elements = document.querySelectorAll("[data-i18n]");
|
|
|
|
elements.forEach((element) => {
|
|
const key = element.getAttribute("data-i18n");
|
|
const translation = getTranslation(key);
|
|
|
|
if (translation && translation !== key) {
|
|
const attr = element.getAttribute("data-i18n-attr");
|
|
if (attr) {
|
|
element.setAttribute(attr, translation);
|
|
} else {
|
|
element.textContent = translation;
|
|
}
|
|
}
|
|
});
|
|
}
|
|
|
|
function getTranslation(keyPath, fallback = "") {
|
|
const keys = keyPath.split(".");
|
|
let value = translations;
|
|
|
|
for (const key of keys) {
|
|
if (value && typeof value === "object" && key in value) {
|
|
value = value[key];
|
|
} else {
|
|
return fallback || keyPath;
|
|
}
|
|
}
|
|
|
|
return typeof value === "string" ? value : fallback || keyPath;
|
|
}
|
|
|
|
async function initializeLanguage() {
|
|
try {
|
|
const storageLanguage = await storageManager.get("languagePreference");
|
|
const localStorageLanguage = localStorage.getItem("languagePreference");
|
|
const language = storageLanguage || localStorageLanguage || "hu";
|
|
|
|
await setLanguage(language);
|
|
loadTranslationsForPage();
|
|
|
|
if (storageLanguage !== localStorageLanguage) {
|
|
if (storageLanguage) {
|
|
localStorage.setItem("languagePreference", storageLanguage);
|
|
} else if (localStorageLanguage) {
|
|
await storageManager.set("languagePreference", localStorageLanguage);
|
|
}
|
|
}
|
|
} catch (error) {
|
|
console.error("Error initializing language:", error);
|
|
await setLanguage("hu");
|
|
loadTranslationsForPage();
|
|
}
|
|
}
|
|
|
|
if (document.readyState === "loading") {
|
|
document.addEventListener("DOMContentLoaded", initializeLanguage);
|
|
} else {
|
|
initializeLanguage();
|
|
}
|
|
|
|
chrome.runtime.onMessage.addListener((message, sender, sendResponse) => {
|
|
if (message.action === "changeLanguage") {
|
|
setLanguage(message.language);
|
|
sendResponse({ success: true });
|
|
}
|
|
|
|
if (message.action === "getLanguage") {
|
|
sendResponse({ language: currentLanguage });
|
|
}
|
|
|
|
return true;
|
|
});
|
|
|
|
function loadTranslationsForPage() {
|
|
try {
|
|
applyTranslations();
|
|
|
|
const observer = new MutationObserver((mutations) => {
|
|
mutations.forEach((mutation) => {
|
|
if (mutation.type === 'childList') {
|
|
mutation.addedNodes.forEach((node) => {
|
|
if (node.nodeType === Node.ELEMENT_NODE) {
|
|
const elementsWithI18n = node.querySelectorAll ? node.querySelectorAll('[data-i18n]') : [];
|
|
elementsWithI18n.forEach((element) => {
|
|
const key = element.getAttribute('data-i18n');
|
|
const translation = getTranslation(key);
|
|
|
|
if (translation && translation !== key) {
|
|
const attr = element.getAttribute('data-i18n-attr');
|
|
if (attr) {
|
|
element.setAttribute(attr, translation);
|
|
} else {
|
|
element.textContent = translation;
|
|
}
|
|
}
|
|
});
|
|
|
|
if (node.hasAttribute && node.hasAttribute('data-i18n')) {
|
|
const key = node.getAttribute('data-i18n');
|
|
const translation = getTranslation(key);
|
|
|
|
if (translation && translation !== key) {
|
|
const attr = node.getAttribute('data-i18n-attr');
|
|
if (attr) {
|
|
node.setAttribute(attr, translation);
|
|
} else {
|
|
node.textContent = translation;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
});
|
|
}
|
|
});
|
|
});
|
|
|
|
observer.observe(document.body, {
|
|
childList: true,
|
|
subtree: true
|
|
});
|
|
} catch (error) {
|
|
console.error('Error loading translations for page:', error);
|
|
}
|
|
}
|
|
|
|
window.LanguageManager = {
|
|
getCurrentLanguage: () => currentLanguage,
|
|
changeLanguage: setLanguage,
|
|
t: getTranslation,
|
|
loadTranslationsForPage: loadTranslationsForPage,
|
|
getAvailableLanguages: () => [
|
|
{ code: "hu", name: "Magyar" },
|
|
{ code: "en", name: "English" },
|
|
{ code: "de", name: "Deutsch" },
|
|
],
|
|
init: initializeLanguage,
|
|
};
|
|
})();
|