319 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
			
		
		
	
	
			319 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
| package validator
 | ||
| 
 | ||
| import (
 | ||
| 	ut "github.com/go-playground/universal-translator"
 | ||
| 	"github.com/go-playground/validator/v10"
 | ||
| )
 | ||
| 
 | ||
| // RegisterCustomTranslations 注册所有自定义翻译
 | ||
| func RegisterCustomTranslations(validate *validator.Validate, trans ut.Translator) {
 | ||
| 	// 注册标准字段翻译
 | ||
| 	registerStandardTranslations(validate, trans)
 | ||
| 	
 | ||
| 	// 注册自定义字段翻译
 | ||
| 	registerCustomFieldTranslations(validate, trans)
 | ||
| }
 | ||
| 
 | ||
| // registerStandardTranslations 注册标准翻译
 | ||
| func registerStandardTranslations(validate *validator.Validate, trans ut.Translator) {
 | ||
| 	// 必填字段翻译
 | ||
| 	validate.RegisterTranslation("required", trans, func(ut ut.Translator) error {
 | ||
| 		return ut.Add("required", "{0}不能为空", true)
 | ||
| 	}, func(ut ut.Translator, fe validator.FieldError) string {
 | ||
| 		t, _ := ut.T("required", getFieldDisplayName(fe.Field()))
 | ||
| 		return t
 | ||
| 	})
 | ||
| 
 | ||
| 	// 字段相等翻译
 | ||
| 	validate.RegisterTranslation("eqfield", trans, func(ut ut.Translator) error {
 | ||
| 		return ut.Add("eqfield", "{0}必须与{1}一致", true)
 | ||
| 	}, func(ut ut.Translator, fe validator.FieldError) string {
 | ||
| 		t, _ := ut.T("eqfield", getFieldDisplayName(fe.Field()), getFieldDisplayName(fe.Param()))
 | ||
| 		return t
 | ||
| 	})
 | ||
| 
 | ||
| 	// 最小长度翻译
 | ||
| 	validate.RegisterTranslation("min", trans, func(ut ut.Translator) error {
 | ||
| 		return ut.Add("min", "{0}长度不能少于{1}位", true)
 | ||
| 	}, func(ut ut.Translator, fe validator.FieldError) string {
 | ||
| 		t, _ := ut.T("min", getFieldDisplayName(fe.Field()), fe.Param())
 | ||
| 		return t
 | ||
| 	})
 | ||
| 
 | ||
| 	// 最大长度翻译
 | ||
| 	validate.RegisterTranslation("max", trans, func(ut ut.Translator) error {
 | ||
| 		return ut.Add("max", "{0}长度不能超过{1}位", true)
 | ||
| 	}, func(ut ut.Translator, fe validator.FieldError) string {
 | ||
| 		t, _ := ut.T("max", getFieldDisplayName(fe.Field()), fe.Param())
 | ||
| 		return t
 | ||
| 	})
 | ||
| 
 | ||
| 	// 固定长度翻译
 | ||
| 	validate.RegisterTranslation("len", trans, func(ut ut.Translator) error {
 | ||
| 		return ut.Add("len", "{0}长度必须为{1}位", true)
 | ||
| 	}, func(ut ut.Translator, fe validator.FieldError) string {
 | ||
| 		t, _ := ut.T("len", getFieldDisplayName(fe.Field()), fe.Param())
 | ||
| 		return t
 | ||
| 	})
 | ||
| 
 | ||
| 	// 邮箱翻译
 | ||
| 	validate.RegisterTranslation("email", trans, func(ut ut.Translator) error {
 | ||
| 		return ut.Add("email", "{0}必须是有效的邮箱地址", true)
 | ||
| 	}, func(ut ut.Translator, fe validator.FieldError) string {
 | ||
| 		t, _ := ut.T("email", getFieldDisplayName(fe.Field()))
 | ||
| 		return t
 | ||
| 	})
 | ||
| 
 | ||
| 	// 枚举值翻译
 | ||
| 	validate.RegisterTranslation("oneof", trans, func(ut ut.Translator) error {
 | ||
| 		return ut.Add("oneof", "{0}必须是以下值之一: {1}", true)
 | ||
| 	}, func(ut ut.Translator, fe validator.FieldError) string {
 | ||
| 		t, _ := ut.T("oneof", getFieldDisplayName(fe.Field()), fe.Param())
 | ||
| 		return t
 | ||
| 	})
 | ||
| 
 | ||
| 	// 大于翻译
 | ||
| 	validate.RegisterTranslation("gt", trans, func(ut ut.Translator) error {
 | ||
| 		return ut.Add("gt", "{0}必须大于{1}", true)
 | ||
| 	}, func(ut ut.Translator, fe validator.FieldError) string {
 | ||
| 		t, _ := ut.T("gt", getFieldDisplayName(fe.Field()), fe.Param())
 | ||
| 		return t
 | ||
| 	})
 | ||
| }
 | ||
