292 lines
11 KiB
Go
292 lines
11 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
|
||
})
|
||
}
|
||
|
||
// 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_address": "IP地址",
|
||
"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",
|
||
"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列表",
|
||
"auth_date": "授权日期",
|
||
"AuthDate": "授权日期",
|
||
"id_card": "身份证号",
|
||
"IDCard": "身份证号",
|
||
}
|
||
|
||
if displayName, exists := fieldNames[field]; exists {
|
||
return displayName
|
||
}
|
||
return field
|
||
} |