From f4473c17edef49df6525a6f935cf30d646571962 Mon Sep 17 00:00:00 2001 From: Michael Geers Date: Fri, 26 Jan 2024 08:54:47 +0100 Subject: [PATCH] Header-based language auto-detection (#11867) --- assets/index.html | 2 +- assets/js/i18n.js | 14 +++----------- server/http_site_handler.go | 19 +++++++++++++++++-- 3 files changed, 21 insertions(+), 14 deletions(-) diff --git a/assets/index.html b/assets/index.html index e65606ca2..29fc23694 100644 --- a/assets/index.html +++ b/assets/index.html @@ -1,5 +1,5 @@ - + diff --git a/assets/js/i18n.js b/assets/js/i18n.js index 481a4573c..2b89ed933 100644 --- a/assets/js/i18n.js +++ b/assets/js/i18n.js @@ -35,15 +35,7 @@ export const LOCALES = { }; export const DEFAULT_LOCALE = "en"; - -function getBrowserLocale() { - const navigatorLocale = - navigator.languages !== undefined ? navigator.languages[0] : navigator.language; - if (!navigatorLocale) { - return undefined; - } - return navigatorLocale.trim().split(/-|_/)[0]; -} +const DEFAULT_BROWSER_LOCALE = document.querySelector("html").getAttribute("lang"); export function getLocalePreference() { return settings.locale; @@ -51,7 +43,7 @@ export function getLocalePreference() { export function removeLocalePreference(i18n) { settings.locale = null; - setI18nLanguage(i18n, getBrowserLocale()); + setI18nLanguage(i18n, DEFAULT_BROWSER_LOCALE); ensureCurrentLocaleMessages(i18n); } @@ -66,7 +58,7 @@ export function setLocalePreference(i18n, locale) { } function getLocale() { - return getLocalePreference() || getBrowserLocale(); + return getLocalePreference() || DEFAULT_BROWSER_LOCALE; } export default function setupI18n() { diff --git a/server/http_site_handler.go b/server/http_site_handler.go index 39ffb4bd7..ca615038b 100644 --- a/server/http_site_handler.go +++ b/server/http_site_handler.go @@ -18,10 +18,22 @@ import ( "github.com/evcc-io/evcc/util/jq" "github.com/gorilla/mux" "github.com/itchyny/gojq" + "golang.org/x/text/language" ) var ignoreState = []string{"releaseNotes"} // excessive size +// getPreferredLanguage returns the preferred language as two letter code +func getPreferredLanguage(header string) string { + languages, _, err := language.ParseAcceptLanguage(header) + if err != nil || len(languages) == 0 { + return "en" + } + + base, _ := languages[0].Base() + return base.String() +} + func indexHandler() http.HandlerFunc { return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "text/html; charset=UTF-8") @@ -39,9 +51,12 @@ func indexHandler() http.HandlerFunc { log.FATAL.Fatal("httpd: failed to create main page template:", err.Error()) } + defaultLang := getPreferredLanguage(r.Header.Get("Accept-Language")) + if err := t.Execute(w, map[string]interface{}{ - "Version": Version, - "Commit": Commit, + "Version": Version, + "Commit": Commit, + "DefaultLang": defaultLang, }); err != nil { log.ERROR.Println("httpd: failed to render main page:", err.Error()) }