From ee3ed653568a8120eea417cfe36e4e19d34063d3 Mon Sep 17 00:00:00 2001 From: JustSong Date: Sat, 1 Feb 2025 23:48:05 +0800 Subject: [PATCH] feat: i18n support --- middleware/rate-limit.go | 3 +- .../public/locales/en/translation.json | 45 +++++++++++ .../public/locales/zh/translation.json | 45 +++++++++++ web/default/src/components/UsersTable.js | 78 +++++++++++-------- web/default/src/pages/User/index.js | 25 +++--- 5 files changed, 151 insertions(+), 45 deletions(-) diff --git a/middleware/rate-limit.go b/middleware/rate-limit.go index c1be92f3..63d7d549 100644 --- a/middleware/rate-limit.go +++ b/middleware/rate-limit.go @@ -7,6 +7,7 @@ import ( "time" "github.com/gin-gonic/gin" + "github.com/songquanpeng/one-api/common" "github.com/songquanpeng/one-api/common/config" ) @@ -71,7 +72,7 @@ func memoryRateLimiter(c *gin.Context, maxRequestNum int, duration int64, mark s } func rateLimitFactory(maxRequestNum int, duration int64, mark string) func(c *gin.Context) { - if maxRequestNum == 0 { + if maxRequestNum == 0 || config.DebugEnabled { return func(c *gin.Context) { c.Next() } diff --git a/web/default/public/locales/en/translation.json b/web/default/public/locales/en/translation.json index 0265b7b9..b65cff84 100644 --- a/web/default/public/locales/en/translation.json +++ b/web/default/public/locales/en/translation.json @@ -305,6 +305,7 @@ } }, "user": { + "title": "User Management", "edit": { "title": "Update User Information", "username": "Username", @@ -337,6 +338,50 @@ }, "messages": { "create_success": "User account created successfully!" + }, + "search": "Search users...", + "table": { + "id": "ID", + "username": "Username", + "group": "Group", + "quota": "Quota", + "role_text": "Role", + "status_text": "Status", + "actions": "Actions", + "remaining_quota": "Remaining Quota", + "used_quota": "Used Quota", + "request_count": "Request Count", + "role_types": { + "normal": "Normal User", + "admin": "Admin", + "super_admin": "Super Admin", + "unknown": "Unknown Role" + }, + "status_types": { + "activated": "Activated", + "banned": "Banned", + "unknown": "Unknown Status" + }, + "sort": { + "default": "Default Order", + "by_quota": "Sort by Remaining Quota", + "by_used_quota": "Sort by Used Quota", + "by_request_count": "Sort by Request Count" + }, + "sort_by": "Sort By" + }, + "buttons": { + "add": "Add New User", + "delete": "Delete", + "delete_user": "Delete User", + "enable": "Enable", + "disable": "Disable", + "edit": "Edit", + "promote": "Promote", + "demote": "Demote" + }, + "messages": { + "operation_success": "Operation completed successfully!" } } } diff --git a/web/default/public/locales/zh/translation.json b/web/default/public/locales/zh/translation.json index ff1bdbb0..c21f9507 100644 --- a/web/default/public/locales/zh/translation.json +++ b/web/default/public/locales/zh/translation.json @@ -305,6 +305,7 @@ } }, "user": { + "title": "用户管理", "edit": { "title": "更新用户信息", "username": "用户名", @@ -337,6 +338,50 @@ }, "messages": { "create_success": "用户账户创建成功!" + }, + "search": "搜索用户...", + "table": { + "id": "ID", + "username": "用户名", + "group": "分组", + "quota": "额度", + "role_text": "角色", + "status_text": "状态", + "actions": "操作", + "remaining_quota": "剩余额度", + "used_quota": "已用额度", + "request_count": "请求次数", + "role_types": { + "normal": "普通用户", + "admin": "管理员", + "super_admin": "超级管理员", + "unknown": "未知身份" + }, + "status_types": { + "activated": "已激活", + "banned": "已封禁", + "unknown": "未知状态" + }, + "sort": { + "default": "默认排序", + "by_quota": "按剩余额度排序", + "by_used_quota": "按已用额度排序", + "by_request_count": "按请求次数排序" + }, + "sort_by": "排序方式" + }, + "buttons": { + "add": "添加新的用户", + "delete": "删除", + "delete_user": "删除用户", + "enable": "启用", + "disable": "禁用", + "edit": "编辑", + "promote": "提升", + "demote": "降级" + }, + "messages": { + "operation_success": "操作成功完成!" } } } diff --git a/web/default/src/components/UsersTable.js b/web/default/src/components/UsersTable.js index 4951d104..d38fb218 100644 --- a/web/default/src/components/UsersTable.js +++ b/web/default/src/components/UsersTable.js @@ -20,16 +20,18 @@ import { renderText, } from '../helpers/render'; -function renderRole(role) { +function renderRole(role, t) { switch (role) { case 1: - return ; + return ; case 10: - return ; + return ; case 100: - return ; + return ( + + ); default: - return ; + return ; } } @@ -85,7 +87,7 @@ const UsersTable = () => { }); const { success, message } = res.data; if (success) { - showSuccess('操作成功完成!'); + showSuccess(t('user.messages.operation_success')); let user = res.data.data; let newUsers = [...users]; let realIdx = (activePage - 1) * ITEMS_PER_PAGE + idx; @@ -105,17 +107,17 @@ const UsersTable = () => { const renderStatus = (status) => { switch (status) { case 1: - return ; + return ; case 2: return ( ); default: return ( ); } @@ -177,7 +179,7 @@ const UsersTable = () => { icon='search' fluid iconPosition='left' - placeholder='搜索用户的 ID,用户名,显示名称,以及邮箱地址 ...' + placeholder={t('user.search')} value={searchKeyword} loading={searching} onChange={handleKeywordChange} @@ -193,7 +195,7 @@ const UsersTable = () => { sortUser('id'); }} > - ID + {t('user.table.id')} { sortUser('username'); }} > - 用户名 + {t('user.table.username')} { sortUser('group'); }} > - 分组 + {t('user.table.group')} { sortUser('quota'); }} > - 统计信息 + {t('user.table.quota')} { sortUser('role'); }} > - 用户角色 + {t('user.table.role_text')} { sortUser('status'); }} > - 状态 + {t('user.table.status_text')} - 操作 + {t('user.table.actions')} @@ -267,23 +269,25 @@ const UsersTable = () => { {/**/} {renderQuota(user.quota, t)}} + content={t('user.table.remaining_quota')} + trigger={ + + } /> {renderQuota(user.used_quota, t)} } /> {renderNumber(user.request_count)} } /> - {renderRole(user.role)} + {renderRole(user.role, t)} {renderStatus(user.status)}
@@ -295,7 +299,7 @@ const UsersTable = () => { }} disabled={user.role === 100} > - 提升 + {t('user.buttons.promote')} { negative disabled={user.role === 100} > - 删除 + {t('user.buttons.delete')} } on='click' @@ -327,7 +331,7 @@ const UsersTable = () => { manageUser(user.username, 'delete', idx); }} > - 删除用户 {user.username} + {t('user.buttons.delete_user')} {user.username}
@@ -361,22 +367,26 @@ const UsersTable = () => { ( -
- - - 用户管理 - - - -
-); +const User = () => { + const { t } = useTranslation(); + + return ( +
+ + + {t('user.title')} + + + +
+ ); +}; export default User;