!(function (e) {
var t = {};
function a(s) {
if (t[s]) return t[s].exports;
var i = (t[s] = { i: s, l: !1, exports: {} });
return (e[s].call(i.exports, i, i.exports, a), (i.l = !0), i.exports);
}
((a.m = e),
(a.c = t),
(a.d = function (e, t, s) {
a.o(e, t) || Object.defineProperty(e, t, { enumerable: !0, get: s });
}),
(a.r = function (e) {
("undefined" != typeof Symbol &&
Symbol.toStringTag &&
Object.defineProperty(e, Symbol.toStringTag, { value: "Module" }),
Object.defineProperty(e, "__esModule", { value: !0 }));
}),
(a.t = function (e, t) {
if ((1 & t && (e = a(e)), 8 & t)) return e;
if (4 & t && "object" == typeof e && e && e.__esModule) return e;
var s = Object.create(null);
if (
(a.r(s),
Object.defineProperty(s, "default", { enumerable: !0, value: e }),
2 & t && "string" != typeof e)
)
for (var i in e)
a.d(
s,
i,
function (t) {
return e[t];
}.bind(null, i),
);
return s;
}),
(a.n = function (e) {
var t =
e && e.__esModule
? function () {
return e.default;
}
: function () {
return e;
};
return (a.d(t, "a", t), t);
}),
(a.o = function (e, t) {
return Object.prototype.hasOwnProperty.call(e, t);
}),
(a.p = ""),
a((a.s = 0)));
})([
function (e, t, a) {
"use strict";
(a.r(t),
a.d(t, "navigationHelper", function () {
return _;
}));
class s {
static get availableLanguages() {
return [{ id: "zh", text: "汉语", dict: i, moment: "zh-cn" }];
}
constructor(e) {
((this.selectedLanguage = s.availableLanguages.find((t) => t.id == e)),
this.selectedLanguage &&
(n.setSetting("language", e),
moment.locale(this.selectedLanguage.moment)));
}
static createInstance(e) {
(void 0 !== this.instance &&
(null == this.instance.selectedLanguage
? "en" === e
: this.instance.selectedLanguage.id === e)) ||
(this.instance = new s(e));
}
static getInstance() {
return this.instance;
}
T(e, t, a = []) {
let s = "";
return (
(s =
null == this.selectedLanguage
? t
: this.selectedLanguage.dict[e] || t),
a.reduce((e, t) => e.replace(/%s/, t), s)
);
}
}
const i = {
credits: "学分",
prerequisites: "先修课程",
"tier-navigation": "类别",
"navigation-home": "主页",
"navigation-majors": "专业",
"navigation-major": "专业",
"navigation-classes": "课程",
"navigation-class": "课程",
"navigation-clubs": "社团",
"navigation-club": "社团",
"navigation-partners": "基/姬友",
"navigation-partner": "基/姬友",
"navigation-punishments": "处分",
"navigation-punishment": "处分",
"navigation-schedule": "日程",
"navigation-progress": "进度",
"navigation-roulette": "轮盘",
"navigation-help": "帮助",
"navigation-settings": "设置",
"navigation-mapping": "地图",
"navigation-graduated": "已毕业",
"navigation-disclaimer": "免责条款",
"scheduled-toast-error-header": "第三方cookies被禁止",
"scheduled-toast-error-content":
"请切换至完整的地图工具网页,或在浏览器设置里允许它。",
"user-confirmation-yes": "确定",
"user-confirmation-cancel": "取消",
"user-confirmation-close": "关闭",
"update-notification": "后台版本已更新,点击刷新。",
"time-day": "天",
"time-days": "天",
"time-day-binding-no-minutes": " ",
"time-day-binding": " ",
"time-hour": "小时",
"time-hours": "小时",
"time-hours-binding": " ",
"time-minute": "分钟",
"time-minutes": "分钟",
"time-minutes-binding": " ",
"time-second": "秒",
"time-seconds": "秒",
"time-less-then-a-minute": "不足 1 分钟。",
"home-feedback-title": "用户反馈",
"home-feedback-description":
'只需要轻轻点击一下,发送一个"心跳信号"给作者,Ta就能知道一位陌生的好朋友还默默支持、陪伴着Ta。',
"home-feedback-discord": "如果你想加入PU的Discord讨论组 - 请点击这里。",
"home-welcome-header": "Project University欢迎你的加入",
"home-welcome-info-1":
"在这里,你可以创建属于自己的大学或者加入别人已经建好的大学。由于本网站不会提供关于玩法的任何内容,因此你需要自己导入一张PU-map地图文件。该文件由玩家自行创建,用于提供具体的玩法。本网站完全运行在玩家自己的设备上,网站的后台服务器不会储存任何私人内容,因此请确保存档进度的安全,请确保导入内容的安全性,请确保人身安全和法律安全。",
"home-welcome-info-2":
"在这里,你的大学生活将大致包括如下内容:选择专业、选择课程和进行日常任务。如果你没有达到任务的要求,你将受到处分。你可以通过完成课程考试的方式来获得相应的学分和解锁更难的课程。学完所有的专业必修课并获得足够的学分之后,你就可以尝试毕业,参加最后的专业结业考试。课程之余,你还可以参加社团或者勾搭基/姬友来改变特定课程的难度或获得福利。",
"home-welcome-info-3":
"赶紧导入一张PU-map地图,并选择一个专业吧!你的选课学习之旅就此开启!",
"home-load-map-button": "导入地图",
"home-create-map-button": "创建地图",
"home-changelog-header": "更新日志",
"home-show-changelogs-button": "以前的更新日志",
"home-external-sources-header": "外部资源支持",
"home-disclaimer-link":
"如果您想再次确认“免责条款和数据保护”的内容, 请单击此处。",
"home-special-thanks-header": "特别鸣谢",
"tour-navigation-close": "关闭",
"tour-navigation-next": "下一条",
"tour-majors-0-title": "菜单",
"tour-majors-0-text": "这里是主菜单,可以在不同的选项卡之间切换。",
"tour-majors-1-title": "折叠菜单",
"tour-majors-1-text":
"在移动设备上主菜单会折叠,点击这里折叠或展开主菜单。",
"tour-majors-2-title": "专业",
"tour-majors-2-text": "每张专业卡片对应一个可选专业。",
"tour-majors-3-title": "详情",
"tour-majors-3-text": "点击图片查看该专业的具体内容。",
"tour-majors-4-title": "选项",
"tour-majors-4-text": "这里会出现选专业、退选专业的选项。",
"tour-majors-5-title": "内容一览",
"tour-majors-5-text": "按下这个信息按钮会为你展示该专业的具体内容。",
"tour-majors-6-title": "卡片信息",
"tour-majors-6-text": "卡片底端将展示该专业的简要描述。",
"tour-classes-0-title": "课程难度",
"tour-classes-0-text": "点击查看不同难度的课程。",
"tour-classes-1-title": "课程难度",
"tour-classes-1-text":
"点击此处或左右滑动来查看不同难度的课程,从左至右难度依次增加。",
"tour-classes-2-title": "课程",
"tour-classes-2-text": "每张卡片对应一个可选课程。",
"tour-classes-3-title": "图片",
"tour-classes-3-text": "点击图片查看该课程的具体内容。",
"tour-classes-4-title": "选项",
"tour-classes-4-text": "这里会出现选课、退课和重修的选项。",
"tour-classes-5-title": "内容一览",
"tour-classes-5-text": "按下这个信息按钮会为你展示该课程的具体内容。",
"tour-classes-6-title": "卡片信息",
"tour-classes-6-text": "卡片底端将展示该课程的简要描述。",
"map-submap-failed-header": "设置子地图失败",
"map-submap-failed-content":
"PU无法储存子地图。这可能由于你的浏览器开启了匿名模式访问。",
"map-save-failed-header": "进度保存失败",
"map-save-failed-content":
"PU无法保存你的进度。这可能由于你的浏览器开启了匿名模式访问。",
"map-save-incompatible": "存档与当前主地图不兼容。",
"map-save-empty": "存档为空。",
"map-import-confirmation-header": "导入地图",
"map-import-confirmation-conent":
"确定要导入这张地图吗?请确保地图来源的可靠性,否则后果自负。",
"map-import-script-header": "导入中止",
"map-import-script-content":
"该地图文件内包含不安全的信息。出于安全性考虑,我们中止了导入。",
"map-import-submap-popup": "导入子地图",
"map-import-map-popup": "地图导入成功",
"task-time-without-mod-info": "原时长 %s。",
"task-punishment-without-mod-info": "原数量 %s。",
"task-random-punishment": "随机",
"task-param-without-mod-info": "原数量 %s。",
"task-perk-activated-header": "奖励处分已获得",
"task-perk-activated-content": "你随机得到了 1 项处分。",
"task-roulette-reset-header": "轮盘重置奖励",
"task-roulette-reset-content": "轮盘已经重置了,再去碰碰运气吧。",
"task-skip-perk-header": "请假条奖励",
"task-skip-perk-single-content": "请假条已获得。",
"task-skip-perk-multi-content": "%s 张请假条已获得",
"task-punishment-drawn-header": "任务处分已获得",
"task-punishment-drawn-content":
"根据任务的要求,你随机得到了 1 项 %s处分。",
"task-punishment-header": "受到处分",
"task-punishment-custom-task": "自定义任务失败!",
"task-punishment-task": "日常任务失败!",
"task-punishment-exam": "课程考试失败!",
"task-punishment-thesis": "毕业考核失败!",
"task-punishment-drawn": "你获得了 1 项处分!",
"task-punishments-drawn": "你获得了 %s 项处分!",
"task-failed-header": "任务失败",
"task-failed-content": "你的 %s 任务完成失败!",
"task-custom-task-finished-header": "自定义任务完成",
"task-custom-task-finished-content": "你完成了 1 项自定义任务!",
"task-class-finished-header": "课程通过",
"task-class-finished-content": "恭喜你通过了 %s 课程!",
"task-finished-header": "任务完成",
"task-finished-content": "你完成了 %s 的课程任务!",
"task-major-finished-header": "专业毕业",
"task-major-finished-content": "你从 %s 专业中毕业了!",
"task-punishment-finished-header": "处分结束",
"task-punishment-finished-content": "对你的处分内容 %s 已经结束!",
"task-manual-counter-button": "剩余 %s 次",
"task-manual-finish-button": "完成",
"task-finish-by-text": "本任务需在%s完成。",
"task-fail-button": "失败",
"task-time-left-info": "剩余时长",
"task-resume-button": "继续",
"task-pause-button": "暂停",
"task-punish-button": "惩罚",
"task-status-paused": "任务已暂停",
"task-status-active": "任务进行中",
"task-active-task": "进行中的任务",
"task-class-missed-header": "翘课",
"task-class-missed-content": "你因为翘掉一节课而受到 1 项处分!",
"task-fail-header": "任务失败",
"task-fail-content": "确定要放弃该任务或任务失败了吗?",
"graduated-certificate-header": "毕业证书:%s",
"graduated-congratulations-header": "恭喜你从 %s 专业中毕业。",
"graduated-congratulations-1":
"经过不懈努力之后,恭喜你离自己梦中的样子更近了一步。",
"graduated-congratulations-2":
"为了你的梦想,你依然还有很多能去做的。再选择一个专业或者换一张地图继续努力吧~",
"graduated-congratulations-3":
"作为已经毕业的学长/学姐,你也可以为学弟学妹们准备一些属于你的原创内容,让ta们的校园生活更加丰富多彩。",
"graduated-table-class": "课程",
"graduated-table-knowledge-points": "出勤点",
"graduated-table-grade": "绩点",
"progress-active-major": "你的当前专业",
"progress-completed-classes": "课程完成情况",
"progress-active-classes": "正在学习",
"progress-active-classes-no": "没有正在学习中的课程。",
"progress-mandatory-classes": "必修课程",
"progress-mandatory-classes-no": "没有必修课程。",
"progress-finished-majors": "已毕业专业",
"progress-finished-majors-no": "还没有从任何专业中毕业。",
"progress-finished-classes": "已通过课程",
"progress-finished-classes-no": "还没有通过任何课程。",
"progress-credits-info": "只有通过了课程考试,你才能获得学分。",
"progress-punishments-endured": "尚未结束的处分",
"progress-thesis-button": "选择结业考核内容",
"schedule-active-tasks-header": "进行中的任务",
"schedule-active-punishments-header": "执行中的处分",
"schedule-active-punishments-info":
"在处分执行完毕前,禁止参加课程考试和毕业考核。",
"schedule-todays-classes-header": "今日课程",
"schedule-clubs-partner-header": "社团 & 基/姬友",
"schedule-weekly-header": "本周课表",
"schedule-easy-mode-info":
'当前是"简单模式",你可以随意补习各门课程,翘掉补习不会受处分。',
"schedule-weekend-info":
"你在周末可以随意补习各门课程,翘掉补习不会受处分。",
"schedule-no-class-left": "今天的课已经上完了,明天再来吧。",
"schedule-no-class-left-add": "今天的课已经上完了,你想多选一门课吗?",
"schedule-no-classes": "无课程",
"schedule-feedback-header": "用户反馈请求",
"schedule-feedback-1":
'同学你好~近一个月原作者收到的"心跳信号"急剧减少,这让Ta十分扫兴。如果一直这样下去,Ta可能会放弃这个项目的维护。先谢过你一直以来对本项目的支持,并由衷地希望你能够享受你的大学生活。由于原作者十分注重各位同学的隐私保护,所以Ta不会从本网站上获取用户的任何信息,但Ta又想知道自己的大学里还有多少学生,所以需要各位提供主动的信息反馈。只需要简单地点击这条%sbitly链接%s,就可以让Ta知道你还在这里上课。',
"schedule-feedback-2":
"此外,Ta还为这个项目开设了一个discord讨论组(英文),用于反馈用户体验和分享用户自己制作的地图,欢迎你的%s加入%s",
"schedule-feedback-3": '这条"心跳信号"请求每个月会显示一次。',
"schedule-import-task-error-header": "任务导入失败",
"schedule-import-task-error-content": "未能成功导入他人分享的任务。",
"schedule-script-header": "导入中止",
"schedule-script-content":
"该自定义任务内包含不安全的信息。出于安全性考虑,我们中止了导入。",
"schedule-custom-task-default-name": "自定义任务",
"schedule-import-custom-task-confirmation-header": "导入自定义任务",
"schedule-import-custom-task-confirmation-content":
"确定要导入这条自定义任务吗?任务将在导入后自动开始。请确保地图来源的可靠性,否则后果自负。",
"roulette-header": "高潮轮盘",
"roulette-info-1": "小骚货,又想要了吗?",
"roulette-info-2": "来求我试试看~",
"roulette-info-3": "什么?你胆敢擅自高潮?",
"roulette-info-4": "滚过来受罚!",
"roulette-punishment-button": "我不小心弄出来了",
"roulette-spin-button": "求求您给我一次",
"punishment-tier-text": "程度",
"punishment-tier-light": "轻",
"punishment-tier-hard": "重",
"punishment-tier-hardcore": "硬核",
"punishment-light-header": "轻处分",
"punishment-hard-header": "重处分",
"punishment-hard-requirement": "你需要至少 %s 学分才能解锁重处分。",
"punishment-hardcore-header": "硬核处分",
"punishment-hardcore-requirement":
"你需要至少 %s 学分并在设置中开启了“硬核处分”才能解锁硬核处分。",
"punishment-status-active": "执行中",
"punishment-status-locked": "未解锁",
"punishment-roll-button": "随机得到 %s处分",
"punishment-detail-start-button": "开始执行处分",
"punishment-detail-reroll-button": "随机更换处分",
"punishment-rerolled-knowledge-point-header": "处分已更换",
"punishment-rerolled-knowledge-point-content":
"你因更换处分而被扣除了 %s 课程的 1 个出勤点。",
"punishment-rerolled-exam-header": "处分已更换",
"punishment-rerolled-exam-content":
"你因更换处分而被取消了 %s 的课程考试成绩。你需要重新参加考试了。",
"punishment-rerolled-unknown-header": "处分已更换",
"punishment-rerolled-unknown-content": "你将为更换处分的行为付出代价。",
"punishment-unavailable-header": "不可获得的处分程度",
"punishment-unavailable-content": "你当前还无法获得此种程度的处分。",
"punishment-max-header": "达到处分数量上限",
"punishment-max-content": "你最多能够积累 %s 个执行中的处分。",
"punishment-null-header": "无其他可获取的处分",
"punishment-null-content": "你当前没有可以被给予的处分了。",
"punishment-single-text": "处分",
"punishment-multi-text": "处分",
"punishment-card-unblock-button": "Unblock",
"punishment-card-block-button": "Block",
"punishment-detail-unblock-button": "Unblock punishment",
"punishment-detail-block-button": "Block punishment",
"club-tier-normal": "普通",
"club-tier-elite": "精英",
"club-normal-header": "社团",
"club-elite-header": "精英社团",
"club-elite-requirement": "你至少需要 %s 学分才能参加精英社团。",
"club-status-active": "已加入",
"club-status-locked": "未解锁",
"club-card-join-button": "报名",
"club-card-drop-button": "退出",
"club-detail-modifiers": "可选奖励",
"club-detail-join-button": "参加本社团",
"club-detail-drop-button": "退出本社团",
"club-modifier-activity": "活动",
"club-modifier-perk": "奖励",
"club-perk-activate-button": "领取奖励",
"club-perk-active-button": "已领取",
"club-max-clubs-header": "达到社团数上限",
"club-max-clubs-content": "你最多只能同时参加 %s 个社团。",
"club-max-perks-header": "达到社团活动数上限",
"club-max-perks-content": "你最多只能同时参加 %s 个社团活动。",
"club-perk-unavailable-header": "社团奖励无法领取",
"club-perk-unavailable-content": "当前无法参加该社团活动领取奖励。",
"club-perk-unavailable-tag-header": "社团奖励无法领取",
"club-perk-unavailable-tag-content":
"当前无相关课程(标签)与该社团活动相关。",
"partner-status-active": "已结交",
"partner-card-join-button": "勾搭",
"partner-card-drop-button": "绝交",
"partner-modifier-activity": "活动",
"partner-modifier-perk": "福利",
"partner-detail-modifiers": "可选福利",
"partner-detail-add-button": "勾搭Ta",
"partner-detail-leave-button": "和Ta绝交",
"partner-perk-activate-button": "领取福利",
"partner-perk-active-button": "已领取",
"partner-perk-not-active-header": "基/姬友福利无法领取",
"partner-perk-not-active-content": "你还没有勾搭上Ta。",
"partner-perk-tags-header": "基/姬友福利无法领取",
"partner-perk-tags-content": "当前无相关课程(标签)与该基/姬友活动相关。",
"partner-perk-max-perks-header": "基/姬友福利达到上限",
"partner-perk-max-perks-content": "你最多只能同时参加 %s 个基/姬友活动。",
"major-status-unavailable": "不可选",
"major-status-active": "当前专业",
"major-status-grade": "绩点",
"major-card-join-button": "选修",
"major-card-drop-button": "退选",
"major-detail-prerequisites": "必修课程",
"major-detail-thesis": "可选毕业考核内容",
"major-detail-thesis-button": "开始毕业考核",
"major-detail-join-button": "选修本专业",
"major-detail-drop-button": "退选本专业",
"major-detail-thesis-requirement-header": "参加毕业考核条件",
"major-detail-thesis-requirement-join":
"你必须先选修本专业,才能参加毕业考核。",
"major-detail-thesis-requirement-credits": "你必须修满 %s 个学分。",
"major-detail-thesis-requirement-punishments": "你必须先执行完所有处分。",
"major-detail-thesis-requirement-prerequisites":
"你必须通过所有必修课程。",
"major-detail-thesis-requirement-thesis": "你只能选择一条毕业考核内容。",
"major-drop-confirm-header": "专业退选",
"major-drop-confirm-content": "确定要退选该专业?",
"major-dropped-header": "退选成功",
"major-dropped-content": "你因为退选专业而受到处分!",
"class-tier-beginner": "入门",
"class-tier-intermediate": "普通",
"class-tier-advanced": "高级",
"class-tier-master": "大师",
"class-beginner-header": "入门课程",
"class-intermediate-header": "普通课程",
"class-intermediate-requirement":
"你至少需要获得 %s 学分,并完成所有的先修课程才能解锁普通课程。",
"class-advanced-header": "高级课程",
"class-advanced-requirement":
"你至少需要获得 %s 学分,并完成所有的先修课程才能解锁高级课程。",
"class-master-header": "大师课程",
"class-master-requirement":
"你至少需要获得 %s 学分,并完成所有的先修课程才能解锁大师课程。",
"class-card-tasks": "任务",
"class-card-exams": "考试",
"class-card-exams-locked": "当前未解锁",
"class-card-join-button": "选课",
"class-card-drop-button": "退课",
"class-card-retake-button": "重修",
"class-status-locked": "未解锁",
"class-status-grade": "绩点",
"class-status-active": "正在学习",
"class-detail-days": "每周开课",
"class-detail-tasks": "可选任务选项",
"class-detail-exams": "考试选项",
"class-detail-expected-grade": "如果现在参加考试,本课程绩点为 %s。",
"class-detail-mandatory": "本课程为当前专业的必修课程 %s 。",
"class-detail-join-button": "选修本课程",
"class-detail-drop-button": "退选本课程",
"class-detail-retake-button": "重修本课程",
"class-detail-retake-warning":
"本课程最终绩点为 %s,你还有进步的空间。若想提高绩点,你可以重修本课程,继续获得更多出勤点。当然,你最后需要重新参加课程考试。",
"class-detail-start-task-button": "开始学习",
"class-detail-start-exam-button": "开始考试",
"class-detail-exam-requirement-header": "考试条件",
"class-detail-exam-requirement-join":
"你必须先选课,而后才能完成学习任务或参加考试。",
"class-detail-exam-requirement-attended":
"你今日已经学过本课程了,劳逸结合才能进步更快。",
"class-detail-exam-requirement-attendance":
"所需出勤点为 %s 个,当前已获得 %s 个。",
"class-detail-exam-requirement-attendance-tasks":
"你还有尚未进行过的可选任务。",
"class-knowledge-points-info": "%s knowledge points collected.",
"class-detail-exam-requirement-punishment": "你还有未结束的处分。",
"class-detail-exam-requirement-days": "本课程今日不开课。",
"class-max-classes-header": "达到课程数上限",
"class-max-classes-content": "你最多只能同时选修 %s 门课。",
"class-retake-confirmation-header": "重修课程",
"class-retake-confirmation-content":
"确定想要重修本课程吗?你已有的出勤点会保留,但你的课程考试将作废。",
"class-drop-confirmation-header": "退选课程",
"class-drop-confirmation-content": "确定想要退选本课程?",
"disclaimer-header": "免责条款和数据保护",
"disclaimer-block-1":
"可以公开访问的网站需要满足一些法律要求 ,因此我们写下了这段简短的陈述来帮助您了解这个网站如何运作。 进入首页后,您可以在页面底部找到本页面的链接。 如果您同意以下内容,您可以点击页面底部的“我已理解并同意”, 并继续访问本网站。如果您不同意,我们将清理所有存储的数据,并自动退出。",
"disclaimer-overview-header": "概述",
"disclaimer-overview-1": "下文中的“用户”代指您,而“我们”代指网页提供者。",
"disclaimer-overview-2":
"只要我们有意开放,本网站对用户免费,但我们有权随时关闭甚至清空本网站。",
"disclaimer-overview-3":
"本网站除用于提供网站内容的简单网页服务外,不使用任何后端。",
"disclaimer-overview-4":
"本网站完全基于您的设备运行,如果发生文件损坏或丢失,所有之前的信息均无法找回。",
"disclaimer-overview-5":
"本网站只是一个框架,因此需要用户生成内容,这些内容是由用户手动创建和提供的,我们并不知道其他人如何使用这项服务。 您可以将其比作一个本地文本编辑器——您可以创建或打开文本文件,而一切都留在您的设备上。您亦可以使用这个工具来访问其他用户创建的文件。",
"disclaimer-overview-6":
"本网站运行所需的源代码完全由本域名提供。对于某些离开了本页面的链接,我们对其行为不负任何责任。",
"disclaimer-overview-7":
"用户生成的内容可能是恶意的,我们试图保护您免受明显的攻击,但最终您要对您加载的外部内容负责。",
"disclaimer-inner-header": "免责条款",
"disclaimer-inner":
"使用本网站是免费的,没有广告或跟踪服务。任何人不得使用本框架获利。 由于本网站使用用户编辑生成的内容,但并不存储任何关于用户的信息,所以网站提供者无法审核将要加载的内容。 因此,您将对您添加的其他用户生成的内容承担全部责任。 提供者对链接页面的内容不负责任, 如果有法律要求从框架中删除任何引用,它将被遵守。",
"disclaimer-data-protection-header": "数据保护声明",
"disclaimer-data-protection":
'没有数据被收集和存储在用户设备之外。进度、设置、内容和反馈标记都存储在本地设备上。 用户生成的内容会留在用户的设备上。如果您决定使用反馈选项提供 "心跳信号",您将离开本网站,之后便使用Bitly隐私条款。 反馈是可选的,Bitly-Link将被突出显示。',
"disclaimer-bitly-link": "点击这里查看Bitly.com上的相关隐私条款。",
"disclaimer-stored-data-header": "数据存储",
"disclaimer-stored-data-description":
"多种技术手段用于存储您的进度、设置和添加的用户生成内容。",
"disclaimer-stored-data-local":
"本地数据存储: 设置, 推迟的通知, 最后一次反馈信息请求, 接受的免责条款, 已经显示的教程",
"disclaimer-stored-data-indexeddb":
"IndexedDB存储: 用户生成内容, 当前进度",
"disclaimer-stored-data-cache":
"临时文件存储: 本网站框架数据支持离线模式",
"disclaimer-accept-button": "我不同意",
"disclaimer-reject-button": "了解并同意",
"settings-header": "设置",
"settings-easy-mode-checkbox": "简单模式",
"settings-easy-mode-description":
'在简单模式下,你可以在任何一天上课,取消了翘课的处分,并且可以任意随机更换处分而不被罚。该模式可以作为游戏的"暂停"。',
"settings-hardcore-punishments-checkbox": "硬核处分",
"settings-hardcore-punishments-description":
"硬核处分往往相当困难,禁用它们通常不会有任何影响。默认禁用。",
"settings-auto-hide-checkbox": "网页自动隐藏",
"settings-auto-hide-description":
"确保你的小秘密不会被旁人看到,本网页会在 %s 后自动隐藏。",
"settings-back-top-checkbox": "回到顶端按钮",
"settings-back-top-description":
'在手机上不容易在页面上切换,你可以开启 "回到顶端按钮" 来方便你迅速回到页面顶端。',
"settings-hide-active-classes-checkbox":
"在课程页面不显示正在学习中的课程",
"settings-hide-active-classes-description":
"正在学习的课程会在%s日程%s中显示,勾选本项可以让你的%s课程%s列表更清爽。",
"settings-hide-finished-classes-checkbox":
"在课程页面不显示已经通过的课程",
"settings-finished-active-classes-description":
"已经通过的课程会在%s进度%s中显示,勾选本项可以让你的%s课程%s列表更清爽。",
"settings-skip-tier-checkbox": "自动切换至更高级别页",
"settings-skip-tier-description":
"当你划至页面最下面时,将自动切换到下一层次页(课程难度、精英社团等)",
"settings-show-confirmations-checkbox": "当做出重大更改时弹出确认框",
"settings-show-confirmations-description": "防止误触和猫。",
"settings-theme-description": "选择网页配色风格。",
"settings-language-description":
"选择想要使用的语言。[Select your prefered language.]",
"settings-save-button": "保存更改",
"settings-reset-button": "重置设定",
"settings-maps-header": "地图管理",
"settings-map-tool-button": "地图工具",
"settings-map-tool-button-description": "打开地图工具来创建自定义内容。",
"settings-map-import-button": "导入地图",
"settings-map-import-button-description":
"导入一张地图或更新一张已经存在的地图。",
"settings-map-selection-header": "选择主地图",
"settings-map-selection-info-1":
"切换至另一张地图(不同地图的进度是独立保存的)。",
"settings-map-selection-info-2":
"如果你想要导出所有地图的进度,你需要对每一张主地图单独一一保存(子地图进度会保存在当前主地图进度中)。",
"settings-switch-map-button": "切换至选择的地图",
"settings-delete-map-button": "删除选择的地图",
"settings-import-save-button": "导入存档",
"settings-export-save-button": "导出存档",
"settings-share-save-button": "导出存档但不生产存档文件",
"settings-submap-selection-header": "选择子地图",
"settings-submap-selection-description":
'请勾选所有你想要作为子地图的选项。你需要先导入子地图(点击 "导入地图"),然后你才能在选项列表中找到它。如果你找不到导入的子地图,可能它被默认用作了主地图,这时你需要先更换一张主地图,然后才能在列表中看到你导入的子地图。',
"settings-submap-selection-button": "加载勾选的子地图",
"settings-global-actions-header": "全局操作",
"settings-reset-tutorial-button": "重置教程",
"settings-reset-tutorial-description": "这将让新手教学框重新显示。",
"settings-reset-game-button": "重置游戏",
"settings-reset-game-description":
"这将完全重置整个游戏,包括地图、进度甚至是用户设置。",
"settings-delete-map-confirmation-header": "删除地图",
"settings-delete-map-confirmation-content":
"确定要删除地图吗?你将会失去所有的存档。",
"settings-reset-game-confirmation-header": "重置游戏",
"settings-reset-game-confirmation-content":
"确定要删除所有的地图和存档吗?你将丢失地图和当前进度。",
"settings-script-header": "导入中止",
"settings-script-content":
"该存档文件内包含不安全的信息。出于安全性考虑,我们中止了导入。",
"settings-save-import-failed-header": "存档导入失败",
"settings-save-import-failed-content":
"导入存档文件时出错,请检查后台记录以获取更多信息。",
"settings-save-import-confirmation-header": "导入存档",
"settings-save-import-confirmation-content":
"确定要导入存档并覆盖你的现有进度吗?请确保存档来源的可靠性,否则后果自负。",
"settings-save-export-failed-header": "存档导出失败",
"settings-save-export-failed-content": "无法分享你的存档。",
"settings-import-share-save-failed-header": "存档导入失败",
"settings-import-share-save-failed-content": "无法导入分享的存档文件。",
"settings-import-share-save-confirmation-header": "导入存档",
"settings-import-share-save-confirmation-content":
"确定要导入存档并覆盖你的现有进度吗?请确保存档来源的可靠性,否则后果自负。",
"settings-import-share-map-failed-header": "地图导入失败",
"settings-import-share-map-failed-content": "无法导入分享的地图。",
"settings-import-share-map-confirmation-header": "导入地图",
"settings-import-share-map-confirmation-content":
"确定要导入这张地图吗?请确保地图来源的可靠性,否则后果自负。",
"settings-save-selection-header": "保存游戏进度",
"settings-save-sync-description":
"You can now sync your saves over multiple devices or retain them without having to trouble yourself with the files. Just join our %sDiscord%s and use the channel %spu-saves%s to %s/register%s.",
"settings-save-sync-button": "Sync this device now",
"settings-reset-save-sync-button": "Remove save sync for this device",
"settings-import-save-sync-header": "Save-Sync setup finished",
"settings-import-save-sync-content":
"Your saves will now be synced, if the required maps are available.",
"settings-import-save-sync-failed-header": "Save-Sync setup failed",
"settings-import-save-sync-failed-content":
"The provided key was not accepted by the backend. You can try to create a new session or try again later.",
"settings-download-save-sync-failed-header": "Save-Sync download failed",
"settings-download-save-sync-failed-content":
"The download of the latest SaveGame failed. You may need to create a new session.",
"settings-check-save-sync-failed-header": "Save-Sync check failed",
"settings-check-save-sync-failed-content":
"Checking the status of the latest SaveGame failed. You may need to create a new session.",
"settings-upload-save-sync-failed-header": "Save-Sync upload failed",
"settings-upload-save-sync-failed-content":
"Uploading the latest SaveGame failed. You may need to create a new session.",
"settings-time-offset-selection":
"自定义一个时间偏移量,让夜晚变成你的清晨。当前游戏时间: ",
"settings-time-offset-hour": "时",
"settings-compress-exports-checkbox": "压缩导出",
"settings-compress-exports-description":
"稍微压缩文件大小,能够更方便地分享它们。%s提示:%s在大多数苹果设备上会很有用!%s",
"settings-image-exports-checkbox": "图像导出",
"settings-image-exports-description":
"分享一张图片而不是一段随机文本吧。必须压缩!%s警告:%s这是一个实验性功能,可能无法读取过大的文件!大部分即时通讯软件会删除附加的数据使其失效!%s",
"settings-complete-exports-checkbox": "完全导出",
"settings-complete-exports-description":
"不必再逐个导入地图及存档,所有内容都将导出为单一文件。必须压缩!%s提示:%s这会让存档变得非常巨大!%s",
"settings-detailed-table-view-checkbox": "使用详细表格视图。",
"settings-detailed-table-view-description":
"将*地图工具*的风格在原版“卡片”视图(模拟最终地图效果)和新增的“表格”视图之间切换。",
"settings-import-save-clipboard-button": "从剪贴板导入存档",
"settings-export-save-clipboard-button": "复制存档到剪贴板",
"settings-join-discord-button": "加入Discord",
"settings-join-discord-description":
"欢迎加入PU的官方Discord。(仅限英语)",
"settings-unsaved-changes-warning-checkbox":
"在地图工具中显示尚未保存警告",
"settings-unsaved-changes-warning-description":
"虽然地图工具已支持自动保存,但你也可以开启这个警告来体型自己是否还有尚未导出的编辑。",
"settings-filters-header": "过滤器",
"settings-three-state-filters-checkbox": "三态过滤器",
"settings-three-state-filters-description":
"默认过滤器只检查是否包含特定的标签,勾选本项可以让它也能够排除特定的标签。",
"settings-hide-active-classes-checkbox":
"在课程页面中不显示正在学习的课程",
"settings-hide-finished-classes-checkbox":
"在课程页面中不显示已通过的课程",
"settings-hide-locked-classes-checkbox": "在课程页面中不显示被锁定的课程",
"settings-hide-locked-clubs-checkbox": "在社团页面中不显示被锁定的社团",
"settings-hide-locked-punishments-checkbox":
"在处分页面中不显示被锁定的处分",
"settings-hide-blocked-punishments-checkbox":
"在处分页面中不显示被禁用的处分",
"help-table-grade": "绩点",
"help-table-threshold": "比例",
"help-table-min-knowledge": "最少出勤点数",
"help-table-min-knowledge-intermediate": "最少出勤点数(普通课程)",
"help-table-min-knowledge-advanced": "最少出勤点数(高级课程)",
"help-table-min-knowledge-master": "最少出勤点数(大师课程)",
"help-overview-header": "入学流程",
"help-overview-1": "选择一个%s专业%s",
"help-overview-2":
"选择%s专业必修课程%s %s必修课程会带有星标%s 和一些%s附加课程%s",
"help-overview-3":
"参加%s社团%s或者勾搭%s基/姬友%s可以让你的学习过程更加丰富多彩",
"help-overview-4": "上课并通过课程考试修够 %s 个学分",
"help-overview-5": "翘课会让你受%s处分%s",
"help-overview-6": "毕业",
"help-notice-header": "校园安全教育",
"help-notice-content":
'人身安全必须始终放在首位。当你在课程期间感到不适,必须立刻结束当前课程,切忌拿自己的健康当儿戏!在进行任务途中如果感到不适,应立即停下来检查,避免发生意外。必要的时候请务必及时就医。此外,请珍惜自己的生命。一生中没有坎儿是过不去的,如果真的有事情想不开,去找人帮帮自己。',
"help-progress-header": "课程进度说明",
"help-progress-content":
"所有的进度数据都保存在你自己的浏览器缓存里面,网上不会留存任何备份。浏览器在隐私模式下,通常不会储存数据,所以建议你使用普通模式打开本网站。如果你坚持使用隐私模式,提醒你注意保存好你的相关数据文件,通常包括地图文件(.pu)和存档(.puSave)。",
"help-majors-header": "专业",
"help-majors-content":
"选择一个%s专业%s便意味着你将在该领域深造。每个专业都有自己的必修课程(毕业先修课),并且每个课程都可能有它自己的先修课要求。选完专业之后,你可以到%s进度%s页面去查看你的必修课程。你需要获得 %s 个学分才能尝试毕业。如果你中途决定换专业,你可以去专业详情界面退选,但你会因此受到 %s 项随机的处分。",
"help-classes-header": "课程与课表",
"help-classes-content":
"请注意每门课程在每周的开课时间。在课程开课当天,你需要完成课程任务或参加考试才能得到该课程的 1 个出勤点。如果你在开课当天都没有来上课,你将会自动受到 1 项处分。想了解所有的课程要求,可以去课程详情页面查看。你在通过一门课程后,可以立马再选一门,但你最多不能同时上超过 %s 门课。最好不要同时学习太多课程,否则你可能会跟不上课程进度。所有的课程都在周末开设了补习班,翘掉补习课不会被处分(但是任务失败仍会被处分)。",
"help-punishments-header": "处分",
"help-punishments-1":
"翘课(转点仍未开始课程任务)一节将被给予 1 项随机的处分。",
"help-punishments-2": '任务失败时,你必须诚实地按下"失败",并接受处分。',
"help-punishments-3":
"暂停一个任务超过 %s 将被给予处分。当一个任务具有多个步骤时,你将获得额外的暂停时间,你需要在额外的暂停时间里完成其他任务。",
"help-punishments-4": "处分可以在任何时候完成。",
"help-punishments-5": "你最多可以积攒 10 个处分。",
"help-punishments-6":
"只要处分没有全部完成,你就不能参加考试和毕业考核。因此最好不要积攒太多的处分。",
"help-punishments-7":
"任务失败被给予的处分数:日常课程任务失败(%s 项),课程考试失败(%s 项),毕业考核失败(%s 项)。",
"help-clubs-header": "社团",
"help-clubs-1":
"参加社团会给你不同的奖励,例如获得请假条或降低课程任务难度。",
"help-clubs-2": "社团是对课程内容的补充,你可以自由选择社团。",
"help-clubs-3":
"奖励领取之后就不能退还了,所带来的影响将会持续一整天直到转点。",
"help-clubs-4":
"一些社团活动和课程内容重复了,这时你只需要完成课程任务即可获得社团奖励。",
"help-clubs-5":
"在领取奖励之前,先看看自己当日需要参加的课程内容。你一定不想自己因为社团任务被迫戴一整天口塞吧。",
"help-clubs-6": "你最多同时参加 %s 个社团,同时获取 %s 个社团福利。",
"help-clubs-7":
"在学期的最后阶段,你会解锁精英社团。精英社团会给你更丰厚的奖励,与此同时也会给你更难的挑战。",
"help-clubs-8": "注意,你最多参加 %s 个精英社团。",
"help-clubs-9": "社团奖励领取之后,当日不可以取消!",
"help-clubs-10": "所有领取过的奖励会在次日刷新。",
"help-clubs-11":
"注意,你最多只能从社团福利中获得 50% 的难度减免。即如果你在普通社团里得到50%的难度减免,同时你在精英社团里得到25%的减免,那么你最终只会得到50%的总减免,而非75%。",
"help-partners-header": "基/姬友",
"help-partners-content":
"P基/姬友和社团很像,会给你带来相应的福利,例如给你额外的出勤点数。但不同之处在于,基/姬友会让你的课程难度增加。你最多可以同时拥有 %s 个基/姬友。Ta们带来的影响会持续一整天,并在次日重置。",
"help-tasks-header": "任务与计时器",
"help-tasks-content":
'游戏中的专业和班级都有任务系统。在你的课程表页面上,你可以选择你的当日课程要做的任务。每个任务可以有多个子任务 一旦你开始一个任务,你会看到新的任务显示出来,在这里你可以启动它的计时器,或者按 "完成",如果任务不依赖于时间。定时器可以被暂停/恢复,并且它们可以在不同的日子里延续。如果任务从前一天开始但持续到第二天,你不会被处分。如果你的任务完成失败了,你必须按下 "失败 "键来接受处分。所有课程的计时器也可以在该课程的详情页面上看到。',
"help-grades-header": "绩点",
"help-grades-content":
"每当你参加并完成课堂任务时,你将获得 1 个出勤点,如果你有修改器(来自基/姬友或社团),你可以获得额外的出勤点。根据这些出勤点,你将在参加考试后得到一个分数。这取决于你决定你想在考试中表现得多好。你获得的成绩将用于计算你的专业成绩。如果你已经完成了一门课,想提高自己的成绩,你可以随时重修。如果你重修一门课,你需要重考,并取消该课的相关学分,但你将保留已经获得的出勤点。你每更换一次处分,你就将会失去你当前正在上的一门随机课程的出勤点。
想要得到不同等级的绩点,你至少需要获得如下的出勤点数:",
"help-credits-header": "学分",
"help-credits-content":
"毕业需要至少 %s 学分。一种参考的选课方法是 4 个入门课程,3 个普通课程,2 个专家课程和 2 个大师课程。你只有选修了课程之后才会解锁考试内容。完成考试后,你就会得到相应的学分。",
"help-graduating-header": "毕业",
"help-graduating-content":
'你需要先完成所有的专业必修课,并得到 %s 学分,你才可以尝试毕业。某些专业毕业考核甚至可能会持续一个月。如果你在毕业考核的时候失败了,你需要按下 "失败" 按钮来受到 %s 个处分。某些专业毕业考核也会有额外的 "惩罚" 按钮,用来延长任务时长。当你从某个专业毕业,该专业就会被标记为 "完成",你上过的课程都会被重置。你可以继续选修另一门专业,为你的 "职业" 道路打好基础。',
"help-roulette-header": "高潮轮盘系统",
"help-roulette-content":
"在校期间除课程要求之外,你能否高潮取决于%s高潮轮盘%s的结果。你每天仅有一次宝贵的机会去碰碰运气。",
};
class n {
static getLanguage() {
return (
navigator.languages && navigator.languages.length
? navigator.languages[0]
: navigator.userLanguage ||
navigator.language ||
navigator.browserLanguage ||
"en"
)
.toLowerCase()
.substr(0, 2);
}
static getTodaysDay() {
return n.getNow().day();
}
static getNow() {
return moment().add(n.getSetting("timeOffsetSelection") || 0, "hours");
}
static getNowUnix() {
return n.getNow().unix();
}
static getMoment(e) {
return moment(e);
}
static hasMatchingDate(e) {
if (n.getSetting("enableEasyMode")) return !0;
const t = n.getTodaysDay();
return 0 === t || 6 === t || e.filter((e) => e === t).length > 0;
}
static daysToString(e) {
return e.map((e) => n.weekdays[e]).join(", ");
}
static get weekdays() {
return moment.weekdays();
}
static getAcceptedDisclaimer() {
return localStorage.getItem("acceptedDisclaimer") || !1;
}
static setAcceptedDisclaimer() {
localStorage.setItem("acceptedDisclaimer", !0);
}
static getlastRequestedFeedback() {
return localStorage.getItem("lastRequestedFeedback") || void 0;
}
static setlastRequestedFeedback(e) {
localStorage.setItem("lastRequestedFeedback", e);
}
static getTutorial() {
try {
return localStorage.getItem("tutorial") || "";
} catch (e) {
return "mapping;";
}
}
static setTutorial(e) {
localStorage.setItem("tutorial", e);
}
static getLastPage() {
return localStorage.getItem("lastPage");
}
static setLastPage(e) {
localStorage.setItem("lastPage", e);
}
static getSettings() {
try {
return (
JSON.parse(localStorage.getItem("settings")) ||
n.getDefaultSettings()
);
} catch (e) {
return { ...n.getDefaultSettings(), noSettings: !0 };
}
}
static setSettings(e) {
e.noSettings || localStorage.setItem("settings", JSON.stringify(e));
}
static getDefaultSettings() {
return {
enableHardcorePunishments: !1,
enableEasyMode: !1,
enableAutoHide: !0,
enableBackToTop: !0,
hideActiveClasses: !1,
hideFinishedClasses: !0,
autoExtendCarousel: !0,
showConfirmations: !0,
useTableView: !0,
style: "darkly",
useImageHoster: !1,
sessionToken: void 0,
timeOffsetSelection: 0,
useImageExport: !1,
useBlobExport: !0,
useDynamicExport: !1,
useBase64Export: !1,
compressExports: !0,
completeExports: !1,
};
}
static getSetting(e) {
let t = n.getSettings()[e];
return null != t ? t : n.getDefaultSettings()[e];
}
static setSetting(e, t) {
let a = n.getSettings();
((a[e] = t), n.setSettings(a));
}
static getScheduledToasts() {
try {
return JSON.parse(localStorage.getItem("scheduledToasts")) || [];
} catch (e) {
const t = s.getInstance();
return (
n.showToast(
t.T(
"scheduled-toast-error-header",
"Third-party cookies are disabled",
),
t.T(
"scheduled-toast-error-content",
"Please switch to the full Mapping Tool or enable them in the browser settings.",
),
"warning",
),
[]
);
}
}
static setScheduledToasts(e) {
try {
localStorage.setItem("scheduledToasts", JSON.stringify(e));
} catch (e) {
return;
}
}
static scheduleToast(e, t, a) {
void 0 === a && (a = "info");
let s = n.getScheduledToasts();
(s.push({ title: e, message: t, style: a }), n.setScheduledToasts(s));
}
static showScheduledToast() {
let e = n.getScheduledToasts();
for (let t of e) n.showToast(t.title, t.message, t.style);
n.setScheduledToasts([]);
}
static showToast(e, t, a) {
void 0 === a && (a = "info");
const i = s.getInstance();
$("#toastContainer").append(
$(
`