Header-based language auto-detection (#11867)

This commit is contained in:
Michael Geers 2024-01-26 08:54:47 +01:00 • committed by GitHub
parent d406b81be8
commit f4473c17ed
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 21 additions and 14 deletions

View file

@ -1,5 +1,5 @@
<!doctype html>
<html lang="en">
<html lang="[[.DefaultLang]]">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1" />

View file

@ -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() {

View file

@ -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())
}