diff --git a/frontend/app/locales/zh.json b/frontend/app/locales/zh.json
new file mode 100644
index 00000000..17206bef
--- /dev/null
+++ b/frontend/app/locales/zh.json
@@ -0,0 +1,169 @@
+{
+ "anonymousLoginForm.length-limit": "用户名最少需要3个字符",
+ "anonymousLoginForm.log-in": "登录",
+ "anonymousLoginForm.symbol-limit": "用户名必须以字母开头并且只能包含字母、数字、下划线或空格",
+ "anonymousLoginForm.user-name": "用户名",
+ "authPanel.anonymous-provider": "匿名",
+ "authPanel.disable-comments": "禁用评论",
+ "authPanel.disabled-cookies": "禁用第三方cookie阻止登录或在其中打开评论",
+ "authPanel.enable-comments": "启用评论",
+ "authPanel.enable-cookies": "允许使用cookie登录并发表评论",
+ "authPanel.hide-settings": "隐藏设置",
+ "authPanel.logged-as": "您以以下身份登录",
+ "authPanel.login": "登入:",
+ "authPanel.logout": "登出?",
+ "authPanel.new-page": "新页面",
+ "authPanel.or-provider": "或",
+ "authPanel.other-provider": "其它",
+ "authPanel.read-only": "只读",
+ "authPanel.request-to-delete-data": "请求删除我的数据",
+ "authPanel.show-settings": "显示设置",
+ "blockingDuration.day": "一天",
+ "blockingDuration.month": "一个月",
+ "blockingDuration.permanently": "永久",
+ "blockingDuration.week": "一周",
+ "comment.block": "封禁",
+ "comment.block-user": "是否封禁 {userName} {duration}?",
+ "comment.blocked-user": "已封禁用户",
+ "comment.blocking-period": "封禁期限",
+ "comment.cancel": "取消",
+ "comment.controversy": "争议: {value}",
+ "comment.copied": "已复制!",
+ "comment.copy": "复制",
+ "comment.delete": "删除",
+ "comment.delete-message": "是否删除这条评论?",
+ "comment.deleted-comment": "此评论已删除",
+ "comment.deleted-user": "已删除用户",
+ "comment.edit": "编辑",
+ "comment.expired-time": "编辑时间已过期",
+ "comment.go-to-parent": "转到父评论",
+ "comment.hide": "隐藏",
+ "comment.hide-user-comment": "您要隐藏{userName}的评论吗?",
+ "comment.pin": "置顶",
+ "comment.pin-comment": "您要置顶此评论吗?",
+ "comment.reply": "回复",
+ "comment.time": "{day} {time}",
+ "comment.toggle-verification": "切换认证",
+ "comment.unblock": "解除封禁",
+ "comment.unblock-user": "您是否要取消封禁此用户?",
+ "comment.unpin": "取消置顶",
+ "comment.unpin-comment": "您要取消置顶此评论吗?",
+ "comment.unverified-user": "未认证的用户",
+ "comment.unverify-user": "您是否要取消认证{userName}?",
+ "comment.verified-user": "认证用户",
+ "comment.verify-user": "您是否要设置{userName}为认证用户?",
+ "comment.vote-error": "投票失败: {voteErrorMessage}",
+ "commentForm.anonymous-uploading-disabled": "未经授权的用户无法上传图片。 上传之前,您应该先登录。",
+ "commentForm.exceeded-size": "{fileName}超出了{maxImageSize}的大小限制",
+ "commentForm.input-placeholder": "在此填写评论",
+ "commentForm.new-comment": "新评论",
+ "commentForm.notice-about-styling": "支持使用 Markdown 样式",
+ "commentForm.preview": "预览",
+ "commentForm.reply": "回复",
+ "commentForm.save": "保存",
+ "commentForm.send": "发送",
+ "commentForm.subscribe-by": "订阅评论:",
+ "commentForm.subscribe-or": "或",
+ "commentForm.unexpected-error": "出了些问题,请稍后再试。",
+ "commentForm.upload-file-fail": "{fileName} 上传失败,错误信息: \"{errorMessage}\"",
+ "commentForm.uploading": "上传中...",
+ "commentForm.uploading-file": "{fileName} 上传中...",
+ "commentSort.sort-by": "排序方式",
+ "commentsSort.best": "最佳",
+ "commentsSort.least-controversial": "争议最小",
+ "commentsSort.least-recently-updated": "最近更新最少",
+ "commentsSort.most-controversial": "争议最多",
+ "commentsSort.newest": "最新",
+ "commentsSort.oldest": "最旧",
+ "commentsSort.recently-updated": "最近更新最多",
+ "commentsSort.worst": "最差",
+ "emailLoginForm.back": "返回",
+ "emailLoginForm.confirm": "确认",
+ "emailLoginForm.email-address": "Email地址",
+ "emailLoginForm.empty-token": "Token字段不能为空",
+ "emailLoginForm.expired-token": "Token已过期",
+ "emailLoginForm.invalid-email": "Email地址应为有效的电子邮件地址",
+ "emailLoginForm.loading": "加载中...",
+ "emailLoginForm.send-verification": "发送验证",
+ "emailLoginForm.token": "Token",
+ "emailLoginForm.user-not-found": "找不到用户",
+ "errors.0": "出了些问题,请稍后再试。",
+ "errors.1": "找不到评论。 请刷新页面,然后重试。",
+ "errors.10": "编辑评论为时已晚。",
+ "errors.11": "评论已回复,无法编辑。",
+ "errors.12": "无法保存投票结果,请稍后再试。",
+ "errors.13": "您不能为自己的评论投票。",
+ "errors.14": "您已经对评论投了赞成票。",
+ "errors.15": "该评论的投票太多。",
+ "errors.16": "该评论已达到最低分数。",
+ "errors.17": "操作被拒绝,请稍后再试。",
+ "errors.18": "找不到请求的文件。",
+ "errors.2": "无法解组传入的请求。",
+ "errors.3": "您无权执行此操作。",
+ "errors.4": "无效的评论数据。",
+ "errors.5": "找不到评论。 请刷新页面,然后重试。",
+ "errors.6": "找不到网站。 请刷新页面,然后重试。",
+ "errors.7": "用户已被封禁。",
+ "errors.8": "用户已被封禁。",
+ "errors.9": "评论更改失败,请稍后再试。",
+ "errors.failed-fetch": "请求失败,请检查您的互联网连接或稍后再试。",
+ "errors.forbidden": "禁止访问",
+ "errors.not-authorized": "未经授权。",
+ "errors.to-many-request": "您已达到最大请求数限制。",
+ "errors.unexpected-error": "出了些问题。",
+ "root.pinned-comments": "置顶的评论",
+ "root.powered-by": "本站评论系统由Remark42提供支持",
+ "root.show-more": "显示更多",
+ "settings.block": "封禁",
+ "settings.block-time": "直到 {day} {time}",
+ "settings.block-user": "您要封禁{userName}吗?",
+ "settings.blocked-users-header": "已封禁用户:",
+ "settings.blocked-users-title": "已封禁用户",
+ "settings.hidden-user-header": "已隐藏评论用户:",
+ "settings.hidden-users-title": "已隐藏评论用户",
+ "settings.hide": "隐藏",
+ "settings.no-blocked-users": "没有被封禁的用户。",
+ "settings.no-hidden-users": "没有被隐藏评论的用户。",
+ "settings.permanently": "永久地",
+ "settings.show": "显示",
+ "settings.unblock": "解除封禁",
+ "settings.unblock-user": "你想解除对{userName}的封禁?",
+ "settings.unknown": "未知",
+ "subscribeByEmail.back": "返回",
+ "subscribeByEmail.close": "关闭",
+ "subscribeByEmail.email": "Email",
+ "subscribeByEmail.expired-token": "token已经过期",
+ "subscribeByEmail.have-been-subscribed": "您已通过电子邮件订阅了更新通知",
+ "subscribeByEmail.have-been-unsubscribed": "您已退订电子邮件更新通知",
+ "subscribeByEmail.only-registered-users": "仅适用于注册用户",
+ "subscribeByEmail.submit": "年底",
+ "subscribeByEmail.subscribe": "订阅",
+ "subscribeByEmail.subscribe-by-email": "通过邮件订阅",
+ "subscribeByEmail.subscribe-to-replies": "订阅回复",
+ "subscribeByEmail.subscribed": "您当前通过电子邮件订阅了更新通知",
+ "subscribeByEmail.token": "Token",
+ "subscribeByEmail.unsubscribe": "退订",
+ "subscribeByRSS.button-title": "通过RSS订阅",
+ "subscribeByRSS.replies": "回复",
+ "subscribeByRSS.site": "站点",
+ "subscribeByRSS.thread": "主题",
+ "subscribeByRSS.title": "RSS",
+ "toolbar.attach-image": "可以从剪贴板拖放或粘贴来上传图片",
+ "toolbar.bold": "添加粗体 ",
+ "toolbar.code": "插入代码",
+ "toolbar.header": "添加标题文字",
+ "toolbar.italic": "添加斜体文字 ",
+ "toolbar.link": "添加链接 ",
+ "toolbar.ordered-list": "添加有序编号列表",
+ "toolbar.quote": "插入引用文本",
+ "toolbar.unordered-list": "添加无序项目列表",
+ "user-info.last-comments": "最近的评论由{userName}发表",
+ "user-info.unexpected-error": "出问题了",
+ "vote.anonymous": "匿名用户无法投票",
+ "vote.deleted": "无法为已删除的评论投票",
+ "vote.guest": "登录以投票",
+ "vote.only-positive": "只允许正面分数",
+ "vote.only-post-page": "只能在文章页面上投票",
+ "vote.own-comment": "无法给自己的评论投票",
+ "vote.readonly": "无法对只读主题进行投票"
+}
diff --git a/frontend/app/utils/loadLocale.ts b/frontend/app/utils/loadLocale.ts
index e81fdf8d..aaee4429 100644
--- a/frontend/app/utils/loadLocale.ts
+++ b/frontend/app/utils/loadLocale.ts
@@ -23,6 +23,11 @@ export async function loadLocale(locale: string): Promise
.then(res => res.default)
.catch(() => enMessages);
}
+ if (locale === 'zh') {
+ return import(/* webpackChunkName: "zh" */ '../locales/zh.json')
+ .then(res => res.default)
+ .catch(() => enMessages);
+ }
return enMessages;
}
diff --git a/frontend/tasks/supportedLocales.json b/frontend/tasks/supportedLocales.json
index 8b10181c..4cdf4433 100644
--- a/frontend/tasks/supportedLocales.json
+++ b/frontend/tasks/supportedLocales.json
@@ -1 +1 @@
-["en", "ru", "de", "fi", "es"]
+["en", "ru", "de", "fi", "es", "zh"]