gin切换validator库设置中文翻译

“github.com/go-playground/validator/v10”
参考文章:Gin 使用 validator 实现参数校验

package main

import (
	"fmt"
	"github.com/gin-gonic/gin"
	"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"
)

type User struct {
	// form字段要和json字段一致
	Name string `form:"user_name" json:"user_name" binding:"user_name"`
}

func main() {
	v, ok := binding.Validator.Engine().(*validator.Validate)
	if !ok {
		panic("断言失败...")
	}
	// 1.自己注册获取jsonTag的值函数
	//                   GetTag函数
	v.RegisterTagNameFunc(GetTag)

	zhT := zh.New() //中文翻译器
	enT := en.New() //英文翻译器
	//第一个参数是备用的语言环境,后面的参数是应该支持的语言环境
	uni := ut.New(enT, zhT, enT)
	// 根据输入获取传入指定的翻译器
	trans, ok := uni.GetTranslator("zh")
	_ = zhtranslations.RegisterDefaultTranslations(v, trans)

	// 2.自己注册 自定义获取json标签值的中文翻译     // tranUserNameRegis函数   tranUserName函数
	_ = v.RegisterTranslation("user_name", trans, tranUserNameRegis, tranUserName)
	// 3.自定义标签user_name的验证器               // validateUsername函数
	err := v.RegisterValidation("user_name", validateUsername)
	if err != nil {
		fmt.Println("验证器注册失败")
		panic(err)
	}

	e := gin.Default()
	e.POST("/testUser", func(c *gin.Context) {
		if err := c.ShouldBind(&User{}); err != nil {
			errs, ok := err.(validator.ValidationErrors)
			if !ok {
				panic(errs.Error())
			}
			translate := ""
			for _, err := range errs {
				translate = err.Translate(trans)
				fmt.Println(translate)

			}
			c.JSON(200, gin.H{"myCode": translate})
			return

		}
		c.JSON(200, gin.H{"myCode": "OK"})
		return
	})
	_ = e.Run(":8080")

}
func GetTag(fld reflect.StructField) string {
	name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]
	if name == "-" {
		return ""
	}
	return name
}

// 注册user_name标签的翻译
func tranUserNameRegis(ut ut.Translator) error {
	// {0} 就是user_name标签名
	return ut.Add("user_name", "{0}非法的用户名!", true)
}

// user_name翻译函数
func tranUserName(ut ut.Translator, fe validator.FieldError) string {
	t, _ := ut.T("user_name", fe.Field())
	return t
}

// 自定义user_name验证器
func validateUsername(fl validator.FieldLevel) bool {
	if fl.Field().String() == "111" {
		return true
	}
	return false
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值