From eedb1aa7d5e82713b3cc14d13a57fe5c28a37cc0 Mon Sep 17 00:00:00 2001 From: "Torsten Schulz (local)" Date: Mon, 15 Sep 2025 10:53:50 +0200 Subject: [PATCH] =?UTF-8?q?=C3=84nderung:=20Verbesserung=20der=20Sprachene?= =?UTF-8?q?rkennung=20und=20-verwaltung?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Änderungen: - Erweiterung der Logik zur Erkennung der Browsersprache in main.js und im Store, um auch spezifische deutsche Dialekte und Länder zu berücksichtigen. - Implementierung einer Überwachung der Sprachänderungen im Store, die die i18n-Konfiguration entsprechend aktualisiert. Diese Anpassungen verbessern die Benutzererfahrung durch präzisere Sprachenerkennung und dynamische Anpassung der Sprache in der Anwendung. --- frontend/src/i18n/index.js | 8 ++++++ frontend/src/main.js | 30 ++++++++++++++++++-- frontend/src/store/index.js | 56 ++++++++++++++++++++++++++++++++++++- 3 files changed, 91 insertions(+), 3 deletions(-) diff --git a/frontend/src/i18n/index.js b/frontend/src/i18n/index.js index 46db93a..9f7e8d2 100644 --- a/frontend/src/i18n/index.js +++ b/frontend/src/i18n/index.js @@ -81,4 +81,12 @@ const i18n = createI18n({ messages }); +// Überwache Änderungen der Sprache im Store und aktualisiere i18n entsprechend +store.watch( + (state) => state.language, + (newLanguage) => { + i18n.global.locale.value = newLanguage; + } +); + export default i18n; diff --git a/frontend/src/main.js b/frontend/src/main.js index 1e9159e..9fb53e7 100644 --- a/frontend/src/main.js +++ b/frontend/src/main.js @@ -9,12 +9,38 @@ import * as components from 'vuetify/components'; import * as directives from 'vuetify/directives'; function getBrowserLanguage() { + // Prüfe zuerst die bevorzugte Sprache const browserLanguage = navigator.language || navigator.languages[0]; + + // Deutschsprachige Länder: Deutschland, Österreich, Schweiz, Liechtenstein + const germanSpeakingCountries = ['de', 'at', 'ch', 'li']; + + // Prüfe ob die Sprache mit 'de' beginnt (deutsch) if (browserLanguage.startsWith('de')) { return 'de'; - } else { - return 'en'; } + + // Prüfe alle verfügbaren Sprachen für deutschsprachige Länder + const allLanguages = navigator.languages || [navigator.language]; + for (const lang of allLanguages) { + // Prüfe auf de-XX Format (z.B. de-DE, de-AT, de-CH, de-LI) + if (lang.startsWith('de-')) { + const countryCode = lang.split('-')[1]?.toLowerCase(); + if (germanSpeakingCountries.includes(countryCode)) { + return 'de'; + } + } + // Prüfe auch auf direkte Länderkennung (z.B. de_AT, de_CH) + if (lang.startsWith('de_')) { + const countryCode = lang.split('_')[1]?.toLowerCase(); + if (germanSpeakingCountries.includes(countryCode)) { + return 'de'; + } + } + } + + // Fallback: Englisch für alle anderen Sprachen + return 'en'; } const vuetify = createVuetify({ diff --git a/frontend/src/store/index.js b/frontend/src/store/index.js index e902a78..001326d 100644 --- a/frontend/src/store/index.js +++ b/frontend/src/store/index.js @@ -10,7 +10,33 @@ const store = createStore({ isLoggedIn: localStorage.getItem('isLoggedIn') === 'true', connectionStatus: 'disconnected', // 'connected', 'connecting', 'disconnected', 'error' user: JSON.parse(localStorage.getItem('user')) || null, - language: navigator.language.startsWith('de') ? 'de' : 'en', + language: (() => { + // Verwende die gleiche Logik wie in main.js + const browserLanguage = navigator.language || navigator.languages[0]; + const germanSpeakingCountries = ['de', 'at', 'ch', 'li']; + + if (browserLanguage.startsWith('de')) { + return 'de'; + } + + const allLanguages = navigator.languages || [navigator.language]; + for (const lang of allLanguages) { + if (lang.startsWith('de-')) { + const countryCode = lang.split('-')[1]?.toLowerCase(); + if (germanSpeakingCountries.includes(countryCode)) { + return 'de'; + } + } + if (lang.startsWith('de_')) { + const countryCode = lang.split('_')[1]?.toLowerCase(); + if (germanSpeakingCountries.includes(countryCode)) { + return 'de'; + } + } + } + + return 'en'; + })(), menu: JSON.parse(localStorage.getItem('menu')) || [], socket: null, daemonSocket: null, @@ -34,6 +60,34 @@ const store = createStore({ localStorage.removeItem('user'); localStorage.removeItem('menu'); state.menuNeedsUpdate = false; + + // Setze die Sprache auf die Browser-Sprache zurück + const browserLanguage = navigator.language || navigator.languages[0]; + const germanSpeakingCountries = ['de', 'at', 'ch', 'li']; + + if (browserLanguage.startsWith('de')) { + state.language = 'de'; + } else { + const allLanguages = navigator.languages || [navigator.language]; + let isGerman = false; + for (const lang of allLanguages) { + if (lang.startsWith('de-')) { + const countryCode = lang.split('-')[1]?.toLowerCase(); + if (germanSpeakingCountries.includes(countryCode)) { + isGerman = true; + break; + } + } + if (lang.startsWith('de_')) { + const countryCode = lang.split('_')[1]?.toLowerCase(); + if (germanSpeakingCountries.includes(countryCode)) { + isGerman = true; + break; + } + } + } + state.language = isGerman ? 'de' : 'en'; + } }, setLanguage(state, language) { state.language = language;