| 
 | ||
| // registerCustomFieldTranslations 注册自定义字段翻译
 | ||
| func registerCustomFieldTranslations(validate *validator.Validate, trans ut.Translator) {
 | ||
| 	// 手机号翻译
 | ||
| 	validate.RegisterTranslation("phone", trans, func(ut ut.Translator) error {
 | ||
| 		return ut.Add("phone", "{0}必须是有效的手机号", true)
 | ||
| 	}, func(ut ut.Translator, fe validator.FieldError) string {
 | ||
| 		t, _ := ut.T("phone", getFieldDisplayName(fe.Field()))
 | ||
| 		return t
 | ||
| 	})
 | ||
| 
 | ||
| 	// 用户名翻译
 | ||
| 	validate.RegisterTranslation("username", trans, func(ut ut.Translator) error {
 | ||
| 		return ut.Add("username", "{0}格式不正确,只能包含字母、数字、下划线,且必须以字母开头,长度3-20位", true)
 | ||
| 	}, func(ut ut.Translator, fe validator.FieldError) string {
 | ||
| 		t, _ := ut.T("username", getFieldDisplayName(fe.Field()))
 | ||
| 		return t
 | ||
| 	})
 | ||
| 
 | ||
| 	// 强密码翻译
 | ||
| 	validate.RegisterTranslation("strong_password", trans, func(ut ut.Translator) error {
 | ||
| 		return ut.Add("strong_password", "{0}强度不足,必须包含大小写字母和数字,且不少于8位", true)
 | ||
| 	}, func(ut ut.Translator, fe validator.FieldError) string {
 | ||
| 		t, _ := ut.T("strong_password", getFieldDisplayName(fe.Field()))
 | ||
| 		return t
 | ||
| 	})
 | ||
| 
 | ||
| 	// 统一社会信用代码翻译
 | ||
| 	validate.RegisterTranslation("social_credit_code", trans, func(ut ut.Translator) error {
 | ||
| 		return ut.Add("social_credit_code", "{0}格式不正确,必须是18位统一社会信用代码", true)
 | ||
| 	}, func(ut ut.Translator, fe validator.FieldError) string {
 | ||
| 		t, _ := ut.T("social_credit_code", getFieldDisplayName(fe.Field()))
 | ||
| 		return t
 | ||
| 	})
 | ||
| 
 | ||
| 	// 身份证号翻译
 | ||
| 	validate.RegisterTranslation("id_card", trans, func(ut ut.Translator) error {
 | ||
| 		return ut.Add("id_card", "{0}格式不正确,必须是18位身份证号", true)
 | ||
| 	}, func(ut ut.Translator, fe validator.FieldError) string {
 | ||
| 		t, _ := ut.T("id_card", getFieldDisplayName(fe.Field()))
 | ||
| 		return t
 | ||
| 	})
 | ||
| 
 | ||
| 	// 价格翻译
 | ||
| 	validate.RegisterTranslation("price", trans, func(ut ut.Translator) error {
 | ||
| 		return ut.Add("price", "{0}必须是非负数", true)
 | ||
| 	}, func(ut ut.Translator, fe validator.FieldError) string {
 | ||
| 		t, _ := ut.T("price", getFieldDisplayName(fe.Field()))
 | ||
| 		return t
 | ||
| 	})
 | ||
| 
 | ||
| 	// 排序方向翻译
 | ||
| 	validate.RegisterTranslation("sort_order", trans, func(ut ut.Translator) error {
 | ||
| 		return ut.Add("sort_order", "{0}必须是 asc 或 desc", true)
 | ||
| 	}, func(ut ut.Translator, fe validator.FieldError) string {
 | ||
| 		t, _ := ut.T("sort_order", getFieldDisplayName(fe.Field()))
 | ||
| 		return t
 | ||
| 	})
 | ||
| 
 | ||
| 	// 产品代码翻译
 | ||
| 	validate.RegisterTranslation("product_code", trans, func(ut ut.Translator) error {
 | ||
| 		return ut.Add("product_code", "{0}格式不正确,只能包含字母、数字、下划线、连字符、中英文括号,长度3-50位", true)
 | ||
| 	}, func(ut ut.Translator, fe validator.FieldError) string {
 | ||
| 		t, _ := ut.T("product_code", getFieldDisplayName(fe.Field()))
 | ||
| 		return t
 | ||
| 	})
 | ||
| 
 | ||
| 	// UUID翻译
 | ||
| 	validate.RegisterTranslation("uuid", trans, func(ut ut.Translator) error {
 | ||
| 		return ut.Add("uuid", "{0}必须是有效的UUID格式", true)
 | ||
| 	}, func(ut ut.Translator, fe validator.FieldError) string {
 | ||
| 		t, _ := ut.T("uuid", getFieldDisplayName(fe.Field()))
 | ||
| 		return t
 | ||
| 	})
 | ||
| 
 | ||
| 	// URL翻译
 | ||
| 	validate.RegisterTranslation("url", trans, func(ut ut.Translator) error {
 | ||
| 		return ut.Add("url", "{0}必须是有效的URL地址", true)
 | ||
| 	}, func(ut ut.Translator, fe validator.FieldError) string {
 | ||
| 		t, _ := ut.T("url", getFieldDisplayName(fe.Field()))
 | ||
| 		return t
 | ||
| 	})
 | ||
| 
 | ||
| 	// 企业邮箱翻译
 | ||
| 	validate.RegisterTranslation("enterprise_email", trans, func(ut ut.Translator) error {
 | ||
| 		return ut.Add("enterprise_email", "{0}必须是有效的企业邮箱地址", true)
 | ||
| 	}, func(ut ut.Translator, fe validator.FieldError) string {
 | ||
| 		t, _ := ut.T("enterprise_email", getFieldDisplayName(fe.Field()))
 | ||
| 		return t
 | ||
| 	})
 | ||
| 
 | ||
| 	// 企业地址翻译
 | ||
| 	validate.RegisterTranslation("enterprise_address", trans, func(ut ut.Translator) error {
 | ||
| 		return ut.Add("enterprise_address", "{0}长度必须在2-200字符之间,且不能只包含空格", true)
 | ||
| 	}, func(ut ut.Translator, fe validator.FieldError) string {
 | ||
| 		t, _ := ut.T("enterprise_address", getFieldDisplayName(fe.Field()))
 | ||
| 		return t
 | ||
| 	})
 | ||
| 
 | ||
| 	// IP地址翻译
 | ||
| 	validate.RegisterTranslation("ip", trans, func(ut ut.Translator) error {
 | ||
| 		return ut.Add("ip", "{0}必须是有效的IPv4地址格式", true)
 | ||
| 	}, func(ut ut.Translator, fe validator.FieldError) string {
 | ||
| 		t, _ := ut.T("ip", getFieldDisplayName(fe.Field()))
 | ||
| 		return t
 | ||
| 	})
 | ||
| 
 | ||
| 	// 授权日期翻译
 | ||
| 	validate.RegisterTranslation("auth_date", trans, func(ut ut.Translator) error {
 | ||
| 		return ut.Add("auth_date", "{0}格式不正确,必须是YYYYMMDD-YYYYMMDD格式,且日期范围必须包括今天", true)
 | ||
| 	}, func(ut ut.Translator, fe validator.FieldError) string {
 | ||
| 		t, _ := ut.T("auth_date", getFieldDisplayName(fe.Field()))
 | ||
| 		return t
 | ||
| 	})
 | ||
| 
 | ||
| 	// 授权书URL翻译
 | ||
| 	validate.RegisterTranslation("authorization_url", trans, func(ut ut.Translator) error {
 | ||
| 		return ut.Add("authorization_url", "{0}必须是有效的URL地址,且文件类型必须是PDF、JPG、JPEG、PNG或BMP格式", true)
 | ||
| 	}, func(ut ut.Translator, fe validator.FieldError) string {
 | ||
| 		t, _ := ut.T("authorization_url", getFieldDisplayName(fe.Field()))
 | ||
| 		return t
 | ||
| 	})
 | ||
| 
 | ||
| 	// 唯一标识翻译
 | ||
| 	validate.RegisterTranslation("validUniqueID", trans, func(ut ut.Translator) error {
 | ||
| 		return ut.Add("validUniqueID", "{0}格式不正确,只能包含字母、数字、下划线和连字符,且长度不能超过32位", true)
 | ||
| 	}, func(ut ut.Translator, fe validator.FieldError) string {
 | ||
| 		t, _ := ut.T("validUniqueID", getFieldDisplayName(fe.Field()))
 | ||
| 		return t
 | ||
| 	})
 | ||
| 
 | ||
| 	// 回调地址翻译
 | ||
| 	validate.RegisterTranslation("validReturnURL", trans, func(ut ut.Translator) error {
 | ||
| 		return ut.Add("validReturnURL", "{0}必须是有效的URL地址,且长度不能超过500字符", true)
 | ||
| 	}, func(ut ut.Translator, fe validator.FieldError) string {
 | ||
| 		t, _ := ut.T("validReturnURL", getFieldDisplayName(fe.Field()))
 | ||
| 		return t
 | ||
| 	})
 | ||
| }
 | ||
