GIN中的错误翻译
2022-01-21 / 4 min read
我们在书写程序的时候,遇见报错对于一些程序员来说全英文的报错不是很友好,这里找到了一个错误翻译的方法
关于翻译器的导入
这里我们先要导入预备的资源,然后再创建翻译器
我们需要导入的包
"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 InitTrans(locale string)(err error){
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
})
zhT := zh.New()//中文翻译器
enT := en.New()//英文翻译器
uni := ut.New(enT,zhT,enT)
trans,ok = uni.GetTranslator(locale)
if !ok {
return fmt.Errorf("uni.GetTranslator(%s)",locale)
}
switch locale{
case "en":
en_translations.RegisterDefaultTranslations(v,trans)
case "zh":
zh_translations.RegisterDefaultTranslations(v,trans)
default:
zh_translations.RegisterDefaultTranslations(v,trans)
}
}
return nil
}
后面我们发现了一个问题,就是我们出现的效果是这样的有前缀的,结构体前缀,当然我们是不需要的所以后序我们添加上了:
func RemoveTopStruct(fileds map[string]string)map[string]string {
rsp := map[string]string{}
for field ,err := range fileds{
rsp[field[strings.Index(field,".")+1:]] = err
}
return rsp
}
这个方法我们可以得到tag。
然后我们在测试的时候,发现了一个问题,就是我们得到的错误,字段他没有按照tag来完成书写,这个时候我们加上了这一段代码实现功能。
//注册一个获取json的tag自定义方法
v.RegisterTagNameFunc(func(fld reflect.StructField) string {
name := strings.SplitN(fld.Tag.Get("json"),",",2)[0]
if name == "-"{
return ""
}
return name
})
最后使用
在使用的时候,我们需要注意的事情,我们要注册一个全局的变量,这样才能在任何的地方使用。
var trans ut.Translator
创建完成后,使用
//初始化翻译
if err := InitTrans("zh");err != nil{
fmt.Println("初始化翻译器错误")
return
}
router := gin.Default()
router.POST("/login", func(c *gin.Context) {
var login LoginForm
if err := c.ShouldBind(&login);err != nil{
errs ,ok := err.(validator.ValidationErrors)
if !ok {
c.JSON(http.StatusOK,gin.H{
"msg":err.Error(),
})
}
c.JSON(http.StatusBadRequest,gin.H{
"err": RemoveTopStruct(errs.Translate(trans)),
})
return
}
c.JSON(http.StatusOK,gin.H{
"msg":"登录成功",
})
})