做好每一件事,读好每一本书,天道酬勤
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":"登录成功",
		  })
   })