This is an automated email from the ASF dual-hosted git repository.

linkinstar pushed a commit to branch feat/1.6.0/user
in repository https://gitbox.apache.org/repos/asf/answer.git


The following commit(s) were added to refs/heads/feat/1.6.0/user by this push:
     new 3b8b5871 feat(user): add user status messages and support localization
3b8b5871 is described below

commit 3b8b5871a6191163901287383bcc7b764944bf6f
Author: LinkinStars <linkins...@foxmail.com>
AuthorDate: Thu Jun 26 16:10:09 2025 +0800

    feat(user): add user status messages and support localization
---
 i18n/en_US.yaml                          |  8 +++++
 i18n/zh_CN.yaml                          |  8 +++++
 internal/base/reason/reason.go           |  4 +++
 internal/schema/user_schema.go           | 50 +++++++++++++++++++-------------
 internal/service/content/user_service.go |  2 +-
 5 files changed, 51 insertions(+), 21 deletions(-)

diff --git a/i18n/en_US.yaml b/i18n/en_US.yaml
index 1791d85c..67d3e3a9 100644
--- a/i18n/en_US.yaml
+++ b/i18n/en_US.yaml
@@ -307,6 +307,14 @@ backend:
         other: "Error {{.Field}} format near '{{.Content}}' at line {{.Line}}. 
{{.ExtraMessage}}"
       add_bulk_users_amount_error:
         other: "The number of users you add at once should be in the range of 
1-{{.MaxAmount}}."
+      status_suspended_forever:
+        other: "<strong>This user was suspended forever.</strong> This user 
doesn't meet a community guideline."
+      status_suspended_until:
+        other: "<strong>This user was suspended until 
{{.SuspendedUntil}}.</strong> This user doesn't meet a community guideline."
+      status_deleted:
+        other: "This user was deleted."
+      status_inactive:
+        other: "This user is inactive."
     config:
       read_config_failed:
         other: Read config failed
diff --git a/i18n/zh_CN.yaml b/i18n/zh_CN.yaml
index 6b153e0a..7a94840e 100644
--- a/i18n/zh_CN.yaml
+++ b/i18n/zh_CN.yaml
@@ -306,6 +306,14 @@ backend:
         other: "发生错误,{{.Field}} 格式错误,在 '{{.Content}}' 行数 {{.Line}}. 
{{.ExtraMessage}}"
       add_bulk_users_amount_error:
         other: "一次性添加的用户数量应在 1-{{.MaxAmount}} 之间。"
+      status_suspended_forever:
+        other: "<strong>该用户已被永久封禁。</strong>该用户不符合社区准则。"
+      status_suspended_until:
+        other: "<strong>该用户已被封禁至 {{.SuspendedUntil}}。</strong>该用户不符合社区准则。"
+      status_deleted:
+        other: "该用户已被删除。"
+      status_inactive:
+        other: "该用户未激活。"
     config:
       read_config_failed:
         other: 读取配置失败
diff --git a/internal/base/reason/reason.go b/internal/base/reason/reason.go
index f318e335..953c316e 100644
--- a/internal/base/reason/reason.go
+++ b/internal/base/reason/reason.go
@@ -111,6 +111,10 @@ const (
        MetaObjectNotFound               = "error.meta.object_not_found"
        BadgeObjectNotFound              = "error.badge.object_not_found"
        StatusInvalid                    = "error.common.status_invalid"
+       UserStatusInactive               = "error.user.status_inactive"
+       UserStatusSuspendedForever       = "error.user.status_suspended_forever"
+       UserStatusSuspendedUntil         = "error.user.status_suspended_until"
+       UserStatusDeleted                = "error.user.status_deleted"
 )
 
 // user external login reasons
