今天在改后台页面,参数校验错误时输出全是英文,使用着很难看懂到底时什么错了
故而决定去做i18n前端国际化. 改的时候踩了很多坑,故而记录一下,顺便记录以下查问题的方式。

效果
Title is required标题为必填字段
完成后的代码:

这里主要定义了初始化了一个中文的trans和Validate的变量,并对其做初始化
初始化主要做了以下事情:

// RegisterTagNameFunc registers a function to get alternate names for StructFields.labelrequired
package service

import (
	zhongwen "github.com/go-playground/locales/zh"
	ut "github.com/go-playground/universal-translator"
	"github.com/go-playground/validator/v10"
	zh_translations "github.com/go-playground/validator/v10/translations/zh"
	"reflect"
	"strings"
)

var Validate *validator.Validate
var trans ut.Translator

func init() {
	zh := zhongwen.New()
	uni := ut.New(zh, zh)
	trans, _ = uni.GetTranslator("zh")

	Validate = validator.New()
	Validate.RegisterTagNameFunc(func(field reflect.StructField) string {
		label := field.Tag.Get("label")
		if label == "" {
			return field.Name
		}
		return label
	})
	zh_translations.RegisterDefaultTranslations(Validate, trans)
}
func Translate(errs validator.ValidationErrors) string {
	var errList []string
	for _, e := range errs {
		// can translate each error one at a time.
		errList = append(errList,e.Translate(trans))
	}
	return strings.Join(errList,"|")
}
调用方式
type ArticlesPost struct {
	Title           string  `json:"title" validate:"required,max=32,min=4" label:"标题"`
}
var ap ArticlePost
err = service.Validate.Struct(ap)
if err!=nil{
  errStr =Translate(errs)
  fmt.Sprintln(errStr)
}
思路
universal-translatoris required必填字段How can I translate fieldName? #364en.Add("MyField", "Field", false)alidate.RegisterTranslationrequiredfld, _ := ut.T(fe.Field())type TranslationFunc func(ut ut.Translator, fe FieldError) stringvalidate
// TagNameFunc allows for adding of a custom tag name parser
type TagNameFunc func(field reflect.StructField) string
// SetTagName allows for changing of the default tag name of 'validate'
func (v *Validate) SetTagName(name string) {
	v.tagName = name
}

// RegisterTagNameFunc registers a function to get alternate names for StructFields.
//
// eg. to use the names which have been specified for JSON representations of structs, rather than normal Go field names:
//
//    validate.RegisterTagNameFunc(func(fld reflect.StructField) string {
//        name := strings.SplitN(fld.Tag.Get("json"), ",", 2)[0]
//        if name == "-" {
//            return ""
//        }
//        return name
//    })
func (v *Validate) RegisterTagNameFunc(fn TagNameFunc) {
	v.tagNameFunc = fn
	v.hasTagNameFunc = true
}

至此,终于找到了正确的解决方案

总结

在这里发现为了解决这个问题走了很多弯路,查了一大堆资料才发现甚至原来就有提供该功能。
发现自己的几个问题:

  1. 英文不是很好,偶尔有些单词不认识,阻止了进一步发现问题,这里也突然想到,英语好一些确实可以在学编程这个路子上受益匪浅
  2. 看文档不是很仔细,鄙人觉得大部分的编程问题都不是很高深,能读得懂错误是什么意思,然后去查查文档或者搜索引擎就能解决,另一个是大部分的编程文档还是英文好一些,细节性的东西在翻译的时候可能会被略掉。