package middleware import ( "bugulma/backend/internal/service" "strings" "github.com/gin-gonic/gin" ) // LocaleKey is the context key for locale const LocaleKey = "locale" // I18nMiddleware extracts locale from Accept-Language header or query parameter // Sets locale in context for use by handlers func I18nMiddleware(i18nService *service.I18nService) gin.HandlerFunc { return func(c *gin.Context) { locale := service.DefaultLocale // Check query parameter first (highest priority) if queryLocale := c.Query("locale"); queryLocale != "" { if i18nService.ValidateLocale(queryLocale) { locale = queryLocale } } else if headerLocale := c.GetHeader("Accept-Language"); headerLocale != "" { // Parse Accept-Language header locale = parseAcceptLanguage(headerLocale, i18nService) } // Set locale in context c.Set(LocaleKey, locale) c.Next() } } // parseAcceptLanguage parses Accept-Language header and returns best match func parseAcceptLanguage(header string, i18nService *service.I18nService) string { // Parse header like "en-US,en;q=0.9,ru;q=0.8" languages := strings.Split(header, ",") for _, lang := range languages { // Extract language code (e.g., "en" from "en-US" or "en;q=0.9") parts := strings.Split(strings.TrimSpace(lang), ";") langCode := strings.ToLower(strings.Split(parts[0], "-")[0]) if i18nService.ValidateLocale(langCode) { return langCode } } return service.DefaultLocale } // GetLocaleFromContext extracts locale from context func GetLocaleFromContext(c *gin.Context) string { if locale, exists := c.Get(LocaleKey); exists { if loc, ok := locale.(string); ok { return loc } } return service.DefaultLocale }