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
}