竹简文档
验证器

中文翻译

为验证错误提供中文翻译支持

中文翻译

xVaildgo-playground/validator 提供中文翻译支持,将验证错误消息转换为友好的中文提示。

RegisterTranslator

注册中文翻译器:

translator.go
func RegisterTranslator(validate *validator.Validate) error

使用:

validate := validator.New()
xVaild.RegisterCustomValidators(validate)
xVaild.RegisterTranslator(validate)

GetTranslator

获取翻译器实例:

translator.go
func GetTranslator() ut.Translator

TranslateError

翻译验证错误为中文:

translator.go
func TranslateError(err error) map[string]string

返回: 字段名到错误消息的映射。

label 标签

使用 label 标签定义字段的中文名称:

type User struct {
    // label 优先于 json 作为字段名
    Username string `json:"username" label:"用户名" binding:"required,min=4"`
    Password string `json:"password" label:"密码" binding:"required,min=8"`
    Email    string `json:"email" label:"邮箱" binding:"required,email"`
}

错误消息示例:

  • 用户名为必填项
  • 密码长度不能少于 8 个字符
  • 邮箱必须是有效的邮箱地址

内置消息映射

字段

类型

自定义验证器消息

字段

类型

使用示例

基础使用

handler/user.go
func CreateUser(ctx *gin.Context) {
    var req dto.CreateUserRequest
    if err := ctx.ShouldBindJSON(&req); err != nil {
        // 获取翻译后的错误消息
        errors := xVaild.TranslateError(err)
        for field, msg := range errors {
            fmt.Printf("%s: %s\n", field, msg)
        }
        return
    }
}

配合 HandleValidationError

handler/user.go
func CreateUser(ctx *gin.Context) {
    var req dto.CreateUserRequest
    if err := ctx.ShouldBindJSON(&req); err != nil {
        // 自动翻译并返回响应
        xVaild.HandleValidationError(ctx, err)
        return
    }
}

完整初始化

register_engine.go
func (r *Reg) EngineInit() {
    engine := gin.Default()

    if v, ok := binding.Validator.Engine().(*validator.Validate); ok {
        // 1. 注册自定义验证器
        _ = xVaild.RegisterCustomValidators(v)

        // 2. 注册中文翻译器
        _ = xVaild.RegisterTranslator(v)

        // 3. 使用 label 标签作为字段名
        v.RegisterTagNameFunc(func(fld reflect.StructField) string {
            name := fld.Tag.Get("label")
            if name == "" {
                name = fld.Tag.Get("json")
            }
            return name
        })
    }
}

下一步

On this page