mirror of
https://git.sanhost.net/sanasol/hytale-f2p.git
synced 2026-02-26 14:51:48 -03:00
Added de.json and sv.json locale files for German and Swedish language support. Updated i18n.js to register 'de' and 'sv' as available languages in the launcher.
95 lines
2.3 KiB
JavaScript
95 lines
2.3 KiB
JavaScript
// Minimal i18n system - optimized async loading
|
|
const i18n = (() => {
|
|
let currentLang = 'en';
|
|
let translations = {};
|
|
const availableLanguages = [
|
|
{ code: 'en', name: 'English' },
|
|
{ code: 'fr', name: 'Français' },
|
|
{ code: 'de', name: 'Deutsch' },
|
|
{ code: 'sv', name: 'Svenska' },
|
|
{ code: 'es-ES', name: 'Español (España)' },
|
|
{ code: 'pt-BR', name: 'Portuguese (Brazil)' },
|
|
{ code: 'tr-TR', name: 'Turkish (Turkey)' },
|
|
{ code: 'pl-PL', name: 'Polish (Poland)' }
|
|
];
|
|
|
|
// Load single language file
|
|
async function loadLanguage(lang) {
|
|
if (translations[lang]) return true;
|
|
|
|
try {
|
|
const response = await fetch(`locales/${lang}.json`);
|
|
if (response.ok) {
|
|
translations[lang] = await response.json();
|
|
return true;
|
|
}
|
|
} catch (e) {
|
|
console.warn(`Failed to load language: ${lang}`);
|
|
}
|
|
return false;
|
|
}
|
|
|
|
// Get translation by key
|
|
function t(key) {
|
|
const keys = key.split('.');
|
|
let value = translations[currentLang];
|
|
|
|
for (const k of keys) {
|
|
if (value && value[k] !== undefined) {
|
|
value = value[k];
|
|
} else {
|
|
return key;
|
|
}
|
|
}
|
|
|
|
return value;
|
|
}
|
|
|
|
// Set language
|
|
async function setLanguage(lang) {
|
|
await loadLanguage(lang);
|
|
if (translations[lang]) {
|
|
currentLang = lang;
|
|
updateDOM();
|
|
window.electronAPI?.saveLanguage(lang);
|
|
}
|
|
}
|
|
|
|
// Update all elements with data-i18n attribute
|
|
function updateDOM() {
|
|
document.querySelectorAll('[data-i18n]').forEach(el => {
|
|
const key = el.getAttribute('data-i18n');
|
|
el.textContent = t(key);
|
|
});
|
|
|
|
document.querySelectorAll('[data-i18n-placeholder]').forEach(el => {
|
|
const key = el.getAttribute('data-i18n-placeholder');
|
|
el.placeholder = t(key);
|
|
});
|
|
|
|
document.querySelectorAll('[data-i18n-title]').forEach(el => {
|
|
const key = el.getAttribute('data-i18n-title');
|
|
el.title = t(key);
|
|
});
|
|
}
|
|
|
|
// Initialize - load saved language only
|
|
async function init(savedLang) {
|
|
const lang = savedLang || 'en';
|
|
await loadLanguage(lang);
|
|
currentLang = lang;
|
|
updateDOM();
|
|
}
|
|
|
|
return {
|
|
init,
|
|
t,
|
|
setLanguage,
|
|
getAvailableLanguages: () => availableLanguages,
|
|
getCurrentLanguage: () => currentLang
|
|
};
|
|
})();
|
|
|
|
// Make i18n globally available
|
|
window.i18n = i18n;
|