package component import ( "errors" "gitee.ltd/lxh/logger/log" "github.com/gin-gonic/gin/binding" "github.com/go-playground/locales/en" "github.com/go-playground/locales/zh" ut "github.com/go-playground/universal-translator" "github.com/go-playground/validator/v10" zhTranslations "github.com/go-playground/validator/v10/translations/zh" "reflect" "strings" ) var validatorTrans ut.Translator func init() { initValidatorTranslator() } func Error(err error) string { var errs validator.ValidationErrors ok := errors.As(err, &errs) if !ok { return err.Error() } errMap := errs.Translate(validatorTrans) var errMsg string for _, v := range errMap { errMsg = v } return errMsg } // initValidatorTranslator // @description: 初始化翻译机 // @receiver vli func initValidatorTranslator() { //修改gin框架中的Validator属性,实现自定制 if v, ok := binding.Validator.Engine().(*validator.Validate); ok { // 注册一个获取json tag的自定义方法 v.RegisterTagNameFunc(func(fld reflect.StructField) string { name := strings.SplitN(fld.Tag.Get("label"), ",", 2)[0] if name == "-" { return "" } return name }) zhT := zh.New() //中文翻译器 enT := en.New() //英文翻译器 // 第一个参数是备用(fallback)的语言环境 // 后面的参数是应该支持的语言环境(支持多个) // uni := ut.New(zhT, zhT) 也是可以的 uni := ut.New(enT, zhT, enT) // locale 通常取决于 http 请求头的 'Accept-Language' var ok bool // 也可以使用 uni.FindTranslator(...) 传入多个locale进行查找 validatorTrans, ok = uni.GetTranslator("zh") if !ok { log.Errorf("获取翻译机失败") return } err := overrideTranslator(v, validatorTrans) if err != nil { log.Errorf("覆盖原有翻译失败: %v", err.Error()) return } } } // overrideTranslator // @description: 覆盖原有翻译 // @param v // @param translator // @return error func overrideTranslator(v *validator.Validate, translator ut.Translator) error { err := zhTranslations.RegisterDefaultTranslations(v, translator) if err != nil { return err } return nil }