diff --git a/frontend/resources/vue/App.vue b/frontend/resources/vue/App.vue index 10da3e6..d7c65da 100644 --- a/frontend/resources/vue/App.vue +++ b/frontend/resources/vue/App.vue @@ -84,6 +84,7 @@ import { UserCircle02Icon } from '@hugeicons/core-free-icons' import { DashboardSquare01Icon } from '@hugeicons/core-free-icons' import logoUrl from '../../OliveTinLogo.png'; import { useI18n } from 'vue-i18n'; +import combinedTranslations from '../../../lang/combined_output.json'; const { t, locale } = useI18n(); @@ -129,13 +130,25 @@ const currentLanguageName = computed(() => { return availableLanguages[languagePreference.value] || languagePreference.value }) -function getBrowserLanguage() { - if (navigator.languages && navigator.languages.length > 0) { - return navigator.languages[0] - } +function normalizeBrowserLanguage() { + const available = Object.keys(combinedTranslations.messages || {}) - if (navigator.language) { - return navigator.language + if (navigator.languages && navigator.languages.length > 0) { + for (const candidate of navigator.languages) { + const lowerCandidate = candidate.toLowerCase() + + // Try exact match (case-insensitive) + const exact = available.find(locale => locale.toLowerCase() === lowerCandidate) + if (exact) { + return exact + } + + // Try prefix match (e.g., "zh-CN" -> "zh-Hans-CN") + const prefix = available.find(locale => locale.toLowerCase().startsWith(lowerCandidate.split('-')[0] + '-')) + if (prefix) { + return prefix + } + } } return 'en' @@ -235,7 +248,7 @@ function changeLanguage() { if (selectedLanguage.value === 'auto') { localStorage.removeItem('olivetin-language') languagePreference.value = 'auto' - window.i18n.locale.value = getBrowserLanguage() + window.i18n.locale.value = normalizeBrowserLanguage() } else { window.i18n.locale.value = selectedLanguage.value localStorage.setItem('olivetin-language', selectedLanguage.value) diff --git a/frontend/resources/vue/views/LogsListView.vue b/frontend/resources/vue/views/LogsListView.vue index 36696fc..f71400a 100644 --- a/frontend/resources/vue/views/LogsListView.vue +++ b/frontend/resources/vue/views/LogsListView.vue @@ -7,7 +7,7 @@ d="m19.6 21l-6.3-6.3q-.75.6-1.725.95T9.5 16q-2.725 0-4.612-1.888T3 9.5t1.888-4.612T9.5 3t4.613 1.888T16 9.5q0 1.1-.35 2.075T14.7 13.3l6.3 6.3zM9.5 14q1.875 0 3.188-1.312T14 9.5t-1.312-3.187T9.5 5T6.313 6.313T5 9.5t1.313 3.188T9.5 14" /> -