diff --git a/packages/better-search/locale/zh.yaml b/packages/better-search/locale/zh.yaml
new file mode 100644
index 000000000..38d2a674f
--- /dev/null
+++ b/packages/better-search/locale/zh.yaml
@@ -0,0 +1 @@
+Ensure index for problem search: 初始化 better-search 插件
\ No newline at end of file
diff --git a/packages/better-search/script.ts b/packages/better-search/script.ts
index 0a66c376d..54deed888 100644
--- a/packages/better-search/script.ts
+++ b/packages/better-search/script.ts
@@ -2,7 +2,7 @@ import nodejieba from 'nodejieba';
import { Pdoc } from 'hydrooj';
import * as document from 'hydrooj/dist/model/document';
-export const description = 'Ensure index for peoblem search';
+export const description = 'Ensure index for problem search';
export async function run() {
await document.coll.find({ docType: document.TYPE_PROBLEM }).forEach(async (doc: Pdoc) => {
diff --git a/packages/hydrojudge/locales/zh.yaml b/packages/hydrojudge/locales/zh.yaml
index 2ad7ec6b5..7644ace78 100644
--- a/packages/hydrojudge/locales/zh.yaml
+++ b/packages/hydrojudge/locales/zh.yaml
@@ -7,18 +7,28 @@ Cannot find output file {0}.: 找不到输出文件 {0}。
Cannot find user extra file {0}.: 找不到用户额外文件 {0}。
Cannot parse testdata.: 无法解析测试数据。
Checker returned {0}.: 比较器返回了{0}。
+Disable builtin judge: 禁用内置评测机
Executable file not found.: 没有找到可执行文件。
Found {0} testcases.: 识别到 {0} 个测试点。
Invalid judge_extra_files config.: 无效的 judge_extra_files 配置。
Invalid user_extra_files config.: 无效的 user_extra_files 配置。
+Max testcases per problem: 单题最多测试点数量
Problem data not found.: 没有找到测试数据。
Read {0}, expect {1}.: 读取到 {0},应为 {1}。
+Retry delay sec: 重试间隔(秒)
+Runner parallelism: 评测机运行进程数
Sandbox Error: 沙箱错误
+Sandbox Host: 沙箱地址
Standard answer longer than user output.: 标准输出比选手输出长。
+Stdout/Stderr size: 标准输出/错误流输出大小限制
+Temp directory: 临时目录
+Testdata cache directory: 测试数据缓存目录
Testdata configuration incorrect.: 题目配置错误。
+Tmpfs size: tmpfs 分区大小
Too many files.: 文件过多。
Too many testcases. Cancelled.: 测试数据过多。评测取消。
Total time limit longer than {0}s. Cancelled.: 总时限超过{0}s。评测取消。
+Total time limit per problem: 单题最多总评测时长
Unknown checker type {0}.: 未知的比较器类型 {0}。
Unknown language type.: 未知的语言类型。
Unsupported language {0}.: 不支持的语言 {0}。
diff --git a/packages/hydrojudge/setting.yaml b/packages/hydrojudge/setting.yaml
index 13331a25d..0f9980f3b 100644
--- a/packages/hydrojudge/setting.yaml
+++ b/packages/hydrojudge/setting.yaml
@@ -1,46 +1,57 @@
sandbox_host:
type: text
- name: Sandbox Host
+ name: sandbox_host
+ desc: Sandbox Host
default: http://localhost:5050
tmp_dir:
type: text
- name: Temp directory
+ name: tmp_dir
+ desc: Temp directory
default: $TEMP/hydro/judge.tmp
tmpfs_size:
type: text
- name: Tmpfs size
+ name: tmpfs_size
+ desc: Tmpfs size
default: 256m
stdio_size:
type: text
- name: Stdout/Stderr size
+ name: stdio_size
+ desc: Stdout/Stderr size
default: 32m
testcases_max:
type: number
- name: Max testcases per problem
+ name: testcases_max
+ desc: Max testcases per problem
default: 100
total_time_limit:
type: number
- name: Total time limit per problem
+ name: total_time_limit
+ desc: Total time limit per problem
default: 60
retry_delay_sec:
type: number
- name: Retry delay sec
+ name: retry_delay_sec
+ desc: Retry delay sec
default: 15
cache_dir:
type: text
- name: Testdata cache directory
+ name: cache_dir
+ desc: Testdata cache directory
default: $HOME/.cache/hydro/judge
parallelism:
type: number
- name: Runner parallelism
+ name: parallelism
+ desc: Runner parallelism
default: 2
disable:
type: boolean
- name: Disable builtin judge
+ name: disable
+ desc: Disable builtin judge
default: false
langs:
type: textarea
- name: Language file settings
+ name: langs
+ desc: Language file settings
default: |
ccWithoutO2: # Do not remove this entry
type: compiler
diff --git a/packages/hydrojudge/src/hosts/vj4.ts b/packages/hydrojudge/src/hosts/vj4.ts
index 60cef1ee0..36dd55b3d 100644
--- a/packages/hydrojudge/src/hosts/vj4.ts
+++ b/packages/hydrojudge/src/hosts/vj4.ts
@@ -166,7 +166,7 @@ class JudgeTask {
this.ws.send(JSON.stringify({
key: 'next',
tag: this.tag,
- judge_text: '自豪的采用HydroJudge(https://github.com/hydro-dev/Hydro)进行评测。',
+ judge_text: '自豪的采用 HydroJudge(https://github.com/hydro-dev/Hydro) 进行评测。',
}));
if (data.message !== undefined) {
data.judge_text = data.message;
diff --git a/packages/hydrooj/locales/ko.yaml b/packages/hydrooj/locales/ko.yaml
index 386adccde..ce9c1da7c 100644
--- a/packages/hydrooj/locales/ko.yaml
+++ b/packages/hydrooj/locales/ko.yaml
@@ -38,7 +38,7 @@ __langname: 한국어
'We use Gravatar to present your avatar icon.': 'Gravatar를 만들어 보세요.'
'Yes': 예
"Effects only when Difficulty is not 'Use algorithm calculated'.": 난이도가 알고리즘에 의해 정해지지 않은 경우에만 적용됩니다.
-"Splitted by ', '.": “, ”“,”으로 구분
+"Split by ', '.": “, ”“,”으로 구분
"What's file?": 파일?
(All Problems): (전체 문제)
(None): (N/A)
diff --git a/packages/hydrooj/locales/zh.yaml b/packages/hydrooj/locales/zh.yaml
index 7ca97a393..d26fb5b0a 100644
--- a/packages/hydrooj/locales/zh.yaml
+++ b/packages/hydrooj/locales/zh.yaml
@@ -38,7 +38,7 @@ __langname: 简体中文
'We use Gravatar to present your avatar icon.': '我们使用 Gravatar 服务来呈现您的头像。'
'Yes': 是
"Effects only when Difficulty is not 'Use algorithm calculated'.": 仅当难度不为“使用算法计算”时才起效。
-"Splitted by ', '.": 由“, ”或“,”分隔。
+"Split by ',' '.'": 由“, ”或“,”分隔。
"What's file?": 什么是文件?
(All Problems): (所有题目)
(None): (无)
@@ -55,6 +55,7 @@ Accepted: 已通过
Access Control: 访问控制
Action: 动作
Active Sessions: 活动会话
+Add blacklist by ip, uid: 封禁 IP / 将对应 uid 的用户拉入黑名单
Add module: 添加模块
Add new data: 添加新数据
Add User: 添加用户
@@ -66,6 +67,7 @@ All Homeworks: 所有作业
All Submissions: 所有递交
All Training Plans: 所有训练计划
All: 全部
+Allow builtin-login: 启用内置登录
Always granted all privileges: 总是拥有所有权限
An error has occurred.: 发生了一个错误。
An example of dataset: 测试数据集的一个例子
@@ -97,6 +99,7 @@ By Contest: 由比赛
By Problem: 由题目
By signing up a Hydro universal account, you can submit code and join discussions in all online judging services provided by us.: 注册一个 Hydro 通用账户,您就可以在我们提供的所有在线评测服务上提交代码、参与讨论。
By Username / UID: 由用户名或 UID
+Calculate rp of a domain, or all domains: 计算用户的 RP
Calendar View: 日历视图
Calendar: 日历
Can be Extended For: 可延期
@@ -104,6 +107,7 @@ Cancel Score: 取消成绩
Cancel: 取消
Categories: 分类
Category: 分类
+CDN Prefix: CDN 路径前缀
Change Email: 修改电子邮件
Change Password: 修改密码
Chinese: 中文
@@ -145,6 +149,8 @@ contest_edit: 编辑比赛
contest_main: 比赛
contest_scoreboard: 比赛成绩表
Contest: 比赛
+Contests on main: 主页展示的比赛数量
+Contests per page: 每页展示的比赛数量
Continue: 继续
Contributed Problems: 贡献的题目
Contributions: 贡献
@@ -192,6 +198,9 @@ Day: 日
Deadline: 截止时间
Default Code Language: 默认代码语言
Default Code Template: 默认代码模板
+Default display language: 默认显示语言
+Default Privilege: 用户默认全站权限
+Delete a user: 删除用户
Delete discussion replies of own discussion: 删除自己讨论中的回复
Delete discussion replies: 删除讨论回复
Delete discussions: 删除讨论
@@ -226,6 +235,8 @@ discussion_edit: 编辑讨论
discussion_main: 讨论
discussion_node: 讨论
Discussion: 讨论
+Discussions on main: 主页展示的讨论数量
+Discussions per page: 每页展示的讨论数量
Discussions: 讨论
Display name {1} you want to set is used by others.: 您想要设置的显示名 {1} 已经被其他人使用了。
Display Name: 显示名
@@ -288,6 +299,8 @@ Enabled: 开启
End at: 结束于
End Date: 结束日期
End Time: 结束时间
+EndPoint for judge: 提供给评测机的 EndPoint
+EndPoint for user: 提供给用户的 EndPoint
English: 英文
Enroll Training: 参加训练
Enrolled: 已参加
@@ -344,15 +357,20 @@ homework_main: 作业
homework_scoreboard: 作业成绩表
homework_status: 作业成绩表
Homework: 作业
-Host: 主持人
+Homeworks on main: 主页展示的作业数量
+Homeworks per page: 每页展示的作业数量
+Host: 主办人
hour(s): 小时
If enabled, source code will be emailed to you after the submission is accepted.: 如果启用,在您通过题目后,源代码会以 Email 的形式发送给您。
If left blank, the built-in template of the corresponding language will be used.: 若留空,则将使用对应语言的内置代码模板。
Images: 图片
+Import From Hydro: 从 Hydro 导入
+Import From SYZOJ: 从 SYZOJ 导入
Import From SYZOJ.: 从 SYZOJ 导入
Import from: 导入自
Import problem from syzoj.: 从运行 syzoj 系统的 OJ 导入题目。
Import Problem: 导入题目
+Import User: 导入用户
Import: 导入
In 1 day: 一天后
In 1 month: 一个月后
@@ -364,6 +382,7 @@ In following homework: 在以下作业中
In following training plans: 在下列训练计划中
In Progress: 进行中
Information: 信息
+Init Discussion Nodes: 初始化讨论结点
Initialize: 初始化
Inline codes: 行内代码
Inline formulas: 行内公式
@@ -388,6 +407,9 @@ Judged At: 评测时间
Judged By: 评测机
Judging Queue: 评测队列
Keep current expiration: 保持当前过期设置
+LANG_TEXTS: 编译语言代号 -> 语言名称
+Language file settings: 评测机语言(langs.yaml)
+Language Highlight ID: 编译语言代号 -> 高亮语言代号
Language: 语言
last active at: 最后活动于
last login at: 最后登录于
@@ -413,6 +435,7 @@ Logout This Session: 注销该会话
Logout: 登出
Lost Password: 忘记密码
Lucky: 手气不错
+Mail From: 发件人
manage_dashboard: 控制面板
manage_join_applications: 加域申请
manage_module: 管理模块
@@ -457,6 +480,7 @@ No Permission to Submit: 您没有权限递交
No problem.: 没有题目。
No solutions so far...: 目前还没有题解...
No Submissions: 没有递交
+No testdata at current.: 暂无测试数据。
No user is allowed to join this domain: 没有用户可以自助加入此域
no_translation_warn: ''
None: 无
@@ -514,6 +538,7 @@ perm_training: 训练
Permission: 权限
Permissions: 权限
Pick a problem randomly based on current filter: 根据当前过滤条件随机选择一道题
+pid: 题目 ID
Plan: 计划
Please attend contest to see the problems.: 请参加比赛来查看题目。
Please claim the assignment to see the problems.: 认领作业后才可以查看作业内容。
@@ -523,8 +548,10 @@ Pretest Data: 自测数据
Pretest Your Code: 使用自定义数据测试
Pretest: 自测
Pretest?: 自测?
+Preview: 预览
Privacy: 隐私
Problem {1} not found.: 题目 {1} 不存在。
+Problem Categories: 题目标签
Problem Data: 题目数据
Problem Description: 题目描述
Problem ID List: 题目 ID 列表
@@ -552,6 +579,7 @@ problem.import.input_format: '## 输入格式'
problem.import.limit_and_hint: '## 限制'
problem.import.output_format: '## 输出格式'
problem.import.problem_description: '## 题目描述'
+Problems per page: 每页展示的题目数量
Problems Sets: 题库
Problems: 题目
Profile Background Image: 背景图片
@@ -565,10 +593,12 @@ Quit Scratchpad: 退出在线编程模式
Quote: 引用
Rank: 排名
ranking: 排名
+Recalculates nSubmit and nAccept in problem status.: 重新计算每道题目的 AC 量和提交量
Recommended: 推荐
Record {0} not found.: 记录 {0} 不存在。
record_detail: 记录详情
record_main: 评测队列
+Records per page: 每页展示的评测记录数量
Records: 评测记录
Refresh Records: 刷新评测记录
Refresh: 刷新
@@ -583,6 +613,7 @@ Remove Selected User: 将所选用户移出
Remove this data: 移除这组数据
Remove: 移除
Repeat Password: 重复密码
+Replies per page: 每页展示的回复数量
Reply discussions: 回复讨论
Reply problem solutions: 回复题解
reply: 回复
@@ -607,6 +638,7 @@ Sample Input: 输入数据
Sample Output: 输出数据
Sample: 样例
Save All Changes: 保存所有修改
+Saved session expire seconds: 保存的会话的过期秒数
Saved session: 已保存的会话
score canceled: 成绩取消
Score: 分数
@@ -626,15 +658,18 @@ Selected users have been removed from the domain.: 所选用户已从此域中
Send Code after acceptance: 通过题目后发送源代码
Send Message: 发送站内信息
Send Password Reset Email: 发送密码重置邮件
+Send Problem: 发送题目
Send Verification Email: 发送验证邮件
Send: 发送
Service Status: 服务状态
Set Role: 设置角色
Set Roles for Selected User: 设置所选用户的角色
Set Roles for selected users: 为所选用户设置角色
+setting_basic: 基础设置
setting_customize: 个性化
setting_display: 显示偏好
setting_domain: 域设置
+setting_file: 存储桶设置
setting_info_domain: 个人信息
setting_info: 个人信息
setting_privacy: 隐私
@@ -654,6 +689,11 @@ Sign up mail has been sent to your email.: 注册邮件已经发送到您的垃
Sign Up Now: 现在注册
Sign Up: 注册
Size: 大小
+SMTP Password: SMTP 密码
+SMTP Server Host: SMTP 服务器地址
+SMTP Server Port: SMTP 服务器端口
+SMTP Username: SMTP 用户名
+Solutions per page: 每页展示的题解数量
Sorry: 对不起
Sort by: 排序
Source type: 来源类型
@@ -664,6 +704,11 @@ Statistics: 统计
Status is hidden: 状态已隐藏
status: 状态
Status: 状态
+Storage engine accessKey: 存储桶 accessKey
+Storage engine bucket: 存储桶名称
+Storage engine endPoint: 存储桶 endPoint
+Storage engine region: 存储桶地域
+Storage engine secret: 存储桶 secretKey
Submission Statistics: 递交统计
Submission: 递交
Submissions: 递交
@@ -671,6 +716,7 @@ Submit: 递交
Submitted: 已递交
Support: 支持
Tags: 标签
+Target: 目标
Technical Information: 技术信息
Temporary session: 临时会话
Terms of Service: 服务条款
@@ -695,6 +741,7 @@ This homework is not open.: 该作业还未开放递交。
This is the current session: 这是当前的会话
This message will be presented to those whose submissions are accepted.: 这条消息将会被展示给通过此题的用户。
This page needs JavaScript to work.: 这个页面需要 Javascript。
+This person is lazy and didn't wrote anything.: 该用户太懒,这里啥也没写 (´・ω・`)
This section cannot be challenged at present, so please complete the following sections first: 该章节目前不可挑战,请先完成以下章节
This type of files are not allowed to be uploaded.: 不允许上传这种文件。
Time (Seconds): 耗时 (秒)
@@ -718,6 +765,8 @@ training_detail: 训练详情
training_edit: 编辑训练
training_main: 训练
Training: 训练
+Trainings on main: 主页展示的训练数量
+Trainings per page: 每页展示的训练数量
Type: 类型
UI Language: 用户界面语言
Uncompleted: 未完成
@@ -725,6 +774,7 @@ Unique: 唯一
Unknown field {0}.: 未知字段 {0}。
Unknown: 未知
Unordered List: 无序列表
+Unsaved session expire seconds: 未保存的会话的过期秒数
Unstar Topic: 取消收藏
Unstar: 取消收藏
Update Permission: 更新权限
@@ -798,6 +848,8 @@ What's this?: 这是什么?
Whether to show tags in the problem list.: 是否在题目列表中显示题目的标签。
Will be used as the domain icon.: 将被用作系统图标。
With this feature, you can copy problems that you can view from a domain to some other domain. Their title, content, tags and categories will be copied. However, their test data are not copied directly.: 您可以通过这个功能将某域下您能查看的题目复制到其它域中,题目的标题、描述、标签与分类将被复制过来。但是测试数据不会被直接复制。
+With this feature, you can import problems that you can view from a site to here. Their title, content, tags and categories will be imported. However, their test data are not copied directly.: 您可以通过这个功能将其他 OJ 的题目导入到本站。题目的标题、题面、标签和分类将会被直接导入,测试数据将会在后台自动导入。
+With this feature, you can import problems that you can view from a site to here. Their title, content, tags and categories will be imported.: 您可以通过这个功能将其他 OJ 的题目导入到本站。题目的标题、题面、标签和分类都将会被自动导入。
Write Your Comment: 发表您的评论
Write Your Solution: 发表您的题解
Year: 年
diff --git a/packages/hydrooj/src/model/setting.ts b/packages/hydrooj/src/model/setting.ts
index d5d3ec60c..fd8175457 100644
--- a/packages/hydrooj/src/model/setting.ts
+++ b/packages/hydrooj/src/model/setting.ts
@@ -128,7 +128,7 @@ DomainSetting(
);
DomainUserSetting(
- Setting('setting_info', 'displayName', null, 'text', 'display name'),
+ Setting('setting_info', 'displayName', null, 'text', 'Display Name'),
Setting('setting_storage', 'nAccept', 0, 'number', 'nAccept', null, FLAG_HIDDEN | FLAG_DISABLED),
Setting('setting_storage', 'nSubmit', 0, 'number', 'nSubmit', null, FLAG_HIDDEN | FLAG_DISABLED),
Setting('setting_storage', 'nLike', 0, 'number', 'nLike', null, FLAG_HIDDEN | FLAG_DISABLED),
@@ -138,50 +138,52 @@ DomainUserSetting(
);
SystemSetting(
- Setting('setting_file', 'file.endPoint', null, 'text', 'Storage engine endPoint'),
- Setting('setting_file', 'file.accessKey', null, 'text', 'Storage engine accessKey'),
- Setting('setting_file', 'file.secretKey', null, 'password', 'Storage engine secret', null, FLAG_SECRET),
- Setting('setting_file', 'file.bucket', 'hydro', 'text', 'Storage engine bucket'),
- Setting('setting_file', 'file.region', 'us-east-1', 'text', 'Storage engine region'),
- Setting('setting_file', 'file.endPointForUser', '/fs/', 'text', 'EndPoint for user'),
- Setting('setting_file', 'file.endPointForJudge', '/fs/', 'text', 'EndPoint for judge'),
- Setting('setting_smtp', 'smtp.user', null, 'text', 'SMTP Username'),
- Setting('setting_smtp', 'smtp.pass', null, 'password', 'SMTP Password', null, FLAG_SECRET),
- Setting('setting_smtp', 'smtp.host', null, 'text', 'SMTP Server Host'),
- Setting('setting_smtp', 'smtp.port', 465, 'number', 'SMTP Server Port'),
- Setting('setting_smtp', 'smtp.from', null, 'text', 'Mail From'),
- Setting('setting_smtp', 'smtp.secure', false, 'boolean', 'SSL'),
- Setting('setting_server', 'server.name', 'Hydro', 'text', 'Server Name'),
- Setting('setting_server', 'server.worker', 1, 'number', 'Server Workers Number'),
- Setting('setting_server', 'server.hostname', 'oj.undefined.moe', 'text', 'Server Hostname'),
- Setting('setting_server', 'server.host', 'oj.undefined.moe', 'text', 'Server Host'),
- Setting('setting_server', 'server.url', '/', 'text', 'Server BaseURL'),
- Setting('setting_server', 'server.cdn', '/', 'text', 'CDN Prefix', 'Ends with /'),
- Setting('setting_server', 'server.port', 8888, 'number', 'Server Port'),
- Setting('setting_server', 'server.xff', null, 'text', 'IP Header', 'e.g. x-forwarded-for (lowercase)'),
- Setting('setting_server', 'server.language', 'zh_CN', langRange, 'Default display language'),
- Setting('setting_server', 'server.login', true, 'boolean', 'Allow builtin-login'),
- Setting('setting_basic', 'default.priv', builtin.PRIV.PRIV_DEFAULT, 'number', 'Default Privilege'),
- Setting('setting_basic', 'problem.categories', builtin.CATEGORIES, 'yaml', 'Problem Categories'),
- Setting('setting_basic', 'lang.texts', builtin.LANG_TEXTS, 'yaml', 'LANG_TEXTS'),
- Setting('setting_basic', 'pagination.problem', 100, 'number', 'Problems per page'),
- Setting('setting_basic', 'pagination.contest', 20, 'number', 'Contests per page'),
- Setting('setting_basic', 'pagination.discussion', 50, 'number', 'Discussions per page'),
- Setting('setting_basic', 'pagination.record', 100, 'number', 'Records per page'),
- Setting('setting_basic', 'pagination.solution', 20, 'number', 'Solutions per page'),
- Setting('setting_basic', 'pagination.training', 10, 'number', 'Trainings per page'),
- Setting('setting_basic', 'pagination.reply', 50, 'number', 'Replies per page'),
- Setting('setting_basic', 'pagination.homework_main', 5, 'number', 'Homeworks on main'),
- Setting('setting_basic', 'pagination.contest_main', 10, 'number', 'Contests on main'),
- Setting('setting_basic', 'pagination.training_main', 10, 'number', 'Trainings on main'),
- Setting('setting_basic', 'pagination.discussion_main', 20, 'number', 'Discussions on main'),
- Setting('setting_session', 'session.keys', [String.random(32)], 'text', 'session.keys', null, FLAG_HIDDEN),
- Setting('setting_session', 'session.secure', false, 'boolean', 'session.secure'),
- Setting('setting_session', 'session.saved_expire_seconds', 3600 * 24 * 30, 'number', 'Saved session expire seconds'),
- Setting('setting_session', 'session.unsaved_expire_seconds', 3600 * 3, 'number', 'Unsaved session expire seconds'),
- Setting('setting_storage', 'db.ver', 0, 'number', 'Database version', null, FLAG_DISABLED | FLAG_HIDDEN),
- Setting('setting_storage', 'user', 1, 'number', 'User Counter', null, FLAG_DISABLED | FLAG_HIDDEN),
- Setting('setting_storage', 'installid', String.random(64), 'text', 'Installation ID', null, FLAG_HIDDEN | FLAG_DISABLED),
+ Setting('setting_file', 'file.endPoint', null, 'text', 'file.endPoint', 'Storage engine endPoint'),
+ Setting('setting_file', 'file.accessKey', null, 'text', 'file.accessKey', 'Storage engine accessKey'),
+ Setting('setting_file', 'file.secretKey', null, 'password', 'file.secretKey', 'Storage engine secret', FLAG_SECRET),
+ Setting('setting_file', 'file.bucket', 'hydro', 'text', 'file.bucket', 'Storage engine bucket'),
+ Setting('setting_file', 'file.region', 'us-east-1', 'text', 'file.region', 'Storage engine region'),
+ Setting('setting_file', 'file.endPointForUser', '/fs/', 'text', 'file.endPointForUser', 'EndPoint for user'),
+ Setting('setting_file', 'file.endPointForJudge', '/fs/', 'text', 'file.endPointForJudge', 'EndPoint for judge'),
+ Setting('setting_smtp', 'smtp.user', null, 'text', 'smtp.user', 'SMTP Username'),
+ Setting('setting_smtp', 'smtp.pass', null, 'password', 'smtp.pass', 'SMTP Password', FLAG_SECRET),
+ Setting('setting_smtp', 'smtp.host', null, 'text', 'smtp.host', 'SMTP Server Host'),
+ Setting('setting_smtp', 'smtp.port', 465, 'number', 'smtp.port', 'SMTP Server Port'),
+ Setting('setting_smtp', 'smtp.from', null, 'text', 'smtp.from', 'Mail From'),
+ Setting('setting_smtp', 'smtp.secure', false, 'boolean', 'smtp.secure', 'SSL'),
+ Setting('setting_server', 'server.name', 'Hydro', 'text', 'server.name', 'Server Name'),
+ Setting('setting_server', 'server.worker', 1, 'number', 'server.worker', 'Server Workers Number'),
+ Setting('setting_server', 'server.hostname', 'oj.undefined.moe', 'text', 'server.hostname', 'Server Hostname'),
+ Setting('setting_server', 'server.host', 'oj.undefined.moe', 'text', 'server.host', 'Server Host'),
+ Setting('setting_server', 'server.url', '/', 'text', 'server.url', 'Server BaseURL'),
+ Setting('setting_server', 'server.cdn', '/', 'text', 'server.cdn', 'CDN Prefix'),
+ Setting('setting_server', 'server.port', 8888, 'number', 'server.port', 'Server Port'),
+ Setting('setting_server', 'server.xff', null, 'text', 'server.xff', 'IP Header'),
+ Setting('setting_server', 'server.language', 'zh_CN', langRange, 'server.language', 'Default display language'),
+ Setting('setting_server', 'server.login', true, 'boolean', 'server.login', 'Allow builtin-login'),
+ Setting('setting_basic', 'default.priv', builtin.PRIV.PRIV_DEFAULT, 'number', 'default.priv', 'Default Privilege'),
+ Setting('setting_basic', 'problem.categories', builtin.CATEGORIES, 'yaml', 'problem.categories', 'Problem Categories'),
+ Setting('setting_basic', 'lang.texts', builtin.LANG_TEXTS, 'yaml', 'lang.texts', 'LANG_TEXTS'),
+ Setting('setting_basic', 'pagination.problem', 100, 'number', 'pagination.problem', 'Problems per page'),
+ Setting('setting_basic', 'pagination.contest', 20, 'number', 'pagination.contest', 'Contests per page'),
+ Setting('setting_basic', 'pagination.discussion', 50, 'number', 'pagination.discussion', 'Discussions per page'),
+ Setting('setting_basic', 'pagination.record', 100, 'number', 'pagination.record', 'Records per page'),
+ Setting('setting_basic', 'pagination.solution', 20, 'number', 'pagination.solution', 'Solutions per page'),
+ Setting('setting_basic', 'pagination.training', 10, 'number', 'pagination.training', 'Trainings per page'),
+ Setting('setting_basic', 'pagination.reply', 50, 'number', 'pagination.reply', 'Replies per page'),
+ Setting('setting_basic', 'pagination.homework_main', 5, 'number', 'pagination.homework_main', 'Homeworks on main'),
+ Setting('setting_basic', 'pagination.contest_main', 10, 'number', 'pagination.contest_main', 'Contests on main'),
+ Setting('setting_basic', 'pagination.training_main', 10, 'number', 'pagination.training_main', 'Trainings on main'),
+ Setting('setting_basic', 'pagination.discussion_main', 20, 'number', 'pagination.discussion_main', 'Discussions on main'),
+ Setting('setting_session', 'session.keys', [String.random(32)], 'text', 'session.keys', 'session.keys', FLAG_HIDDEN),
+ Setting('setting_session', 'session.secure', false, 'boolean', 'session.secure', 'session.secure'),
+ Setting('setting_session', 'session.saved_expire_seconds', 3600 * 24 * 30,
+ 'number', 'session.saved_expire_seconds', 'Saved session expire seconds'),
+ Setting('setting_session', 'session.unsaved_expire_seconds', 3600 * 3,
+ 'number', 'session.unsaved_expire_seconds', 'Unsaved session expire seconds'),
+ Setting('setting_storage', 'db.ver', 0, 'number', 'db.ver', 'Database version', FLAG_DISABLED | FLAG_HIDDEN),
+ Setting('setting_storage', 'user', 1, 'number', 'user', 'User Counter', FLAG_DISABLED | FLAG_HIDDEN),
+ Setting('setting_storage', 'installid', String.random(64), 'text', 'installid', 'Installation ID', FLAG_HIDDEN | FLAG_DISABLED),
);
bus.once('app/started', async () => {
diff --git a/packages/hydrooj/src/script/problemStat.ts b/packages/hydrooj/src/script/problemStat.ts
index 02d01986f..1593c8123 100644
--- a/packages/hydrooj/src/script/problemStat.ts
+++ b/packages/hydrooj/src/script/problemStat.ts
@@ -3,7 +3,7 @@ import db from '../service/db';
import { STATUS } from '../model/builtin';
import * as document from '../model/document';
-export const description = 'Recalcuates nSubmit and nAccept in problem status.';
+export const description = 'Recalculates nSubmit and nAccept in problem status.';
export async function udoc() {
const pipeline = [
diff --git a/packages/import-qduoj/locale/zh.yaml b/packages/import-qduoj/locale/zh.yaml
new file mode 100644
index 000000000..2d0704dde
--- /dev/null
+++ b/packages/import-qduoj/locale/zh.yaml
@@ -0,0 +1 @@
+From QDUOJ Export: 从 QDUOJ 导入
\ No newline at end of file
diff --git a/packages/migrate-hustoj/locale/zh.yaml b/packages/migrate-hustoj/locale/zh.yaml
new file mode 100644
index 000000000..989f26537
--- /dev/null
+++ b/packages/migrate-hustoj/locale/zh.yaml
@@ -0,0 +1 @@
+migrate from hustoj: 从 HustOJ 导入
\ No newline at end of file
diff --git a/packages/migrate-vijos/locale/zh.yaml b/packages/migrate-vijos/locale/zh.yaml
new file mode 100644
index 000000000..e66715a60
--- /dev/null
+++ b/packages/migrate-vijos/locale/zh.yaml
@@ -0,0 +1 @@
+migrate from vijos: 从 Vijos 导入
\ No newline at end of file