package globals import ( "errors" "github.com/go-playground/locales/zh" ut "github.com/go-playground/universal-translator" "github.com/go-playground/validator/v10" zhtrans "github.com/go-playground/validator/v10/translations/zh" "github.com/gofiber/fiber/v2" "strings" ) var Validator *ValidatorClient type ValidatorClient struct { validator *validator.Validate translator ut.Translator } func (v *ValidatorClient) Validate(c *fiber.Ctx, data any) error { if err := c.BodyParser(data); err != nil { return err } if errs := v.validator.Struct(data); errs != nil { var sb = strings.Builder{} var typeErrs validator.ValidationErrors errors.As(errs, &typeErrs) for i, err := range typeErrs { sb.WriteString(err.Translate(v.translator)) if i < len(typeErrs)-1 { sb.WriteString("\n") } } return fiber.NewError(fiber.StatusBadRequest, sb.String()) } return nil } func initValidator() { var validate = validator.New(validator.WithRequiredStructEnabled()) var translator = ut.New(zh.New()).GetFallback() err := zhtrans.RegisterDefaultTranslations(validate, translator) if err != nil { panic(err) } Validator = &ValidatorClient{ validator: validate, translator: translator, } }