1. package setup
    2. import (
    3. "fmt"
    4. "reflect"
    5. "strings"
    6. "github.com/gin-gonic/gin/binding"
    7. "github.com/go-playground/locales/en"
    8. "github.com/go-playground/locales/zh"
    9. ut "github.com/go-playground/universal-translator"
    10. "github.com/go-playground/validator/v10"
    11. enTranslations "github.com/go-playground/validator/v10/translations/en"
    12. zhTranslations "github.com/go-playground/validator/v10/translations/zh"
    13. )
    14. // 定义一个全局翻译器 Trans
    15. var Trans ut.Translator
    16. // InitTrans 初始化翻译器
    17. func InitTrans(locale string) (err error) {
    18. // 修改gin框架中的Validator引擎属性,实现自定制 (使用断言转化)
    19. if v, assert_ok := binding.Validator.Engine().(*validator.Validate); assert_ok {
    20. // 注册一个获取json tag的自定义方法
    21. v.RegisterTagNameFunc(func(fld reflect.StructField) string {
    22. name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]
    23. if name == "-" {
    24. return ""
    25. }
    26. return name
    27. })
    28. zhT := zh.New() // 中文翻译器
    29. enT := en.New() // 英文翻译器
    30. // 第一个参数是备用(fallback)的语言环境
    31. // 后面的参数是应该支持的语言环境(支持多个)
    32. // uni := ut.New(zhT, zhT) 也是可以的
    33. uni := ut.New(enT, zhT, enT)
    34. // locale 通常取决于 http 请求头的 'Accept-Language'
    35. var ok bool
    36. //根据需要的语言,通过 GetTranslator 初始化一个翻译器 也可以使用 uni.FindTranslator(...) 传入多个locale进行查找
    37. Trans, ok = uni.GetTranslator(locale)
    38. if !ok {
    39. return fmt.Errorf("uni.GetTranslator(%s) failed", locale)
    40. }
    41. // 注册翻译器
    42. switch locale {
    43. case "en":
    44. err = enTranslations.RegisterDefaultTranslations(v, Trans)
    45. case "zh":
    46. err = zhTranslations.RegisterDefaultTranslations(v, Trans)
    47. default:
    48. err = enTranslations.RegisterDefaultTranslations(v, Trans)
    49. }
    50. return
    51. }
    52. return
    53. }