From d414cf5ce4282866f7678c364981ddc3dd7b3cd1 Mon Sep 17 00:00:00 2001 From: partisan Date: Mon, 9 Sep 2024 14:14:41 +0200 Subject: [PATCH] added lang "auto-detect" instead of random lang --- main.go | 18 ++++++++----- user-settings.go | 68 +++++++++++++++++++++++++++++++++++++++++++++--- 2 files changed, 76 insertions(+), 10 deletions(-) diff --git a/main.go b/main.go index 9bed1f1..63b60ca 100755 --- a/main.go +++ b/main.go @@ -17,7 +17,7 @@ type LanguageOption struct { var settings UserSettings var languageOptions = []LanguageOption{ - {Code: "", Name: "Any Language"}, + {Code: "", Name: "Auto-detect"}, {Code: "en", Name: "English"}, {Code: "af", Name: "Afrikaans"}, {Code: "ar", Name: "العربية (Arabic)"}, @@ -70,25 +70,31 @@ func handleSearch(w http.ResponseWriter, r *http.Request) { query, safe, lang, searchType, page := parseSearchParams(r) // Load user settings - settings = loadUserSettings(r) + settings = loadUserSettings(w, r) - // Update the theme, safe search, and language based on query parameters or use existing settings + // Update theme if provided, or use existing settings theme := r.URL.Query().Get("theme") if theme != "" { settings.Theme = theme - saveUserSettings(w, settings) + saveUserSettings(w, settings) // Save if theme is updated } else if settings.Theme == "" { settings.Theme = "dark" // Default theme } + // Update safe search if provided, or use existing settings if safe != "" && safe != settings.SafeSearch { settings.SafeSearch = safe - saveUserSettings(w, settings) + saveUserSettings(w, settings) // Save if safe search is updated } + // Update language if provided, or use existing settings if lang != "" && lang != settings.Language { settings.Language = lang - saveUserSettings(w, settings) + saveUserSettings(w, settings) // Save if language is updated + } else if settings.Language == "" { + // If no language set, auto-detect from browser or default to "en" + settings.Language = normalizeLangCode(r.Header.Get("Accept-Language")) + saveUserSettings(w, settings) // Save if language is auto-detected } // This will do for now (to handle Dark Reader addon) diff --git a/user-settings.go b/user-settings.go index 92da588..bd2f02f 100755 --- a/user-settings.go +++ b/user-settings.go @@ -3,6 +3,7 @@ package main import ( "html/template" "net/http" + "strings" "time" ) @@ -13,21 +14,35 @@ type UserSettings struct { IsThemeDark bool } -func loadUserSettings(r *http.Request) UserSettings { +func loadUserSettings(w http.ResponseWriter, r *http.Request) UserSettings { var settings UserSettings + saveRequired := false // Track if we need to save settings back // Load theme if cookie, err := r.Cookie("theme"); err == nil { settings.Theme = cookie.Value } else { settings.Theme = "dark" // Default theme + saveRequired = true // No cookie found, need to save this later } // Load language if cookie, err := r.Cookie("language"); err == nil { settings.Language = cookie.Value } else { - settings.Language = "en" // Default language + settings.Language = "" // Set language to empty, handled later + } + + // If language is empty, get it from the Accept-Language header + if settings.Language == "" { + acceptLang := r.Header.Get("Accept-Language") + if acceptLang != "" { + // Get the first language from Accept-Language header and normalize + settings.Language = normalizeLangCode(strings.Split(acceptLang, ",")[0]) + } else { + settings.Language = "en" // Default language if Accept-Language is not present + } + saveRequired = true // No language cookie found, need to save } // Load safe search @@ -35,6 +50,12 @@ func loadUserSettings(r *http.Request) UserSettings { settings.SafeSearch = cookie.Value } else { settings.SafeSearch = "" // Default safe search off + saveRequired = true // No safe search cookie found, need to save + } + + // Save settings if required (no cookie found for any of the settings) + if saveRequired { + saveUserSettings(w, settings) } return settings @@ -74,7 +95,7 @@ func saveUserSettings(w http.ResponseWriter, settings UserSettings) { func handleSaveSettings(w http.ResponseWriter, r *http.Request) { if r.Method == "POST" { // Load current settings - settings := loadUserSettings(r) + settings := loadUserSettings(w, r) // Update only the settings that were submitted in the form if theme := r.FormValue("theme"); theme != "" { @@ -82,6 +103,12 @@ func handleSaveSettings(w http.ResponseWriter, r *http.Request) { } if lang := r.FormValue("lang"); lang != "" { settings.Language = lang + } else { + // If lang is empty, try to get from Accept-Language header + acceptLang := r.Header.Get("Accept-Language") + if acceptLang != "" { + settings.Language = strings.Split(acceptLang, ",")[0] + } } if safe := r.FormValue("safe"); safe != "" { settings.SafeSearch = safe @@ -97,7 +124,7 @@ func handleSaveSettings(w http.ResponseWriter, r *http.Request) { func handleSettings(w http.ResponseWriter, r *http.Request) { // Load user settings - settings = loadUserSettings(r) + settings = loadUserSettings(w, r) data := struct { LanguageOptions []LanguageOption @@ -129,3 +156,36 @@ func handleSettings(w http.ResponseWriter, r *http.Request) { return } } + +// Helper function to normalize language codes +func normalizeLangCode(lang string) string { + lang = strings.ToLower(lang) + + // First, check if the language code is already valid + if isValidLangCode(lang) { + return lang + } + + // Strip regional codes (e.g., en-US -> en) + if strings.Contains(lang, "-") { + lang = strings.Split(lang, "-")[0] + } + + // Re-check if the normalized version is valid + if isValidLangCode(lang) { + return lang + } + + // If the language is not recognized, default to "en" + return "en" +} + +// Helper function to check if a language code exists in the language options +func isValidLangCode(lang string) bool { + for _, opt := range languageOptions { + if opt.Code == lang { + return true + } + } + return false +}