253 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			Go
		
	
	
	
	
	
		
		
			
		
	
	
			253 lines
		
	
	
		
			9.6 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 | |||
|  | 	}) | |||
|  | } | |||
|  | 
 | |||
|  | // getFieldDisplayName 获取字段显示名称(中文) | |||
|  | func getFieldDisplayName(field string) string { | |||
|  | 	fieldNames := map[string]string{ | |||
|  | 		"phone":                "手机号", | |||
|  | 		"password":             "密码", | |||
|  | 		"confirm_password":     "确认密码", | |||
|  | 		"old_password":         "原密码", | |||
|  | 		"new_password":         "新密码", | |||
|  | 		"confirm_new_password": "确认新密码", | |||
|  | 		"code":                 "验证码", | |||
|  | 		"username":             "用户名", | |||
|  | 		"email":                "邮箱", | |||
|  | 		"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列表", | |||
|  | 	} | |||
|  | 
 | |||
|  | 	if displayName, exists := fieldNames[field]; exists { | |||
|  | 		return displayName | |||
|  | 	} | |||
|  | 	return field | |||
|  | }  |