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" />
-