package main
import (
"fmt"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"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"
"log"
"net/http"
"reflect"
"strings"
)
var trans ut.Translator
func main() {
r := gin.Default()
err := InitTrans("zh")
if err != nil {
log.Fatalln(err)
return
}
r.POST("/test", test())
r.Run() // 监听并在 0.0.0.0:8080 上启动服务
}
func test() gin.HandlerFunc {
return func(ctx *gin.Context) {
s := new(struct {
Name string `json:"name" binding:"required"`
Age int `json:"age" binding:"required"`
})
err := ctx.ShouldBindJSON(s)
if err != nil {
if errors, ok := err.(validator.ValidationErrors); ok {
ctx.JSON(http.StatusOK, ParamError(errors))
return
}
}
}
}
func InitTrans(locale string) (err error) {
if validate, ok := binding.Validator.Engine().(*validator.Validate); ok {
validate.RegisterTagNameFunc(func(field reflect.StructField) string {
name := strings.SplitN(field.Tag.Get("json"), ",", 2)[0]
if name == "-" {
return ""
}
return name
})
zhT := zh.New() // 中文翻译
uniT := ut.New(zhT, zhT) //注册中文翻译机
//enT := en.New() // 英文翻译
//uniT := ut.New(zhT, enT) //注册英文翻译机
// 也可以使用 uni.FindTranslator(...) 传入多个locale进行查找
trans, ok = uniT.GetTranslator(locale)
if !ok {
return fmt.Errorf("uni.GetTranslator(%s) failed", locale)
}
// 注册翻译器
switch locale {
case "en":
err = enTranslations.RegisterDefaultTranslations(validate, trans)
case "zh":
err = zhTranslations.RegisterDefaultTranslations(validate, trans)
default:
err = enTranslations.RegisterDefaultTranslations(validate, trans)
}
return
}
return
}
func ParamError(err validator.ValidationErrors) *gin.H {
return &gin.H{
"errCode": -1,
"errMsg": err.Translate(trans),
}
}
gin binding validator 中英文翻译
最新推荐文章于 2024-01-23 12:48:24 发布