-
Farben
+
Sprache
+
+
+
+
+
Farben
diff --git a/frontend/js/calendar.js b/frontend/js/calendar.js
index d9ee375..0c1fe33 100644
--- a/frontend/js/calendar.js
+++ b/frontend/js/calendar.js
@@ -4,7 +4,7 @@ import { renderMonth } from './views/month.js';
import { renderWeek } from './views/week.js';
import { renderAgenda } from './views/agenda.js';
import { openColorPicker } from './color-picker.js';
-import { t, setLang, applyLang } from './i18n.js';
+import { t, setLang, getLang } from './i18n.js';
// Fetch avatar image as blob URL (with auth header)
function fetchAvatarBlob() {
@@ -1046,7 +1046,7 @@ function openSettingsModal() {
document.getElementById(id + '-preview').style.background = val;
});
document.getElementById('cfg-dim-past').checked = !!s.dim_past_events;
- document.getElementById('cfg-language').value = s.language || 'de';
+ document.getElementById('cfg-language').value = getLang();
// Set active contrast/hour-height buttons
[
diff --git a/frontend/js/i18n.js b/frontend/js/i18n.js
index 94095af..382451e 100644
--- a/frontend/js/i18n.js
+++ b/frontend/js/i18n.js
@@ -364,13 +364,16 @@ const translations = {
},
};
-let currentLang = 'de';
+let currentLang = (() => {
+ try { const l = localStorage.getItem('lang'); return (l && translations[l]) ? l : 'de'; } catch (_) { return 'de'; }
+})();
export function getLang() { return currentLang; }
export function setLang(lang) {
currentLang = (lang && translations[lang]) ? lang : 'de';
document.documentElement.lang = currentLang;
+ try { localStorage.setItem('lang', currentLang); } catch (_) {}
applyLang();
}