export type Lang = 'zh' | 'en';
const zh = {
'header.menu': '菜单',
'header.sessionList': '会话列表',
'header.switchCwd': '切换工作目录',
'header.noCwd': '(未设置工作目录)',
'sidebar.expand': '展开侧栏',
'sidebar.collapse': '收起侧栏',
'sidebar.newChat': '新建对话',
'sidebar.search': '搜索会话',
'sidebar.searchPlaceholder': '搜索会话…',
'sidebar.recent': '最近会话',
'sidebar.group': '分组',
'sidebar.groupBy': '分组方式',
'sidebar.groupNone': '默认',
'sidebar.groupDate': '日期',
'sidebar.loading': '加载中…',
'sidebar.empty': '暂无会话',
'sidebar.emptyInCwd': '该目录暂无会话',
'sidebar.noMatch': '无匹配会话',
'sidebar.msgCount': '{n} 条',
'sidebar.sessionCount': '{n} 个会话',
'sidebar.sessionCountFiltered': '{f} / {t} 个会话',
'sidebar.noRecords': '无会话记录',
'sidebar.settings': '设置',
'sidebar.itemMenu': '更多操作',
'sidebar.rename': '重命名',
'sidebar.delete': '删除',
'rename.title': '重命名会话',
'rename.placeholder': '会话名称',
'rename.confirm': '保存',
'delete.title': '删除会话',
'delete.confirm': '删除',
'delete.body': '确定删除会话「{name}」吗?此操作不可撤销。',
'time.justNow': '刚刚',
'time.minutesAgo': '{n}分钟前',
'time.hoursAgo': '{n}小时前',
'time.yesterday': '昨天',
'model.label': '模型',
'effort.label': '强度',
'effort.default': '默认',
'effort.high': 'High',
'effort.max': 'Max',
'chat.startHint': '发送消息开始对话…',
'chat.continueHint': '发送消息继续此会话',
'chat.skillExpand': '展开查看',
'chat.skillCollapse': '收起',
'chat.continueSession': '继续会话 {id}(历史在 TUI/磁盘中)',
'chat.inputPlaceholder': '输入消息,Enter 发送,Shift+Enter 换行…',
'chat.stop': '停止',
'chat.send': '发送',
'chat.queue': '排队发送(当前回合结束后自动发送)',
'chat.queued': '排队中',
'chat.removeQueued': '移除',
'chat.error': '[错误: {msg}]',
'chat.connError': '[连接错误: {msg}]',
'attach.menu': '添加',
'attach.image': '上传图片',
'attach.file': '上传文件',
'attach.skill': '选择技能',
'attach.imageSoon': '即将支持',
'attach.removeImage': '移除图片',
'attach.tooLarge': '图片不能超过 {mb}M,已自动忽略超限图片。',
'attach.dismissError': '关闭提示',
'attach.skillsEmpty': '暂无可用技能。在项目 .atomcode/skills/<名称>/SKILL.md 添加技能,或放到 ~/.atomcode/skills/ 全局共享。',
'attach.skillsLoading': '加载中…',
'filepicker.title': '选择文件',
'filepicker.empty': '(空目录)',
'filepicker.loading': '加载中…',
'filepicker.noFiles': '(无文件)',
'tool.waiting': '等待批准…',
'tool.running': '运行中…',
'tool.done': '完成',
'tool.failed': '失败',
'tool.args': '参数',
'tool.output': '输出',
'settings.title': '设置',
'settings.theme': '主题',
'settings.theme.light': '浅色',
'settings.theme.dark': '深色',
'settings.theme.system': '跟随系统',
'settings.language': '语言',
'settings.modelConfig': '模型配置',
'settings.close': '关闭',
'settings.loadFailed': '加载失败',
'settings.loading': '加载中…',
'settings.defaultProvider': '默认 Provider',
'settings.defaultWorkdir': '默认工作目录',
'settings.configFile': '配置文件',
'settings.default': '默认',
'settings.model': '模型',
'settings.contextWindow': '上下文窗口',
'settings.contextWindowLocked': 'AtomGit 模型的上下文窗口由平台固定,不可修改',
'settings.apiKey': 'API Key',
'settings.configured': '已配置',
'settings.notConfigured': '未配置',
'settings.providers': 'Providers',
'settings.menuTheme': '主题设置',
'settings.menuLang': '语言设置',
'settings.menuModel': '模型配置',
'settings.menuRemote': '远程访问',
'remote.title': '远程访问',
'remote.intro': '通过蒲公英私有网络,从手机等设备安全访问本机 webui(虚拟局域网、不暴露公网)。',
'remote.loading': '检测中…',
'remote.ready': '已就绪,用手机扫码或打开下面的地址(手机需登录同一蒲公英账号、加入同一网络):',
'remote.notReachable': '已检测到蒲公英,但 webui 仅绑定了本机。请在 TUI 运行 /webui --host {ip} 后刷新本页。',
'remote.notConnected': '已安装蒲公英,但本机还没分配虚拟 IP。请在蒲公英客户端连接组网后,回到这里重新检测。',
'remote.notInstalled': '未检测到蒲公英。请在本机与手机都安装蒲公英并登录同一账号、加入同一网络,然后回到这里。',
'remote.installLink': '下载蒲公英',
'remote.guide': '使用引导',
'remote.copy': '复制链接',
'remote.copied': '已复制',
'remote.refresh': '重新检测',
'remote.warnToken': '该链接包含访问令牌,等同于密码,请勿外传。',
'settings.addModel': '添加模型',
'settings.providerName': '名称',
'settings.providerType': '类型',
'settings.baseUrl': 'Base URL',
'settings.apiKeyInput': 'API Key',
'settings.setAsDefault': '设为默认',
'settings.add': '添加',
'settings.adding': '添加中…',
'settings.edit': '编辑',
'settings.editModel': '编辑模型',
'settings.save': '保存',
'settings.saving': '保存中…',
'settings.apiKeyKeep': '留空则保留现有',
'settings.updateFailed': '更新失败',
'settings.delete': '删除',
'settings.deleteTitle': '删除模型',
'settings.deleteConfirm': '确定删除模型「{name}」?',
'settings.addFailed': '添加失败',
'settings.nameModelRequired': '名称和模型必填',
'settings.allRequired': '请填写所有字段',
'settings.nameExists': '模型名称已存在,请使用其他名称',
'cwd.title': '切换工作目录',
'cwd.affectsSession': '仅影响当前会话',
'cwd.path': '路径',
'cwd.jump': '跳转',
'cwd.hintBefore': '支持',
'cwd.hintAfter': '展开。下方可浏览子目录(GET /fs/list)。',
'cwd.loading': '加载中…',
'cwd.noSubdirs': '(无子目录)',
'cwd.recentProjects': '最近项目',
'cwd.current': '当前',
'cwd.setDefault': '设为默认目录(重启后仍生效)',
'cwd.newFolder': '新建文件夹',
'cwd.folderName': '文件夹名称',
'cwd.create': '创建',
'cwd.createFailed': '创建失败',
'cwd.cancel': '取消',
'cwd.confirm': '确定',
'perm.title': '工具请求批准',
'perm.args': '参数',
'perm.deny': '拒绝',
'perm.approve': '批准',
'perm.alwaysAllow': '本会话总是允许',
'perm.allowPersist': '永久允许此工具',
'sync.toggle': '同步当前会话',
'sync.on': '已同步(多端实时)',
'sync.off': '独立会话',
'common.readonly': '只读',
'common.cancel': '取消',
} as const;
export type MsgKey = keyof typeof zh;
const en: Record<MsgKey, string> = {
'header.menu': 'Menu',
'header.sessionList': 'Session list',
'header.switchCwd': 'Switch working directory',
'header.noCwd': '(No working directory)',
'sidebar.expand': 'Expand sidebar',
'sidebar.collapse': 'Collapse sidebar',
'sidebar.newChat': 'New chat',
'sidebar.search': 'Search sessions',
'sidebar.searchPlaceholder': 'Search sessions…',
'sidebar.recent': 'Recent',
'sidebar.group': 'Group',
'sidebar.groupBy': 'Group by',
'sidebar.groupNone': 'None',
'sidebar.groupDate': 'Date',
'sidebar.loading': 'Loading…',
'sidebar.empty': 'No sessions',
'sidebar.emptyInCwd': 'No sessions in this directory',
'sidebar.noMatch': 'No matches',
'sidebar.msgCount': '{n} msgs',
'sidebar.sessionCount': '{n} sessions',
'sidebar.sessionCountFiltered': '{f} / {t} sessions',
'sidebar.noRecords': 'No session records',
'sidebar.settings': 'Settings',
'sidebar.itemMenu': 'More actions',
'sidebar.rename': 'Rename',
'sidebar.delete': 'Delete',
'rename.title': 'Rename session',
'rename.placeholder': 'Session name',
'rename.confirm': 'Save',
'delete.title': 'Delete session',
'delete.confirm': 'Delete',
'delete.body': 'Delete session “{name}”? This cannot be undone.',
'time.justNow': 'just now',
'time.minutesAgo': '{n} min ago',
'time.hoursAgo': '{n} hr ago',
'time.yesterday': 'yesterday',
'model.label': 'Model',
'effort.label': 'Effort',
'effort.default': 'Default',
'effort.high': 'High',
'effort.max': 'Max',
'chat.startHint': 'Send a message to start a conversation…',
'chat.continueHint': 'Send a message to continue this session',
'chat.skillExpand': 'Expand',
'chat.skillCollapse': 'Collapse',
'chat.continueSession': 'Continue session {id} (history on TUI/disk)',
'chat.inputPlaceholder': 'Type a message — Enter to send, Shift+Enter for newline…',
'chat.stop': 'Stop',
'chat.send': 'Send',
'chat.queue': 'Queue message (sent after the current turn finishes)',
'chat.queued': 'Queued',
'chat.removeQueued': 'Remove',
'chat.error': '[Error: {msg}]',
'chat.connError': '[Connection error: {msg}]',
'attach.menu': 'Add',
'attach.image': 'Upload image',
'attach.file': 'Upload file',
'attach.skill': 'Choose skill',
'attach.imageSoon': 'Coming soon',
'attach.removeImage': 'Remove image',
'attach.tooLarge': 'Images must be under {mb}M; oversized images were skipped.',
'attach.dismissError': 'Dismiss',
'attach.skillsEmpty': 'No skills yet. Add one at .atomcode/skills/<name>/SKILL.md, or ~/.atomcode/skills/ to share globally.',
'attach.skillsLoading': 'Loading…',
'filepicker.title': 'Choose a file',
'filepicker.empty': '(empty)',
'filepicker.loading': 'Loading…',
'filepicker.noFiles': '(no files)',
'tool.waiting': 'Awaiting approval…',
'tool.running': 'Running…',
'tool.done': 'Done',
'tool.failed': 'Failed',
'tool.args': 'Arguments',
'tool.output': 'Output',
'settings.title': 'Settings',
'settings.theme': 'Theme',
'settings.theme.light': 'Light',
'settings.theme.dark': 'Dark',
'settings.theme.system': 'System',
'settings.language': 'Language',
'settings.modelConfig': 'Model configuration',
'settings.close': 'Close',
'settings.loadFailed': 'Load failed',
'settings.loading': 'Loading…',
'settings.defaultProvider': 'Default provider',
'settings.defaultWorkdir': 'Default working directory',
'settings.configFile': 'Config file',
'settings.default': 'Default',
'settings.model': 'Model',
'settings.contextWindow': 'Context window',
'settings.contextWindowLocked': 'Context window for AtomGit models is fixed by the platform and cannot be changed',
'settings.apiKey': 'API Key',
'settings.configured': 'Configured',
'settings.notConfigured': 'Not configured',
'settings.providers': 'Providers',
'settings.menuTheme': 'Theme settings',
'settings.menuLang': 'Language settings',
'settings.menuModel': 'Model configuration',
'settings.menuRemote': 'Remote access',
'remote.title': 'Remote access',
'remote.intro': 'Reach this webui from your phone or other devices over the 蒲公英 (Oray PGY) private network — a virtual LAN, nothing exposed publicly.',
'remote.loading': 'Checking…',
'remote.ready': 'Ready — scan the QR or open the URL below on your phone (it must be signed into the same 蒲公英 account and joined to the same network):',
'remote.notReachable': '蒲公英 detected, but the webui is bound to localhost only. Run /webui --host {ip} in the TUI, then refresh this page.',
'remote.notConnected': '蒲公英 is installed but this machine has no virtual IP yet. Connect it in the 蒲公英 client, then re-check here.',
'remote.notInstalled': '蒲公英 not detected. Install 蒲公英 on both this machine and your phone, sign into the same account and join the same network, then come back.',
'remote.installLink': 'Download 蒲公英',
'remote.guide': 'Usage guide',
'remote.copy': 'Copy link',
'remote.copied': 'Copied',
'remote.refresh': 'Re-check',
'remote.warnToken': 'This link contains an access token — treat it like a password and do not share it.',
'settings.addModel': 'Add model',
'settings.providerName': 'Name',
'settings.providerType': 'Type',
'settings.baseUrl': 'Base URL',
'settings.apiKeyInput': 'API Key',
'settings.setAsDefault': 'Set as default',
'settings.add': 'Add',
'settings.adding': 'Adding…',
'settings.edit': 'Edit',
'settings.editModel': 'Edit provider',
'settings.save': 'Save',
'settings.saving': 'Saving…',
'settings.apiKeyKeep': 'Leave blank to keep current',
'settings.updateFailed': 'Update failed',
'settings.delete': 'Delete',
'settings.deleteTitle': 'Delete model',
'settings.deleteConfirm': 'Delete model "{name}"?',
'settings.addFailed': 'Add failed',
'settings.nameModelRequired': 'Name and model are required',
'settings.allRequired': 'Please fill in all fields',
'settings.nameExists': 'Model name already exists, please use a different name',
'cwd.title': 'Switch working directory',
'cwd.affectsSession': 'Affects current session only',
'cwd.path': 'Path',
'cwd.jump': 'Go',
'cwd.hintBefore': 'Supports',
'cwd.hintAfter': 'expansion. Browse subdirectories below (GET /fs/list).',
'cwd.loading': 'Loading…',
'cwd.noSubdirs': '(No subdirectories)',
'cwd.recentProjects': 'Recent projects',
'cwd.current': 'Current',
'cwd.setDefault': 'Set as default directory (persists across restarts)',
'cwd.newFolder': 'New folder',
'cwd.folderName': 'Folder name',
'cwd.create': 'Create',
'cwd.createFailed': 'Create failed',
'cwd.cancel': 'Cancel',
'cwd.confirm': 'Confirm',
'perm.title': 'Tool approval request',
'perm.args': 'Arguments',
'perm.deny': 'Deny',
'perm.approve': 'Approve',
'perm.alwaysAllow': 'Always allow this session',
'perm.allowPersist': 'Always allow this tool',
'sync.toggle': 'Sync current session',
'sync.on': 'Synced (live)',
'sync.off': 'Independent',
'common.readonly': 'Read-only',
'common.cancel': 'Cancel',
};
export const messages: Record<Lang, Record<MsgKey, string>> = { zh, en };