added lang "auto-detect" instead of random lang

This commit is contained in:
partisan 2024-09-09 14:14:41 +02:00
parent 4d6b99c67e
commit d414cf5ce4
2 changed files with 76 additions and 10 deletions

18
main.go
View file

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

View file

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