go validator實現中文翻譯


go validator實現中文翻譯

在使用go-kratos v2的過程中,官方對於參數驗證推薦了[protoc-gen-validate] (https://github.com/envoyproxy/protoc-gen-validate),但是由於返回值是中文,就算了用了middleware去處理,也無法完全中文化。所以采用了validator.

示例代碼如下

用戶結構體, validate表示validator驗證規則, label用於中文文案提示

建立validator/validator.go

package validator

import (
	"errors"
	"reflect"
)

import (
	"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"
)

const (
	BadRequest = "請求參數錯誤"
	)

// ValidateData 全局model數據驗證器
func Validate(dataStruct interface{}) error {
	
	//驗證
	zh_ch := zh.New()
	validate := validator.New()
	//注冊一個函數,獲取struct tag里自定義的label作為字段名
	validate.RegisterTagNameFunc(func(fld reflect.StructField) string {
		name := fld.Tag.Get("label")
		return name
	})

	uni := ut.New(zh_ch)
	trans, _ := uni.GetTranslator("zh")
	//驗證器注冊翻譯器
	zh_translations.RegisterDefaultTranslations(validate, trans)
	err := validate.Struct(dataStruct)
	if err != nil {
		for _, err := range err.(validator.ValidationErrors) {
			return errors.New(err.Translate(trans))
		}
	}
	return nil
}

main.go


type User struct {
	Id int64  `validate:"required" label:"id" ignoreRequired:"true"`
	Name string `validate:"required" label:"姓名"`
}

func main(){
    var u User
    u.Id = 0
    u.Name = ""
    if err := validator.Validate(user); err != nil {
		fmt.Println(err.Error())
		return
	}
  return	
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM