使用validato系列的翻译 但是不生效是什么原因呀 有知道的吗
package utils
import (
"basketball_web/src/com/basketball/entity"
"fmt"
"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"
enTranslations "github.com/go-playground/validator/v10/translations/en"
zhTranslations "github.com/go-playground/validator/v10/translations/zh"
"reflect"
"strings"
"time"
)
var trans ut.Translator
// InitTrans
//
// @Description: Init初始化翻译器
// @param locale
// @return err
func InitTrans(locale string) (err error) {
// 修改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("json"), ",", 2)[0]
if name == "-" {
return ""
}
return name
})
//为Game 注册 自自定义校验方法
v.RegisterStructValidation(SignUpParamStructLevelValidation, entity.Game{})
//在校验注册自定义的校验方法
err = v.RegisterValidation("checkDate", customFunc)
if err != nil {
return err
}
//设置支持语言
chinese := zh.New() //中文翻译器
english := en.New() //英文翻译器
//第一个参数是备用(fallback)的语言环境
//后面的参数是应该支持的语言环境 ,支持多个 国际化翻译器
uni := ut.New(chinese, chinese, english)
//locale 通常取决于 http 请求头的 Accept—Language
var ok bool
//也可以使用 uni.FindTranslator(...)传入多个locale进行查找
trans, ok = uni.GetTranslator(locale)
if !ok {
return fmt.Errorf("uni.GetTranslator(%s) failed", locale)
}
//注册翻译器
switch locale {
case "chinese":
err = zhTranslations.RegisterDefaultTranslations(v, trans)
case "english":
err = enTranslations.RegisterDefaultTranslations(v, trans)
default:
err = enTranslations.RegisterDefaultTranslations(v, trans)
}
if err:=v.RegisterTranslation(
"checkDate",
trans,
registerTranslator("checkDate","{0}必须要晚于当前日期"),
translate,
);err!=nil{
return err
}
return
}
return
}
// SignUpParamStructLevelValidation
//
// @Description: 自定义SignUpParam结构体校验参数
// @param sl
func SignUpParamStructLevelValidation(sl validator.StructLevel) {
}
// customFunc
//
// @Description: 自定义字段级别校验方法
// @param game
// @param fl
// @return bool
func customFunc(fl validator.FieldLevel) bool {
date, err := time.Parse("2033-01-02", fl.Field().String())
if err != nil {
return false
}
if date.Before(time.Now()) {
return false
}
return true
}
// registerTranslator
//
// @Description: 为自定义字段添加翻译功能
// @param tag
// @param msg
// @return validator.RegisterTranslationsFunc
func registerTranslator(tag string, msg string) validator.RegisterTranslationsFunc {
return func(trans ut.Translator) error {
if err := trans.Add(tag, msg, false); err != nil {
return err
}
return nil
}
}
func translate(trans ut.Translator, fe validator.FieldError) string {
msg, err := trans.T(fe.Tag(), fe.Field())
if err != nil {
//panic(fe.(error).Error())
return err.Error()
}
return msg
}
func InsertAdmin(c *gin.Context) {
var admin entity.Admin
err := c.BindJSON(&admin)
if err != nil {
errs, ok := err.(validator.ValidationErrors)
if !ok {
c.JSON(http.StatusBadRequest, resp.Failed().WithMsg("绑定 admin 对象失败").WithData(err).WithCode(http.StatusBadRequest))
return
}
c.JSON(http.StatusOK, resp.NewResult().WithMsg("绑定 admin 对象失败").WithData(errs.Translate(trans)).WithCode(http.StatusOK))
return
}
err, affected := service.InsertAdmin(&admin)
if err != nil {
errs, ok := err.(validator.ValidationErrors)
if !ok {
fmt.Println("添加管理员失败:", err)
c.JSON(http.StatusBadRequest, resp.NewResult().WithCode(http.StatusBadRequest).WithMsg("添加管理员失败").WithData(err))
return
}
c.JSON(http.StatusBadRequest, resp.NewResult().WithMsg("添加管理员失败").WithData(errs.Translate(trans)).WithCode(http.StatusBadRequest))
return
}
if err == nil {
if affected != 0 {
c.JSON(http.StatusOK, resp.NewResult().WithCode(http.StatusOK).WithMsg("添加管理员成功").WithData(admin))
return
} else {
c.JSON(http.StatusOK, resp.NewResult().WithCode(http.StatusOK).WithMsg("该管理员已存在,请登录").WithData(admin))
return
}
}
}
{"code":400,"msg":"绑定 json 类型的 game类型 失败","data":{"Value":"string","Type":{},"Offset":52,"Struct":"Game","Field":"tid2"}}