1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123
| package main
import ( "fmt" "net/http" "reflect" "strings"
"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"
en_translations "github.com/go-playground/validator/v10/translations/en" zh_translations "github.com/go-playground/validator/v10/translations/zh" )
func main() { if err := InitTranslate("zh"); err != nil { fmt.Println("初始化翻译器出错") return }
r := gin.Default()
r.POST("/", func(c *gin.Context) { var singUpForm SingUpForm if err := c.ShouldBind(&singUpForm); nil != err { errors, ok := err.(validator.ValidationErrors) if !ok { c.JSON(http.StatusOK, gin.H{ "code": -1, "msg": fmt.Errorf("error getting translation of error message, %s", err.Error()), }) return }
c.JSON(http.StatusBadRequest, gin.H{ "code": -1, "msg": removeTopStruct(errors.Translate(translator)), })
return }
c.JSON(http.StatusOK, gin.H{ "code": 0, "msg": "登录成功", }) })
r.Run(":8080") }
type SingUpForm struct { Age uint8 `json:"age" binding:"gte=1,lte=130"` Name string `json:"name" binding:"required,min=3"` Email string `json:"email" binding:"required,email"` Password string `json:"password" binding:"required"` RePassword string `json:"rePassword" binding:"required,eqfield=Password"` }
var ( uni *ut.UniversalTranslator validate *validator.Validate translator ut.Translator )
func InitTranslate(locale string) (err error) { engine, ok := binding.Validator.Engine().(*validator.Validate) if !ok { fmt.Println("获取 gin 框架的 validator 出错") }
engine.RegisterTagNameFunc(func(field reflect.StructField) string { jsonTag := field.Tag.Get("json") splitN := strings.SplitN(jsonTag, ",", 2) name := splitN[0] if name == "-" { return "" } return name })
zhT := zh.New() enT := en.New()
uni := ut.New(enT, zhT, enT)
translator, ok = uni.GetTranslator(locale) if !ok { return fmt.Errorf("uni.GetTranslator(%s)", locale) }
switch locale { case "en": en_translations.RegisterDefaultTranslations(engine, translator) case "zh": zh_translations.RegisterDefaultTranslations(engine, translator) }
return }
func removeTopStruct(fields map[string]string) map[string]string { resp := make(map[string]string) for key, value := range fields { resp[key[strings.Index(key, ".")+1:]] = value } return resp }
|