package ecode import ( "context" "fmt" "server/utility/i18n" "github.com/gogf/gf/v2/errors/gcode" ) type Error struct { code int message string sub string params []interface{} } func New(code int, message string) Error { return Error{ code: code, message: message, } } func (e Error) Params(params ...interface{}) Error { e.params = append(e.params, params...) return e } func (e Error) Error() string { return e.Message() } func (e Error) Sub(sub string) Error { e.sub = sub return e } func (e Error) Message() string { if e.message != "" && len(e.params) > 0 { e.message = fmt.Sprintf(e.message, e.params...) } if e.sub != "" { if e.message != "" { if len(e.params) > 0 { e.message = fmt.Sprintf(e.message, e.params...) } return fmt.Sprintf("%s:%s", e.message, e.sub) } return e.sub } return e.message } // MessageI18n 返回国际化消息 func (e Error) MessageI18n(ctx context.Context) string { // 如果有子消息,优先使用子消息的国际化 if e.sub != "" { return i18n.T(ctx, e.sub) } // 否则使用主消息的国际化 if e.message != "" { // 尝试从国际化系统获取消息 i18nMsg := i18n.T(ctx, e.message) if i18nMsg != e.message { // 如果找到了国际化消息,使用它 if len(e.params) > 0 { return fmt.Sprintf(i18nMsg, e.params...) } return i18nMsg } // 如果没有找到国际化消息,使用原来的逻辑 if len(e.params) > 0 { return fmt.Sprintf(e.message, e.params...) } return e.message } return "" } func (e Error) Code() gcode.Code { return gcode.New(e.code, e.Message(), "customer") } func (e Error) Detail() interface{} { return "customer" }