i18n.go 1.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950
  1. package middleware
  2. import (
  3. "github.com/gin-gonic/gin"
  4. "github.com/QuantumNous/new-api/common"
  5. "github.com/QuantumNous/new-api/constant"
  6. "github.com/QuantumNous/new-api/dto"
  7. "github.com/QuantumNous/new-api/i18n"
  8. )
  9. // I18n middleware detects and sets the language preference for the request
  10. func I18n() gin.HandlerFunc {
  11. return func(c *gin.Context) {
  12. lang := detectLanguage(c)
  13. c.Set(string(constant.ContextKeyLanguage), lang)
  14. c.Next()
  15. }
  16. }
  17. // detectLanguage determines the language preference for the request
  18. // Priority: 1. User setting (if logged in) -> 2. Accept-Language header -> 3. Default language
  19. func detectLanguage(c *gin.Context) string {
  20. // 1. Try to get language from user setting (set by auth middleware)
  21. if userSetting, ok := common.GetContextKeyType[dto.UserSetting](c, constant.ContextKeyUserSetting); ok {
  22. if userSetting.Language != "" && i18n.IsSupported(userSetting.Language) {
  23. return userSetting.Language
  24. }
  25. }
  26. // 2. Parse Accept-Language header
  27. acceptLang := c.GetHeader("Accept-Language")
  28. if acceptLang != "" {
  29. lang := i18n.ParseAcceptLanguage(acceptLang)
  30. if i18n.IsSupported(lang) {
  31. return lang
  32. }
  33. }
  34. // 3. Return default language
  35. return i18n.DefaultLang
  36. }
  37. // GetLanguage returns the current language from gin context
  38. func GetLanguage(c *gin.Context) string {
  39. if lang := c.GetString(string(constant.ContextKeyLanguage)); lang != "" {
  40. return lang
  41. }
  42. return i18n.DefaultLang
  43. }