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 }