Files
Time/src/renderer/i18n.ts
2026-09-12 13:49:44 +08:00

171 lines
6.4 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
// 极简文案:只有中文一种语言;保持 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;
}