This commit is contained in:
2026-09-12 13:49:44 +08:00
commit a8b1decc48
62 changed files with 16061 additions and 0 deletions

171
src/renderer/i18n.ts Normal file
View File

@@ -0,0 +1,171 @@
// 极简文案:只有中文一种语言;保持 t() 调用点的 API 不变以便后续扩展。
// 缺失键时静默回落到键名本身(开发期容易发现)。
// 简单 {0} {1} 占位符替换。
const dict = {
// 顶栏 / 侧栏
'app.brand': 'Time',
'nav.clock': '时钟',
'nav.alarms': '闹钟',
'nav.pomodoro': '番茄钟',
'nav.countdown': '倒计时',
/** TabStrip 整条 tablist 的无障碍名称 */
'nav.mainTabs': '主导航',
'topbar.pinOn': '已置顶',
'topbar.pinOff': '置顶',
'topbar.settings': '设置',
'topbar.floatingGroup': '浮窗小卡片',
'topbar.floatingPomodoro': '浮窗番茄钟',
'topbar.floatingClock': '浮窗时钟',
'topbar.floatingAlarms': '浮窗闹钟',
'topbar.floatingCountdown': '浮窗倒计时',
// 时钟面板
'clock.subtitle': '当前时间',
'clock.nextNone': '暂无闹钟',
/** {0}=时刻 {1}=剩余分钟 {2}=标签 */
'clock.nextFmtMin': '下一个 {0} · {1} 分钟后 · {2}',
/** {0}=时刻 {1}=小时 {2}=分钟 {3}=标签 */
'clock.nextFmtHm': '下一个 {0} · {1}h {2}m 后 · {3}',
'clock.statEnabledSub': '闹钟',
'clock.pomoStateIdle': '未开始',
// 闹钟
'alarms.title': '闹钟',
'alarms.empty': '暂无闹钟',
'alarms.emptyHint': '点击右上"+ 新建闹钟"开始',
'alarms.newBtn': '+ 新建闹钟',
'alarms.cancelNew': '取消新建',
'alarms.edit': '编辑',
'alarms.delete': '删除',
'alarms.confirmDelete': '确认删除',
'alarms.toggle': '启用',
'alarms.toggleAria': '启用闹钟',
'alarms.countFmt': '{0} / {1} 启用',
'alarms.untitled': '(无标题)',
'alarms.repeatOnce': '一次',
'alarms.repeatDaily': '每日',
// 编辑器
'editor.newTitle': '新建闹钟',
'editor.editTitle': '编辑闹钟',
'editor.label': '标签',
'editor.labelPh': '例如:晨间起床',
'editor.time': '时间',
'editor.save': '保存',
'editor.saving': '保存中…',
'editor.cancel': '取消',
'editor.deleteBtn': '删除',
'editor.timeInvalid': '时间格式错误',
'editor.behaviorNotify': '系统通知',
'editor.behaviorSilent': '静默',
'editor.saveFailedPrefix': '保存失败:',
'editor.deleteFailedPrefix': '删除失败:',
'editor.settingsLoading': '设置尚未加载,请稍后重试。',
'editor.defaultLabel': '闹钟',
'editor.ariaSetTime': '设定闹钟时间',
'editor.ariaHours': '小时',
'editor.ariaMinutes': '分钟',
'editor.ariaSeconds': '秒',
'editor.srHours': '小时',
'editor.srMinutes': '分钟',
'editor.srSeconds': '秒',
'editor.repeat': '每日重复',
'editor.repeatOnce': '一次',
'editor.repeatDaily': '每日',
// 番茄钟
'pomo.idle': '未开始',
'pomo.focus': '专注',
'pomo.shortBreak': '短休',
'pomo.longBreak': '长休',
'pomo.paused': '已暂停',
'pomo.subFocus': '保持专注',
'pomo.subBreak': '休息一下',
'pomo.start': '开始',
'pomo.pause': '暂停',
'pomo.resume': '继续',
'pomo.skip': '跳过',
'pomo.reset': '重置',
'pomo.today': '今日完成',
'pomo.todayUnit': '个番茄',
'pomo.footHint': '长休出现在每完成 4 轮之后',
'pomo.roundPill': '第 {0} 轮',
'pomo.ariaDisplay': '番茄钟显示',
'pomo.ariaIdle': '番茄钟未开始,下一阶段 {0} {1} 分钟',
'pomo.ariaRemain': '{0}{1},剩余 {2}',
'pomo.ariaPaused': '(已暂停)',
// 倒计时
'countdown.title': '倒计时',
'countdown.stateIdle': '空闲',
'countdown.stateRunning': '运行中',
'countdown.statePaused': '暂停',
'countdown.ariaSetDuration': '设定时长',
'countdown.ariaHours': '小时',
'countdown.ariaMinutes': '分钟',
'countdown.ariaSeconds': '秒',
'countdown.ariaDisplay': '倒计时显示',
'countdown.srHours': '小时',
'countdown.srMinutes': '分钟',
'countdown.srSeconds': '秒',
'countdown.startBtn': '开始',
'countdown.pauseBtn': '暂停',
'countdown.resumeBtn': '继续',
'countdown.resetBtn': '重置',
'countdown.doneBtn': '完成',
'countdown.timeUp': '时间到',
'countdown.setN': '设定 {0}',
'countdown.inputEmpty': '请输入时间',
'countdown.ariaPausedFmt': '倒计时已暂停,剩余 {0}',
'countdown.ariaRunningFmt': '倒计时运行中,剩余 {0}',
'countdown.fmtHoursMinutes': '{0} 小时 {1} 分',
'countdown.fmtMinutes': '{0} 分钟',
'countdown.fmtSeconds': '{0} 秒',
// 浮窗番茄钟的文案沿用 pomo.* 共享一份id 全套启停/重置与主页一致);
// 后续若浮窗需要独立文案(如"开始 / 暂停"按钮 title 这类)再拆 floating.pomo.*。
// 浮窗闹钟
'floating.alarms.next': '下一个',
'floating.alarms.empty': '暂无闹钟',
'floating.alarms.tagDefault': '闹钟',
'floating.alarms.titleFmt': '{0} · 共 {1} 个启用',
'floating.alarms.titleOnly': '{0}',
'floating.alarms.countN': '共 {0} 个启用',
'floating.alarms.diffSec': '{0} 秒后',
'floating.alarms.diffMin': '{0} 分后',
'floating.alarms.diffHM': '{0}h {1}m 后',
'floating.alarms.diffH': '{0}h 后',
// 浮窗倒计时
'floating.cd.stateIdle': '空闲',
'floating.cd.stateRunning': '运行中',
'floating.cd.statePaused': '已暂停',
// 浮窗时钟
'floating.clock.dateFmt': '星期{0} {1}月{2}日',
'floating.clock.weekdayChars': '日一二三四五六',
// 设置面板
'settings.title': '设置',
'settings.sub': '个性化外观',
'settings.skinTitle': '外观',
'settings.skinDesc': '点击卡片即可切换整套配色,立即生效。',
'settings.windowTitle': '窗口',
'settings.alwaysOnTop': '窗口置顶',
'settings.alwaysOnTopDesc': '让主窗口悬浮在其它窗口之上',
'settings.modeDark': '暗色',
'settings.modeLight': '亮色',
'settings.aboutTitle': '关于',
'settings.aboutDeveloper': '开发者:关济寰',
'settings.aboutDeveloperAria': '访问关济寰的个人网站',
'settings.aboutOpenFailed': '无法在系统浏览器中打开链接',
'settings.foot': '所有设置都会自动保存到本地',
// 通用
'common.cancel': '取消',
'toast.close': '关闭',
// 错误toast
'error.unhandled': '未捕获的错误:{0}',
'error.unknown': '未知',
'error.script': '脚本错误:{0}',
} as const;
type Dict = typeof dict;
export function t(key: keyof Dict, ...args: unknown[]): string {
let s = (dict as Record<string, string>)[key as string] ?? (key as string);
if (args.length > 0) {
s = s.replace(/\{(\d+)\}/g, (_m, idx) => String(args[Number(idx)] ?? ''));
}
return s;
}