From ba287195b5e7ca89302f1ad227e1939ca5029688 Mon Sep 17 00:00:00 2001 From: moonrailgun Date: Wed, 17 May 2023 18:00:41 +0800 Subject: [PATCH] feat(admin-next): add custom translation --- package.json | 2 + server/admin-next/src/client/App.tsx | 7 +- server/admin-next/src/client/fields.ts | 46 ++---- server/admin-next/src/client/i18n.ts | 151 ++++++++++++++++++ .../src/client/routes/network/index.tsx | 18 ++- .../admin-next/src/client/routes/socketio.tsx | 11 +- .../src/client/routes/system/index.tsx | 17 +- 7 files changed, 199 insertions(+), 53 deletions(-) create mode 100644 server/admin-next/src/client/i18n.ts diff --git a/package.json b/package.json index 620905af..2e210c37 100644 --- a/package.json +++ b/package.json @@ -11,10 +11,12 @@ "dev:admin": "cd server/admin && pnpm dev", "start:service": "cd server && pnpm start:service", "start:admin": "cd server/admin && pnpm start", + "start:admin-next": "cd server/admin-next && pnpm start", "build": "concurrently npm:build:web npm:build:server npm:build:admin && cp -r client/web/dist/* server/dist/public && cp -r client/web/dist/* server/dist/public", "build:web": "cd client/web && pnpm build", "build:server": "cd server && pnpm build && echo \"Install server side plugin:\" && pnpm run plugin:install com.msgbyte.tasks com.msgbyte.linkmeta com.msgbyte.github com.msgbyte.simplenotify com.msgbyte.topic com.msgbyte.agora com.msgbyte.wxpusher && mkdir -p ./dist/public && cp -r ./public/plugins ./dist/public && cp ./public/registry-be.json ./dist/public", "build:admin": "cd server/admin && pnpm build", + "build:admin-next": "cd server/admin-next && pnpm build", "check:type": "concurrently npm:check:type:client npm:check:type:server", "check:type:client": "cd client/web && tsc --noEmit", "check:type:server": "cd server && tsc --noEmit", diff --git a/server/admin-next/src/client/App.tsx b/server/admin-next/src/client/App.tsx index 221bf31e..e4160c3c 100644 --- a/server/admin-next/src/client/App.tsx +++ b/server/admin-next/src/client/App.tsx @@ -24,6 +24,7 @@ import { messageFields, userFields, } from './fields'; +import { i18n } from './i18n'; import { httpClient } from './request'; import { TailchatNetwork } from './routes/network'; import { SocketIOAdmin } from './routes/socketio'; @@ -37,10 +38,10 @@ function App() { basename="/admin" dataProvider={dataProvider} authProvider={authProvider} + i18n={i18n} > } list={ } list={ } list={ } list={ } list={} /> diff --git a/server/admin-next/src/client/fields.ts b/server/admin-next/src/client/fields.ts index 60da5708..1cbbb100 100644 --- a/server/admin-next/src/client/fields.ts +++ b/server/admin-next/src/client/fields.ts @@ -7,18 +7,17 @@ import { createDateTimeField, createUrlField, emailValidator, + createNumberField, } from 'tushan'; import { createFileSizeField } from './components/field/filesize'; export const userFields = [ createTextField('id', { - label: 'ID', list: { sort: true, }, }), createEmailField('email', { - label: 'Email', edit: { rules: [ { @@ -30,11 +29,8 @@ export const userFields = [ ], }, }), - createTextField('nickname', { - label: 'Nickname', - }), + createTextField('nickname'), createTextField('discriminator', { - label: 'Discriminator', edit: { rules: [ { @@ -46,14 +42,9 @@ export const userFields = [ ], }, }), - createBooleanField('temporary', { - label: 'Temporary', - }), - createAvatarField('avatar', { - label: 'Avatar', - }), + createBooleanField('temporary'), + createAvatarField('avatar'), createJSONField('settings', { - label: 'Settings', list: { width: 200, }, @@ -67,15 +58,9 @@ export const userFields = [ ]; export const messageFields = [ - createTextField('id', { - label: 'ID', - }), - createTextField('content', { - label: 'Content', - }), - createTextField('author', { - label: 'Author', - }), + createTextField('id'), + createTextField('content'), + createTextField('author'), createTextField('groupId'), createTextField('converseId'), createBooleanField('hasRecall'), @@ -89,9 +74,7 @@ export const messageFields = [ ]; export const groupFields = [ - createTextField('id', { - label: 'ID', - }), + createTextField('id'), createTextField('name'), createTextField('owner'), createTextField('members.length', { @@ -122,9 +105,7 @@ export const fileFields = [ width: 120, }, }), - createTextField('metaData.content-type', { - label: 'Content Type', - }), + createTextField('metaData.content-type'), createTextField('etag'), createTextField('userId'), createDateTimeField('createdAt'), @@ -133,11 +114,10 @@ export const fileFields = [ export const mailFields = [ createTextField('userId'), createTextField('host'), - createTextField('port'), - createTextField('port'), - createTextField('secure'), - createTextField('is_success'), - createTextField('data'), + createNumberField('port'), + createBooleanField('secure'), + createBooleanField('is_success'), + createJSONField('data'), createTextField('error'), createDateTimeField('createdAt'), ]; diff --git a/server/admin-next/src/client/i18n.ts b/server/admin-next/src/client/i18n.ts new file mode 100644 index 00000000..c1b00629 --- /dev/null +++ b/server/admin-next/src/client/i18n.ts @@ -0,0 +1,151 @@ +import { TushanContextProps } from 'tushan'; +import { i18nEnTranslation } from 'tushan/client/i18n/resources/en'; +import { i18nZhTranslation } from 'tushan/client/i18n/resources/zh'; + +export const i18n: TushanContextProps['i18n'] = { + languages: [ + { + key: 'en', + label: 'English', + translation: { + ...i18nEnTranslation, + custom: { + network: { + nodeList: 'Node List', + id: 'ID', + hostname: 'Host Name', + cpuUsage: 'CPU Usage', + ipList: 'IP List', + sdkVersion: 'SDK Version', + serviceList: 'Service List', + actionList: 'Action List', + eventList: 'Event List', + }, + socketio: { + tip1: 'The server URL is:', + tip2: 'The account password is the account password of Tailchat Admin', + tip3: 'NOTICE: please check "Advanced options" then select "websocket only" and "MessagePack parser"', + btn: 'Open the Admin platform', + }, + config: { + uploadFileLimit: 'Upload file limit (Byte)', + emailVerification: 'Mandatory Email Verification', + serverName: 'Server Name', + serverEntryImage: 'Server Entry Page Image', + }, + }, + }, + }, + { + key: 'zh', + label: '简体中文', + translation: { + ...i18nZhTranslation, + resources: { + users: { + name: '用户管理', + fields: { + id: '用户ID', + email: '邮箱', + avatar: '头像', + username: '用户名', + password: '密码', + nickname: '昵称', + discriminator: '标识符', + temporary: '是否游客', + type: '用户类型', + settings: '用户设置', + createdAt: '创建时间', + }, + }, + messages: { + name: '消息管理', + fields: { + content: '内容', + author: '作者', + groupId: '群组ID', + converseId: '会话ID', + hasRecall: '撤回', + reactions: '消息反应', + createdAt: '创建时间', + }, + }, + groups: { + name: '群组管理', + fields: { + id: '群组ID', + name: '群组名称', + avatar: '头像', + owner: '管理员', + 'members.length': '成员数量', + 'panels.length': '面板数量', + roles: '角色', + config: '配置信息', + fallbackPermissions: '默认权限', + createdAt: '创建时间', + updatedAt: '更新时间', + }, + }, + file: { + name: '文件管理', + fields: { + objectName: '对象存储名', + url: '文件路径', + size: '文件大小', + 'metaData.content-type': '文件类型', + userId: '存储用户', + createdAt: '创建时间', + }, + }, + mail: { + name: '邮件历史', + fields: { + userId: '用户ID', + host: '发信主机', + port: '发信端口', + secure: '是否加密', + is_success: '是否成功', + data: '数据', + error: '错误信息', + createdAt: '创建时间', + }, + }, + system: { + name: '系统设置', + }, + network: { + name: '微服务网络', + }, + socketio: { + name: 'Socket.IO 长链接', + }, + }, + custom: { + network: { + nodeList: '节点列表', + id: 'ID', + hostname: '主机名', + cpuUsage: 'CPU占用', + ipList: 'IP地址列表', + sdkVersion: 'SDK版本', + serviceList: '服务列表', + actionList: '操作列表', + eventList: '事件列表', + }, + socketio: { + tip1: '服务器URL为:', + tip2: '账号密码为Tailchat后台的账号密码', + tip3: '注意: 请打开 "Advanced options" 并选中 "websocket only" 与 "MessagePack parser"', + btn: '打开管理平台', + }, + config: { + uploadFileLimit: '上传文件限制(Byte)', + emailVerification: '邮箱强制验证', + serverName: '服务器名', + serverEntryImage: '服务器登录图', + }, + }, + }, + }, + ], +}; diff --git a/server/admin-next/src/client/routes/network/index.tsx b/server/admin-next/src/client/routes/network/index.tsx index 735811cf..cfcfb157 100644 --- a/server/admin-next/src/client/routes/network/index.tsx +++ b/server/admin-next/src/client/routes/network/index.tsx @@ -2,7 +2,14 @@ import React from 'react'; import { request } from '../../request'; import _uniq from 'lodash/uniq'; import { TagItems } from '../../components/TagItems'; -import { Card, Spin, Table, Typography, useAsync } from 'tushan'; +import { + Card, + Spin, + Table, + Typography, + useAsync, + useTranslation, +} from 'tushan'; /** * Tailchat 网络状态 @@ -13,6 +20,7 @@ export const TailchatNetwork: React.FC = React.memo(() => { return data; }); + const { t } = useTranslation(); if (loading) { return ; @@ -21,7 +29,7 @@ export const TailchatNetwork: React.FC = React.memo(() => { return ( - {'custom.network.nodeList'} + {t('custom.network.nodeList')} { /> - {'custom.network.serviceList'} + {t('custom.network.serviceList')}
@@ -67,14 +75,14 @@ export const TailchatNetwork: React.FC = React.memo(() => {
- {'custom.network.actionList'} + {t('custom.network.actionList')}
(data.actions ?? [])} />
- {'custom.network.eventList'} + {t('custom.network.eventList')}
diff --git a/server/admin-next/src/client/routes/socketio.tsx b/server/admin-next/src/client/routes/socketio.tsx index ca792360..505ed92f 100644 --- a/server/admin-next/src/client/routes/socketio.tsx +++ b/server/admin-next/src/client/routes/socketio.tsx @@ -1,23 +1,24 @@ import React from 'react'; -import { Button, Card, Typography } from 'tushan'; +import { Button, Card, Typography, useTranslation } from 'tushan'; /** * SocketIO 管理 */ export const SocketIOAdmin: React.FC = React.memo(() => { const protocol = window.location.protocol === 'https:' ? 'wss' : 'ws'; + const { t } = useTranslation(); return (
- {'custom.socketio.tip1'}{' '} + {t('custom.socketio.tip1')}{' '} {protocol}://{window.location.host} - {'custom.socketio.tip2'} - {'custom.socketio.tip3'} + {t('custom.socketio.tip2')} + {t('custom.socketio.tip3')}
); diff --git a/server/admin-next/src/client/routes/system/index.tsx b/server/admin-next/src/client/routes/system/index.tsx index 626e0d9c..8c46d26c 100644 --- a/server/admin-next/src/client/routes/system/index.tsx +++ b/server/admin-next/src/client/routes/system/index.tsx @@ -9,6 +9,7 @@ import { Message, Form, Upload, + useTranslation, } from 'tushan'; import { IconCheck, IconClose, IconDelete } from 'tushan/icon'; import { TailchatImage } from '../../components/TailchatImage'; @@ -17,13 +18,14 @@ import { TailchatImage } from '../../components/TailchatImage'; * Tailchat 系统设置 */ export const SystemConfig: React.FC = React.memo(() => { - const [{ value: config = {}, loading }, fetchConfig] = useAsyncRequest( + const [{ value: config = {}, loading, error }, fetchConfig] = useAsyncRequest( async () => { const { data } = await request.get('/config/client'); return data.config ?? {}; } ); + const { t } = useTranslation(); useEffect(() => { fetchConfig(); @@ -89,17 +91,22 @@ export const SystemConfig: React.FC = React.memo(() => { return ; } + if (error) { + console.log('error', error); + return
{String(error)}
; + } + return (
- + {config.uploadFileLimit} - + {config.emailVerification ? : } - + setServerName(val)} @@ -108,7 +115,7 @@ export const SystemConfig: React.FC = React.memo(() => { /> - +
{config?.serverEntryImage ? (