diff --git a/internal/schema/user_schema.go b/internal/schema/user_schema.go
index dd65cba9..a320ca9b 100644
--- a/internal/schema/user_schema.go
+++ b/internal/schema/user_schema.go
@@ -20,10 +20,13 @@
 package schema
 
 import (
+       "context"
        "encoding/json"
 
+       "github.com/apache/answer/internal/base/handler"
        "github.com/apache/answer/internal/base/reason"
        "github.com/apache/answer/internal/base/translator"
+       "github.com/apache/answer/pkg/day"
        "github.com/segmentfault/pacman/errors"
 
        "github.com/apache/answer/internal/base/constant"
@@ -176,29 +179,36 @@ func (r *GetOtherUserInfoByUsernameResp) 
ConvertFromUserEntity(userInfo *entity.
        if !userInfo.SuspendedUntil.IsZero() && userInfo.SuspendedUntil != 
entity.PermanentSuspensionTime {
                r.SuspendedUntil = userInfo.SuspendedUntil.Unix()
        }
-       if userInfo.MailStatus == entity.EmailStatusToBeVerified {
-               statusMsgShow, ok := UserStatusShowMsg[11]
-               if ok {
-                       r.StatusMsg = statusMsgShow
-               }
-       } else {
-               statusMsgShow, ok := UserStatusShowMsg[userInfo.Status]
-               if ok {
-                       r.StatusMsg = statusMsgShow
-               }
-       }
+       r.StatusMsg = ""
 }
 
-const (
-       NoticeStatusOn  = 1
-       NoticeStatusOff = 2
-)
+func (r *GetOtherUserInfoByUsernameResp) ConvertFromUserEntityWithLang(ctx 
context.Context, userInfo *entity.User) {
+       _ = copier.Copy(r, userInfo)
+       r.CreatedAt = userInfo.CreatedAt.Unix()
+       r.LastLoginDate = userInfo.LastLoginDate.Unix()
+       r.Status = constant.ConvertUserStatus(userInfo.Status, 
userInfo.MailStatus)
+       if !userInfo.SuspendedUntil.IsZero() && userInfo.SuspendedUntil != 
entity.PermanentSuspensionTime {
+               r.SuspendedUntil = userInfo.SuspendedUntil.Unix()
+       }
 
-var UserStatusShowMsg = map[int]string{
-       1:  "",
-       9:  "<strong>This user was suspended forever.</strong> This user 
doesn't meet a community guideline.",
-       10: "This user was deleted.",
-       11: "This user is inactive.",
+       lang := handler.GetLangByCtx(ctx)
+       if userInfo.MailStatus == entity.EmailStatusToBeVerified {
+               r.StatusMsg = translator.Tr(lang, reason.UserStatusInactive)
+       }
+       switch userInfo.Status {
+       case entity.UserStatusSuspended:
+               if userInfo.SuspendedUntil.IsZero() || userInfo.SuspendedUntil 
== entity.PermanentSuspensionTime {
+                       r.StatusMsg = translator.Tr(lang, 
reason.UserStatusSuspendedForever)
+               } else {
+                       trans := translator.GlobalTrans.Tr(lang, 
"ui.dates.long_date_with_year")
+                       suspendedUntilFormatted := 
day.Format(userInfo.SuspendedUntil.Unix(), trans, "UTC")
+                       r.StatusMsg = translator.TrWithData(lang, 
reason.UserStatusSuspendedUntil, map[string]interface{}{
+                               "SuspendedUntil": suspendedUntilFormatted,
+                       })
+               }
+       case entity.UserStatusDeleted:
+               r.StatusMsg = translator.Tr(lang, reason.UserStatusDeleted)
+       }
 }
 
 // UserEmailLoginReq user email login request
diff --git a/internal/service/content/user_service.go 
b/internal/service/content/user_service.go
index 1c94d22d..81f7ac82 100644
--- a/internal/service/content/user_service.go
+++ b/internal/service/content/user_service.go
@@ -141,7 +141,7 @@ func (us *UserService) GetOtherUserInfoByUsername(ctx 
context.Context, req *sche
                return nil, errors.NotFound(reason.UserNotFound)
        }
        resp = &schema.GetOtherUserInfoByUsernameResp{}
-       resp.ConvertFromUserEntity(userInfo)
+       resp.ConvertFromUserEntityWithLang(ctx, userInfo)
        resp.Avatar = us.siteInfoService.FormatAvatar(ctx, userInfo.Avatar, 
userInfo.EMail, userInfo.Status).GetURL()
 
        // Only the user himself and the administrator can see the hidden 
questions

Reply via email to