| 
 | ||
| // getFieldDisplayName 获取字段显示名称(中文)
 | ||
| func getFieldDisplayName(field string) string {
 | ||
| 	fieldNames := map[string]string{
 | ||
| 		"phone":                "手机号",
 | ||
| 		"password":             "密码",
 | ||
| 		"confirm_password":     "确认密码",
 | ||
| 		"old_password":         "原密码",
 | ||
| 		"new_password":         "新密码",
 | ||
| 		"confirm_new_password": "确认新密码",
 | ||
| 		"code":                 "验证码",
 | ||
| 		"username":             "用户名",
 | ||
| 		"email":                "邮箱",
 | ||
| 		"enterprise_email":     "企业邮箱",
 | ||
| 		"enterprise_address":   "企业地址",
 | ||
| 		"ip":                   "IP地址",
 | ||
| 		"auth_date":            "授权日期",
 | ||
| 		"unique_id":            "唯一标识",
 | ||
| 		"return_url":           "回调地址",
 | ||
| 		"display_name":         "显示名称",
 | ||
| 		"scene":                "使用场景",
 | ||
| 		"Password":             "密码",
 | ||
| 		"NewPassword":          "新密码",
 | ||
| 		"ConfirmPassword":      "确认密码",
 | ||
| 		"name":                 "名称",
 | ||
| 		"Name":                 "名称",
 | ||
| 		"description":          "描述",
 | ||
| 		"Description":          "描述",
 | ||
| 		"price":                "价格",
 | ||
| 		"Price":                "价格",
 | ||
| 		"category_id":          "分类ID",
 | ||
| 		"CategoryID":           "分类ID",
 | ||
| 		"product_id":           "产品ID",
 | ||
| 		"ProductID":            "产品ID",
 | ||
| 		"user_id":              "用户ID",
 | ||
| 		"UserID":               "用户ID",
 | ||
| 		"page":                 "页码",
 | ||
| 		"Page":                 "页码",
 | ||
| 		"page_size":            "每页数量",
 | ||
| 		"PageSize":             "每页数量",
 | ||
| 		"keyword":              "关键词",
 | ||
| 		"Keyword":              "关键词",
 | ||
| 		"sort_by":              "排序字段",
 | ||
| 		"SortBy":               "排序字段",
 | ||
| 		"sort_order":           "排序方向",
 | ||
| 		"SortOrder":            "排序方向",
 | ||
| 		"company_name":         "企业名称",
 | ||
| 		"CompanyName":          "企业名称",
 | ||
| 		"unified_social_code":  "统一社会信用代码",
 | ||
| 		"UnifiedSocialCode":    "统一社会信用代码",
 | ||
| 		"legal_person_name":    "法定代表人姓名",
 | ||
| 		"LegalPersonName":      "法定代表人姓名",
 | ||
| 		"legal_person_id":      "法定代表人身份证号",
 | ||
| 		"LegalPersonID":        "法定代表人身份证号",
 | ||
| 		"legal_person_phone":   "法定代表人手机号",
 | ||
| 		"LegalPersonPhone":     "法定代表人手机号",
 | ||
| 		"verification_code":    "验证码",
 | ||
| 		"VerificationCode":     "验证码",
 | ||
| 		"contract_url":         "合同URL",
 | ||
| 		"ContractURL":          "合同URL",
 | ||
| 		"authorization_url":    "授权书地址",
 | ||
| 		"AuthorizationURL":     "授权书地址",
 | ||
| 		"amount":               "金额",
 | ||
| 		"Amount":               "金额",
 | ||
| 		"balance":              "余额",
 | ||
| 		"Balance":              "余额",
 | ||
| 		"is_active":            "是否激活",
 | ||
| 		"IsActive":             "是否激活",
 | ||
| 		"is_enabled":           "是否启用",
 | ||
| 		"IsEnabled":            "是否启用",
 | ||
| 		"is_visible":           "是否可见",
 | ||
| 		"IsVisible":            "是否可见",
 | ||
| 		"is_package":           "是否组合包",
 | ||
| 		"IsPackage":            "是否组合包",
 | ||
| 		"Code":                 "编号",
 | ||
| 		"content":              "内容",
 | ||
| 		"Content":              "内容",
 | ||
| 		"sort":                 "排序",
 | ||
| 		"Sort":                 "排序",
 | ||
| 		"seo_title":            "SEO标题",
 | ||
| 		"SEOTitle":             "SEO标题",
 | ||
| 		"seo_description":      "SEO描述",
 | ||
| 		"SEODescription":       "SEO描述",
 | ||
| 		"seo_keywords":         "SEO关键词",
 | ||
| 		"SEOKeywords":          "SEO关键词",
 | ||
| 		"id":                   "ID",
 | ||
| 		"ID":                   "ID",
 | ||
| 		"ids":                  "ID列表",
 | ||
| 		"IDs":                  "ID列表",
 | ||
| 		"id_card":              "身份证号",
 | ||
| 		"IDCard":               "身份证号",
 | ||
| 	}
 | ||
| 
 | ||
| 	if displayName, exists := fieldNames[field]; exists {
 | ||
| 		return displayName
 | ||
| 	}
 | ||
| 	return field
 | ||
| }  |