From e820e5599bc289e910ed85a2a6f34708ea145bbf Mon Sep 17 00:00:00 2001 From: Elvis Liao Date: Fri, 27 Sep 2024 00:42:40 +0800 Subject: [PATCH] wip: i18n - Change locales json to one-dimensional format --- ui/src/components/certimate/EmailsEdit.tsx | 14 +- ui/src/components/certimate/Version.tsx | 5 +- ui/src/i18n/locales/en.json | 103 +++++++++++- ui/src/i18n/locales/zh.json | 172 +++++++++++---------- ui/src/pages/access/Access.tsx | 35 +++-- ui/src/pages/domains/Edit.tsx | 72 ++++----- 6 files changed, 259 insertions(+), 142 deletions(-) diff --git a/ui/src/components/certimate/EmailsEdit.tsx b/ui/src/components/certimate/EmailsEdit.tsx index d1d2fc97..6da10ea3 100644 --- a/ui/src/components/certimate/EmailsEdit.tsx +++ b/ui/src/components/certimate/EmailsEdit.tsx @@ -10,6 +10,7 @@ import { import { z } from "zod"; import { zodResolver } from "@hookform/resolvers/zod"; import { useForm } from "react-hook-form"; +import { useTranslation } from "react-i18next"; import { Form, FormControl, @@ -39,9 +40,10 @@ const EmailsEdit = ({ className, trigger }: EmailsEditProps) => { } = useConfig(); const [open, setOpen] = useState(false); + const { t } = useTranslation(); const formSchema = z.object({ - email: z.string().email(), + email: z.string().email("email.valid.message"), }); const form = useForm>({ @@ -54,7 +56,7 @@ const EmailsEdit = ({ className, trigger }: EmailsEditProps) => { const onSubmit = async (data: z.infer) => { if ((emails.content as EmailsSetting).emails.includes(data.email)) { form.setError("email", { - message: "邮箱已存在", + message: "email.already.exist", }); return; } @@ -100,7 +102,7 @@ const EmailsEdit = ({ className, trigger }: EmailsEditProps) => { - 添加邮箱 + {t('email.add')}
@@ -118,9 +120,9 @@ const EmailsEdit = ({ className, trigger }: EmailsEditProps) => { name="email" render={({ field }) => ( - 邮箱 + {t('email')} - + @@ -129,7 +131,7 @@ const EmailsEdit = ({ className, trigger }: EmailsEditProps) => { />
- +
diff --git a/ui/src/components/certimate/Version.tsx b/ui/src/components/certimate/Version.tsx index 47bfa7ca..997ab11d 100644 --- a/ui/src/components/certimate/Version.tsx +++ b/ui/src/components/certimate/Version.tsx @@ -1,9 +1,12 @@ import { BookOpen } from "lucide-react"; +import { useTranslation } from "react-i18next"; import { Separator } from "../ui/separator"; import { version } from "@/domain/version"; const Version = () => { + const { t } = useTranslation() + return (
@@ -14,7 +17,7 @@ const Version = () => { className="flex items-center" > -
文档
+
{t('document')}
部署历史 查看详情。", - "empty": "请添加域名开始部署证书吧。", - "expiry.date": "有效期限", - "expiry.date1": "有效期 {{date}} 天", - "expiry.date2": "{{date}} 到期", - "last.execution.time": "最近执行时间", - "last.execution.status": "最近执行状态", - "last.execution.stage": "最近执行阶段", - "enable": "是否启用", - "start.deploying": "立即部署", - "forced.deployment": "强行部署", - "delete.confirm": "确定要删除域名吗?", - "edit": { - "title": "编辑域名", - "domain.verify.tips": "域名", - "dns.verify.tips": "请选择DNS服务商授权配置", - "target.type.verify.tips": "请选择部署服务类型" - } - }, + "domain.not.empty.verify.message": "请输入域名", + "domain.management.name": "域名列表", + "domain.management.start.deploy.succeed.tips": "已发起部署,请稍后查看部署日志。", + "domain.management.execution.failed": "执行失败", + "domain.management.execution.failed.tips": "执行失败,请在 <1>部署历史 查看详情。", + "domain.management.empty": "请添加域名开始部署证书吧。", + "domain.management.expiry.date": "有效期限", + "domain.management.expiry.date1": "有效期 {{date}} 天", + "domain.management.expiry.date2": "{{date}} 到期", + "domain.management.last.execution.time": "最近执行时间", + "domain.management.last.execution.status": "最近执行状态", + "domain.management.last.execution.stage": "最近执行阶段", + "domain.management.enable": "是否启用", + "domain.management.start.deploying": "立即部署", + "domain.management.forced.deployment": "强行部署", + "domain.management.delete.confirm": "确定要删除域名吗?", + "domain.management.edit.title": "编辑域名", + "domain.management.edit.dns.access.label": "DNS 服务商授权配置", + "domain.management.edit.dns.access.not.empty.message": "请选择DNS服务商授权配置", + "domain.management.edit.access.label": "服务商授权配置", + "domain.management.edit.access.not.empty.message": "请选择授权配置", + "domain.management.edit.target.type": "部署服务类型", + "domain.management.edit.target.type.not.empty.message": "请选择部署服务类型", + "domain.management.edit.succeed.tips": "域名编辑成功", + "domain.management.edit.target.access": "部署服务商授权配置", + "domain.management.edit.target.access.content.label": "服务商授权配置", + "domain.management.edit.target.access.not.empty.message": "请选择授权配置", + "domain.management.edit.target.access.verify.msg": "部署授权和部署授权组至少选一个", + "domain.management.edit.group.label": "部署配置组(用于将一个域名证书部署到多个 ssh 主机)", + "domain.management.edit.group.not.empty.message": "请选择分组", + "domain.management.edit.email.not.empty.message": "请选择邮箱", + "domain.management.edit.email.description": "(申请证书需要提供邮箱)", + "domain.management.edit.variables.placeholder": "可在SSH部署中使用,形如:\nkey=val;\nkey2=val2;", + "domain.management.edit.dns.placeholder": "自定义域名服务器,多个用分号隔开,如:\n8.8.8.8;\n8.8.4.4;", + "domain.management.add.succeed.tips": "域名添加成功", + "email.add": "添加邮箱", + "email.list": "邮箱列表", + "email.valid.message": "请输入正确的邮箱地址", + "email.already.exist": "邮箱已存在", + "email.not.empty.message": "请输入邮箱", "setting.notify.menu": "消息推送", "setting.submit": "确认修改", - "setting.account.email": { - "valid.message": "请输入正确的邮箱地址", - "placeholder": "请输入邮箱", - "change.succeed": "修改账户邮箱成功", - "change.failed": "修改账户邮箱失败" - }, + "setting.account.email.valid.message": "请输入正确的邮箱地址", + "setting.account.email.placeholder": "请输入邮箱", + "setting.account.email.change.succeed": "修改账户邮箱成功", + "setting.account.email.change.failed": "修改账户邮箱失败", "setting.account.log.back.in": "请重新登录", - "setting.password": { - "length.message": "密码至少10个字符", - "not.match": "两次密码不一致", - "change.succeed": "修改密码成功", - "change.failed": "修改密码失败", - "current.password": "当前密码", - "new.password": "新密码", - "confirm.password": "确认密码" - }, - "setting.notify": { - "template": { - "save.succeed": "通知模板保存成功", - "variables.tips": { - "title": "可选的变量, COUNT:即将过期张数", - "content": "可选的变量, COUNT:即将过期张数,DOMAINS:域名列表" - } - }, - "config": { - "enable": "是否启用", - "save.succeed": "配置保存成功", - "save.failed": "配置保存失败", - "save.failed.url.not.valid": "Url格式不正确" - } - }, - "deploy.progress": { - "check": "检查", - "apply": "获取", - "deploy": "部署" - } + "setting.password.length.message": "密码至少10个字符", + "setting.password.not.match": "两次密码不一致", + "setting.password.change.succeed": "修改密码成功", + "setting.password.change.failed": "修改密码失败", + "setting.password.current.password": "当前密码", + "setting.password.new.password": "新密码", + "setting.password.confirm.password": "确认密码", + "setting.notify.template.save.succeed": "通知模板保存成功", + "setting.notify.template.variables.tips.title": "可选的变量, COUNT:即将过期张数", + "setting.notify.template.variables.tips.content": "可选的变量, COUNT:即将过期张数,DOMAINS:域名列表", + "setting.notify.config.enable": "是否启用", + "setting.notify.config.save.succeed": "配置保存成功", + "setting.notify.config.save.failed": "配置保存失败", + "setting.notify.config.save.failed.url.not.valid": "Url格式不正确", + "deploy.progress.check": "检查", + "deploy.progress.apply": "获取", + "deploy.progress.deploy": "部署", + "access.management": "授权管理", + "access.add": "添加授权", + "access.list": "授权列表", + "access.type": "服务商", + "access.empty": "请添加授权开始部署证书吧。", + "access.group.management": "授权组管理", + "access.group.add": "添加授权组" } \ No newline at end of file diff --git a/ui/src/pages/access/Access.tsx b/ui/src/pages/access/Access.tsx index cbeb2679..3f955f29 100644 --- a/ui/src/pages/access/Access.tsx +++ b/ui/src/pages/access/Access.tsx @@ -9,6 +9,7 @@ import { Access as AccessType, accessTypeMap } from "@/domain/access"; import { convertZulu2Beijing } from "@/lib/time"; import { useConfig } from "@/providers/config"; import { remove } from "@/repository/access"; +import { t } from "i18next"; import { Key } from "lucide-react"; import { useLocation, useNavigate } from "react-router-dom"; @@ -46,11 +47,11 @@ const Access = () => { return (
-
授权管理
+
{t('access.management')}
{tab != "access_group" ? ( - 添加授权} op="add" /> + {t('access.add')}} op="add" /> ) : ( - 添加授权组} /> + {t('access.group.add')}} /> )}
@@ -66,7 +67,7 @@ const Access = () => { handleTabItemClick("access"); }} > - 授权管理 + {t('access.management')} { handleTabItemClick("access_group"); }} > - 授权组管理 + {t('access.group.management')} @@ -85,10 +86,10 @@ const Access = () => {
- 请添加授权开始部署证书吧。 + {t('access.empty')}
添加授权} + trigger={} op="add" className="mt-3" /> @@ -96,15 +97,15 @@ const Access = () => { ) : ( <>
-
名称
-
服务商
+
{t('name')}
+
{t('access.type')}
-
创建时间
-
更新时间
-
操作
+
{t('create.time')}
+
{t('update.time')}
+
{t('operation')}
- 授权列表 + {t('access.list')}
{accesses .filter((item) => { @@ -128,18 +129,18 @@ const Access = () => {
- 创建于{" "} + {t('created.in')}{" "} {access.created && convertZulu2Beijing(access.created)}
- 更新于{" "} + {t('updated.in')}{" "} {access.updated && convertZulu2Beijing(access.updated)}
- 编辑 + {t('edit')} } op="edit" @@ -153,7 +154,7 @@ const Access = () => { handleDelete(access); }} > - 删除 + {t('delete')}
diff --git a/ui/src/pages/domains/Edit.tsx b/ui/src/pages/domains/Edit.tsx index 3a4c4230..771b96bb 100644 --- a/ui/src/pages/domains/Edit.tsx +++ b/ui/src/pages/domains/Edit.tsx @@ -71,15 +71,15 @@ const Edit = () => { const formSchema = z.object({ id: z.string().optional(), domain: z.string().regex(/^(?:\*\.)?([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}$/, { - message: t('domain.management.edit.domain.verify.tips'), + message: 'domain.not.empty.verify.message', }), - email: z.string().email().optional(), + email: z.string().email('email.valid.message').optional(), access: z.string().regex(/^[a-zA-Z0-9]+$/, { - message: t('domain.management.edit.dns.verify.tips'), + message: 'domain.management.edit.dns.access.not.empty.message', }), targetAccess: z.string().optional(), targetType: z.string().regex(/^[a-zA-Z0-9-]+$/, { - message: t('domain.management.edit.target.type.verify.tips'), + message: 'domain.management.edit.target.type.not.empty.message', }), variables: z.string().optional(), group: z.string().optional(), @@ -140,11 +140,11 @@ const Edit = () => { if (group == "" && targetAccess == "") { form.setError("group", { type: "manual", - message: "部署授权和部署授权组至少选一个", + message: 'domain.management.edit.target.access.verify.msg', }); form.setError("targetAccess", { type: "manual", - message: "部署授权和部署授权组至少选一个", + message: 'domain.management.edit.target.access.verify.msg', }); return; } @@ -164,13 +164,13 @@ const Edit = () => { try { await save(req); - let description = "域名编辑成功"; + let description = t('domain.management.edit.succeed.tips'); if (req.id == "") { - description = "域名添加成功"; + description = t('domain.management.add.succeed.tips'); } toast({ - title: "成功", + title: t('succeed'), description, }); navigate("/domains"); @@ -195,7 +195,7 @@ const Edit = () => {
- {domain?.id ? "编辑" : "新增"}域名 + {domain?.id ? t('domain.edit') : t('domain.add')}
@@ -208,7 +208,7 @@ const Edit = () => { setTab("base"); }} > - 基础设置 + {t('basic.setting')}
{ setTab("advance"); }} > - 高级设置 + {t('advanced.setting')}
@@ -234,9 +234,9 @@ const Edit = () => { name="domain" render={({ field }) => (
} /> @@ -268,11 +268,11 @@ const Edit = () => { }} > - + - 邮箱列表 + {t('email.list')} {(emails.content as EmailsSetting).emails.map( (item) => ( @@ -295,12 +295,12 @@ const Edit = () => { render={({ field }) => (
} op="add" @@ -315,11 +315,11 @@ const Edit = () => { }} > - + - 服务商授权配置 + {t('domain.management.edit.access.label')} {accesses .filter((item) => item.usage != "deploy") .map((item) => ( @@ -351,7 +351,7 @@ const Edit = () => { name="targetType" render={({ field }) => (