From b97dd23abb916d7d98bc1b9ab0bba2b9e9d7fc58 Mon Sep 17 00:00:00 2001 From: jamesread Date: Tue, 11 Nov 2025 23:24:44 +0000 Subject: [PATCH] chore: Better fixups on lang tool and support --- frontend/resources/vue/App.vue | 27 +++- frontend/resources/vue/views/LogsListView.vue | 2 +- lang/README.md | 4 +- lang/combined_output.json | 151 +++++++++++++++++- lang/de-DE.yaml | 1 + lang/en.yaml | 1 + lang/es-ES.yaml | 5 +- lang/it-IT.yaml | 5 +- lang/main.go | 42 ++++- lang/zh-Hans-CN.yaml | 3 +- 10 files changed, 224 insertions(+), 17 deletions(-) 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" /> -