mirror of
https://github.com/SamyRai/turash.git
synced 2025-12-26 23:01:33 +00:00
63 lines
1.7 KiB
Go
63 lines
1.7 KiB
Go
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
|
|
}
|
|
|