const DICT = Object.freeze({
    zh: {
        // Global
        'lang.zh': '中文',
        'lang.en': 'English',
        'lang.label': '语言',
        'nav.topTabs.aria': '导航',

        // Common
        'common.all': '全部',
        'common.copy': '复制',
        'common.paste': '粘贴',
        'common.edit': '编辑',
        'common.install': '安装',
        'common.update': '升级',
        'common.uninstall': '卸载',
        'common.official': '官方',
        'common.custom': '自定义',
        'common.rules': '规则',
        'common.troubleshooting': '排障提示',
        'common.command': '命令',
        'common.mirror': '镜像源',
        'common.packageManager': '包管理器',
        'common.action': '操作',
        'common.targets': '目标数',
        'common.currentPm': '当前包管理器',
        'common.currentAction': '当前操作',
        'common.mirrorActive': '镜像',
        'common.defaultOfficial': '官方默认',
        'common.cancel': '取消',
        'common.confirm': '确认',
        'common.add': '添加',
        'common.save': '保存',
        'common.saveApply': '保存并应用',
        'common.close': '关闭',
        'common.delete': '删除',
        'common.clear': '清空',
        'common.show': '显示',
        'common.hide': '隐藏',
        'common.detail': '详情',
        'common.refresh': '刷新',
        'common.refreshing': '刷新中...',
        'common.loading': '加载中...',
        'common.saving': '保存中...',
        'common.sending': '发送中...',
        'common.scanning': '扫描中...',
        'common.export': '导出',
        'common.import': '导入',
        'common.apply': '应用',
        'common.applying': '应用中...',
        'common.confirming': '确认中...',
        'common.writeToEditor': '写入编辑器',
        'common.refreshFromText': '从文本刷新',
        'common.backToEdit': '返回编辑',
        'common.selectAll': '全选',
        'common.unselectAll': '取消全选',
        'common.resetFilters': '重置筛选',
        'common.notEditable': '不可编辑',
        'common.notDeletable': '不可删除',
        'common.notLoaded': '未加载',
        'common.exists': '已存在',
        'common.notExistsWillCreateOnApply': '不存在，将在应用时创建',
        'common.notExistsWillCreateOnSave': '不存在，将在保存时创建',
        'common.none': '暂无',
        'cli.missing.title': '{name} CLI 未安装',
        'cli.missing.subtitle': '请先安装 {name} CLI 后再继续使用此页面。',
        'cli.missing.openDocs': '打开安装指南',
        'cli.missing.commandAria': '{name} CLI 安装命令',

        // Brand
        'brand.kicker.workspace': '工作区',
        'brand.subtitle.localConfigSessionsWorkspace': '本地配置与会话工作区',

        // Confirm dialog
        'confirm.aria': '确认操作',
        'confirm.title.default': '请确认操作',
        'confirm.ok': '确认',
        'confirm.cancel': '取消',

        // Shared fields
        'field.name': '名称',
        'field.configName': '配置名称',
        'field.apiEndpoint': 'API 端点',
        'field.apiKey': '认证密钥',
        'field.baseUrl': 'Base URL',
        'field.provider': '提供商',
        'field.providerName': 'Provider 名称',
        'field.modelName': '模型名称',
        'field.model': '模型',
        'field.message': '消息',
        'field.varName': '变量名',
        'field.targetFile': '目标文件',
        'field.modelId': '模型 ID',
        'field.displayName': '展示名称',
        'field.contextAndMaxOutput': '上下文与最大输出',
        'field.apiType': 'API 类型',
        'field.env': '环境变量',
        'field.allow': 'Allow',
        'field.deny': 'Deny',

        // Shared placeholders/hints
        'placeholder.providerNameExample': '例如: myapi',
        'placeholder.apiEndpointExample': 'https://api.example.com/v1',
        'placeholder.providerName': '提供商名称',
        'placeholder.keepUnchanged': '留空则保持不变',
        'hint.keepKeyUnchanged': '留空表示不修改密钥',
        'placeholder.modelExample': '例如: gpt-5',
        'placeholder.configNameExample': '例如: 智谱GLM',
        'placeholder.apiKeyExampleClaude': 'sk-ant-...',
        'placeholder.baseUrlExampleClaude': 'https://open.bigmodel.cn/api/anthropic',
        'placeholder.selectProvider': '请选择提供商',

        // Roles / labels
        'role.you': '你',
        'role.provider': '提供商',
        'label.model': '模型：',

        // Top tabs
        'tab.dashboard': '概览',
        'tab.docs': '文档',
        'tab.config': '配置',
        'tab.config.codex': 'Codex',
        'tab.config.claude': 'Claude',
        'tab.config.openclaw': 'OpenClaw',
        'tab.sessions': '会话',
        'tab.usage': '用量',
        'tab.orchestration': '任务',
        'tab.market': 'Skills',
        'tab.plugins': '插件',
        'tab.settings': '设置',

        // Side rail section titles
        'side.overview': '概览',
        'side.docs': '文档',
        'side.config': '配置',
        'side.sessions': '会话',
        'side.plugins': '插件',
        'side.system': '系统',
        'side.orchestration': '任务',
        'side.skills': 'Skills',

        // Side rail items
        'side.overview.doctor': 'Doctor 面板',
        'side.overview.doctor.meta': '总览 / 诊断 / 跳转',
        'side.docs.cliInstall': 'CLI 安装',
        'side.docs.cliInstall.meta': '安装 / 升级 / 卸载',
        'side.config.codex': 'Codex',
        'side.config.codex.meta': 'Provider / Model',
        'side.config.claude': 'Claude Code',
        'side.config.claude.meta': 'Claude Settings',
        'side.config.openclaw': 'OpenClaw',
        'side.config.openclaw.meta': 'JSON5 / AGENTS',
        'side.sessions.browser': '会话浏览',
        'side.sessions.browser.meta': '浏览 / 导出 / 清理',
        'side.plugins.tools': '提示词工具',
        'side.plugins.tools.meta': '模板 / 变量',
        'side.system.settings': '运行设置',
        'side.system.settings.meta': '数据 / 备份',

        // Header titles
        'kicker.dashboard': 'Doctor',
        'kicker.config': 'Configuration',
        'kicker.sessions': 'Sessions',
        'kicker.usage': 'Usage',
        'kicker.orchestration': 'Tasks',
        'kicker.market': 'Skills',
        'kicker.plugins': 'Plugins',
        'kicker.docs': 'Docs',
        'kicker.settings': 'Settings',

        'title.dashboard': 'Dashboard / Doctor',
        'title.config': '本地配置控制台',
        'title.sessions': '会话与导出',
        'title.usage': '本地用量与趋势',
        'title.orchestration': '任务编排',
        'title.market': 'Skills 安装与同步',
        'title.plugins': '插件与模板',
        'title.docs': 'CLI 安装与文档',
        'title.settings': '系统与数据设置',

        'subtitle.dashboard': '聚合状态与诊断入口。',
        'subtitle.config': '管理本地配置与模型。',
        'subtitle.sessions': '浏览与导出会话。',
        'subtitle.usage': '查看近 7 / 30 天用量。',
        'subtitle.orchestration': '规划、排队、执行与回看本地任务。',
        'subtitle.market': '管理本地 Skills。',
        'subtitle.plugins': '管理模板化 prompt 与可复用插件。',
        'subtitle.docs': '查看 CLI 安装命令与排障。',
        'subtitle.settings': '管理下载、目录与回收站。',
        'dashboard.doctor.title': 'Doctor',
        'dashboard.doctor.runChecks': '运行检查',
        'dashboard.doctor.checking': '检查中...',
        'dashboard.doctor.export': '导出报告',
        'dashboard.doctor.export.json': '导出 JSON',
        'dashboard.doctor.export.md': '导出 Markdown',
        'dashboard.doctor.open': '打开',
        'doctor.action.openConfig': '打开 Config',
        'doctor.action.checkProvider': '检查 Provider 配置',
        'doctor.action.openUsage': '打开 Usage',
        'doctor.action.openSessions': '打开 Sessions',
        'doctor.action.openTasks': '打开 Tasks',
        'doctor.action.viewTaskLogs': '查看 Tasks / Logs',
        'doctor.action.openSkills': '打开 Skills',
        'doctor.issue.configNotReady.problem': '配置文件未就绪',
        'doctor.issue.configNotReady.impact': '可能导致 provider/model 无法读取，模型列表与请求将不可用。',
        'doctor.issue.providerUnreachable.problem.remote-model-probe-unreachable': 'Provider 不可达',
        'doctor.issue.providerUnreachable.problem.remote-model-probe-auth-failed': 'Provider 鉴权失败',
        'doctor.issue.providerUnreachable.problem.remote-model-probe-not-found': 'Provider 返回 404',
        'doctor.issue.providerUnreachable.problem.remote-model-probe-http-error': 'Provider 返回 HTTP 错误',
        'doctor.issue.providerUnreachable.problem.remote-model-probe-error': 'Provider 探测失败',
        'doctor.issue.providerUnreachable.problem.unknown': 'Provider 不可用',
        'doctor.issue.providerUnreachable.impactAuth': '鉴权失败会导致模型列表/对话请求返回 401/403。',
        'doctor.issue.providerUnreachable.impactNetwork': '远端不可达会导致模型列表/对话请求失败或超时。',
        'doctor.issue.configHealthFailed.problem': '配置健康检查未通过',
        'doctor.issue.configHealthFailed.impact': '可能导致部分功能不可用或行为不符合预期。',
        'doctor.issue.usageError.problem': 'Usage 统计异常',
        'doctor.issue.usageError.impact': 'Usage 页面可能无法展示趋势/汇总，Doctor 的用量诊断也会缺失。',
        'doctor.issue.usageMissingModel.problem': '部分会话缺少模型信息',
        'doctor.issue.usageMissingModel.impact': '会导致用量归因与成本估算不准确。',
        'doctor.issue.tasksError.problem': 'Tasks 状态读取失败',
        'doctor.issue.tasksError.impact': '可能导致编排队列/运行记录无法展示。',
        'doctor.issue.tasksFailed.problem': '存在失败的任务运行',
        'doctor.issue.tasksFailed.impact': '可能导致自动化流水线中断，需要查看日志并重试或修复输入。',
        'doctor.issue.skillsError.problem': 'Skills 列表读取失败',
        'doctor.issue.skillsError.impact': '会导致 Skills 页面无法正常展示或安装。',
        'doctor.issue.skillsRootMissing.problem': 'Skills 目录不存在',
        'doctor.issue.skillsRootMissing.impact': '会导致 Skills 安装/扫描为空；可在 Settings/Docs 按指引初始化目录。',
        'doctor.issue.skillsMissingFiles.problem': '存在缺失 skill.json 的技能',
        'doctor.issue.skillsMissingFiles.impact': '会导致部分技能无法被运行或同步。',
        'dashboard.card.config': '配置',
        'dashboard.card.sessions': '会话',
        'dashboard.card.usage': '用量',
        'dashboard.card.tasks': '任务',
        'dashboard.card.skills': 'Skills',
        'dashboard.kv.model': '模型',
        'dashboard.kv.issue': '异常',
        'dashboard.kv.active': '当前',
        'dashboard.kv.sessions': '会话数',
        'dashboard.kv.missingModel': '缺失模型',
        'dashboard.kv.blockers': '阻塞',
        'dashboard.kv.runs': '运行',
        'dashboard.kv.target': '目标',
        'dashboard.kv.root': '目录',
        'dashboard.status.health': '健康',
        'dashboard.status.busy': '忙闲',
        'dashboard.status.models': '模型',
        'dashboard.busy.init': '初始化',
        'dashboard.busy.sessions': '会话加载',
        'dashboard.busy.models': '模型加载',
        'dashboard.busy.configApply': '配置应用',
        'dashboard.busy.agents': 'AGENTS 保存',
        'dashboard.busy.skills': 'Skills 管理',
        'dashboard.busy.tasks': '任务编排',
        'dashboard.busy.idle': '空闲',
        'dashboard.message.none': '暂无提示',
        'dashboard.sessionSource.codex': 'Codex',
        'dashboard.sessionSource.claude': 'Claude Code',
        'dashboard.sessionSource.gemini': 'Gemini CLI',
        'dashboard.sessionSource.codebuddy': 'CodeBuddy Code',
        'dashboard.sessionSource.all': '全部',
        'dashboard.sessionPath.all': '全部路径',
        'dashboard.sessionQuery.unsupported': '当前来源不支持',
        'dashboard.sessionQuery.unset': '未设置',
        'dashboard.healthStatus.failRead': '读取失败',
        'dashboard.healthStatus.initializing': '初始化中',
        'dashboard.healthStatus.ok': '正常',
        'dashboard.modelStatus.loading': '加载中',
        'dashboard.modelStatus.error': '加载异常',
        'dashboard.modelStatus.ok': '正常',
        'dashboard.health.ok': '检查通过',
        'dashboard.health.fail': '检查失败',
        'dashboard.health.issues': '{count} 条问题',
        'dashboard.issues.title': '发现 {count} 条可操作问题',
        'dashboard.state.loading': '加载中',
        'dashboard.state.ready': '就绪',
        'dashboard.state.idle': '未加载',
        'dashboard.none': '无',
        'dashboard.sessions.count': '{count} 条会话',
        'dashboard.usage.range': '范围 {value}',
        'dashboard.tasks.queue': 'run {running} / queue {queued}',
        'dashboard.skills.count': 'installed {installed} / import {importable}',
        'dashboard.providersHealth.title': 'Provider 健康状态',
        'dashboard.providersHealth.current': '(当前)',
        'dashboard.providersHealth.checking': '检查中...',
        'dashboard.providersHealth.allOk': '所有 Provider 正常',
        'dashboard.providersHealth.hasIssues': '{count} 个 Provider 存在问题',

        // Plugins panel
        'plugins.sidebar.title': 'Plugins',
        'plugins.sidebar.note': '可复用的标准化工具。未来自定义插件应遵循相同结构。',
        'plugins.sidebar.ariaList': '插件列表',
        'plugins.main.ariaWorkspace': '插件工作区',
        'plugins.refresh': '刷新',
        'plugins.refreshing': '刷新中...',
        'plugins.promptTemplates.title': '提示词模板',
        'plugins.promptTemplates.subtitle': '内置：代码注释润色（{{code}}）。复制后直接粘贴到输入框即可。',
        'plugins.promptTemplates.mode.aria': '提示词模板模式',
        'plugins.promptTemplates.mode.compose': '生成',
        'plugins.promptTemplates.mode.manage': '管理',
        'plugins.promptTemplates.compose.selectTemplate': '选择模板',
        'plugins.promptTemplates.compose.chooseTemplate': '选择模板',
        'plugins.promptTemplates.compose.chooseTemplateHint': '请选择一个模板开始生成。',
        'plugins.promptTemplates.compose.builtinSuffix': '（内置）',
        'plugins.promptTemplates.compose.empty': '暂无可用模板。',
        'plugins.promptTemplates.compose.varsHint': '变量填写与新增请在「管理」中进行。',
        'plugins.promptTemplates.compose.missingCount': '未填 {count} 项',
        'plugins.promptTemplates.compose.jumpToMissing': '跳到未填',
        'plugins.promptTemplates.compose.goManage': '去管理填写变量',
        'plugins.promptTemplates.compose.outputTitle': '生成结果',
        'plugins.promptTemplates.compose.outputHint': '点“复制”后直接粘贴到 Codex/Claude 输入框。',
        'plugins.promptTemplates.compose.outputAria': '生成结果（提示词）',
        'plugins.promptTemplates.compose.copy': '复制',
        'plugins.promptTemplates.manage.searchAria': '搜索模板',
        'plugins.promptTemplates.manage.searchPlaceholder': '搜索模板',
        'plugins.promptTemplates.manage.create': '新建',
        'plugins.promptTemplates.manage.export': '导出',
        'plugins.promptTemplates.manage.import': '导入',
        'plugins.promptTemplates.manage.loading': '正在加载模板...',
        'plugins.promptTemplates.manage.empty': '暂无模板。',
        'plugins.promptTemplates.manage.vars': '{count} vars',
        'plugins.promptTemplates.manage.builtin': 'built-in',
        'plugins.promptTemplates.manage.custom': 'custom',
        'plugins.promptTemplates.manage.newTemplateName': '新模板',
        'plugins.promptTemplates.editor.selectHint': '请选择一个模板进行编辑。',
        'plugins.promptTemplates.editor.namePlaceholder': '模板名称',
        'plugins.promptTemplates.editor.nameAria': '模板名称',
        'plugins.promptTemplates.editor.duplicate': '复制',
        'plugins.promptTemplates.editor.delete': '删除',
        'plugins.promptTemplates.editor.save': '保存',
        'plugins.promptTemplates.editor.builtinReadOnly': '内置模板为只读，不支持编辑/保存/删除/复制。',
        'plugins.promptTemplates.editor.descPlaceholder': '描述（可选）',
        'plugins.promptTemplates.editor.descAria': '模板描述',
        'plugins.promptTemplates.editor.templateLabel': '模板',
        'plugins.promptTemplates.editor.templateAria': '模板内容',
        'plugins.promptTemplates.editor.templatePlaceholder': '在这里编写模板。使用 {{var}} 占位符。',
        'plugins.promptTemplates.vars.title': '变量',
        'plugins.promptTemplates.vars.hint': '从模板中检测。填写后可渲染最终提示词。',
        'plugins.promptTemplates.vars.reset': '重置',
        'plugins.promptTemplates.vars.empty': '未检测到变量。',
        'plugins.promptTemplates.vars.valuePlaceholder': '变量值：{name}',
        'plugins.promptTemplates.preview.title': '预览',
        'plugins.promptTemplates.preview.hint': '渲染结果（缺失变量会替换为空）。',
        'plugins.promptTemplates.preview.copy': '复制',
        'plugins.promptTemplates.preview.outputAria': '渲染结果（提示词）',
        'plugins.promptTemplates.noPluginSelected': '请先从左侧选择一个插件。',

        'plugins.meta.attribution': '创建者：{createdBy} · 维护者：{maintainers}',
        'plugins.meta.createdBy': '创建者：{createdBy}',
        'plugins.meta.maintainedBy': '维护者：{maintainers}',

        // Built-in prompt templates
        'plugins.builtin.commentPolish.name': '代码注释润色',
        'plugins.builtin.commentPolish.desc': '轻微收敛以下代码注释 {{code}}',
        'plugins.builtin.commentPolish.line1': '轻微收敛以下代码注释',
        'plugins.builtin.ruleAck.name': '规则确认回复',
        'plugins.builtin.ruleAck.desc': '请根据【{{rule}}】，收到请回复',
        'plugins.builtin.ruleAck.line1': '请根据【{{rule}}】，收到请回复',

        // Toasts
        'toast.copy.empty': '没有可复制内容',
        'toast.copy.ok': '已复制',
        'toast.copy.fail': '复制失败',
        'toast.save.ok': '已保存',
        'toast.save.fail': '保存失败',
        'toast.delete.ok': '已删除',
        'toast.delete.fail': '删除失败',
        'toast.export.empty': '没有可导出内容',
        'toast.export.ok': '已导出',
        'toast.export.fail': '导出失败',
        'toast.import.ok': '导入成功',
        'toast.import.fail': '导入失败',
        'toast.import.notAvailable': '导入不可用',
        'toast.import.readFileFail': '读取文件失败',
        'toast.import.invalidJson': 'JSON 无效',
        'toast.import.expectedArray': 'JSON 必须为数组',
        'toast.export.notSupported': '当前不支持导出',
        'toast.plugins.loadFail': '加载 Plugins 失败',
        'toast.templates.builtinNotEditable': '内置模板不可编辑',
        'toast.templates.builtinNotModifiable': '内置模板不可修改，请先复制再编辑',
        'toast.templates.nameRequired': '模板名称不能为空',
        'toast.templates.builtinNotDuplicable': '内置模板不可复制',
        'toast.templates.builtinNotDeletable': '内置模板不可删除',
        'toast.templates.deleteTitle': '删除模板',
        'toast.templates.deleteMessage': '删除“{name}”？此操作无法撤销。',
        'toast.templates.deleteConfirm': '删除',
        'toast.templates.deleteCancel': '取消',

        // Basic modals
        'modal.providerAdd.title': '添加提供商',
        'modal.providerEdit.title': '编辑提供商',
        'modal.modelAdd.title': '添加模型',
        'modal.modelManage.title': '管理模型',
        'modal.claudeConfigAdd.title': '添加 Claude Code 配置',
        'modal.claudeConfigEdit.title': '编辑 Claude Code 配置',
        'field.useBuiltinTransform': '使用内建转换（兼容 OpenAI 格式）',
        'hint.useBuiltinTransform': '开启后：写入的 base_url 会指向 codexmate 内建转换服务；Codex 使用的令牌固定为 codexmate。',

        // Config template / agents modals
        'modal.configTemplate.title': 'Config 模板编辑器（手动确认应用）',
        'modal.configTemplate.label': 'config.toml 模板',
        'modal.configTemplate.placeholder': '在这里编辑 config.toml 模板内容',
        'modal.configTemplate.mode.twoStep': '两步确认：先预览差异，再应用写入。',
        'modal.configTemplate.mode.oneStep': '一步应用：点击“应用”直接写入。',
        'diff.title.configTemplate': '差异预览（config.toml）',
        'diff.generating': '生成中...',
        'diff.failed': '生成失败',
        'diff.noChanges': '未检测到改动',
        'diff.hint.busy': '正在生成差异或应用中，操作暂不可用。',
        'diff.hint.failedBack': '差异预览失败，请返回编辑后重试。',
        'diff.hint.noChangesBack': '未检测到改动，可返回编辑继续修改或取消退出。',
        'diff.hint.previewMode': '当前为预览模式，可点击“应用”写入或“返回编辑”继续修改。',

        'modal.agents.export': '导出',
        'modal.agents.copy': '复制',
        'modal.agents.title': 'AGENTS.md 编辑器',
        'modal.agents.hint': '保存后会写入目标 AGENTS.md（与 config.toml 同级）。',
        'modal.agents.targetFile': '目标文件',
        'modal.agents.contentLabel': 'AGENTS.md 内容',
        'modal.agents.placeholder': '在这里编辑 AGENTS.md 内容',
        'modal.agents.unsaved.previewModeHint': '预览模式：当前改动尚未保存，只有点击“应用”后才会写入文件。',
        'modal.agents.unsaved.detectedHint': '检测到未保存改动：关闭页面或应用前请先保存。',
        'modal.agents.hint.shortcuts': '快捷键：Esc（差异预览时返回编辑，编辑时关闭窗口）。',
        'modal.agents.hint.twoStepSave': '保存需两步：先点击“确认”预览差异，再点击“应用”保存。',
        'diff.tooLargeSkip': '内容过大，已跳过逐行差异预览',
        'diff.viewHint.preview': '当前为预览模式，可点击“应用”保存或“返回编辑”继续修改。',
        'diff.viewHint.truncated': '内容过大，已跳过预览，可点击“应用”保存或“返回编辑”继续修改。',

        // Skills modal
        'modal.skills.title': 'Skills 管理',
        'modal.skills.subtitle': '管理当前宿主的本地 Skills。',
        'modal.skills.target.aria': '选择 Skills 管理目标',
        'modal.skills.rootDir': 'Skills 目录（{label}）',
        'modal.skills.summary.target': '安装目标',
        'modal.skills.summary.total': '本地总数',
        'modal.skills.summary.withSkill': '含 SKILL.md',
        'modal.skills.summary.missingSkill': '缺少 SKILL.md',
        'modal.skills.summary.importable': '可导入',
        'modal.skills.panel.aria': 'Skills 管理面板',
        'modal.skills.local.title': '本地 Skills',
        'modal.skills.local.note': '可检索、筛选与批量删除。',
        'modal.skills.filter.keywordAria': '按名称或描述筛选 skill',
        'modal.skills.filter.keywordPlaceholder': '按目录名/显示名/描述检索',
        'modal.skills.filter.statusAria': '按 SKILL.md 状态筛选 skill',
        'modal.skills.filter.status.all': '全部状态',
        'modal.skills.filter.status.withSkill': '仅含 SKILL.md',
        'modal.skills.filter.status.missingSkill': '仅缺少 SKILL.md',
        'modal.skills.selection.stats': '已选 {selected}（筛选命中 {filtered} / {total}，筛选内已选 {visibleSelected}）',
        'modal.skills.empty.local': '暂无可管理的 skill。',
        'modal.skills.empty.filtered': '当前筛选条件下没有匹配的 skill。',
        'modal.skills.pill.hasSkillFile': '含 SKILL.md',
        'modal.skills.pill.missingSkillFile': '缺少 SKILL.md',
        'modal.skills.pill.symlink': '符号链接',
        'modal.skills.pill.dir': '目录',
        'modal.skills.import.title': '跨应用导入',
        'modal.skills.import.note': '扫描并导入到当前 {label}。',
        'modal.skills.import.scan': '扫描可导入',
        'modal.skills.import.stats': '已选 {selected} / {total}，含 SKILL.md {configured}，缺失 {missing}',
        'modal.skills.import.emptyHint': '暂无可导入 skill，点击“扫描可导入”。',
        'modal.skills.bulk.title': '批量操作',
        'modal.skills.bulk.note': '右侧为导入操作，左侧为本地选择。',
        'modal.skills.actions.zipImport': '导入 ZIP',
        'modal.skills.actions.zipImporting': 'ZIP 导入中...',
        'modal.skills.actions.exportSelected': '导出选中',
        'modal.skills.actions.exporting': '导出中...',
        'modal.skills.actions.importSelected': '导入选中',
        'modal.skills.actions.importing': '导入中...',
        'modal.skills.actions.deleteSelected': '删除选中',
        'modal.skills.actions.deleting': '删除中...',

        // OpenClaw config modal (quick)
        'placeholder.openclawConfigNameExample': '例如: 默认配置',
        'modal.openclaw.loadCurrent': '加载当前配置',
        'modal.openclaw.quick.title': '新手快速配置',
        'modal.openclaw.quick.subtitle': '按 3 步完成：填 Provider 和模型，写入编辑器，保存并应用。',
        'modal.openclaw.quick.readFromEditor': '从编辑器读取',
        'modal.openclaw.quick.step1': '填写 Provider 与模型',
        'modal.openclaw.quick.step2': '点击写入编辑器',
        'modal.openclaw.quick.step3': '保存并应用',
        'modal.openclaw.quick.providerHint': '会拼成 provider/model 作为主模型标识。',
        'modal.openclaw.quick.baseUrlHintDefault': '已按 OpenClaw 内建 provider 默认值回填，可直接修改。',
        'modal.openclaw.quick.baseUrlHintReadonly': '检测到外部引用，快速表单中只读显示；如需修改请使用原文编辑。',
        'modal.openclaw.quick.apiKeyHintFromAuth': '当前值来自 OpenClaw 外部认证配置；修改后在“保存并应用”时会回写对应 auth profile。',
        'modal.openclaw.quick.apiKeyHintReadonly': '检测到外部认证或引用，快速表单中只读显示；如需修改请使用原文编辑或对应认证配置。',
        'modal.openclaw.quick.apiKeyHintKeep': '留空表示不覆盖现有 key。',
        'placeholder.apiTypeExample': '例如: openai-responses',
        'modal.openclaw.quick.modelTitle': '模型',
        'placeholder.modelIdExample': '例如: gpt-4.1',
        'placeholder.modelNameOptional': '留空则使用模型 ID',
        'field.contextWindow': '上下文长度',
        'field.maxOutput': '最大输出',
        'hint.emptyNoChange': '留空表示不改动已有配置。',
        'modal.openclaw.quick.optionsTitle': '选项',
        'modal.openclaw.quick.setPrimary': '设为主模型',
        'modal.openclaw.quick.overrideProvider': '覆盖同名 Provider 基础信息',
        'modal.openclaw.quick.overrideModels': '覆盖同名模型列表',
        'modal.openclaw.quick.optionsHint': '关闭覆盖会只补空缺字段。',
        'modal.openclaw.quick.writeToEditor': '写入编辑器',

        // Docs panel
        'docs.title': 'CLI 安装文档',
        'docs.subtitle': '查看 Claude Code / Gemini CLI / CodeBuddy Code / Codex CLI 命令。',
        'docs.section.commands': '安装命令',
        'docs.section.commandsNote': '命令可直接复制。',
        'docs.section.faq': '常见问题',
        'docs.section.faqNote': '常见问题见下。',
        'docs.command.aria': '{name} 命令',
        'docs.registryHintPrefix': '命令将附加：',
        'docs.registryHintCustom': '请输入完整 URL（含 http/https），将自动附加到命令。',
        'docs.registry.tencent': '腾讯云',
        'docs.meta.bin': 'bin: {bin}',
        'docs.termuxLabel': 'Termux',
        'docs.termuxAria': 'Termux Codex CLI command',
        'docs.rule.1': '命令按当前包管理器、镜像与操作生成。',
        'docs.rule.2': '自定义镜像仅用于安装与升级。',
        'docs.tip.win.1': 'PowerShell 报权限不足（EACCES/EPERM）时，请以管理员身份执行安装命令。',
        'docs.tip.win.2': '安装后若仍提示找不到命令，重开终端并执行：where codex / where claude / where gemini / where codebuddy。',
        'docs.tip.win.3': '公司网络受限时，可先切换镜像源快捷项（npmmirror / 腾讯云 / 自定义）。',
        'docs.tip.unix.1': '出现 EACCES 权限错误时，优先修复 Node 全局目录权限，不建议直接 sudo npm。',
        'docs.tip.unix.2': '安装后若命令未生效，重开终端并执行：which codex / which claude / which gemini / which codebuddy。',
        'docs.tip.unix.3': '公司网络受限时，可先切换镜像源快捷项（npmmirror / 腾讯云 / 自定义）。',

        // Sessions panel
        'sessions.loading': '加载中...',
        'sessions.sourceTitle': '会话来源',
        'sessions.refresh': '刷新会话',
        'sessions.refreshing': '刷新中...',
        'sessions.allPaths': '全部路径',
        'sessions.source.codex': 'Codex',
        'sessions.source.claudeCode': 'Claude Code',
        'sessions.source.gemini': 'Gemini CLI',
        'sessions.source.codebuddy': 'CodeBuddy Code',
        'sessions.loadingList': '会话加载中...',
        'sessions.empty': '暂无可用会话记录',
        'sessions.unknownTime': '未知时间',
        'sessions.query.placeholder.enabled': '关键词检索（支持 Codex/Claude/Gemini/CodeBuddy，例：claude code）',
        'sessions.query.placeholder.disabled': '当前来源暂不支持关键词检索',
        'sessions.pin': '置顶',
        'sessions.unpin': '取消置顶',
        'sessions.copyResume': '复制恢复命令',
        'sessions.preview.refresh': '刷新内容',
        'sessions.preview.loading': '加载中...',
        'sessions.preview.deleteHard': '直接删除',
        'sessions.preview.moveToTrash': '移入回收站',
        'sessions.preview.deleting': '删除中...',
        'sessions.preview.moving': '移入中...',
        'sessions.preview.export': '导出记录',
        'sessions.preview.exporting': '导出中...',
        'sessions.preview.convert': '生成派生会话',
        'sessions.preview.converting': '生成中...',
        'sessions.preview.convert.loadedOnly': '仅转换已加载消息',
        'sessions.preview.importNative': '导入原生目录',
        'sessions.preview.importingNative': '导入中...',
        'sessions.preview.importNative.unsupported': '不支持此操作',
        'sessions.preview.importNative.confirmTitle': '覆盖原生会话文件？',
        'sessions.preview.importNative.confirmMessage': '原生会话文件已存在，覆盖后会替换目标工具原生目录中的同名会话。',
        'sessions.preview.importNative.confirmText': '覆盖',
        'sessions.preview.importNative.cancelled': '已取消导入',
        'sessions.preview.importNative.conflict': '原生会话已存在',
        'sessions.preview.importNative.invalidSource': '会话来源无效',
        'sessions.preview.importNative.fileNotFound': '未找到会话文件',
        'sessions.preview.importNative.nativePathUnavailable': '无法解析原生会话路径',
        'sessions.preview.importNative.success': '已导入原生目录',
        'sessions.preview.importNative.failed': '导入失败',
        'sessions.preview.importNative.failedWithReason': '导入原生目录失败：{reason}',
        'sessions.preview.copyLink': '复制链接',
        'sessions.preview.loadingBody': '正在加载会话内容...',
        'sessions.preview.emptyMsgs': '当前会话暂无可展示消息',
        'sessions.preview.rendering': '正在渲染会话内容...',
        'sessions.preview.rerender': '重新渲染',
        'sessions.preview.preparing': '正在准备会话内容...',
        'sessions.preview.clipped': '仅展示最近 {count} 条消息。',
        'sessions.preview.shownCount': '已显示 {shown} / {total} 条',
        'sessions.preview.loadMore': '加载更多（剩余 {remain}）',
        'sessions.preview.loadingMore': '正在加载更早消息...',
        'sessions.timeline.aria': '会话时间轴',
        'sessions.selectHint': '请先在左侧选择一个会话',
        'sessions.role.all': '全部角色',
        'sessions.role.user': '仅 User',
        'sessions.role.assistant': '仅 Assistant',
        'sessions.role.system': '仅 System',
        'sessions.time.all': '全部时间',
        'sessions.time.7d': '近 7 天',
        'sessions.time.30d': '近 30 天',
        'sessions.time.90d': '近 90 天',
        'sessions.sort.time': '按时间',
        'sessions.sort.hot': '按热度',
        'sessions.sort.hotBadge': '热',
        'sessions.filters.copyLink': '复制筛选链接',
        'sessions.filters.urlBuildFail': '无法生成链接',
        'sessions.filters.source': '来源',
        'sessions.filters.path': '路径',
        'sessions.filters.keyword': '关键词',
        'sessions.filters.role': '角色',
        'sessions.filters.time': '时间',
        'sessions.roleLabel.user': 'User',
        'sessions.roleLabel.system': 'System',
        'sessions.roleLabel.assistant': 'Assistant',

        // Usage panel
        'usage.overview': 'Usage 概览',
        'usage.range.aria': 'Usage 时间范围',
        'usage.range.7d': '近 7 天',
        'usage.range.30d': '近 30 天',
        'usage.range.all': '全部',
        'usage.compare.toggle': '对比上周期',
        'usage.compare.prev': '上周期',
        'usage.compare.delta': '变化',
        'usage.refresh': '刷新统计',
        'usage.refreshing': '刷新中...',
        'usage.loading': '正在加载 Usage 统计...',
        'usage.empty': '暂无可用于统计的会话数据',
        'usage.refreshOverlay': '正在刷新…',
        'usage.copyTitle': '点击复制：{value}',
        'usage.copySuccess': '已复制：{label}',
        'usage.copyFail': '复制失败',
        'usage.copyNone': '没有可复制内容',
        'usage.daily.title': '每天消耗',
        'usage.daily.subtitle': '按天汇总 token 与预估费用（费用各自按最大值归一显示）。',
        'usage.daily.note': '说明：预估费用默认不含 Claude；仅在可匹配模型单价且会话记录 input/output token 时计算。',
        'usage.heatmap.title': '活动热力图',
        'usage.heatmap.subtitle': '按每天会话数聚合，支持 hover 查看详细数据。',
        'usage.heatmap.legend.less': '少',
        'usage.heatmap.legend.more': '多',
        'usage.heatmap.tooltip': '{date} · {sessions} 会话 · {messages} 消息 · {tokens} token',
        'usage.heatmap.aria': '{date}，{sessions} 会话',
        'usage.hourlyHeatmap.title': '7×24 活跃热力图',
        'usage.hourlyHeatmap.subtitle': '按星期 × 小时聚合会话分布，深色 = 高活跃。',
        'usage.hourlyHeatmap.tooltip': '{weekday} {hour}:00 · {sessions} 会话 · {messages} 消息 · {tokens} token',
        'usage.hourlyHeatmap.legend.less': '少',
        'usage.hourlyHeatmap.legend.more': '多',
        'usage.legend.tokens': 'Token',
        'usage.legend.cost': '预估费用',
        'usage.table.date': '日期',
        'usage.table.sessions': '会话',
        'usage.table.messages': '消息',
        'usage.table.tokens': 'Token',
        'usage.table.cost': '预估费用',
        'usage.trend.sessions': '会话趋势',
        'usage.trend.messages': '消息趋势',
        'usage.trend.activeHours': '活跃时段',
        'usage.trend.sources': '来源洞察',
        'usage.legend.codex': 'Codex',
        'usage.legend.claude': 'Claude',
        'usage.trend.sessions.codexTitle': 'Codex {count}',
        'usage.trend.sessions.claudeTitle': 'Claude {count}',
        'usage.trend.messages.barTitle': '{count} 条消息',
        'usage.hour.title': '{hour}:00 · {count} 次会话',
        'usage.source.row': '{sessions} 会话 · {messages} 消息 · 均值 {avg}',
        'usage.summary.sessions': '总会话数',
        'usage.summary.messages': '总消息数',
        'usage.summary.tokens': '总 Token 数',
        'usage.summary.contextWindow': '总上下文数',
        'usage.summary.estimatedCost': '预估费用 · {range}',
        'usage.estimatedCost.note.excludesClaudePrefix': '暂不含 Claude，',
        'usage.estimatedCost.method.configured': '按已配置单价估算',
        'usage.estimatedCost.method.catalog': '按公开模型目录估算',
        'usage.estimatedCost.method.configuredAndCatalog': '按已配置单价 + 公开模型目录估算',
        'usage.estimatedCost.detail.estimate': '{prefix}{method}，估算 {estimate}，覆盖 {covered}/{total} 个会话，约 {percent}% token',
        'usage.estimatedCost.detail.missing': '{prefix}缺少可匹配的模型单价或 token 拆分。请先补 models.cost，或确认会话已记录 input/output token。',
        'usage.summary.activeDuration': '活跃时长',
        'usage.summary.activeDuration.title': '累计会话跨度 {value}',
        'usage.summary.totalDuration': '总时长',
        'usage.summary.totalDuration.title': '整体时间跨度 {value}',
        'usage.summary.activeDays': '活跃天数',
        'usage.summary.avgMessagesPerSession': '平均每会话消息',
        'usage.summary.busiestDay': '最忙日',
        'usage.summary.busiestHour': '高峰时段',
        'usage.currentSession.title': '当前会话',
        'usage.currentSession.apiDuration': 'API时长',
        'usage.currentSession.totalDuration': '总时长',
        'usage.currentSession.tokens': 'Token',
        'usage.range.kicker.all': '全部',
        'usage.range.kicker.30d': '近 30 天',
        'usage.range.kicker.7d': '近 7 天',
        'usage.copyTokenDay': '已复制：Token（{day}）',
        'usage.copyCostDay': '已复制：预估费用（{day}）',
        'usage.dayDetail.title': '{day} 详情',
        'usage.dayDetail.subtitle': '选择日期可快速查看当天构成。',
        'usage.dayDetail.pick': '选择日期',
        'usage.dayDetail.empty': '请选择一个日期以查看当天构成。',
        'usage.dayDetail.clear': '清除',
        'usage.dayDetail.topSessions': 'Top 会话',
        'usage.dayDetail.topModels': 'Top 模型',
        'usage.models.title': '使用模型',
        'usage.models.subtitle': '只列真实落盘的 model 名。',
        'usage.models.kicker': '已识别 {modeled}/{total}',
        'usage.models.count': '模型数',
        'usage.models.coverage': '会话覆盖率',
        'usage.models.missing': '缺 model',
        'usage.models.noneTitle': '当前范围没读到模型名',
        'usage.models.noneBody': '已扫描 {total} 个会话，但原始记录里没有可识别的 model 字段。',
        'usage.models.providerOnly': '其中 {count} 个旧会话只写了 provider。',
        'usage.models.missingNote.providerOnly': '另有 {count} 个会话没写模型名，未计入列表。',
        'usage.models.missingNote': '另有 {count} 个会话缺少 model，未计入列表。',
        'usage.models.missingListTitle': '仍缺模型名的会话',
        'usage.models.chipTitle': '{model} · {sessions} 会话 · {messages} 消息{tokens}',
        'usage.models.meta': '{sessions} 会话 · {messages} 消息{tokens}',
        'usage.weekday.title': '工作日分布',
        'usage.paths.title': '高频路径',
        'usage.paths.empty': '暂无路径数据',
        'usage.paths.count': '{count} 次',
        'usage.paths.meta': '{messages} 消息{recent}',
        'usage.paths.recent': ' · 最近 {label}',
        'usage.recent.title': '近期活跃会话',
        'usage.sessions.empty': '暂无会话数据',
        'usage.sessions.messages': '{count} 消息',
        'usage.sessions.topDensity': '消息密度最高',

        // Config panel (Codex)
        'config.addProvider': '新增提供商',
        'config.providerTemplate.title': '预设供应商',
        'config.models': '模型',
        'config.modelLoading': '加载中...',
        'config.models.unlimited': '当前无模型列表，可手填。',
        'config.models.error': '模型列表获取失败，可手填。',
        'config.models.notInList.codex': '当前模型不在列表，可手填或改模板。',
        'config.models.notInList.other': '当前模型不在列表，可手填。',
        'config.template.editFirst': '先改模板，再应用。',
        'config.template.bridgeCodexOnly': '{hint} 模板仅限 Codex 编辑。',
        'config.template.openEditor': '打开模板编辑器',
        'modal.configTemplate.title': 'Config 模板编辑器（手动确认应用）',
        'modal.configTemplate.placeholder': '在这里编辑 config.toml 模板内容',
        'config.serviceTier': '服务档',
        'config.serviceTier.fast': 'fast（默认）',
        'config.serviceTier.standard': 'standard',
        'config.serviceTier.hint': '仅 fast 写入 {field}。',
        'config.reasoningEffort': '推理强度',
        'config.reasoningEffort.medium': 'medium（默认）',
        'config.reasoningEffort.hint': '控制推理深度；high 更深。',
        'config.contextBudget': '压缩阈值',
        'config.reset': '重置',
        'config.example': '例如: {value}',
        'config.contextWindow.hint': '上下文上限，默认 190000。',
        'config.autoCompact.hint': '自动压缩阈值，默认 185000。',
        'config.agents.open': '打开 AGENTS.md',
        'modal.agents.title.default': 'AGENTS.md 编辑器',
        'modal.agents.title.claudeMd': 'CLAUDE.md 编辑器',
        'modal.agents.title.openclaw': 'OpenClaw AGENTS.md 编辑器',
        'modal.agents.hint.default': '保存后会写入目标 AGENTS.md（与 config.toml 同级）。',
        'modal.agents.hint.claudeMd': '保存后会写入 ~/.claude/CLAUDE.md。',
        'modal.agents.contentLabel.claudeMd': 'CLAUDE.md 内容',
        'modal.agents.placeholder.claudeMd': '在这里编辑 CLAUDE.md 内容',
        'modal.agents.hint.openclaw': '保存后会写入 OpenClaw Workspace 下的 AGENTS.md。',
        'modal.agents.title.openclawWorkspaceFile': 'OpenClaw 工作区文件: {fileName}',
        'modal.agents.hint.openclawWorkspaceFile': '保存后会写入 OpenClaw Workspace 下的 {fileName}。',
        'config.url.unset': '未设 URL',
        'config.model.unset': '未设置模型',
        'config.badge.system': '系统',
        'config.availabilityTest': '可用性测试',
        'config.availabilityTestAria': '测试 {name} 可用性',
        'config.health.title': '配置健康检查',
        'config.health.run': '运行检查',
        'config.health.running': '检查中...',
        'config.health.hint': '会批量探测所有提供商可用性，并刷新延迟显示。',
        'config.health.progress': '已完成 {done}/{total} · 失败 {failed}',
        'config.health.ok': '检查通过',
        'config.health.fail': '检查未通过',
        'config.health.issues': '{count} 项问题',
        'config.shareCommand': '分享命令',
        'config.shareDisabled': '不可分享',
        'config.shareCommand.aria': '分享导入命令',
        'config.provider.edit.aria': '编辑提供商：{name}',
        'config.provider.delete.aria': '删除提供商：{name}',
        'config.provider.clone': '克隆',
        'config.provider.clone.aria': '克隆提供商：{name}',
        'app.loadingConfig': '加载配置中...',
        'common.current': '当前 {value}',
        'common.notSelected': '未选择',
        'common.readFromEditor': '从编辑器读取',
        'common.writeToEditor': '写入编辑器',
        'sessions.sourceLabel': '来源：{value}',
        'usage.rangeLabel': '范围：{value}',
        'sessions.source.all': '全部',
        'usage.range.all': '全部',
        'usage.range.7d.short': '近 7 天',
        'usage.range.30d.short': '近 30 天',
        'orchestration.queueStats': '队列 {running} 运行中 · {queued} 等待中',
        'orchestration.hero.kicker': '任务编排',
        'orchestration.hero.title': '把需求拆成可执行步骤',
        'orchestration.hero.subtitle': '先写目标，再预览计划，再执行。',
        'orchestration.draft.reset': '重置草稿',
        'orchestration.summary.aria': '任务编排概览',
        'orchestration.summary.running': '运行中',
        'orchestration.summary.queued': '排队中',
        'orchestration.summary.runs': '运行记录',
        'orchestration.step1.title': '先把结果写清楚',
        'orchestration.step1.subtitle': '只写会影响执行的内容。',
        'orchestration.templates.title': '快捷示例',
        'orchestration.templates.reviewFix.label': '修 review + 回归',
        'orchestration.templates.reviewFix.target': '修复当前 PR review 评论，并补对应回归测试',
        'orchestration.templates.reviewFix.notes': '不要改动无关模块；需要给出验证结果',
        'orchestration.templates.reviewFix.followUps': '继续处理新增 review 评论\n最后更新 PR 摘要',
        'orchestration.templates.planOnly.label': '只做排查规划',
        'orchestration.templates.planOnly.target': '先排查问题根因并给出执行计划，不直接修改代码',
        'orchestration.templates.planOnly.notes': '优先定位根因、影响范围和风险点',
        'orchestration.templates.workflowBatch.label': 'Workflow 批处理',
        'orchestration.templates.workflowBatch.target': '用 Workflow 跑一组固定检查并整理结果',
        'orchestration.templates.workflowBatch.workflowIds': 'diagnose-config\nsafe-provider-switch',
        'orchestration.templates.workflowBatch.notes': '输出统一结论，避免重复描述',
        'orchestration.fields.target': '目标',
        'orchestration.fields.target.placeholder': '例如：修复当前 PR review 评论，并补对应回归测试；不要改无关模块',
        'orchestration.fields.target.hint': '一句话写清结果、边界和验收标准就够了。',
        'orchestration.engine.codex': 'Codex',
        'orchestration.engine.workflow': 'Workflow',
        'orchestration.runMode.write': '写入',
        'orchestration.runMode.readOnly': '只读',
        'orchestration.runMode.dryRun': '仅预演',
        'orchestration.pills.hasTitle': '标题已设',
        'orchestration.pills.workflowCount': 'Workflow {count}',
        'orchestration.pills.planNodes': '计划 {count} 节点',
        'orchestration.step2.title': '选择执行方式',
        'orchestration.step2.subtitle': '常用项默认展开，其余放高级设置。',
        'orchestration.fields.engine': '引擎',
        'orchestration.fields.runMode': '运行模式',
        'orchestration.advanced.title': '高级设置',
        'orchestration.fields.title': '标题',
        'orchestration.fields.title.placeholder': '可选，默认从目标自动提取',
        'orchestration.fields.notes': '说明',
        'orchestration.fields.notes.placeholder': '例如：不要重写现有架构，只做增量实现',
        'orchestration.fields.notes.hint': '补边界、禁区、风格要求或验证要求。',
        'orchestration.fields.followUps': '后续动作（每行一条）',
        'orchestration.fields.followUps.placeholder': '例如：\n继续处理 review 评论\n最后补回归测试',
        'orchestration.fields.concurrency': '并发',
        'orchestration.fields.concurrency.hint': '复杂任务先从 1~2 开始更稳。',
        'orchestration.fields.autoFixRounds': '自动修复',
        'orchestration.fields.autoFixRounds.hint': '失败后自动再试几轮。',
        'orchestration.fields.workflowIds': 'Workflow ID（每行一条）',
        'orchestration.fields.workflowIds.placeholder': '例如：\ndiagnose-config\nsafe-provider-switch',
        'orchestration.fields.workflowIds.hint': '仅 Workflow 模式需要。当前本地可用 {count} 个。',
        'orchestration.workflow.stepCount': '{count} 步',
        'orchestration.step3.title': '先预览，再执行',
        'orchestration.step3.subtitle': '先确认计划，再决定立即执行还是入队。',
        'orchestration.actions.planning': '规划中...',
        'orchestration.actions.previewOnly': '仅预览',
        'orchestration.actions.preparing': '准备中...',
        'orchestration.actions.generatePlan': '生成计划',
        'orchestration.actions.planAndRun': '计划并执行',
        'orchestration.actions.processing': '处理中...',
        'orchestration.actions.queueAndStart': '入队并开始',
        'orchestration.actions.caption': '“计划并执行”会在必要时自动刷新计划；批量任务用“入队并开始”。',
        'orchestration.stage.title': '有内容时再展开工作区',
        'orchestration.stage.subtitle': '先写目标，再预览计划。',
        'orchestration.stage.pill.target': '写目标',
        'orchestration.stage.pill.preview': '预览',
        'orchestration.stage.pill.run': '执行或入队',
        'orchestration.plan.title': '计划预览',
        'orchestration.plan.subtitle': '先确认节点、波次和依赖。',
        'orchestration.plan.summary.nodes': '节点数',
        'orchestration.plan.summary.waves': '波次',
        'orchestration.plan.summary.engine': '引擎',
        'orchestration.plan.node.write': 'write',
        'orchestration.plan.node.readOnly': 'read-only',
        'orchestration.labels.dependencies': '依赖：',
        'orchestration.labels.error': '错误：',
        'orchestration.workbench.title': '执行工作台',
        'orchestration.workbench.subtitle': '有内容时才展开。',
        'orchestration.queue.start': '开始队列',
        'orchestration.queue.starting': '启动中...',
        'orchestration.workbench.tabs.aria': '任务编排工作台视图',
        'orchestration.workbench.tabs.queue': '队列 {count}',
        'orchestration.workbench.tabs.runs': '运行记录 {count}',
        'orchestration.workbench.tabs.detail': '运行详情',
        'orchestration.queue.empty.title': '当前没有排队任务',
        'orchestration.queue.empty.subtitle': '批量任务可先入队，再启动队列。',
        'orchestration.runs.empty.title': '还没有运行记录',
        'orchestration.runs.empty.subtitle': '执行后会显示最近运行记录。',
        'orchestration.detail.refresh': '刷新详情',
        'orchestration.detail.retry': '重试',
        'orchestration.detail.retrying': '重试中...',
        'orchestration.detail.empty.title': '选择一条运行记录查看详情',
        'orchestration.detail.empty.subtitle': '这里会显示节点状态、摘要和日志。',
        'orchestration.detail.summary.status': '状态',
        'orchestration.detail.summary.duration': '耗时',
        'orchestration.detail.summary.nodes': '节点数',
        'orchestration.detail.summary.summary': '摘要',
        'orchestration.detail.node.meta': '{id} · attempts {attempts} · auto-fix {autoFix}',
        'skills.localLabel': '{target} / 本地 Skills',
        'skills.counts': '已装 {installed} · 可导入 {importable}',

        // Sidebar status labels (compact)
        'status.currentSource': '当前来源',
        'status.sessionCount': '会话数',
        'status.range': '统计范围',
        'status.totalSessions': '总会话数',
        'status.totalMessages': '总消息数',
        'status.engine': '引擎',
        'status.concurrency': '并发度',
        'status.running': '运行中',
        'status.queued': '排队中',
        'status.runs': '历史 Runs',
        'status.currentTarget': '当前目标',
        'status.localSkills': '本地 Skills',
        'status.importable': '可导入',
        'status.importableDirect': '可直接导入',
        'status.pm': '包管理器',
        'status.action': '当前操作',
        'status.registry': '镜像',
        'status.claudeConfig': 'Claude 配置',
        'status.claudeModel': 'Claude 模型',
        'status.openclawConfig': 'OpenClaw 配置',
        'status.workspaceFile': '工作区文件',
        'status.configMode': '配置模式',
        'status.currentProvider': '当前 Provider',
        'status.currentModel': '当前模型',
        'status.quickSwitchProvider': '快速切换提供商',
        'side.usage.meta': '本地统计 / 趋势',
        'side.orchestration.meta': '计划 / 队列 / Runs',

        // Settings panel
        'settings.tab.general': '通用',
        'settings.tab.data': '数据',
        'settings.tabs.aria': '设置分类',
        'settings.sharePrefix.title': '分享命令前缀',
        'settings.sharePrefix.meta': '影响 Web UI 里“复制分享命令”的前缀',
        'settings.sharePrefix.label': '前缀',
        'settings.sharePrefix.hint': '默认走项目内 npm start，也可切到全局 codexmate。该设置会缓存到浏览器本地。',
        'settings.backup.title': '数据备份',
        'settings.backup.meta': '导出 / 导入 Claude 与 Codex 配置',
        'settings.claude.title': 'Claude 配置',
        'settings.claude.meta': '备份 / 导入 ~/.claude',
        'settings.codex.title': 'Codex 配置',
        'settings.codex.meta': '备份 / 导入 ~/.codex',
        'settings.backup.progress': '备份中 {percent}%',
        'settings.backup.oneClickClaude': '一键备份 ~/.claude',
        'settings.backup.importClaude': '导入 ~/.claude 备份',
        'settings.backup.oneClickCodex': '一键备份 ~/.codex',
        'settings.backup.importCodex': '导入 ~/.codex 备份',
        'settings.importing': '导入中...',

        'settings.trashConfig.title': '回收站配置',
        'settings.trashConfig.meta': '回收站开关与自动清理天数',
        'settings.deleteBehavior.title': '会话删除行为',
        'settings.deleteBehavior.meta': '决定“删除”是否先进入回收站',
        'settings.deleteBehavior.toggle': '删除会话时先移入回收站',
        'settings.deleteBehavior.hint': '默认开启。关闭后，会话浏览里的删除会直接永久删除，不再进入回收站。',

        'settings.trash.title': '回收站',
        'settings.trash.meta': '已删除会话（可恢复/彻底删除）',
        'settings.trash.refresh': '刷新列表',
        'settings.trash.refreshing': '刷新中...',
        'settings.trash.clear': '清空回收站',
        'settings.trash.clearing': '清空中...',
        'settings.trash.loading': '正在加载回收站...',
        'settings.trash.empty': '回收站为空',
        'settings.trash.retry': '回收站列表加载失败，请刷新重试',
        'settings.trash.restore': '恢复',
        'settings.trash.restoring': '恢复中...',
        'settings.trash.purge': '彻底删除',
        'settings.trash.purging': '删除中...',
        'settings.trash.workspace': '工作区',
        'settings.trash.originalFile': '原文件',
        'settings.trash.loadMore': '加载更多（剩余 {count} 项）',
        'settings.trash.retention': '自动清理',
        'settings.trash.retentionMeta': '超过保留天数的回收站记录将自动清除',
        'settings.trash.retentionLabel': '保留天数',
        'settings.trash.retentionHint': '范围 1-365 天，默认 30 天。每次加载回收站时自动清理过期记录。',

        'settings.templateConfirm.title': '配置模板二次确认',
        'settings.templateConfirm.meta': '降低误写入风险',
        'settings.templateConfirm.toggle': '应用模板前先预览差异（两步：确认 → 应用）',
        'settings.templateConfirm.hint': '开启后：先展示差异预览，再确认写入。',

        'settings.reset.title': '配置重置',
        'settings.reset.meta': '谨慎操作',
        'settings.reset.hint': '会先备份 config.toml，再写入默认配置。',
        'settings.reset.button': '重装配置',
        'settings.reset.loading': '重装中...',

        // Market (Skills)
        'market.title': 'Skills 概览',
        'market.subtitle': '切换目标并查看本地 Skills。',
        'market.refresh': '刷新概览',
        'market.refreshing': '刷新中...',
        'market.openManager': '打开 Skills 管理',
        'market.target.aria': '选择 Skills 安装目标',
        'market.summary.target': '安装目标',
        'market.summary.total': '本地总数',
        'market.summary.configured': '含 SKILL.md',
        'market.summary.missing': '缺少 SKILL.md',
        'market.summary.importable': '可导入',
        'market.summary.importableDirect': '可直接导入',
        'market.root.fallback': '默认目录',

        'market.installed.title': '已安装 Skills',
        'market.installed.note': '仅显示前 6 项。',
        'market.local.refresh': '刷新本地',
        'market.local.refreshing': '刷新中...',
        'market.local.loading': '正在加载本地 Skills...',
        'market.local.empty': '当前暂无已安装 skill。',
        'market.pill.verified': '已验证',
        'market.pill.missingSkill': '待补 SKILL.md',

        'market.import.title': '可导入来源',
        'market.import.note': '扫描并导入到当前 {target}。',
        'market.import.scan': '扫描来源',
        'market.import.scanning': '扫描中...',
        'market.import.loading': '正在扫描可导入 skill...',
        'market.import.empty': '暂未扫描到可导入 skill。',
        'market.pill.importableDirect': '可直接导入',
        'market.pill.importMissing': '缺少 SKILL.md',

        'market.actions.title': '分发入口',
        'market.actions.note': '操作均作用于当前安装目标。',
        'market.action.manage.title': '本地 Skills 管理',
        'market.action.manage.copy': '管理当前 {target} 的已装 skills',
        'market.action.crossImport.title': '跨应用导入',
        'market.action.crossImport.copy': '导入到当前 {target}',
        'market.action.zipImport.title': 'ZIP 导入',
        'market.action.zipImport.copy': '从 ZIP 导入到当前目标',

        'market.help.title': '操作说明',
        'market.help.target.title': '目标切换',
        'market.help.target.copy': '当前操作写入 {target} 目录。',
        'market.help.crossImport.title': '跨应用导入',
        'market.help.crossImport.copy': '从其他宿主导入未托管 skill。',
        'market.help.zipImport.title': 'ZIP 导入',
        'market.help.zipImport.copy': '从 ZIP 导入本地 skill。',

        // Claude config panel
        'claude.addProvider': '添加提供商',
        'claude.applyDefault': '默认应用到 ~/.claude/settings.json。',
        'claude.presetProviders': '预设供应商',
        'claude.customConfig': '自定义配置',
        'claude.model': '模型',
        'claude.model.placeholder': '例如: claude-3-7-sonnet',
        'claude.model.hint': '模型修改后会自动保存并应用到当前配置。',
        'claude.health.title': '配置健康检查',
        'claude.health.run': '运行检查',
        'claude.health.running': '检查中...',
        'claude.health.hint': '会批量探测所有 Claude 配置可用性，并刷新延迟显示。',
        'claude.health.progress': '已完成 {done}/{total} · 失败 {failed}',
        'claude.md.title': 'CLAUDE.md',
        'claude.md.open': '打开 CLAUDE.md',
        'claude.md.hint': '读写 ~/.claude/CLAUDE.md。',
        'claude.model.unset': '未设置模型',
        'claude.configured': '已配置',
        'claude.notConfigured': '未配置',
        'claude.action.edit': '编辑',
        'claude.action.delete': '删除',
        'claude.action.shareDisabled': '分享导入命令',
        'claude.action.editAria': '编辑 Claude 配置：{name}',
        'claude.action.deleteAria': '删除 Claude 配置：{name}',
        'claude.action.clone': '克隆',
        'claude.action.cloneAria': '克隆 Claude 配置：{name}',
        'claude.localBridge.poolTitle': '轮询池',
        'claude.localBridge.poolHint': '勾选参与负载均衡的提供商',
        'claude.localBridge.noProviders': '暂无可用提供商，请先添加直连提供商',
        'claude.localBridge.disabled': '未启用',
        'claude.localBridge.enabled': '已启用',

        // OpenClaw config panel
        'openclaw.applyHint': '写入 ~/.openclaw/openclaw.json，支持 JSON5。',
        'openclaw.agents.hint': '读写 Workspace 的 AGENTS.md，默认路径 ~/.openclaw/workspace/AGENTS.md。',
        'openclaw.agents.open': '打开 AGENTS.md',
        'openclaw.workspaceFile': '工作区文件',
        'openclaw.workspace.placeholder': '例如: SOUL.md',
        'openclaw.workspace.hint': '仅限 Workspace 内的 .md 文件。',
        'openclaw.workspace.open': '打开工作区文件',
        'openclaw.configured': '已配置',
        'openclaw.notConfigured': '未配置',
        'openclaw.action.edit': '编辑',
        'openclaw.action.delete': '删除',
        'modal.openclaw.quick.subtitle': '按 3 步完成：填 Provider 和模型，写入编辑器，保存并应用。',
        'modal.openclaw.quick.step2': '点击写入编辑器',
        'modal.openclaw.structured.writeHint': '写入编辑器会重排 JSON，注释可能丢失。',
        'openclaw.action.editAria': '编辑 OpenClaw 配置：{name}',
        'openclaw.action.deleteAria': '删除 OpenClaw 配置：{name}'
    },
    ja: {

        // Global
        'lang.zh': '中国語',
        'lang.en': 'English',
        'lang.label': '言語',
        'nav.topTabs.aria': 'ナビゲーション',

        // Common
        'common.all': 'すべて',
        'common.copy': 'コピー',
        'common.paste': 'ペースト',
        'common.edit': '編集',
        'common.install': 'インストール',
        'common.update': 'アップグレード',
        'common.uninstall': 'アンインストール',
        'common.official': '公式',
        'common.custom': 'カスタム',
        'common.rules': 'ルール',
        'common.troubleshooting': 'トラブルシューティング',
        'common.command': 'コマンド',
        'common.mirror': 'ミラー',
        'common.packageManager': 'パッケージマネージャー',
        'common.action': '操作',
        'common.targets': 'ターゲット数',
        'common.currentPm': '現在のパッケージマネージャー',
        'common.currentAction': '現在の操作',
        'common.mirrorActive': 'ミラー有効',
        'common.defaultOfficial': '公式デフォルト',
        'common.cancel': 'キャンセル',
        'common.confirm': '確認',
        'common.add': '追加',
        'common.save': '保存',
        'common.saveApply': '保存して適用',
        'common.close': '閉じる',
        'common.delete': '削除',
        'common.clear': 'クリア',
        'common.show': '表示',
        'common.hide': '非表示',
        'common.detail': '詳細',
        'common.refresh': '更新',
        'common.refreshing': '更新中...',
        'common.loading': '読み込み中...',
        'common.saving': '保存中...',
        'common.sending': '送信中...',
        'common.scanning': 'スキャン中...',
        'common.export': 'エクスポート',
        'common.import': 'インポート',
        'common.apply': '適用',
        'common.applying': '適用中...',
        'common.confirming': '確認中...',
        'common.writeToEditor': 'エディタに書き込み',
        'common.refreshFromText': 'テキストから更新',
        'common.backToEdit': '編集に戻る',
        'common.selectAll': 'すべて選択',
        'common.unselectAll': '選択解除',
        'common.resetFilters': 'フィルターをリセット',
        'common.notEditable': '編集不可',
        'common.notDeletable': '削除不可',
        'common.notLoaded': '未読み込み',
        'common.exists': '存在します',
        'common.notExistsWillCreateOnApply': '存在しません。適用時に作成されます',
        'common.notExistsWillCreateOnSave': '存在しません。保存時に作成されます',
        'common.none': 'なし',
        'cli.missing.title': '{name} CLI がインストールされていません',
        'cli.missing.subtitle': '{name} CLI をインストールしてからこのページをご利用ください。',
        'cli.missing.openDocs': 'インストールガイドを開く',
        'cli.missing.commandAria': '{name} CLI インストールコマンド',

        // Brand
        'brand.kicker.workspace': 'ワークスペース',
        'brand.subtitle.localConfigSessionsWorkspace': 'ローカル設定とセッションワークスペース',

        // Confirm dialog
        'confirm.aria': '操作確認',
        'confirm.title.default': '操作を確認してください',
        'confirm.ok': '確認',
        'confirm.cancel': 'キャンセル',

        // Shared fields
        'field.name': '名前',
        'field.configName': '設定名',
        'field.apiEndpoint': 'API エンドポイント',
        'field.apiKey': '認証キー',
        'field.baseUrl': 'Base URL',
        'field.provider': 'プロバイダー',
        'field.providerName': 'プロバイダー名',
        'field.modelName': 'モデル名',
        'field.model': 'モデル',
        'field.message': 'メッセージ',
        'field.varName': '変数名',
        'field.targetFile': '対象ファイル',
        'field.modelId': 'モデル ID',
        'field.displayName': '表示名',
        'field.contextAndMaxOutput': 'コンテキストと最大出力',
        'field.apiType': 'API タイプ',
        'field.env': '環境変数',
        'field.allow': '許可',
        'field.deny': '拒否',

        // Shared placeholders/hints
        'placeholder.providerNameExample': '例: myapi',
        'placeholder.apiEndpointExample': 'https://api.example.com/v1',
        'placeholder.providerName': 'プロバイダー名',
        'placeholder.keepUnchanged': '空白のままにすると変更されません',
        'hint.keepKeyUnchanged': '空白のままにするとキーは変更されません',
        'placeholder.modelExample': '例: gpt-5',
        'placeholder.configNameExample': '例: 智譜GLM',
        'placeholder.apiKeyExampleClaude': 'sk-ant-...',
        'placeholder.baseUrlExampleClaude': 'https://open.bigmodel.cn/api/anthropic',
        'placeholder.selectProvider': 'プロバイダーを選択してください',

        // Roles / labels
        'role.you': 'あなた',
        'role.provider': 'プロバイダー',
        'label.model': 'モデル：',

        // Top tabs
        'tab.dashboard': '概要',
        'tab.docs': 'ドキュメント',
        'tab.config': '設定',
        'tab.config.codex': 'Codex',
        'tab.config.claude': 'Claude',
        'tab.config.openclaw': 'OpenClaw',
        'tab.sessions': 'セッション',
        'tab.usage': '使用量',
        'tab.orchestration': 'タスク',
        'tab.market': 'Skills',
        'tab.plugins': 'プラグイン',
        'tab.settings': '設定',

        // Side rail section titles
        'side.overview': '概要',
        'side.docs': 'ドキュメント',
        'side.config': '設定',
        'side.sessions': 'セッション',
        'side.plugins': 'プラグイン',
        'side.system': 'システム',
        'side.orchestration': 'タスク',
        'side.skills': 'Skills',

        // Side rail items
        'side.overview.doctor': 'Doctor パネル',
        'side.overview.doctor.meta': '概要 / 診断 / ジャンプ',
        'side.docs.cliInstall': 'CLI インストール',
        'side.docs.cliInstall.meta': 'インストール / 更新 / 削除',
        'side.config.codex': 'Codex',
        'side.config.codex.meta': 'Provider / Model',
        'side.config.claude': 'Claude Code',
        'side.config.claude.meta': 'Claude Settings',
        'side.config.openclaw': 'OpenClaw',
        'side.config.openclaw.meta': 'JSON5 / AGENTS',
        'side.sessions.browser': 'セッション閲覧',
        'side.sessions.browser.meta': '閲覧 / エクスポート / クリーンアップ',
        'side.plugins.tools': 'プロンプトツール',
        'side.plugins.tools.meta': 'テンプレート / 変数',
        'side.system.settings': '実行設定',
        'side.system.settings.meta': 'データ / バックアップ',

        // Header titles
        'kicker.dashboard': 'Doctor',
        'kicker.config': 'Configuration',
        'kicker.sessions': 'Sessions',
        'kicker.usage': 'Usage',
        'kicker.orchestration': 'Tasks',
        'kicker.market': 'Skills',
        'kicker.plugins': 'Plugins',
        'kicker.docs': 'Docs',
        'kicker.settings': 'Settings',

        'title.dashboard': 'Dashboard / Doctor',
        'title.config': 'ローカル設定コンソール',
        'title.sessions': 'セッションとエクスポート',
        'title.usage': 'ローカル使用量と推移',
        'title.orchestration': 'タスクオーケストレーション',
        'title.market': 'Skills インストールと同期',
        'title.plugins': 'プラグインとテンプレート',
        'title.docs': 'CLI インストールとドキュメント',
        'title.settings': 'システムとデータ設定',

        'subtitle.dashboard': '集約状態と診断エントリ。',
        'subtitle.config': 'ローカル設定とモデルの管理。',
        'subtitle.sessions': 'セッションの閲覧とエクスポート。',
        'subtitle.usage': '過去 7 / 30 日間の使用量を表示。',
        'subtitle.orchestration': 'ローカルタスクの計画・キュー・実行・振り返り。',
        'subtitle.market': 'ローカル Skills の管理。',
        'subtitle.plugins': 'テンプレート化されたプロンプトと再利用可能なプラグインの管理。',
        'subtitle.docs': 'CLI インストールコマンドとトラブルシューティング。',
        'subtitle.settings': 'ダウンロード・ディレクトリ・ゴミ箱の管理。',

        'dashboard.doctor.title': 'Doctor',
        'dashboard.doctor.runChecks': 'チェックを実行',
        'dashboard.doctor.checking': 'チェック中...',
        'dashboard.doctor.export': 'レポートをエクスポート',
        'dashboard.doctor.export.json': 'JSON エクスポート',
        'dashboard.doctor.export.md': 'Markdown エクスポート',
        'dashboard.doctor.open': '開く',
        'doctor.action.openConfig': 'Config を開く',
        'doctor.action.checkProvider': 'Provider 設定をチェック',
        'doctor.action.openUsage': 'Usage を開く',
        'doctor.action.openSessions': 'Sessions を開く',
        'doctor.action.openTasks': 'Tasks を開く',
        'doctor.action.viewTaskLogs': 'Tasks / Logs を表示',
        'doctor.action.openSkills': 'Skills を開く',
        'doctor.issue.configNotReady.problem': '設定ファイルが準備できていません',
        'doctor.issue.configNotReady.impact': 'provider/model が読み取れず、モデル一覧とリクエストが利用できなくなる可能性があります。',
        'doctor.issue.providerUnreachable.problem.remote-model-probe-unreachable': 'Provider に到達できません',
        'doctor.issue.providerUnreachable.problem.remote-model-probe-auth-failed': 'Provider 認証失敗',
        'doctor.issue.providerUnreachable.problem.remote-model-probe-not-found': 'Provider が 404 を返しました',
        'doctor.issue.providerUnreachable.problem.remote-model-probe-http-error': 'Provider が HTTP エラーを返しました',
        'doctor.issue.providerUnreachable.problem.remote-model-probe-error': 'Provider プローブ失敗',
        'doctor.issue.providerUnreachable.problem.unknown': 'Provider が利用できません',
        'doctor.issue.providerUnreachable.impactAuth': '認証失敗によりモデル一覧/会話リクエストが 401/403 を返します。',
        'doctor.issue.providerUnreachable.impactNetwork': 'リモートに到達できないためモデル一覧/会話リクエストが失敗またはタイムアウトします。',
        'doctor.issue.configHealthFailed.problem': '設定ヘルスチェックが失敗しました',
        'doctor.issue.configHealthFailed.impact': '一部の機能が利用できなかったり、期待通りの動作をしない可能性があります。',
        'doctor.issue.usageError.problem': 'Usage 統計異常',
        'doctor.issue.usageError.impact': 'Usage ページでトレンド/サマリーが表示できず、Doctor の使用量診断も欠落します。',
        'doctor.issue.usageMissingModel.problem': '一部のセッションにモデル情報がありません',
        'doctor.issue.usageMissingModel.impact': '使用量の帰属とコスト見積もりが不正確になります。',
        'doctor.issue.tasksError.problem': 'Tasks 状態の読み取りに失敗しました',
        'doctor.issue.tasksError.impact': 'オーケストレーションキュー/実行記録が表示できなくなる可能性があります。',
        'doctor.issue.tasksFailed.problem': '失敗したタスク実行があります',
        'doctor.issue.tasksFailed.impact': '自動化パイプラインが中断される可能性があります。ログを確認して再試行または入力を修正してください。',
        'doctor.issue.skillsError.problem': 'Skills 一覧の読み取りに失敗しました',
        'doctor.issue.skillsError.impact': 'Skills ページが正常に表示またはインストールできなくなります。',
        'doctor.issue.skillsRootMissing.problem': 'Skills ディレクトリが存在しません',
        'doctor.issue.skillsRootMissing.impact': 'Skills のインストール/スキャンが空になります。Settings/Docs でガイドに従ってディレクトリを初期化してください。',
        'doctor.issue.skillsMissingFiles.problem': 'skill.json が欠落しているスキルがあります',
        'doctor.issue.skillsMissingFiles.impact': '一部のスキルが実行または同期できなくなります。',
        'dashboard.card.config': '設定',
        'dashboard.card.sessions': 'セッション',
        'dashboard.card.usage': '使用量',
        'dashboard.card.tasks': 'タスク',
        'dashboard.card.skills': 'Skills',
        'dashboard.kv.model': 'モデル',
        'dashboard.kv.issue': '異常',
        'dashboard.kv.active': '現在',
        'dashboard.kv.sessions': 'セッション数',
        'dashboard.kv.missingModel': 'モデル欠落',
        'dashboard.kv.blockers': 'ブロッカー',
        'dashboard.kv.runs': '実行',
        'dashboard.kv.target': 'ターゲット',
        'dashboard.kv.root': 'ディレクトリ',
        'dashboard.status.health': '健全',
        'dashboard.status.busy': 'ビジー',
        'dashboard.status.models': 'モデル',
        'dashboard.busy.init': '初期化',
        'dashboard.busy.sessions': 'セッション読み込み',
        'dashboard.busy.models': 'モデル読み込み',
        'dashboard.busy.configApply': '設定適用',
        'dashboard.busy.agents': 'AGENTS 保存',
        'dashboard.busy.skills': 'Skills 管理',
        'dashboard.busy.tasks': 'タスクオーケストレーション',
        'dashboard.busy.idle': 'アイドル',
        'dashboard.message.none': 'メッセージなし',
        'dashboard.sessionSource.codex': 'Codex',
        'dashboard.sessionSource.claude': 'Claude Code',
        'dashboard.sessionSource.gemini': 'Gemini CLI',
        'dashboard.sessionSource.codebuddy': 'CodeBuddy Code',
        'dashboard.sessionSource.all': 'すべて',
        'dashboard.sessionPath.all': 'すべてのパス',
        'dashboard.sessionQuery.unsupported': '現在のソースは非対応',
        'dashboard.sessionQuery.unset': '未設定',
        'dashboard.healthStatus.failRead': '読み取り失敗',
        'dashboard.healthStatus.initializing': '初期化中',
        'dashboard.healthStatus.ok': '正常',
        'dashboard.modelStatus.loading': '読み込み中',
        'dashboard.modelStatus.error': '読み込みエラー',
        'dashboard.modelStatus.ok': '正常',
        'dashboard.health.ok': 'チェック通過',
        'dashboard.health.fail': 'チェック失敗',
        'dashboard.health.issues': '{count} 件の問題',
        'dashboard.issues.title': '{count} 件の対応可能な問題が見つかりました',
        'dashboard.state.loading': '読み込み中',
        'dashboard.state.ready': '準備完了',
        'dashboard.state.idle': '未読み込み',
        'dashboard.none': 'なし',
        'dashboard.sessions.count': '{count} 件のセッション',
        'dashboard.usage.range': '範囲 {value}',
        'dashboard.tasks.queue': '実行 {running} / キュー {queued}',
        'dashboard.skills.count': 'インストール済 {installed} / インポート可 {importable}',
        'dashboard.providersHealth.title': 'Provider 健全性',
        'dashboard.providersHealth.current': '(現在)',
        'dashboard.providersHealth.checking': 'チェック中...',
        'dashboard.providersHealth.allOk': 'すべての Provider が正常',
        'dashboard.providersHealth.hasIssues': '{count} 件の Provider に問題あり',

        // Plugins panel
        'plugins.sidebar.title': 'Plugins',
        'plugins.sidebar.note': '再利用可能な標準化ツール。将来のカスタムプラグインも同じ構造に従います。',
        'plugins.sidebar.ariaList': 'プラグイン一覧',
        'plugins.main.ariaWorkspace': 'プラグインワークスペース',
        'plugins.refresh': '更新',
        'plugins.refreshing': '更新中...',
        'plugins.promptTemplates.title': 'プロンプトテンプレート',
        'plugins.promptTemplates.subtitle': '内蔵：コードコメントのブラッシュアップ（{{code}}）。コピーして入力欄に貼り付けてください。',
        'plugins.promptTemplates.mode.aria': 'プロンプトテンプレートモード',
        'plugins.promptTemplates.mode.compose': '生成',
        'plugins.promptTemplates.mode.manage': '管理',
        'plugins.promptTemplates.compose.selectTemplate': 'テンプレートを選択',
        'plugins.promptTemplates.compose.chooseTemplate': 'テンプレートを選択',
        'plugins.promptTemplates.compose.chooseTemplateHint': 'テンプレートを選択して生成を開始してください。',
        'plugins.promptTemplates.compose.builtinSuffix': '（内蔵）',
        'plugins.promptTemplates.compose.empty': '利用可能なテンプレートがありません。',
        'plugins.promptTemplates.compose.varsHint': '変数の入力と追加は「管理」で行ってください。',
        'plugins.promptTemplates.compose.missingCount': '{count} 項目未入力',
        'plugins.promptTemplates.compose.jumpToMissing': '未入力にジャンプ',
        'plugins.promptTemplates.compose.goManage': '管理で変数を入力',
        'plugins.promptTemplates.compose.outputTitle': '生成結果',
        'plugins.promptTemplates.compose.outputHint': '「コピー」をクリックして Codex/Claude の入力欄に貼り付けてください。',
        'plugins.promptTemplates.compose.outputAria': '生成結果（プロンプト）',
        'plugins.promptTemplates.compose.copy': 'コピー',
        'plugins.promptTemplates.manage.searchAria': 'テンプレート検索',
        'plugins.promptTemplates.manage.searchPlaceholder': 'テンプレート検索',
        'plugins.promptTemplates.manage.create': '新規作成',
        'plugins.promptTemplates.manage.export': 'エクスポート',
        'plugins.promptTemplates.manage.import': 'インポート',
        'plugins.promptTemplates.manage.loading': 'テンプレート読み込み中...',
        'plugins.promptTemplates.manage.empty': 'テンプレートがありません。',
        'plugins.promptTemplates.manage.vars': '{count} vars',
        'plugins.promptTemplates.manage.builtin': 'built-in',
        'plugins.promptTemplates.manage.custom': 'custom',
        'plugins.promptTemplates.manage.newTemplateName': '新しいテンプレート',
        'plugins.promptTemplates.editor.selectHint': '編集するテンプレートを選択してください。',
        'plugins.promptTemplates.editor.namePlaceholder': 'テンプレート名',
        'plugins.promptTemplates.editor.nameAria': 'テンプレート名',
        'plugins.promptTemplates.editor.duplicate': '複製',
        'plugins.promptTemplates.editor.delete': '削除',
        'plugins.promptTemplates.editor.save': '保存',
        'plugins.promptTemplates.editor.builtinReadOnly': '内蔵テンプレートは読み取り専用です。編集/保存/削除/複製はできません。',
        'plugins.promptTemplates.editor.descPlaceholder': '説明（任意）',
        'plugins.promptTemplates.editor.descAria': 'テンプレート説明',
        'plugins.promptTemplates.editor.templateLabel': 'テンプレート',
        'plugins.promptTemplates.editor.templateAria': 'テンプレート内容',
        'plugins.promptTemplates.editor.templatePlaceholder': 'ここにテンプレートを記述します。{{var}} プレースホルダーを使用してください。',
        'plugins.promptTemplates.vars.title': '変数',
        'plugins.promptTemplates.vars.hint': 'テンプレートから検出されました。入力後に最終プロンプトをレンダリングできます。',
        'plugins.promptTemplates.vars.reset': 'リセット',
        'plugins.promptTemplates.vars.empty': '変数が検出されませんでした。',
        'plugins.promptTemplates.vars.valuePlaceholder': '変数値：{name}',
        'plugins.promptTemplates.preview.title': 'プレビュー',
        'plugins.promptTemplates.preview.hint': 'レンダリング結果（欠落変数は空に置換されます）。',
        'plugins.promptTemplates.preview.copy': 'コピー',
        'plugins.promptTemplates.preview.outputAria': 'レンダリング結果（プロンプト）',
        'plugins.promptTemplates.noPluginSelected': '左側からプラグインを選択してください。',

        'plugins.meta.attribution': '作成者：{createdBy} · メンテナー：{maintainers}',
        'plugins.meta.createdBy': '作成者：{createdBy}',
        'plugins.meta.maintainedBy': 'メンテナー：{maintainers}',

        // Built-in prompt templates
        'plugins.builtin.commentPolish.name': 'コードコメントブラッシュアップ',
        'plugins.builtin.commentPolish.desc': '以下のコードコメントを軽く整えてください {{code}}',
        'plugins.builtin.commentPolish.line1': '以下のコードコメントを軽く整えてください',
        'plugins.builtin.ruleAck.name': 'ルール確認返信',
        'plugins.builtin.ruleAck.desc': '【{{rule}}】に従って、受信確認を返してください',
        'plugins.builtin.ruleAck.line1': '【{{rule}}】に従って、受信確認を返してください',

        // Toasts
        'toast.copy.empty': 'コピーする内容がありません',
        'toast.copy.ok': 'コピーしました',
        'toast.copy.fail': 'コピーに失敗しました',
        'toast.save.ok': '保存しました',
        'toast.save.fail': '保存に失敗しました',
        'toast.delete.ok': '削除しました',
        'toast.delete.fail': '削除に失敗しました',
        'toast.export.empty': 'エクスポートする内容がありません',
        'toast.export.ok': 'エクスポートしました',
        'toast.export.fail': 'エクスポートに失敗しました',
        'toast.import.ok': 'インポート成功',
        'toast.import.fail': 'インポート失敗',
        'toast.import.notAvailable': 'インポートは利用できません',
        'toast.import.readFileFail': 'ファイル読み取り失敗',
        'toast.import.invalidJson': '無効な JSON',
        'toast.import.expectedArray': 'JSON は配列である必要があります',
        'toast.export.notSupported': '現在エクスポートはサポートされていません',
        'toast.plugins.loadFail': 'Plugins 読み込み失敗',
        'toast.templates.builtinNotEditable': '内蔵テンプレートは編集できません',
        'toast.templates.builtinNotModifiable': '内蔵テンプレートは変更できません。先に複製してから編集してください',
        'toast.templates.nameRequired': 'テンプレート名は必須です',
        'toast.templates.builtinNotDuplicable': '内蔵テンプレートは複製できません',
        'toast.templates.builtinNotDeletable': '内蔵テンプレートは削除できません',
        'toast.templates.deleteTitle': 'テンプレート削除',
        'toast.templates.deleteMessage': '「{name}」を削除しますか？この操作は取り消せません。',
        'toast.templates.deleteConfirm': '削除',
        'toast.templates.deleteCancel': 'キャンセル',

        // Basic modals
        'modal.providerAdd.title': 'プロバイダー追加',
        'modal.providerEdit.title': 'プロバイダー編集',
        'modal.modelAdd.title': 'モデル追加',
        'modal.modelManage.title': 'モデル管理',
        'modal.claudeConfigAdd.title': 'Claude Code 設定追加',
        'modal.claudeConfigEdit.title': 'Claude Code 設定編集',
        'field.useBuiltinTransform': '内蔵変換を使用（OpenAI 形式互換）',
        'hint.useBuiltinTransform': '有効時：書き込まれる base_url は codexmate 内蔵変換サービスを指します。Codex のトークンは codexmate に固定されます。',

        // Config template / agents modals
        'modal.configTemplate.title': 'Config テンプレートエディタ（手動確認適用）',
        'modal.configTemplate.label': 'config.toml テンプレート',
        'modal.configTemplate.placeholder': 'ここに config.toml テンプレート内容を編集してください',
        'modal.configTemplate.mode.twoStep': '二段階確認：先に差分をプレビューし、その後適用します。',
        'modal.configTemplate.mode.oneStep': '一段階適用：「適用」をクリックすると直接書き込みます。',
        'diff.title.configTemplate': '差分プレビュー（config.toml）',
        'diff.generating': '生成中...',
        'diff.failed': '生成失敗',
        'diff.noChanges': '変更が検出されませんでした',
        'diff.hint.busy': '差分生成中または適用中のため、操作は一時的に利用できません。',
        'diff.hint.failedBack': '差分プレビューに失敗しました。編集に戻って再試行してください。',
        'diff.hint.noChangesBack': '変更が検出されませんでした。編集に戻って修正を続けるか、キャンセルして終了してください。',
        'diff.hint.previewMode': '現在プレビューモードです。「適用」をクリックして書き込むか、「編集に戻る」で修正を続けてください。',

        'modal.agents.export': 'エクスポート',
        'modal.agents.copy': 'コピー',
        'modal.agents.title': 'AGENTS.md エディタ',
        'modal.agents.hint': '保存すると対象の AGENTS.md（config.toml と同階層）に書き込まれます。',
        'modal.agents.targetFile': '対象ファイル',
        'modal.agents.contentLabel': 'AGENTS.md 内容',
        'modal.agents.placeholder': 'ここに AGENTS.md の内容を編集してください',
        'modal.agents.unsaved.previewModeHint': 'プレビューモード：現在の変更はまだ保存されていません。「適用」をクリックするとファイルに書き込まれます。',
        'modal.agents.unsaved.detectedHint': '未保存の変更が検出されました：ページを閉じるか適用する前に保存してください。',
        'modal.agents.hint.shortcuts': 'ショートカット：Esc（差分プレビュー時は編集に戻る、編集時はウィンドウを閉じる）。',
        'modal.agents.hint.twoStepSave': '保存は2段階：「確認」で差分をプレビューし、「適用」で保存します。',
        'diff.tooLargeSkip': '内容が大きすぎるため、行単位の差分プレビューをスキップしました',
        'diff.viewHint.preview': '現在プレビューモードです。「適用」で保存するか、「編集に戻る」で修正を続けてください。',
        'diff.viewHint.truncated': '内容が大きすぎるためプレビューをスキップしました。「適用」で保存するか、「編集に戻る」で修正を続けてください。',

        // Skills modal
        'modal.skills.title': 'Skills 管理',
        'modal.skills.subtitle': '現在のホストのローカル Skills を管理します。',
        'modal.skills.target.aria': 'Skills 管理ターゲットを選択',
        'modal.skills.rootDir': 'Skills ディレクトリ（{label}）',
        'modal.skills.summary.target': 'インストールターゲット',
        'modal.skills.summary.total': 'ローカル総数',
        'modal.skills.summary.withSkill': 'SKILL.md あり',
        'modal.skills.summary.missingSkill': 'SKILL.md なし',
        'modal.skills.summary.importable': 'インポート可',
        'modal.skills.panel.aria': 'Skills 管理パネル',
        'modal.skills.local.title': 'ローカル Skills',
        'modal.skills.local.note': '検索・フィルター・一括削除が可能です。',
        'modal.skills.filter.keywordAria': '名前または説明で skill をフィルター',
        'modal.skills.filter.keywordPlaceholder': 'ディレクトリ名/表示名/説明で検索',
        'modal.skills.filter.statusAria': 'SKILL.md 状態で skill をフィルター',
        'modal.skills.filter.status.all': 'すべての状態',
        'modal.skills.filter.status.withSkill': 'SKILL.md ありのみ',
        'modal.skills.filter.status.missingSkill': 'SKILL.md なしのみ',
        'modal.skills.selection.stats': '選択 {selected}（フィルターヒット {filtered} / {total}、フィルター内選択 {visibleSelected}）',
        'modal.skills.empty.local': '管理可能な skill がありません。',
        'modal.skills.empty.filtered': '現在のフィルター条件に一致する skill がありません。',
        'modal.skills.pill.hasSkillFile': 'SKILL.md あり',
        'modal.skills.pill.missingSkillFile': 'SKILL.md なし',
        'modal.skills.pill.symlink': 'シンボリックリンク',
        'modal.skills.pill.dir': 'ディレクトリ',
        'modal.skills.import.title': 'クロスアプリインポート',
        'modal.skills.import.note': 'スキャンして現在の {label} にインポートします。',
        'modal.skills.import.scan': 'インポート可能をスキャン',
        'modal.skills.import.stats': '選択 {selected} / {total}、SKILL.md あり {configured}、なし {missing}',
        'modal.skills.import.emptyHint': 'インポート可能な skill がありません。「インポート可能をスキャン」をクリックしてください。',
        'modal.skills.bulk.title': '一括操作',
        'modal.skills.bulk.note': '右側はインポート操作、左側はローカル選択です。',
        'modal.skills.actions.zipImport': 'ZIP インポート',
        'modal.skills.actions.zipImporting': 'ZIP インポート中...',
        'modal.skills.actions.exportSelected': '選択をエクスポート',
        'modal.skills.actions.exporting': 'エクスポート中...',
        'modal.skills.actions.importSelected': '選択をインポート',
        'modal.skills.actions.importing': 'インポート中...',
        'modal.skills.actions.deleteSelected': '選択を削除',
        'modal.skills.actions.deleting': '削除中...',

        // OpenClaw config modal (quick)
        'placeholder.openclawConfigNameExample': '例: デフォルト設定',
        'modal.openclaw.loadCurrent': '現在の設定を読み込む',
        'modal.openclaw.quick.title': '初心者向けクイック設定',
        'modal.openclaw.quick.subtitle': '3ステップで完了：Provider とモデルを入力、エディタに書き込み、保存して適用。',
        'modal.openclaw.quick.readFromEditor': 'エディタから読み取り',
        'modal.openclaw.quick.step1': 'Provider とモデルを入力',
        'modal.openclaw.quick.step2': 'エディタに書き込みをクリック',
        'modal.openclaw.quick.step3': '保存して適用',
        'modal.openclaw.quick.providerHint': 'provider/model として主モデル識別子に結合されます。',
        'modal.openclaw.quick.baseUrlHintDefault': 'OpenClaw 内蔵 provider のデフォルト値で補完されています。直接変更可能です。',
        'modal.openclaw.quick.baseUrlHintReadonly': '外部参照が検出されたため、クイックフォームでは読み取り専用で表示されます。変更するには原文編集を使用してください。',
        'modal.openclaw.quick.apiKeyHintFromAuth': '現在の値は OpenClaw 外部認証設定から取得されています。変更後「保存して適用」時に対応する auth profile に書き戻されます。',
        'modal.openclaw.quick.apiKeyHintReadonly': '外部認証または参照が検出されたため、クイックフォームでは読み取り専用で表示されます。変更するには原文編集または対応する認証設定を使用してください。',
        'modal.openclaw.quick.apiKeyHintKeep': '空白のままにすると既存のキーは上書きされません。',
        'placeholder.apiTypeExample': '例: openai',
        'modal.openclaw.quick.modelTitle': 'モデル',
        'placeholder.modelIdExample': '例: gpt-5',
        'placeholder.modelNameOptional': 'モデル表示名（任意）',
        'field.contextWindow': 'コンテキスト長',
        'field.maxOutput': '最大出力',
        'hint.emptyNoChange': '空白のままにすると既存の設定は変更されません。',
        'modal.openclaw.quick.optionsTitle': 'オプション',
        'modal.openclaw.quick.setPrimary': '主モデルに設定',
        'modal.openclaw.quick.overrideProvider': '同名 Provider 基本情報を上書き',
        'modal.openclaw.quick.overrideModels': '同名モデルリストを上書き',
        'modal.openclaw.quick.optionsHint': '上書きをオフにすると欠落フィールドのみ補完されます。',
        'modal.openclaw.quick.writeToEditor': 'エディタに書き込み',

        // Docs panel
        'docs.title': 'CLI インストールドキュメント',
        'docs.subtitle': 'Claude Code / Gemini CLI / CodeBuddy Code / Codex CLI コマンドを表示。',
        'docs.section.commands': 'インストールコマンド',
        'docs.section.commandsNote': 'コマンドは直接コピーできます。',
        'docs.section.faq': 'よくある質問',
        'docs.section.faqNote': 'よくある質問は以下をご覧ください。',
        'docs.command.aria': '{name} コマンド',
        'docs.registryHintPrefix': 'コマンドに付加：',
        'docs.registryHintCustom': '完全な URL（http/https 含む）を入力してください。コマンドに自動付加されます。',
        'docs.registry.tencent': 'Tencent Cloud',
        'docs.meta.bin': 'bin: {bin}',
        'docs.termuxLabel': 'Termux',
        'docs.termuxAria': 'Termux Codex CLI command',
        'docs.rule.1': 'コマンドは現在のパッケージマネージャー、ミラー、操作に基づいて生成されます。',
        'docs.rule.2': 'カスタムミラーはインストールとアップグレードにのみ使用されます。',
        'docs.tip.win.1': 'PowerShell で権限不足（EACCES/EPERM）エラーが発生した場合は、管理者としてインストールコマンドを実行してください。',
        'docs.tip.win.2': 'インストール後にコマンドが見つからない場合は、ターミナルを再起動して実行：where codex / where claude / where gemini / where codebuddy。',
        'docs.tip.win.3': '企業ネットワークで制限がある場合は、ミラーソース（npmmirror / Tencent Cloud / カスタム）を切り替えてください。',
        'docs.tip.unix.1': 'EACCES 権限エラーが発生した場合は、Node グローバルディレクトリの権限を修正してください。sudo npm は推奨しません。',
        'docs.tip.unix.2': 'インストール後にコマンドが認識されない場合は、ターミナルを再起動して実行：which codex / which claude / which gemini / which codebuddy。',
        'docs.tip.unix.3': '企業ネットワークで制限がある場合は、ミラーソース（npmmirror / Tencent Cloud / カスタム）を切り替えてください。',

        // Sessions panel
        'sessions.loading': 'セッション読み込み中...',
        'sessions.sourceTitle': 'ソース',
        'sessions.refresh': '更新',
        'sessions.refreshing': '更新中...',
        'sessions.allPaths': 'すべてのパス',
        'sessions.source.codex': 'Codex',
        'sessions.source.claudeCode': 'Claude Code',
        'sessions.source.gemini': 'Gemini',
        'sessions.source.codebuddy': 'CodeBuddy',
        'sessions.loadingList': 'セッション一覧を読み込み中...',
        'sessions.empty': 'セッションがありません',
        'sessions.unknownTime': '不明な時間',
        'sessions.query.placeholder.enabled': 'セッションを検索...',
        'sessions.query.placeholder.disabled': '現在のソースでは検索は利用できません',
        'sessions.pin': 'ピン留め',
        'sessions.unpin': 'ピン留め解除',
        'sessions.copyResume': '再開コマンドをコピー',
        'sessions.preview.refresh': '更新',
        'sessions.preview.loading': 'プレビュー読み込み中...',
        'sessions.preview.deleteHard': '直接削除',
        'sessions.preview.moveToTrash': 'ゴミ箱に移動',
        'sessions.preview.deleting': '削除中...',
        'sessions.preview.moving': '移動中...',
        'sessions.preview.export': 'エクスポート',
        'sessions.preview.exporting': 'エクスポート中...',
        'sessions.preview.convert': '派生セッションを生成',
        'sessions.preview.converting': '変換中...',
        'sessions.preview.convert.loadedOnly': '読み込み済みのみ変換',
        'sessions.preview.openStandalone': 'スタンドアロンで開く',
        'sessions.preview.loadingBody': 'メッセージ読み込み中...',
        'sessions.preview.emptyMsgs': 'メッセージがありません',
        'sessions.preview.rendering': 'レンダリング中...',
        'sessions.preview.rerender': '再レンダリング',
        'sessions.preview.preparing': '準備中...',
        'sessions.preview.clipped': 'プレビューは一部のみ表示されています',
        'sessions.preview.shownCount': '{shown} / {total} 件表示',
        'sessions.preview.loadMore': 'さらに読み込む',
        'sessions.preview.loadingMore': 'さらに読み込み中...',
        'sessions.timeline.aria': 'セッションタイムライン',
        'sessions.selectHint': '左側からセッションを選択してください',
        'sessions.role.all': 'すべてのロール',
        'sessions.role.user': 'ユーザー',
        'sessions.role.assistant': 'アシスタント',
        'sessions.role.system': 'システム',
        'sessions.time.all': 'すべての期間',
        'sessions.time.7d': '直近 7 日',
        'sessions.time.30d': '直近 30 日',
        'sessions.time.90d': '直近 90 日',
        'sessions.sort.time': '時間順',
        'sessions.sort.hot': '話題順',
        'sessions.sort.hotBadge': '話題',
        'sessions.filters.copyLink': 'リンクをコピー',
        'sessions.filters.urlBuildFail': 'リンク生成失敗',
        'sessions.filters.source': 'ソース',
        'sessions.filters.path': 'パス',
        'sessions.filters.keyword': 'キーワード',
        'sessions.filters.role': 'ロール',
        'sessions.filters.time': '期間',
        'sessions.roleLabel.user': 'User',
        'sessions.roleLabel.system': 'System',
        'sessions.roleLabel.assistant': 'Assistant',

        // Usage panel
        'usage.overview': 'Usage 概要',
        'usage.range.aria': 'Usage 時間範囲',
        'usage.range.7d': '直近 7 日',
        'usage.range.30d': '直近 30 日',
        'usage.range.all': 'すべて',
        'usage.compare.toggle': '前期間と比較',
        'usage.compare.prev': '前期間',
        'usage.compare.delta': '変化',
        'usage.refresh': '統計を更新',
        'usage.refreshing': '更新中...',
        'usage.loading': 'Usage 統計を読み込み中...',
        'usage.empty': '統計に使用できるセッションデータがありません',
        'usage.refreshOverlay': '更新中…',
        'usage.copyTitle': 'クリックでコピー：{value}',
        'usage.copySuccess': 'コピー済：{label}',
        'usage.copyFail': 'コピー失敗',
        'usage.copyNone': 'コピーする内容がありません',
        'usage.daily.title': '日別消費',
        'usage.daily.subtitle': '日別 token と推定費用のサマリー（費用はそれぞれ最大値で正規化表示）。',
        'usage.daily.note': '注：推定費用はデフォルトで Claude を含みません。モデル単価が一致し、セッションが input/output token を記録している場合のみ計算されます。',
        'usage.heatmap.title': 'ヒートマップ',
        'usage.heatmap.subtitle': '日別セッション数。色が濃いほど多い。',
        'usage.heatmap.legend.less': '少',
        'usage.heatmap.legend.more': '多',
        'usage.heatmap.tooltip': '{date} · {sessions} セッション · {messages} メッセージ · {tokens} token',
        'usage.heatmap.aria': '{date}、{sessions} セッション',
        'usage.hourlyHeatmap.title': '7×24 アクティブヒートマップ',
        'usage.hourlyHeatmap.subtitle': '曜日 × 時間帯でセッション分布を集計、濃色 = 高アクティブ。',
        'usage.hourlyHeatmap.tooltip': '{weekday} {hour}:00 · {sessions} セッション · {messages} メッセージ · {tokens} token',
        'usage.hourlyHeatmap.legend.less': '少',
        'usage.hourlyHeatmap.legend.more': '多',
        'usage.legend.tokens': 'Token',
        'usage.legend.cost': '推定費用',
        'usage.table.date': '日付',
        'usage.table.sessions': 'セッション',
        'usage.table.messages': 'メッセージ',
        'usage.table.tokens': 'Token',
        'usage.table.cost': '推定費用',
        'usage.trend.sessions': 'セッション推移',
        'usage.trend.messages': 'メッセージ推移',
        'usage.trend.activeHours': 'アクティブ時間帯',
        'usage.trend.sources': 'ソースインサイト',
        'usage.legend.codex': 'Codex',
        'usage.legend.claude': 'Claude',
        'usage.trend.sessions.codexTitle': 'Codex {count}',
        'usage.trend.sessions.claudeTitle': 'Claude {count}',
        'usage.trend.messages.barTitle': '{count} 件のメッセージ',
        'usage.hour.title': '{hour}:00 · {count} 回のセッション',
        'usage.source.row': '{sessions} セッション · {messages} メッセージ · 平均 {avg}',
        'usage.summary.sessions': '総セッション数',
        'usage.summary.messages': '総メッセージ数',
        'usage.summary.tokens': '総 Token 数',
        'usage.summary.contextWindow': '総コンテキスト数',
        'usage.summary.estimatedCost': '推定費用 · {range}',
        'usage.estimatedCost.note.excludesClaudePrefix': '現在 Claude を除く、',
        'usage.estimatedCost.method.configured': '設定済み単価で推定',
        'usage.estimatedCost.method.catalog': '公開モデルカタログで推定',
        'usage.estimatedCost.method.configuredAndCatalog': '設定済み単価 + 公開モデルカタログで推定',
        'usage.estimatedCost.detail.estimate': '{prefix}{method}、推定 {estimate}、カバー {covered}/{total} セッション、約 {percent}% token',
        'usage.estimatedCost.detail.missing': '{prefix}一致するモデル単価または token 分割がありません。先に models.cost を補完するか、セッションが input/output token を記録しているか確認してください。',
        'usage.summary.activeDuration': 'アクティブ期間',
        'usage.summary.activeDuration.title': '累積セッションスパン {value}',
        'usage.summary.totalDuration': '総期間',
        'usage.summary.totalDuration.title': '全体の時間スパン {value}',
        'usage.summary.activeDays': 'アクティブ日数',
        'usage.summary.avgMessagesPerSession': 'セッションあたり平均メッセージ',
        'usage.summary.busiestDay': '最も忙しい日',
        'usage.summary.busiestHour': 'ピーク時間帯',
        'usage.currentSession.title': '現在のセッション',
        'usage.currentSession.apiDuration': 'API 時間',
        'usage.currentSession.totalDuration': '総時間',
        'usage.currentSession.tokens': 'Token',
        'usage.range.kicker.all': 'すべて',
        'usage.range.kicker.30d': '直近 30 日',
        'usage.range.kicker.7d': '直近 7 日',
        'usage.copyTokenDay': 'コピー済：Token（{day}）',
        'usage.copyCostDay': 'コピー済：推定費用（{day}）',
        'usage.dayDetail.title': '{day} 詳細',
        'usage.dayDetail.subtitle': '日付を選択すると当日の構成をすばやく確認できます。',
        'usage.dayDetail.pick': '日付を選択',
        'usage.dayDetail.empty': '日付を選択して当日の構成を確認してください。',
        'usage.dayDetail.clear': 'クリア',
        'usage.dayDetail.topSessions': 'トップセッション',
        'usage.dayDetail.topModels': 'トップモデル',
        'usage.models.title': '使用モデル',
        'usage.models.subtitle': '実際に記録されたモデル名のみを表示します。',
        'usage.models.kicker': '識別済 {modeled}/{total}',
        'usage.models.count': 'モデル数',
        'usage.models.coverage': 'セッションカバレッジ',
        'usage.models.missing': 'モデル欠落',
        'usage.models.noneTitle': '現在の範囲でモデル名が読み取れません',
        'usage.models.noneBody': '{total} セッションをスキャンしましたが、元のレコードに識別可能な model フィールドがありません。',
        'usage.models.providerOnly': 'うち {count} 件の古いセッションは provider のみ記録されています。',
        'usage.models.missingNote.providerOnly': '別途 {count} 件のセッションにモデル名がなく、一覧に含まれていません。',
        'usage.models.missingNote': '別途 {count} 件のセッションに model がなく、一覧に含まれていません。',
        'usage.models.missingListTitle': 'まだモデル名が欠落しているセッション',
        'usage.models.chipTitle': '{model} · {sessions} セッション · {messages} メッセージ{tokens}',
        'usage.models.meta': '{sessions} セッション · {messages} メッセージ{tokens}',
        'usage.weekday.title': '曜日分布',
        'usage.paths.title': '高頻度パス',
        'usage.paths.empty': 'パスデータがありません',
        'usage.paths.count': '{count} 回',
        'usage.paths.meta': '{messages} メッセージ{recent}',
        'usage.paths.recent': ' · 最近 {label}',
        'usage.recent.title': '最近アクティブなセッション',
        'usage.sessions.empty': 'セッションデータがありません',
        'usage.sessions.messages': '{count} メッセージ',
        'usage.sessions.topDensity': 'メッセージ密度最高',

        // Config panel (Codex)
        'config.addProvider': 'プロバイダー追加',
        'config.providerTemplate.title': 'プリセットプロバイダー',
        'config.models': 'モデル',
        'config.modelLoading': '読み込み中...',
        'config.models.unlimited': '現在モデル一覧がありません。手動入力可能です。',
        'config.models.error': 'モデル一覧の取得に失敗しました。手動入力可能です。',
        'config.models.notInList.codex': '現在のモデルは一覧にありません。手動入力またはテンプレート変更が可能です。',
        'config.models.notInList.other': '現在のモデルは一覧にありません。手動入力可能です。',
        'config.template.editFirst': '先にテンプレートを編集してから適用してください。',
        'config.template.bridgeCodexOnly': '{hint} テンプレートは Codex のみ編集可能です。',
        'config.template.openEditor': 'テンプレートエディタを開く',
        'modal.configTemplate.title': 'Config テンプレートエディタ（手動確認適用）',
        'modal.configTemplate.placeholder': 'ここに config.toml テンプレート内容を編集してください',
        'config.serviceTier': 'サービスティア',
        'config.serviceTier.fast': 'fast（デフォルト）',
        'config.serviceTier.standard': 'standard',
        'config.serviceTier.hint': 'fast のみ {field} に書き込みます。',
        'config.reasoningEffort': '推論強度',
        'config.reasoningEffort.medium': 'medium（デフォルト）',
        'config.reasoningEffort.hint': '推論の深さを制御します。high はより深く推論します。',
        'config.contextBudget': '圧縮閾値',
        'config.reset': 'リセット',
        'config.example': '例: {value}',
        'config.contextWindow.hint': 'コンテキスト上限、デフォルト 190000。',
        'config.autoCompact.hint': '自動圧縮閾値、デフォルト 185000。',
        'config.agents.open': 'AGENTS.md を開く',
        'modal.agents.title.default': 'AGENTS.md エディタ',
        'modal.agents.title.claudeMd': 'CLAUDE.md エディタ',
        'modal.agents.title.openclaw': 'OpenClaw AGENTS.md エディタ',
        'modal.agents.hint.default': '保存すると対象の AGENTS.md（config.toml と同階層）に書き込まれます。',
        'modal.agents.hint.claudeMd': '保存すると ~/.claude/CLAUDE.md に書き込まれます。',
        'modal.agents.contentLabel.claudeMd': 'CLAUDE.md 内容',
        'modal.agents.placeholder.claudeMd': 'ここに CLAUDE.md の内容を編集してください',
        'modal.agents.hint.openclaw': '保存すると OpenClaw Workspace の AGENTS.md に書き込まれます。',
        'modal.agents.title.openclawWorkspaceFile': 'OpenClaw ワークスペースファイル: {fileName}',
        'modal.agents.hint.openclawWorkspaceFile': '保存すると OpenClaw Workspace の {fileName} に書き込まれます。',
        'config.url.unset': 'URL 未設定',
        'config.model.unset': 'モデル未設定',
        'config.badge.system': 'システム',
        'config.availabilityTest': '可用性テスト',
        'config.availabilityTestAria': '{name} の可用性をテスト',
        'config.health.title': '設定ヘルスチェック',
        'config.health.run': 'チェック実行',
        'config.health.running': 'チェック中...',
        'config.health.hint': 'すべてのプロバイダーの可用性を一括プローブし、遅延表示を更新します。',
        'config.health.progress': '完了 {done}/{total} · 失敗 {failed}',
        'config.health.ok': 'チェック通過',
        'config.health.fail': 'チェック失敗',
        'config.health.issues': '{count} 件の問題',
        'config.shareCommand': 'コマンド共有',
        'config.shareDisabled': '共有不可',
        'config.shareCommand.aria': 'インポートコマンドを共有',
        'config.provider.edit.aria': 'プロバイダーを編集：{name}',
        'config.provider.delete.aria': 'プロバイダーを削除：{name}',
        'config.provider.clone': 'クローン',
        'config.provider.clone.aria': 'プロバイダーをクローン：{name}',
        'app.loadingConfig': '設定読み込み中...',
        'common.current': '現在 {value}',
        'common.notSelected': '未選択',
        'common.readFromEditor': 'エディタから読み取り',
        'common.writeToEditor': 'エディタに書き込み',
        'sessions.sourceLabel': 'ソース：{value}',
        'usage.rangeLabel': '範囲：{value}',
        'sessions.source.all': 'すべて',
        'usage.range.all': 'すべて',
        'usage.range.7d.short': '直近 7 日',
        'usage.range.30d.short': '直近 30 日',
        'orchestration.queueStats': 'キュー {running} 実行中 · {queued} 待機中',
        'orchestration.hero.kicker': 'タスクオーケストレーション',
        'orchestration.hero.title': '要件を実行可能なステップに分解',
        'orchestration.hero.subtitle': '最初に目標を書き、計画をプレビューし、実行します。',
        'orchestration.draft.reset': '下書きをリセット',
        'orchestration.summary.aria': 'タスクオーケストレーション概要',
        'orchestration.summary.running': '実行中',
        'orchestration.summary.queued': '待機中',
        'orchestration.summary.runs': '実行記録',
        'orchestration.step1.title': '最初に結果を明確に書く',
        'orchestration.step1.subtitle': '実行に影響する内容だけを書いてください。',
        'orchestration.templates.title': 'クイックサンプル',
        'orchestration.templates.reviewFix.label': 'レビュー修正 + 回帰',
        'orchestration.templates.reviewFix.target': '現在の PR レビューを修正',
        'orchestration.templates.reviewFix.notes': '输出统一结论，避免重复描述',
        'orchestration.templates.reviewFix.followUps': '继续处理新增 review 评论\n最后更新 PR 摘要',
        'orchestration.templates.planOnly.label': '計画のみ',
        'orchestration.templates.planOnly.target': '計画を生成するだけ',
        'orchestration.templates.planOnly.notes': '出力統一結論，避免重复描述',
        'orchestration.templates.workflowBatch.label': 'Workflow 批处理',
        'orchestration.templates.workflowBatch.target': 'Workflow 一括実行',
        'orchestration.templates.workflowBatch.workflowIds': 'review-fix\nregression-test',
        'orchestration.templates.workflowBatch.notes': '用 Workflow 跑一组固定检查并整理结果',
        'orchestration.fields.target': 'ターゲット',
        'orchestration.fields.target.placeholder': '例: /path/to/project',
        'orchestration.fields.target.hint': '作業ディレクトリまたはファイルパス。',
        'orchestration.engine.codex': 'Codex',
        'orchestration.engine.workflow': 'Workflow',
        'orchestration.runMode.write': '書き込み',
        'orchestration.runMode.readOnly': '読み取り専用',
        'orchestration.runMode.dryRun': 'ドライラン',
        'orchestration.pills.hasTitle': 'タイトルあり',
        'orchestration.pills.workflowCount': 'Workflow {count}',
        'orchestration.pills.planNodes': '計画 {count} ノード',
        'orchestration.step2.title': '計画をプレビュー',
        'orchestration.step2.subtitle': 'AI が生成した計画を確認・調整します。',
        'orchestration.fields.engine': 'エンジン',
        'orchestration.fields.runMode': '実行モード',
        'orchestration.advanced.title': '詳細設定',
        'orchestration.fields.title': 'タイトル',
        'orchestration.fields.title.placeholder': '例: PR #42 のレビュー指摘を修正',
        'orchestration.fields.notes': '説明',
        'orchestration.fields.notes.placeholder': '例：既存アーキテクチャを書き換えず、増分実装のみ行う',
        'orchestration.fields.notes.hint': '境界条件、禁止事項、スタイル要件、検証要件を補足してください。',
        'orchestration.fields.followUps': '後続アクション（1行1件）',
        'orchestration.fields.followUps.placeholder': '例：\nレビューコメントの続きを処理\n最後に回帰テストを実行',
        'orchestration.fields.concurrency': '並列度',
        'orchestration.fields.concurrency.hint': '複雑なタスクは 1~2 から始めると安定します。',
        'orchestration.fields.autoFixRounds': '自動修正',
        'orchestration.fields.autoFixRounds.hint': '失敗後に自動で再試行する回数。',
        'orchestration.fields.workflowIds': 'Workflow ID（1行1件）',
        'orchestration.fields.workflowIds.placeholder': '例:\nreview-fix\nregression-test',
        'orchestration.fields.workflowIds.hint': 'Workflow エンジン使用時に必須。',
        'orchestration.workflow.stepCount': '{count} ステップ',
        'orchestration.step3.title': '実行して確認',
        'orchestration.step3.subtitle': '計画を実行し、結果を確認します。',
        'orchestration.actions.planning': '計画中...',
        'orchestration.actions.previewOnly': 'プレビューのみ',
        'orchestration.actions.preparing': '準備中...',
        'orchestration.actions.generatePlan': '計画を生成',
        'orchestration.actions.planAndRun': '計画して実行',
        'orchestration.actions.processing': '処理中...',
        'orchestration.actions.queueAndStart': 'キューに入れて開始',
        'orchestration.actions.caption': '「計画して実行」は必要に応じて計画を自動更新します。バッチタスクは「キューに入れて開始」を使用してください。',
        'orchestration.stage.title': 'タスクステージ',
        'orchestration.stage.subtitle': '3ステップでタスクを完了：計画 → プレビュー → 実行。',
        'orchestration.stage.pill.target': 'ターゲット',
        'orchestration.stage.pill.preview': 'プレビュー',
        'orchestration.stage.pill.run': '実行',
        'orchestration.plan.title': '計画',
        'orchestration.plan.subtitle': 'AI が生成した実行計画。各ノードは1つのステップを表します。',
        'orchestration.plan.summary.nodes': 'ノード数',
        'orchestration.plan.summary.waves': '波数',
        'orchestration.plan.summary.engine': 'エンジン',
        'orchestration.plan.node.write': '書き込み',
        'orchestration.plan.node.readOnly': '読み取り専用',
        'orchestration.labels.dependencies': '依存',
        'orchestration.labels.error': 'エラー',
        'orchestration.workbench.title': 'タスクワークベンチ',
        'orchestration.workbench.subtitle': 'タスクの計画・キュー・実行・振り返り。',
        'orchestration.queue.start': '開始',
        'orchestration.queue.starting': '開始中...',
        'orchestration.workbench.tabs.aria': 'タスクタブ',
        'orchestration.workbench.tabs.queue': 'キュー {count}',
        'orchestration.workbench.tabs.runs': '実行記録 {count}',
        'orchestration.workbench.tabs.detail': '詳細',
        'orchestration.queue.empty.title': 'キューは空です',
        'orchestration.queue.empty.subtitle': 'キューにタスクがありません。',
        'orchestration.runs.empty.title': '実行記録なし',
        'orchestration.runs.empty.subtitle': 'まだ実行記録がありません。',
        'orchestration.detail.refresh': '詳細を更新',
        'orchestration.detail.retry': '再試行',
        'orchestration.detail.retrying': '再試行中...',
        'orchestration.detail.empty.title': '実行記録を選択して詳細を表示',
        'orchestration.detail.empty.subtitle': 'ここにノードの状態、サマリー、ログが表示されます。',
        'orchestration.detail.summary.status': '状態',
        'orchestration.detail.summary.duration': '所要時間',
        'orchestration.detail.summary.nodes': 'ノード数',
        'orchestration.detail.summary.summary': 'サマリー',
        'orchestration.detail.node.meta': '{id} · 試行 {attempts} · 自動修正 {autoFix}',
        'skills.localLabel': '{target} / ローカル Skills',
        'skills.counts': 'インストール済 {installed} · インポート可 {importable}',

        // Sidebar status labels (compact)
        'status.currentSource': '現在のソース',
        'status.sessionCount': 'セッション数',
        'status.range': '統計範囲',
        'status.totalSessions': '総セッション数',
        'status.totalMessages': '総メッセージ数',
        'status.engine': 'エンジン',
        'status.concurrency': '並列度',
        'status.running': '実行中',
        'status.queued': '待機中',
        'status.runs': '履歴実行',
        'status.currentTarget': '現在のターゲット',
        'status.localSkills': 'ローカル Skills',
        'status.importable': 'インポート可',
        'status.importableDirect': '直接インポート可',
        'status.pm': 'パッケージマネージャー',
        'status.action': '現在の操作',
        'status.registry': 'ミラー',
        'status.claudeConfig': 'Claude 設定',
        'status.claudeModel': 'Claude モデル',
        'status.openclawConfig': 'OpenClaw 設定',
        'status.workspaceFile': 'ワークスペースファイル',
        'status.configMode': '設定モード',
        'status.currentProvider': '現在の Provider',
        'status.currentModel': '現在のモデル',
        'status.quickSwitchProvider': 'プロバイダーをクイック切替',
        'side.usage.meta': 'ローカル統計 / トレンド',
        'side.orchestration.meta': '計画 / キュー / 実行',

        // Settings panel
        'settings.tab.general': '一般',
        'settings.tab.data': 'データ',
        'settings.tabs.aria': '設定カテゴリ',
        'settings.sharePrefix.title': '共有コマンドプレフィックス',
        'settings.sharePrefix.meta': 'Web UI の「共有コマンドをコピー」のプレフィックスに影響',
        'settings.sharePrefix.label': 'プレフィックス',
        'settings.sharePrefix.hint': 'デフォルトはプロジェクト内の npm start を使用します。グローバル codexmate に切り替えることもできます。この設定はブラウザローカルにキャッシュされます。',
        'settings.backup.title': 'データバックアップ',
        'settings.backup.meta': 'Claude と Codex 設定のエクスポート / インポート',
        'settings.claude.title': 'Claude 設定',
        'settings.claude.meta': '~/.claude のバックアップ / インポート',
        'settings.codex.title': 'Codex 設定',
        'settings.codex.meta': '~/.codex のバックアップ / インポート',
        'settings.backup.progress': 'バックアップ中 {percent}%',
        'settings.backup.oneClickClaude': '~/.claude をワンクリックバックアップ',
        'settings.backup.importClaude': '~/.claude バックアップをインポート',
        'settings.backup.oneClickCodex': '~/.codex をワンクリックバックアップ',
        'settings.backup.importCodex': '~/.codex バックアップをインポート',
        'settings.importing': 'インポート中...',

        'settings.trashConfig.title': 'ゴミ箱設定',
        'settings.trashConfig.meta': 'ゴミ箱の有効/無効と自動クリーンアップ日数',
        'settings.deleteBehavior.title': 'セッション削除動作',
        'settings.deleteBehavior.meta': '「削除」を先にゴミ箱に入れるかどうかを決定',
        'settings.deleteBehavior.toggle': 'セッション削除時に先にゴミ箱に移動',
        'settings.deleteBehavior.hint': 'デフォルトで有効。オフにすると、セッション閲覧での削除は直接完全削除され、ゴミ箱に入りません。',

        'settings.trash.title': 'ゴミ箱',
        'settings.trash.meta': '削除済みセッション（復元/完全削除可能）',
        'settings.trash.refresh': 'リストを更新',
        'settings.trash.refreshing': '更新中...',
        'settings.trash.clear': 'ゴミ箱を空にする',
        'settings.trash.clearing': 'クリア中...',
        'settings.trash.loading': 'ゴミ箱を読み込み中...',
        'settings.trash.empty': 'ゴミ箱は空です',
        'settings.trash.retry': 'ゴミ箱リストの読み込みに失敗しました。更新して再試行してください',
        'settings.trash.restore': '復元',
        'settings.trash.restoring': '復元中...',
        'settings.trash.purge': '完全に削除',
        'settings.trash.purging': '削除中...',
        'settings.trash.workspace': 'ワークスペース',
        'settings.trash.originalFile': '元ファイル',
        'settings.trash.loadMore': 'さらに読み込む（残り {count} 件）',
        'settings.trash.retention': '自動クリーンアップ',
        'settings.trash.retentionMeta': '保持日数を超えたゴミ箱レコードは自動的に削除されます',
        'settings.trash.retentionLabel': '保持日数',
        'settings.trash.retentionHint': '範囲 1-365 日、デフォルト 30 日。ゴミ箱読み込み時に期限切れレコードを自動クリーンアップします。',

        'settings.templateConfirm.title': '設定テンプレートの二次確認',
        'settings.templateConfirm.meta': '誤書き込みリスクを低減',
        'settings.templateConfirm.toggle': 'テンプレート適用前に差分をプレビュー（2段階：確認 → 適用）',
        'settings.templateConfirm.hint': '有効時：先に差分プレビューを表示し、確認後に書き込みます。',

        'settings.reset.title': '設定リセット',
        'settings.reset.meta': '注意して操作してください',
        'settings.reset.hint': '先に config.toml をバックアップし、デフォルト設定を書き込みます。',
        'settings.reset.button': '設定を再インストール',
        'settings.reset.loading': '再インストール中...',

        // Market (Skills)
        'market.title': 'Skills 概要',
        'market.subtitle': 'ターゲットを切り替えてローカル Skills を表示。',
        'market.refresh': '概要を更新',
        'market.refreshing': '更新中...',
        'market.openManager': 'Skills 管理を開く',
        'market.target.aria': 'Skills インストールターゲットを選択',
        'market.summary.target': 'インストールターゲット',
        'market.summary.total': 'ローカル総数',
        'market.summary.configured': 'SKILL.md あり',
        'market.summary.missing': 'SKILL.md なし',
        'market.summary.importable': 'インポート可',
        'market.summary.importableDirect': '直接インポート可',
        'market.root.fallback': 'デフォルトディレクトリ',

        'market.installed.title': 'インストール済 Skills',
        'market.installed.note': '上位 6 項目のみ表示。',
        'market.local.refresh': 'ローカルを更新',
        'market.local.refreshing': '更新中...',
        'market.local.loading': 'ローカル Skills 読み込み中...',
        'market.local.empty': '現在インストール済の skill はありません。',
        'market.pill.verified': '検証済',
        'market.pill.missingSkill': 'SKILL.md 要追加',

        'market.import.title': 'インポート可能ソース',
        'market.import.note': 'スキャンして現在の {target} にインポートします。',
        'market.import.scan': 'ソースをスキャン',
        'market.import.scanning': 'スキャン中...',
        'market.import.loading': 'インポート可能 skill をスキャン中...',
        'market.import.empty': 'インポート可能な skill がスキャンされませんでした。',
        'market.pill.importableDirect': '直接インポート可',
        'market.pill.importMissing': 'SKILL.md なし',

        'market.actions.title': '配布エントリ',
        'market.actions.note': '操作はすべて現在のインストールターゲットに適用されます。',
        'market.action.manage.title': 'ローカル Skills 管理',
        'market.action.manage.copy': '現在の {target} のインストール済 skills を管理',
        'market.action.crossImport.title': 'クロスアプリインポート',
        'market.action.crossImport.copy': '現在の {target} にインポート',
        'market.action.zipImport.title': 'ZIP インポート',
        'market.action.zipImport.copy': 'ZIP から現在のターゲットにインポート',

        'market.help.title': '操作説明',
        'market.help.target.title': 'ターゲット切替',
        'market.help.target.copy': '現在の操作は {target} ディレクトリに書き込まれます。',
        'market.help.crossImport.title': 'クロスアプリインポート',
        'market.help.crossImport.copy': '他のホストから未管理の skill をインポートします。',
        'market.help.zipImport.title': 'ZIP インポート',
        'market.help.zipImport.copy': 'ZIP からローカル skill をインポートします。',

        // Claude config panel
        'claude.addProvider': 'プロバイダー追加',
        'claude.applyDefault': 'デフォルトで ~/.claude/settings.json に適用されます。',
        'claude.presetProviders': 'プリセットプロバイダー',
        'claude.customConfig': 'カスタム設定',
        'claude.model': 'モデル',
        'claude.model.placeholder': '例: claude-3-7-sonnet',
        'claude.model.hint': 'モデル変更後は自動保存され、現在の設定に適用されます。',
        'claude.health.title': '設定ヘルスチェック',
        'claude.health.run': 'チェック実行',
        'claude.health.running': 'チェック中...',
        'claude.health.hint': 'すべての Claude 設定の可用性を一括プローブし、遅延表示を更新します。',
        'claude.health.progress': '完了 {done}/{total} · 失敗 {failed}',
        'claude.md.title': 'CLAUDE.md',
        'claude.md.open': 'CLAUDE.md を開く',
        'claude.md.hint': '~/.claude/CLAUDE.md の読み書き。',
        'claude.model.unset': 'モデル未設定',
        'claude.configured': '設定済み',
        'claude.notConfigured': '未設定',
        'claude.action.edit': '編集',
        'claude.action.delete': '削除',
        'claude.action.shareDisabled': 'インポートコマンド共有',
        'claude.action.editAria': 'Claude 設定を編集：{name}',
        'claude.action.deleteAria': 'Claude 設定を削除：{name}',
        'claude.action.clone': 'クローン',
        'claude.action.cloneAria': 'Claude 設定をクローン：{name}',
        'claude.localBridge.poolTitle': 'ラウンドロビンプール',
        'claude.localBridge.poolHint': '負荷分散に参加するプロバイダを選択',
        'claude.localBridge.noProviders': '利用可能なプロバイダがありません。まずプロバイダを追加してください。',
        'claude.localBridge.disabled': '無効',
        'claude.localBridge.enabled': '有効',

        // OpenClaw config panel
        'openclaw.applyHint': '~/.openclaw/openclaw.json に書き込みます。JSON5 対応。',
        'openclaw.agents.hint': 'Workspace の AGENTS.md を読み書きします。デフォルトパス ~/.openclaw/workspace/AGENTS.md。',
        'openclaw.agents.open': 'AGENTS.md を開く',
        'openclaw.workspaceFile': 'ワークスペースファイル',
        'openclaw.workspace.placeholder': '例: SOUL.md',
        'openclaw.workspace.hint': 'Workspace 内の .md ファイルのみ。',
        'openclaw.workspace.open': 'ワークスペースファイルを開く',
        'openclaw.configured': '設定済み',
        'openclaw.notConfigured': '未設定',
        'openclaw.action.edit': '編集',
        'openclaw.action.delete': '削除',
        'modal.openclaw.quick.subtitle': '3ステップで完了：Provider とモデルを入力、エディタに書き込み、保存して適用。',
        'modal.openclaw.quick.step2': 'エディタに書き込みをクリック',
        'modal.openclaw.structured.writeHint': 'エディタに書き込むと JSON が再配置され、コメントが失われる可能性があります。',
        'openclaw.action.editAria': 'OpenClaw 設定を編集：{name}',
        'openclaw.action.deleteAria': 'OpenClaw 設定を削除：{name}',
    
    },

    en: {
        // Global
        'lang.zh': '中文',
        'lang.en': 'English',
        'lang.label': 'Language',
        'nav.topTabs.aria': 'Navigation',

        // Common
        'common.all': 'All',
        'common.copy': 'Copy',
        'common.paste': 'Paste',
        'common.edit': 'Edit',
        'common.install': 'Install',
        'common.update': 'Update',
        'common.uninstall': 'Uninstall',
        'common.official': 'Official',
        'common.custom': 'Custom',
        'common.rules': 'Rules',
        'common.troubleshooting': 'Troubleshooting',
        'common.command': 'Command',
        'common.mirror': 'Registry',
        'common.packageManager': 'Package manager',
        'common.action': 'Action',
        'common.targets': 'Targets',
        'common.currentPm': 'Package manager',
        'common.currentAction': 'Action',
        'common.mirrorActive': 'Registry',
        'common.defaultOfficial': 'Default',
        'common.cancel': 'Cancel',
        'common.confirm': 'Confirm',
        'common.add': 'Add',
        'common.save': 'Save',
        'common.saveApply': 'Save & apply',
        'common.close': 'Close',
        'common.delete': 'Delete',
        'common.clear': 'Clear',
        'common.show': 'Show',
        'common.hide': 'Hide',
        'common.detail': 'Details',
        'common.refresh': 'Refresh',
        'common.refreshing': 'Refreshing...',
        'common.loading': 'Loading...',
        'common.saving': 'Saving...',
        'common.sending': 'Sending...',
        'common.scanning': 'Scanning...',
        'common.export': 'Export',
        'common.import': 'Import',
        'common.apply': 'Apply',
        'common.applying': 'Applying...',
        'common.confirming': 'Confirming...',
        'common.writeToEditor': 'Write to editor',
        'common.refreshFromText': 'Refresh from text',
        'common.backToEdit': 'Back to edit',
        'common.selectAll': 'Select all',
        'common.unselectAll': 'Unselect all',
        'common.resetFilters': 'Reset filters',
        'common.notEditable': 'Not editable',
        'common.notDeletable': 'Not deletable',
        'common.notLoaded': 'Not loaded',
        'common.exists': 'Exists',
        'common.notExistsWillCreateOnApply': 'Not found. Will be created on apply.',
        'common.notExistsWillCreateOnSave': 'Not found. Will be created on save.',
        'common.none': 'None',
        'cli.missing.title': '{name} CLI not installed',
        'cli.missing.subtitle': 'Install {name} CLI before using this page.',
        'cli.missing.openDocs': 'Open install guide',
        'cli.missing.commandAria': '{name} CLI install command',

        // Brand
        'brand.kicker.workspace': 'Workspace',
        'brand.subtitle.localConfigSessionsWorkspace': 'Local config & sessions workspace',

        // Confirm dialog
        'confirm.aria': 'Confirm action',
        'confirm.title.default': 'Please confirm',
        'confirm.ok': 'Confirm',
        'confirm.cancel': 'Cancel',

        // Shared fields
        'field.name': 'Name',
        'field.configName': 'Config name',
        'field.apiEndpoint': 'API endpoint',
        'field.apiKey': 'API key',
        'field.baseUrl': 'Base URL',
        'field.provider': 'Provider',
        'field.providerName': 'Provider name',
        'field.modelName': 'Model name',
        'field.model': 'Model',
        'field.message': 'Message',
        'field.varName': 'Variable name',
        'field.targetFile': 'Target file',
        'field.modelId': 'Model ID',
        'field.displayName': 'Display name',
        'field.contextAndMaxOutput': 'Context and max output',
        'field.apiType': 'API type',
        'field.env': 'Environment variables',
        'field.allow': 'Allow',
        'field.deny': 'Deny',

        // Shared placeholders/hints
        'placeholder.providerNameExample': 'e.g. myapi',
        'placeholder.apiEndpointExample': 'https://api.example.com/v1',
        'placeholder.providerName': 'Provider name',
        'placeholder.keepUnchanged': 'Leave blank to keep unchanged',
        'hint.keepKeyUnchanged': 'Leave blank to keep current key',
        'placeholder.modelExample': 'e.g. gpt-5',
        'placeholder.configNameExample': 'e.g. My Claude Setup',
        'placeholder.apiKeyExampleClaude': 'sk-ant-...',
        'placeholder.baseUrlExampleClaude': 'https://open.bigmodel.cn/api/anthropic',
        'placeholder.selectProvider': 'Select a provider',

        // Roles / labels
        'role.you': 'You',
        'role.provider': 'Provider',
        'label.model': 'Model:',

        // Top tabs
        'tab.dashboard': 'Dashboard',
        'tab.docs': 'Docs',
        'tab.config': 'Config',
        'tab.config.codex': 'Codex',
        'tab.config.claude': 'Claude',
        'tab.config.openclaw': 'OpenClaw',
        'tab.sessions': 'Sessions',
        'tab.usage': 'Usage',
        'tab.orchestration': 'Tasks',
        'tab.market': 'Skills',
        'tab.plugins': 'Plugins',
        'tab.settings': 'Settings',

        // Side rail section titles
        'side.overview': 'Overview',
        'side.docs': 'Docs',
        'side.config': 'Config',
        'side.sessions': 'Sessions',
        'side.plugins': 'Plugins',
        'side.system': 'System',
        'side.orchestration': 'Tasks',
        'side.skills': 'Skills',

        // Side rail items
        'side.overview.doctor': 'Doctor',
        'side.overview.doctor.meta': 'Overview / Diagnostics',
        'side.docs.cliInstall': 'CLI Install',
        'side.docs.cliInstall.meta': 'Install / Update / Uninstall',
        'side.config.codex': 'Codex',
        'side.config.codex.meta': 'Provider / Model',
        'side.config.claude': 'Claude Code',
        'side.config.claude.meta': 'Claude Settings',
        'side.config.openclaw': 'OpenClaw',
        'side.config.openclaw.meta': 'JSON5 / AGENTS',
        'side.sessions.browser': 'Session Browser',
        'side.sessions.browser.meta': 'Browse / Export / Cleanup',
        'side.plugins.tools': 'Prompt Tools',
        'side.plugins.tools.meta': 'Templates / Variables',
        'side.system.settings': 'Runtime Settings',
        'side.system.settings.meta': 'Data / Backup',

        // Header titles
        'kicker.dashboard': 'Doctor',
        'kicker.config': 'Configuration',
        'kicker.sessions': 'Sessions',
        'kicker.usage': 'Usage',
        'kicker.orchestration': 'Tasks',
        'kicker.market': 'Skills',
        'kicker.plugins': 'Plugins',
        'kicker.docs': 'Docs',
        'kicker.settings': 'Settings',

        'title.dashboard': 'Dashboard / Doctor',
        'title.config': 'Local Configuration Console',
        'title.sessions': 'Sessions & Export',
        'title.usage': 'Local Usage & Trends',
        'title.orchestration': 'Task Orchestration',
        'title.market': 'Skills Install & Sync',
        'title.plugins': 'Plugins & Templates',
        'title.docs': 'CLI Install & Docs',
        'title.settings': 'System & Data Settings',

        'subtitle.dashboard': 'Aggregate status and diagnostics.',
        'subtitle.config': 'Manage local configs and models.',
        'subtitle.sessions': 'Browse and export sessions.',
        'subtitle.usage': 'View usage for the last 7/30 days.',
        'subtitle.orchestration': 'Plan, queue, run, and review local tasks.',
        'subtitle.market': 'Manage local skills.',
        'subtitle.plugins': 'Manage reusable prompt templates and plugins.',
        'subtitle.docs': 'CLI install commands and troubleshooting.',
        'subtitle.settings': 'Manage downloads, directories, and trash.',
        'dashboard.doctor.title': 'Doctor',
        'dashboard.doctor.runChecks': 'Run checks',
        'dashboard.doctor.checking': 'Checking...',
        'dashboard.doctor.export': 'Export report',
        'dashboard.doctor.export.json': 'Export JSON',
        'dashboard.doctor.export.md': 'Export Markdown',
        'dashboard.doctor.open': 'Open',
        'doctor.action.openConfig': 'Open Config',
        'doctor.action.checkProvider': 'Check provider config',
        'doctor.action.openUsage': 'Open Usage',
        'doctor.action.openSessions': 'Open Sessions',
        'doctor.action.openTasks': 'Open Tasks',
        'doctor.action.viewTaskLogs': 'View Tasks / Logs',
        'doctor.action.openSkills': 'Open Skills',
        'doctor.issue.configNotReady.problem': 'Config is not ready',
        'doctor.issue.configNotReady.impact': 'Provider/model cannot be read; model listing and requests may fail.',
        'doctor.issue.providerUnreachable.problem.remote-model-probe-unreachable': 'Provider unreachable',
        'doctor.issue.providerUnreachable.problem.remote-model-probe-auth-failed': 'Provider auth failed',
        'doctor.issue.providerUnreachable.problem.remote-model-probe-not-found': 'Provider endpoint returned 404',
        'doctor.issue.providerUnreachable.problem.remote-model-probe-http-error': 'Provider returned HTTP error',
        'doctor.issue.providerUnreachable.problem.remote-model-probe-error': 'Provider probe failed',
        'doctor.issue.providerUnreachable.problem.unknown': 'Provider unreachable',
        'doctor.issue.providerUnreachable.impactAuth': 'Auth failure will cause model listing and chat requests to return 401/403.',
        'doctor.issue.providerUnreachable.impactNetwork': 'Unreachable provider will cause model listing and chat requests to fail or timeout.',
        'doctor.issue.configHealthFailed.problem': 'Config health check failed',
        'doctor.issue.configHealthFailed.impact': 'Some features may be unavailable or behave unexpectedly.',
        'doctor.issue.usageError.problem': 'Usage aggregation failed',
        'doctor.issue.usageError.impact': 'Usage charts and summaries may be unavailable; Doctor usage diagnostics will be incomplete.',
        'doctor.issue.usageMissingModel.problem': 'Some sessions miss model metadata',
        'doctor.issue.usageMissingModel.impact': 'Usage attribution and cost estimates may be inaccurate.',
        'doctor.issue.tasksError.problem': 'Task overview failed',
        'doctor.issue.tasksError.impact': 'Task queue and run history may be unavailable.',
        'doctor.issue.tasksFailed.problem': 'Failed task runs detected',
        'doctor.issue.tasksFailed.impact': 'Automation pipelines may be blocked; inspect logs and retry after fixing inputs.',
        'doctor.issue.skillsError.problem': 'Skills listing failed',
        'doctor.issue.skillsError.impact': 'Skills marketplace may be unavailable.',
        'doctor.issue.skillsRootMissing.problem': 'Skills directory is missing',
        'doctor.issue.skillsRootMissing.impact': 'Skills install/scan will be empty; create the directory via Settings/Docs.',
        'doctor.issue.skillsMissingFiles.problem': 'Some skills are missing skill.json',
        'doctor.issue.skillsMissingFiles.impact': 'Those skills may not run or sync properly.',
        'dashboard.card.config': 'Config',
        'dashboard.card.sessions': 'Sessions',
        'dashboard.card.usage': 'Usage',
        'dashboard.card.tasks': 'Tasks',
        'dashboard.card.skills': 'Skills',
        'dashboard.kv.model': 'Model',
        'dashboard.kv.issue': 'Issue',
        'dashboard.kv.active': 'Active',
        'dashboard.kv.sessions': 'Sessions',
        'dashboard.kv.missingModel': 'Missing model',
        'dashboard.kv.blockers': 'Blockers',
        'dashboard.kv.runs': 'Runs',
        'dashboard.kv.target': 'Target',
        'dashboard.kv.root': 'Root',
        'dashboard.status.health': 'Health',
        'dashboard.status.busy': 'Busy',
        'dashboard.status.models': 'Models',
        'dashboard.busy.init': 'Init',
        'dashboard.busy.sessions': 'Sessions',
        'dashboard.busy.models': 'Models',
        'dashboard.busy.configApply': 'Apply config',
        'dashboard.busy.agents': 'Saving agents',
        'dashboard.busy.skills': 'Skills',
        'dashboard.busy.tasks': 'Tasks',
        'dashboard.busy.idle': 'Idle',
        'dashboard.message.none': 'No messages',
        'dashboard.sessionSource.codex': 'Codex',
        'dashboard.sessionSource.claude': 'Claude Code',
        'dashboard.sessionSource.gemini': 'Gemini CLI',
        'dashboard.sessionSource.codebuddy': 'CodeBuddy Code',
        'dashboard.sessionSource.all': 'All',
        'dashboard.sessionPath.all': 'All paths',
        'dashboard.sessionQuery.unsupported': 'Unsupported source',
        'dashboard.sessionQuery.unset': 'Not set',
        'dashboard.healthStatus.failRead': 'Failed',
        'dashboard.healthStatus.initializing': 'Initializing',
        'dashboard.healthStatus.ok': 'OK',
        'dashboard.modelStatus.loading': 'Loading',
        'dashboard.modelStatus.error': 'Error',
        'dashboard.modelStatus.ok': 'OK',
        'dashboard.health.ok': 'Checks passed',
        'dashboard.health.fail': 'Checks failed',
        'dashboard.health.issues': '{count} issues',
        'dashboard.issues.title': '{count} actionable issues',
        'dashboard.state.loading': 'Loading',
        'dashboard.state.ready': 'Ready',
        'dashboard.state.idle': 'Idle',
        'dashboard.none': 'None',
        'dashboard.sessions.count': '{count} sessions',
        'dashboard.usage.range': 'Range {value}',
        'dashboard.tasks.queue': 'run {running} / queue {queued}',
        'dashboard.skills.count': 'installed {installed} / import {importable}',
        'dashboard.providersHealth.title': 'Provider Health',
        'dashboard.providersHealth.current': '(current)',
        'dashboard.providersHealth.checking': 'Checking...',
        'dashboard.providersHealth.allOk': 'All providers OK',
        'dashboard.providersHealth.hasIssues': '{count} provider(s) have issues',

        // Plugins panel
        'plugins.sidebar.title': 'Plugins',
        'plugins.sidebar.note': 'Reusable, standardized utilities. Future custom plugins should follow the same structure.',
        'plugins.sidebar.ariaList': 'Plugin list',
        'plugins.main.ariaWorkspace': 'Plugin workspace',
        'plugins.refresh': 'Refresh',
        'plugins.refreshing': 'Refreshing...',
        'plugins.promptTemplates.title': 'Prompt templates',
        'plugins.promptTemplates.subtitle': 'Built-in: comment polish ({{code}}). Copy and paste into Codex/Claude.',
        'plugins.promptTemplates.mode.aria': 'Prompt templates mode',
        'plugins.promptTemplates.mode.compose': 'Compose',
        'plugins.promptTemplates.mode.manage': 'Manage',
        'plugins.promptTemplates.compose.selectTemplate': 'Select template',
        'plugins.promptTemplates.compose.chooseTemplate': 'Choose a template',
        'plugins.promptTemplates.compose.chooseTemplateHint': 'Select a template to start composing.',
        'plugins.promptTemplates.compose.builtinSuffix': ' (built-in)',
        'plugins.promptTemplates.compose.empty': 'No templates available.',
        'plugins.promptTemplates.compose.varsHint': 'Fill and add variables in “Manage”.',
        'plugins.promptTemplates.compose.missingCount': '{count} missing',
        'plugins.promptTemplates.compose.jumpToMissing': 'Jump to missing',
        'plugins.promptTemplates.compose.goManage': 'Manage variables',
        'plugins.promptTemplates.compose.outputTitle': 'Output',
        'plugins.promptTemplates.compose.outputHint': 'Click “Copy” and paste into Codex/Claude.',
        'plugins.promptTemplates.compose.outputAria': 'Rendered prompt',
        'plugins.promptTemplates.compose.copy': 'Copy',
        'plugins.promptTemplates.manage.searchAria': 'Search templates',
        'plugins.promptTemplates.manage.searchPlaceholder': 'Search templates',
        'plugins.promptTemplates.manage.create': 'New',
        'plugins.promptTemplates.manage.export': 'Export',
        'plugins.promptTemplates.manage.import': 'Import',
        'plugins.promptTemplates.manage.loading': 'Loading templates...',
        'plugins.promptTemplates.manage.empty': 'No templates.',
        'plugins.promptTemplates.manage.vars': '{count} vars',
        'plugins.promptTemplates.manage.builtin': 'built-in',
        'plugins.promptTemplates.manage.custom': 'custom',
        'plugins.promptTemplates.manage.newTemplateName': 'New template',
        'plugins.promptTemplates.editor.selectHint': 'Select a template to edit.',
        'plugins.promptTemplates.editor.namePlaceholder': 'Template name',
        'plugins.promptTemplates.editor.nameAria': 'Template name',
        'plugins.promptTemplates.editor.duplicate': 'Duplicate',
        'plugins.promptTemplates.editor.delete': 'Delete',
        'plugins.promptTemplates.editor.save': 'Save',
        'plugins.promptTemplates.editor.builtinReadOnly': 'Built-in templates are read-only (no edit/save/delete/duplicate).',
        'plugins.promptTemplates.editor.descPlaceholder': 'Description (optional)',
        'plugins.promptTemplates.editor.descAria': 'Template description',
        'plugins.promptTemplates.editor.templateLabel': 'Template',
        'plugins.promptTemplates.editor.templateAria': 'Template body',
        'plugins.promptTemplates.editor.templatePlaceholder': 'Write your template here. Use {{var}} placeholders.',
        'plugins.promptTemplates.vars.title': 'Variables',
        'plugins.promptTemplates.vars.hint': 'Detected from the template. Fill them to render the final prompt.',
        'plugins.promptTemplates.vars.reset': 'Reset',
        'plugins.promptTemplates.vars.empty': 'No variables detected.',
        'plugins.promptTemplates.vars.valuePlaceholder': 'Value for {name}',
        'plugins.promptTemplates.preview.title': 'Preview',
        'plugins.promptTemplates.preview.hint': 'Rendered output (missing vars become empty).',
        'plugins.promptTemplates.preview.copy': 'Copy',
        'plugins.promptTemplates.preview.outputAria': 'Rendered prompt',
        'plugins.promptTemplates.noPluginSelected': 'Select a plugin from the left panel first.',

        'plugins.meta.attribution': 'Created by {createdBy} · Maintained by {maintainers}',
        'plugins.meta.createdBy': 'Created by {createdBy}',
        'plugins.meta.maintainedBy': 'Maintained by {maintainers}',

        // Built-in prompt templates
        'plugins.builtin.commentPolish.name': 'Comment polish',
        'plugins.builtin.commentPolish.desc': 'Polish the following code comments {{code}}',
        'plugins.builtin.commentPolish.line1': 'Polish the following code comments',
        'plugins.builtin.ruleAck.name': 'Rule acknowledgement',
        'plugins.builtin.ruleAck.desc': 'Please follow 【{{rule}}】, reply when received',
        'plugins.builtin.ruleAck.line1': 'Please follow 【{{rule}}】, reply when received',

        // Toasts
        'toast.copy.empty': 'Nothing to copy',
        'toast.copy.ok': 'Copied',
        'toast.copy.fail': 'Copy failed',
        'toast.save.ok': 'Saved',
        'toast.save.fail': 'Save failed',
        'toast.delete.ok': 'Deleted',
        'toast.delete.fail': 'Delete failed',
        'toast.export.empty': 'Nothing to export',
        'toast.export.ok': 'Exported',
        'toast.export.fail': 'Export failed',
        'toast.import.ok': 'Imported',
        'toast.import.fail': 'Import failed',
        'toast.import.notAvailable': 'Import is not available',
        'toast.import.readFileFail': 'Failed to read file',
        'toast.import.invalidJson': 'Invalid JSON',
        'toast.import.expectedArray': 'Expected an array',
        'toast.export.notSupported': 'Export not supported',
        'toast.plugins.loadFail': 'Failed to load plugins',
        'toast.templates.builtinNotEditable': 'Built-in templates are not editable',
        'toast.templates.builtinNotModifiable': 'Built-in templates are read-only. Duplicate first.',
        'toast.templates.nameRequired': 'Template name is required',
        'toast.templates.builtinNotDuplicable': 'Built-in templates cannot be duplicated',
        'toast.templates.builtinNotDeletable': 'Built-in templates cannot be deleted',
        'toast.templates.deleteTitle': 'Delete template',
        'toast.templates.deleteMessage': 'Delete “{name}”? This action cannot be undone.',
        'toast.templates.deleteConfirm': 'Delete',
        'toast.templates.deleteCancel': 'Cancel',

        // Basic modals
        'modal.providerAdd.title': 'Add provider',
        'modal.providerEdit.title': 'Edit provider',
        'modal.modelAdd.title': 'Add model',
        'modal.modelManage.title': 'Manage models',
        'modal.claudeConfigAdd.title': 'Add Claude Code config',
        'modal.claudeConfigEdit.title': 'Edit Claude Code config',
        'field.useBuiltinTransform': 'Use built-in transform (OpenAI compatible)',
        'hint.useBuiltinTransform': 'When enabled, base_url points to codexmate built-in transform service; Codex token is fixed to codexmate.',

        // Config template / agents modals
        'modal.configTemplate.title': 'Config template editor (manual confirm)',
        'modal.configTemplate.label': 'config.toml template',
        'modal.configTemplate.placeholder': 'Edit config.toml template here',
        'modal.configTemplate.mode.twoStep': 'Two-step confirm: preview diff, then apply.',
        'modal.configTemplate.mode.oneStep': 'One-step apply: write immediately.',
        'diff.title.configTemplate': 'Diff preview (config.toml)',
        'diff.generating': 'Generating...',
        'diff.failed': 'Failed',
        'diff.noChanges': 'No changes detected',
        'diff.hint.busy': 'Generating diff or applying. Actions are temporarily disabled.',
        'diff.hint.failedBack': 'Diff preview failed. Go back to edit and retry.',
        'diff.hint.noChangesBack': 'No changes detected. Go back to edit or cancel.',
        'diff.hint.previewMode': 'Preview mode. Click “Apply” to write or “Back to edit” to continue.',

        'modal.agents.export': 'Export',
        'modal.agents.copy': 'Copy',
        'modal.agents.title': 'AGENTS.md editor',
        'modal.agents.hint': 'Saved content will be written to the target AGENTS.md (next to config.toml).',
        'modal.agents.targetFile': 'Target file',
        'modal.agents.contentLabel': 'AGENTS.md content',
        'modal.agents.placeholder': 'Edit AGENTS.md here',
        'modal.agents.unsaved.previewModeHint': 'Preview mode: changes are not saved until you click “Apply”.',
        'modal.agents.unsaved.detectedHint': 'Unsaved changes detected: save before closing or applying.',
        'modal.agents.hint.shortcuts': 'Shortcut: Esc (back to edit in preview, close in edit).',
        'modal.agents.hint.twoStepSave': 'Two-step save: “Confirm” to preview diff, then “Apply” to save.',
        'diff.tooLargeSkip': 'Content too large. Line diff preview skipped.',
        'diff.viewHint.preview': 'Preview mode. Click “Apply” to save or “Back to edit” to continue.',
        'diff.viewHint.truncated': 'Preview skipped due to size. Click “Apply” to save or “Back to edit” to continue.',

        // Skills modal
        'modal.skills.title': 'Skills manager',
        'modal.skills.subtitle': 'Manage local skills for the current host.',
        'modal.skills.target.aria': 'Select skills target',
        'modal.skills.rootDir': 'Skills directory ({label})',
        'modal.skills.summary.target': 'Target',
        'modal.skills.summary.total': 'Total',
        'modal.skills.summary.withSkill': 'With SKILL.md',
        'modal.skills.summary.missingSkill': 'Missing SKILL.md',
        'modal.skills.summary.importable': 'Importable',
        'modal.skills.panel.aria': 'Skills manager',
        'modal.skills.local.title': 'Local skills',
        'modal.skills.local.note': 'Search, filter, and bulk delete.',
        'modal.skills.filter.keywordAria': 'Filter by name or description',
        'modal.skills.filter.keywordPlaceholder': 'Search by dir name / display name / description',
        'modal.skills.filter.statusAria': 'Filter by SKILL.md status',
        'modal.skills.filter.status.all': 'All',
        'modal.skills.filter.status.withSkill': 'With SKILL.md',
        'modal.skills.filter.status.missingSkill': 'Missing SKILL.md',
        'modal.skills.selection.stats': '{selected} selected (filtered {filtered} / {total}, selected in filtered {visibleSelected})',
        'modal.skills.empty.local': 'No skills to manage.',
        'modal.skills.empty.filtered': 'No skills match the current filters.',
        'modal.skills.pill.hasSkillFile': 'Has SKILL.md',
        'modal.skills.pill.missingSkillFile': 'Missing SKILL.md',
        'modal.skills.pill.symlink': 'Symlink',
        'modal.skills.pill.dir': 'Directory',
        'modal.skills.import.title': 'Cross-app import',
        'modal.skills.import.note': 'Scan and import into {label}.',
        'modal.skills.import.scan': 'Scan importable',
        'modal.skills.import.stats': '{selected} selected / {total}. With SKILL.md {configured}, missing {missing}.',
        'modal.skills.import.emptyHint': 'No importable skills. Click “Scan importable”.',
        'modal.skills.bulk.title': 'Bulk actions',
        'modal.skills.bulk.note': 'Right side is import selection; left side is local selection.',
        'modal.skills.actions.zipImport': 'Import ZIP',
        'modal.skills.actions.zipImporting': 'Importing ZIP...',
        'modal.skills.actions.exportSelected': 'Export selected',
        'modal.skills.actions.exporting': 'Exporting...',
        'modal.skills.actions.importSelected': 'Import selected',
        'modal.skills.actions.importing': 'Importing...',
        'modal.skills.actions.deleteSelected': 'Delete selected',
        'modal.skills.actions.deleting': 'Deleting...',

        // OpenClaw config modal (quick)
        'placeholder.openclawConfigNameExample': 'e.g. Default',
        'modal.openclaw.loadCurrent': 'Load current config',
        'modal.openclaw.quick.title': 'Quick setup',
        'modal.openclaw.quick.subtitle': '3 steps: fill provider/model, write to editor, save & apply.',
        'modal.openclaw.quick.readFromEditor': 'Read from editor',
        'modal.openclaw.quick.step1': 'Fill provider and model',
        'modal.openclaw.quick.step2': 'Write to editor',
        'modal.openclaw.quick.step3': 'Save & apply',
        'modal.openclaw.quick.providerHint': 'Will be combined as provider/model for the primary model identifier.',
        'modal.openclaw.quick.baseUrlHintDefault': 'Pre-filled from OpenClaw built-in provider defaults. You can edit it directly.',
        'modal.openclaw.quick.baseUrlHintReadonly': 'Detected an external reference. Read-only in quick form; edit in raw editor.',
        'modal.openclaw.quick.apiKeyHintFromAuth': 'Value comes from external auth profile; changes will be written back on save & apply.',
        'modal.openclaw.quick.apiKeyHintReadonly': 'Detected external auth/reference. Read-only in quick form; edit in raw editor or auth config.',
        'modal.openclaw.quick.apiKeyHintKeep': 'Leave blank to keep existing key.',
        'placeholder.apiTypeExample': 'e.g. openai-responses',
        'modal.openclaw.quick.modelTitle': 'Model',
        'placeholder.modelIdExample': 'e.g. gpt-4.1',
        'placeholder.modelNameOptional': 'Leave blank to use model ID',
        'field.contextWindow': 'Context window',
        'field.maxOutput': 'Max output',
        'hint.emptyNoChange': 'Leave blank to keep existing values.',
        'modal.openclaw.quick.optionsTitle': 'Options',
        'modal.openclaw.quick.setPrimary': 'Set as primary model',
        'modal.openclaw.quick.overrideProvider': 'Override provider base settings',
        'modal.openclaw.quick.overrideModels': 'Override model list',
        'modal.openclaw.quick.optionsHint': 'When override is off, only missing fields will be filled.',
        'modal.openclaw.quick.writeToEditor': 'Write to editor',

        // Docs panel
        'docs.title': 'CLI Install',
        'docs.subtitle': 'Install commands for Claude Code / Gemini CLI / CodeBuddy Code / Codex CLI.',
        'docs.section.commands': 'Commands',
        'docs.section.commandsNote': 'Copy and run directly.',
        'docs.section.faq': 'FAQ',
        'docs.section.faqNote': 'Common issues and tips.',
        'docs.command.aria': '{name} command',
        'docs.registryHintPrefix': 'Command will append:',
        'docs.registryHintCustom': 'Enter a full URL (http/https) to append as registry.',
        'docs.registry.tencent': 'Tencent Cloud',
        'docs.meta.bin': 'bin: {bin}',
        'docs.termuxLabel': 'Termux',
        'docs.termuxAria': 'Termux Codex CLI command',
        'docs.rule.1': 'Commands depend on package manager, registry and action.',
        'docs.rule.2': 'Custom registry is used for install/update only.',
        'docs.tip.win.1': 'If PowerShell reports permission errors (EACCES/EPERM), run the install command as Administrator.',
        'docs.tip.win.2': 'If the command is still not found after install, reopen the terminal and run: where codex / where claude / where gemini / where codebuddy.',
        'docs.tip.win.3': 'If your network blocks npm, try switching registry presets (npmmirror / Tencent / Custom).',
        'docs.tip.unix.1': 'If you hit EACCES, fix your global Node directory permissions instead of using sudo npm.',
        'docs.tip.unix.2': 'If the command is not available after install, reopen the terminal and run: which codex / which claude / which gemini / which codebuddy.',
        'docs.tip.unix.3': 'If your network blocks npm, try switching registry presets (npmmirror / Tencent / Custom).',

        // Sessions panel
        'sessions.loading': 'Loading...',
        'sessions.sourceTitle': 'Session Source',
        'sessions.refresh': 'Refresh',
        'sessions.refreshing': 'Refreshing...',
        'sessions.allPaths': 'All paths',
        'sessions.source.codex': 'Codex',
        'sessions.source.claudeCode': 'Claude Code',
        'sessions.source.gemini': 'Gemini CLI',
        'sessions.source.codebuddy': 'CodeBuddy Code',
        'sessions.loadingList': 'Loading sessions...',
        'sessions.empty': 'No sessions found',
        'sessions.unknownTime': 'unknown time',
        'sessions.query.placeholder.enabled': 'Search keywords (Codex/Claude/Gemini/CodeBuddy, e.g. claude code)',
        'sessions.query.placeholder.disabled': 'Keyword search is not available for this source',
        'sessions.pin': 'Pin',
        'sessions.unpin': 'Unpin',
        'sessions.copyResume': 'Copy resume command',
        'sessions.preview.refresh': 'Refresh content',
        'sessions.preview.loading': 'Loading...',
        'sessions.preview.deleteHard': 'Delete permanently',
        'sessions.preview.moveToTrash': 'Move to trash',
        'sessions.preview.deleting': 'Deleting...',
        'sessions.preview.moving': 'Moving...',
        'sessions.preview.export': 'Export',
        'sessions.preview.exporting': 'Exporting...',
        'sessions.preview.convert': 'Create derived',
        'sessions.preview.converting': 'Creating...',
        'sessions.preview.convert.loadedOnly': 'Converted loaded messages only',
        'sessions.preview.importNative': 'Import to Native',
        'sessions.preview.importingNative': 'Importing...',
        'sessions.preview.importNative.unsupported': 'This operation is not supported',
        'sessions.preview.importNative.confirmTitle': 'Overwrite native session file?',
        'sessions.preview.importNative.confirmMessage': 'A native session file already exists. Overwriting will replace the matching session in the target tool native directory.',
        'sessions.preview.importNative.confirmText': 'Overwrite',
        'sessions.preview.importNative.cancelled': 'Import cancelled',
        'sessions.preview.importNative.conflict': 'Native session already exists',
        'sessions.preview.importNative.invalidSource': 'Invalid session source',
        'sessions.preview.importNative.fileNotFound': 'Session file not found',
        'sessions.preview.importNative.nativePathUnavailable': 'Native session path unavailable',
        'sessions.preview.importNative.success': 'Imported to native directory',
        'sessions.preview.importNative.failed': 'Import failed',
        'sessions.preview.importNative.failedWithReason': 'Import to native failed: {reason}',
        'sessions.preview.copyLink': 'Copy link',
        'sessions.preview.loadingBody': 'Loading session content...',
        'sessions.preview.emptyMsgs': 'No messages to display',
        'sessions.preview.rendering': 'Rendering session content...',
        'sessions.preview.rerender': 'Re-render',
        'sessions.preview.preparing': 'Preparing session content...',
        'sessions.preview.clipped': 'Showing the latest {count} messages only.',
        'sessions.preview.shownCount': 'Shown {shown} / {total}',
        'sessions.preview.loadMore': 'Load more (remaining {remain})',
        'sessions.preview.loadingMore': 'Loading older messages...',
        'sessions.timeline.aria': 'Session timeline',
        'sessions.selectHint': 'Select a session on the left first',
        'sessions.role.all': 'All roles',
        'sessions.role.user': 'User only',
        'sessions.role.assistant': 'Assistant only',
        'sessions.role.system': 'System only',
        'sessions.time.all': 'All time',
        'sessions.time.7d': 'Last 7 days',
        'sessions.time.30d': 'Last 30 days',
        'sessions.time.90d': 'Last 90 days',
        'sessions.sort.time': 'Sort: time',
        'sessions.sort.hot': 'Sort: hot',
        'sessions.sort.hotBadge': 'Hot',
        'sessions.filters.copyLink': 'Copy filter link',
        'sessions.filters.urlBuildFail': 'Failed to build link',
        'sessions.filters.source': 'Source',
        'sessions.filters.path': 'Path',
        'sessions.filters.keyword': 'Keyword',
        'sessions.filters.role': 'Role',
        'sessions.filters.time': 'Time',
        'sessions.roleLabel.user': 'User',
        'sessions.roleLabel.system': 'System',
        'sessions.roleLabel.assistant': 'Assistant',

        // Usage panel
        'usage.overview': 'Usage Overview',
        'usage.range.aria': 'Usage time range',
        'usage.range.7d': 'Last 7 days',
        'usage.range.30d': 'Last 30 days',
        'usage.range.all': 'All',
        'usage.compare.toggle': 'Compare previous',
        'usage.compare.prev': 'Prev',
        'usage.compare.delta': 'Delta',
        'usage.refresh': 'Refresh stats',
        'usage.refreshing': 'Refreshing...',
        'usage.loading': 'Loading usage stats...',
        'usage.empty': 'No session data available for usage stats',
        'usage.refreshOverlay': 'Refreshing…',
        'usage.copyTitle': 'Click to copy: {value}',
        'usage.copySuccess': 'Copied: {label}',
        'usage.copyFail': 'Copy failed',
        'usage.copyNone': 'Nothing to copy',
        'usage.daily.title': 'Daily usage',
        'usage.daily.subtitle': 'Daily aggregated tokens and estimated cost (normalized by max values).',
        'usage.daily.note': 'Note: Estimated cost excludes Claude by default; only computed when model pricing and input/output tokens are available.',
        'usage.heatmap.title': 'Activity heatmap',
        'usage.heatmap.subtitle': 'Aggregated by sessions per day; hover to see details.',
        'usage.heatmap.legend.less': 'Less',
        'usage.heatmap.legend.more': 'More',
        'usage.heatmap.tooltip': '{date} · {sessions} sessions · {messages} messages · {tokens} tokens',
        'usage.heatmap.aria': '{date}, {sessions} sessions',
        'usage.hourlyHeatmap.title': '7×24 Activity Heatmap',
        'usage.hourlyHeatmap.subtitle': 'Session distribution by weekday × hour; darker = more active.',
        'usage.hourlyHeatmap.tooltip': '{weekday} {hour}:00 · {sessions} sessions · {messages} messages · {tokens} tokens',
        'usage.hourlyHeatmap.legend.less': 'Less',
        'usage.hourlyHeatmap.legend.more': 'More',
        'usage.legend.tokens': 'Tokens',
        'usage.legend.cost': 'Estimated cost',
        'usage.table.date': 'Date',
        'usage.table.sessions': 'Sessions',
        'usage.table.messages': 'Messages',
        'usage.table.tokens': 'Tokens',
        'usage.table.cost': 'Estimated cost',
        'usage.trend.sessions': 'Session trend',
        'usage.trend.messages': 'Message trend',
        'usage.trend.activeHours': 'Active hours',
        'usage.trend.sources': 'Source insights',
        'usage.legend.codex': 'Codex',
        'usage.legend.claude': 'Claude',
        'usage.trend.sessions.codexTitle': 'Codex {count}',
        'usage.trend.sessions.claudeTitle': 'Claude {count}',
        'usage.trend.messages.barTitle': '{count} messages',
        'usage.hour.title': '{hour}:00 · {count} sessions',
        'usage.source.row': '{sessions} sessions · {messages} messages · avg {avg}',
        'usage.summary.sessions': 'Total sessions',
        'usage.summary.messages': 'Total messages',
        'usage.summary.tokens': 'Total tokens',
        'usage.summary.contextWindow': 'Total context',
        'usage.summary.estimatedCost': 'Estimated cost · {range}',
        'usage.estimatedCost.note.excludesClaudePrefix': 'Excludes Claude. ',
        'usage.estimatedCost.method.configured': 'Estimated using configured pricing',
        'usage.estimatedCost.method.catalog': 'Estimated using public catalog pricing',
        'usage.estimatedCost.method.configuredAndCatalog': 'Estimated using configured + public catalog pricing',
        'usage.estimatedCost.detail.estimate': '{prefix}{method}. Estimate {estimate}. Coverage {covered}/{total} sessions (~{percent}% tokens).',
        'usage.estimatedCost.detail.missing': '{prefix}Missing matching model pricing or token breakdown. Add models.cost or ensure sessions record input/output tokens.',
        'usage.summary.activeDuration': 'Active duration',
        'usage.summary.activeDuration.title': 'Active span {value}',
        'usage.summary.totalDuration': 'Total duration',
        'usage.summary.totalDuration.title': 'Overall span {value}',
        'usage.summary.activeDays': 'Active days',
        'usage.summary.avgMessagesPerSession': 'Avg messages/session',
        'usage.summary.busiestDay': 'Busiest day',
        'usage.summary.busiestHour': 'Peak hour',
        'usage.currentSession.title': 'Current session',
        'usage.currentSession.apiDuration': 'API duration',
        'usage.currentSession.totalDuration': 'Total duration',
        'usage.currentSession.tokens': 'Tokens',
        'usage.range.kicker.all': 'All',
        'usage.range.kicker.30d': 'Last 30 days',
        'usage.range.kicker.7d': 'Last 7 days',
        'usage.copyTokenDay': 'Copied: Tokens ({day})',
        'usage.copyCostDay': 'Copied: Estimated cost ({day})',
        'usage.dayDetail.title': '{day} detail',
        'usage.dayDetail.subtitle': 'Pick a day to inspect its breakdown.',
        'usage.dayDetail.pick': 'Pick a day',
        'usage.dayDetail.empty': 'Pick a day to inspect its breakdown.',
        'usage.dayDetail.clear': 'Clear',
        'usage.dayDetail.topSessions': 'Top sessions',
        'usage.dayDetail.topModels': 'Top models',
        'usage.models.title': 'Models used',
        'usage.models.subtitle': 'Only includes model names present in saved records.',
        'usage.models.kicker': 'Identified {modeled}/{total}',
        'usage.models.count': 'Models',
        'usage.models.coverage': 'Coverage',
        'usage.models.missing': 'Missing model',
        'usage.models.noneTitle': 'No model names found in this range',
        'usage.models.noneBody': 'Scanned {total} sessions, but no recognizable model field was found in raw records.',
        'usage.models.providerOnly': '{count} older sessions only recorded provider.',
        'usage.models.missingNote.providerOnly': '{count} sessions did not record model names and are excluded.',
        'usage.models.missingNote': '{count} sessions are missing model and are excluded.',
        'usage.models.missingListTitle': 'Sessions still missing model',
        'usage.models.chipTitle': '{model} · {sessions} sessions · {messages} messages{tokens}',
        'usage.models.meta': '{sessions} sessions · {messages} messages{tokens}',
        'usage.weekday.title': 'Weekday distribution',
        'usage.paths.title': 'Top paths',
        'usage.paths.empty': 'No path data',
        'usage.paths.count': '{count} hits',
        'usage.paths.meta': '{messages} messages{recent}',
        'usage.paths.recent': ' · last {label}',
        'usage.recent.title': 'Recently active sessions',
        'usage.sessions.empty': 'No session data',
        'usage.sessions.messages': '{count} messages',
        'usage.sessions.topDensity': 'Most messages',

        // Config panel (Codex)
        'config.addProvider': 'Add provider',
        'config.providerTemplate.title': 'Provider presets',
        'config.models': 'Model',
        'config.modelLoading': 'Loading...',
        'config.models.unlimited': 'No model list available. Enter manually.',
        'config.models.error': 'Failed to fetch model list. Enter manually.',
        'config.models.notInList.codex': 'Current model is not in the list. Enter manually or edit the template.',
        'config.models.notInList.other': 'Current model is not in the list. Enter manually.',
        'config.template.editFirst': 'Edit template first, then apply.',
        'config.template.bridgeCodexOnly': '{hint} template is editable in Codex mode only.',
        'config.template.openEditor': 'Open template editor',
        'modal.configTemplate.title': 'Config template editor (manual confirm)',
        'modal.configTemplate.placeholder': 'Edit config.toml template here',
        'config.serviceTier': 'Service tier',
        'config.serviceTier.fast': 'fast (default)',
        'config.serviceTier.standard': 'standard',
        'config.serviceTier.hint': 'Only fast writes {field}.',
        'config.reasoningEffort': 'Reasoning effort',
        'config.reasoningEffort.medium': 'medium (default)',
        'config.reasoningEffort.hint': 'Controls reasoning depth; high is deeper.',
        'config.contextBudget': 'Compaction thresholds',
        'config.reset': 'Reset',
        'config.example': 'e.g. {value}',
        'config.contextWindow.hint': 'Context window limit (default 190000).',
        'config.autoCompact.hint': 'Auto-compaction threshold (default 185000).',
        'config.agents.open': 'Open AGENTS.md',
        'modal.agents.title.default': 'AGENTS.md editor',
        'modal.agents.title.claudeMd': 'CLAUDE.md editor',
        'modal.agents.title.openclaw': 'OpenClaw AGENTS.md editor',
        'modal.agents.hint.default': 'Saved content will be written to AGENTS.md (next to config.toml).',
        'modal.agents.hint.claudeMd': 'Saved content will be written to ~/.claude/CLAUDE.md.',
        'modal.agents.contentLabel.claudeMd': 'CLAUDE.md content',
        'modal.agents.placeholder.claudeMd': 'Edit CLAUDE.md here',
        'modal.agents.hint.openclaw': 'Saved content will be written to OpenClaw workspace AGENTS.md.',
        'modal.agents.title.openclawWorkspaceFile': 'OpenClaw workspace file: {fileName}',
        'modal.agents.hint.openclawWorkspaceFile': 'Saved content will be written to OpenClaw workspace {fileName}.',
        'config.url.unset': 'URL not set',
        'config.model.unset': 'Model not set',
        'config.badge.system': 'System',
        'config.availabilityTest': 'Availability test',
        'config.availabilityTestAria': 'Test availability for {name}',
        'config.health.title': 'Config health check',
        'config.health.run': 'Run check',
        'config.health.running': 'Checking...',
        'config.health.hint': 'Runs availability probes across all providers and refreshes latency badges.',
        'config.health.progress': '{done}/{total} done · {failed} failed',
        'config.health.ok': 'Passed',
        'config.health.fail': 'Failed',
        'config.health.issues': '{count} issues',
        'config.shareCommand': 'Share command',
        'config.shareDisabled': 'Not shareable',
        'config.shareCommand.aria': 'Share import command',
        'config.provider.edit.aria': 'Edit provider: {name}',
        'config.provider.delete.aria': 'Delete provider: {name}',
        'config.provider.clone': 'Clone',
        'config.provider.clone.aria': 'Clone provider: {name}',
        'app.loadingConfig': 'Loading configuration...',
        'common.current': 'Current {value}',
        'common.notSelected': 'Not selected',
        'common.readFromEditor': 'Read from editor',
        'common.writeToEditor': 'Write to editor',
        'sessions.sourceLabel': 'Source: {value}',
        'usage.rangeLabel': 'Range: {value}',
        'sessions.source.all': 'All',
        'usage.range.all': 'All',
        'usage.range.7d.short': 'Last 7 days',
        'usage.range.30d.short': 'Last 30 days',
        'orchestration.queueStats': 'Queue: {running} running · {queued} queued',
        'orchestration.hero.kicker': 'Task orchestration',
        'orchestration.hero.title': 'Turn goals into executable steps',
        'orchestration.hero.subtitle': 'Write a target, preview a plan, then run.',
        'orchestration.draft.reset': 'Reset draft',
        'orchestration.summary.aria': 'Task orchestration summary',
        'orchestration.summary.running': 'Running',
        'orchestration.summary.queued': 'Queued',
        'orchestration.summary.runs': 'Runs',
        'orchestration.step1.title': 'Start with the outcome',
        'orchestration.step1.subtitle': 'Only include what affects execution.',
        'orchestration.templates.title': 'Quick examples',
        'orchestration.templates.reviewFix.label': 'Review fixes + regression',
        'orchestration.templates.reviewFix.target': 'Address current PR review comments and add regression tests',
        'orchestration.templates.reviewFix.notes': 'Avoid unrelated refactors; provide verification results',
        'orchestration.templates.reviewFix.followUps': 'Handle newly added review comments\nUpdate the PR summary',
        'orchestration.templates.planOnly.label': 'Plan only',
        'orchestration.templates.planOnly.target': 'Investigate root cause and propose an execution plan without changing code',
        'orchestration.templates.planOnly.notes': 'Focus on root cause, blast radius, and risk areas',
        'orchestration.templates.workflowBatch.label': 'Workflow batch',
        'orchestration.templates.workflowBatch.target': 'Run a fixed set of checks using workflows and summarize results',
        'orchestration.templates.workflowBatch.workflowIds': 'diagnose-config\nsafe-provider-switch',
        'orchestration.templates.workflowBatch.notes': 'Produce a unified conclusion; avoid repetitive narration',
        'orchestration.fields.target': 'Target',
        'orchestration.fields.target.placeholder': 'e.g. Address PR review comments and add regression tests; avoid unrelated modules',
        'orchestration.fields.target.hint': 'One sentence is enough: outcome, constraints, and acceptance criteria.',
        'orchestration.engine.codex': 'Codex',
        'orchestration.engine.workflow': 'Workflow',
        'orchestration.runMode.write': 'Write',
        'orchestration.runMode.readOnly': 'Read-only',
        'orchestration.runMode.dryRun': 'Dry run',
        'orchestration.pills.hasTitle': 'Title set',
        'orchestration.pills.workflowCount': 'Workflows {count}',
        'orchestration.pills.planNodes': 'Plan {count} nodes',
        'orchestration.step2.title': 'Choose how to run',
        'orchestration.step2.subtitle': 'Common options are visible; the rest lives under Advanced.',
        'orchestration.fields.engine': 'Engine',
        'orchestration.fields.runMode': 'Run mode',
        'orchestration.advanced.title': 'Advanced',
        'orchestration.fields.title': 'Title',
        'orchestration.fields.title.placeholder': 'Optional. Defaults to an inferred title from target.',
        'orchestration.fields.notes': 'Notes',
        'orchestration.fields.notes.placeholder': 'e.g. Do incremental changes only; do not rewrite architecture',
        'orchestration.fields.notes.hint': 'Add boundaries, constraints, style rules, or verification requirements.',
        'orchestration.fields.followUps': 'Follow-ups (one per line)',
        'orchestration.fields.followUps.placeholder': 'e.g.\nAddress new review comments\nAdd regression tests',
        'orchestration.fields.concurrency': 'Concurrency',
        'orchestration.fields.concurrency.hint': 'Start with 1–2 for complex tasks.',
        'orchestration.fields.autoFixRounds': 'Auto-fix',
        'orchestration.fields.autoFixRounds.hint': 'Retry a few rounds after failures.',
        'orchestration.fields.workflowIds': 'Workflow IDs (one per line)',
        'orchestration.fields.workflowIds.placeholder': 'e.g.\ndiagnose-config\nsafe-provider-switch',
        'orchestration.fields.workflowIds.hint': 'Required in Workflow mode. {count} available locally.',
        'orchestration.workflow.stepCount': '{count} steps',
        'orchestration.step3.title': 'Preview, then execute',
        'orchestration.step3.subtitle': 'Confirm the plan, then decide to run now or queue.',
        'orchestration.actions.planning': 'Planning...',
        'orchestration.actions.previewOnly': 'Preview only',
        'orchestration.actions.preparing': 'Preparing...',
        'orchestration.actions.generatePlan': 'Generate plan',
        'orchestration.actions.planAndRun': 'Plan & run',
        'orchestration.actions.processing': 'Working...',
        'orchestration.actions.queueAndStart': 'Queue & start',
        'orchestration.actions.caption': '“Plan & run” refreshes the plan when needed; use “Queue & start” for batch runs.',
        'orchestration.stage.title': 'Workspace opens when there is data',
        'orchestration.stage.subtitle': 'Write the target first, then preview the plan.',
        'orchestration.stage.pill.target': 'Write target',
        'orchestration.stage.pill.preview': 'Preview',
        'orchestration.stage.pill.run': 'Run or queue',
        'orchestration.plan.title': 'Plan preview',
        'orchestration.plan.subtitle': 'Confirm nodes, waves, and dependencies.',
        'orchestration.plan.summary.nodes': 'Nodes',
        'orchestration.plan.summary.waves': 'Waves',
        'orchestration.plan.summary.engine': 'Engine',
        'orchestration.plan.node.write': 'write',
        'orchestration.plan.node.readOnly': 'read-only',
        'orchestration.labels.dependencies': 'Dependencies: ',
        'orchestration.labels.error': 'Error: ',
        'orchestration.workbench.title': 'Workbench',
        'orchestration.workbench.subtitle': 'Only expands when there is data.',
        'orchestration.queue.start': 'Start queue',
        'orchestration.queue.starting': 'Starting...',
        'orchestration.workbench.tabs.aria': 'Workbench views',
        'orchestration.workbench.tabs.queue': 'Queue {count}',
        'orchestration.workbench.tabs.runs': 'Runs {count}',
        'orchestration.workbench.tabs.detail': 'Run detail',
        'orchestration.queue.empty.title': 'No queued tasks',
        'orchestration.queue.empty.subtitle': 'Queue batch tasks first, then start the runner.',
        'orchestration.runs.empty.title': 'No runs yet',
        'orchestration.runs.empty.subtitle': 'Recent runs will appear after execution.',
        'orchestration.detail.refresh': 'Refresh detail',
        'orchestration.detail.retry': 'Retry',
        'orchestration.detail.retrying': 'Retrying...',
        'orchestration.detail.empty.title': 'Select a run to view details',
        'orchestration.detail.empty.subtitle': 'This view shows node statuses, summaries, and logs.',
        'orchestration.detail.summary.status': 'Status',
        'orchestration.detail.summary.duration': 'Duration',
        'orchestration.detail.summary.nodes': 'Nodes',
        'orchestration.detail.summary.summary': 'Summary',
        'orchestration.detail.node.meta': '{id} · attempts {attempts} · auto-fix {autoFix}',
        'skills.localLabel': '{target} / Local skills',
        'skills.counts': '{installed} installed · {importable} importable',

        // Sidebar status labels (compact)
        'status.currentSource': 'Current source',
        'status.sessionCount': 'Sessions',
        'status.range': 'Range',
        'status.totalSessions': 'Total sessions',
        'status.totalMessages': 'Total messages',
        'status.engine': 'Engine',
        'status.concurrency': 'Concurrency',
        'status.running': 'Running',
        'status.queued': 'Queued',
        'status.runs': 'Runs',
        'status.currentTarget': 'Current target',
        'status.localSkills': 'Local skills',
        'status.importable': 'Importable',
        'status.importableDirect': 'Direct importable',
        'status.pm': 'Package manager',
        'status.action': 'Action',
        'status.registry': 'Registry',
        'status.claudeConfig': 'Claude config',
        'status.claudeModel': 'Claude model',
        'status.openclawConfig': 'OpenClaw config',
        'status.workspaceFile': 'Workspace file',
        'status.configMode': 'Config mode',
        'status.currentProvider': 'Current provider',
        'status.currentModel': 'Current model',
        'status.quickSwitchProvider': 'Quick switch provider',
        'side.usage.meta': 'Local stats / Trends',
        'side.orchestration.meta': 'Plan / Queue / Runs',

        // Settings panel
        'settings.tab.general': 'General',
        'settings.tab.data': 'Data',
        'settings.tabs.aria': 'Settings categories',
        'settings.sharePrefix.title': 'Share command prefix',
        'settings.sharePrefix.meta': 'Used as the prefix for “Copy share command” in the Web UI',
        'settings.sharePrefix.label': 'Prefix',
        'settings.sharePrefix.hint': 'Defaults to npm start (project-local). You can switch to global codexmate. This setting is stored in the browser.',
        'settings.claude.title': 'Claude config',
        'settings.claude.meta': 'Backup / import ~/.claude',
        'settings.codex.title': 'Codex config',
        'settings.codex.meta': 'Backup / import ~/.codex',
        'settings.backup.progress': 'Backing up {percent}%',
        'settings.backup.oneClickClaude': 'Backup ~/.claude',
        'settings.backup.importClaude': 'Import ~/.claude backup',
        'settings.backup.oneClickCodex': 'Backup ~/.codex',
        'settings.backup.importCodex': 'Import ~/.codex backup',
        'settings.importing': 'Importing...',

        'settings.deleteBehavior.title': 'Session deletion behavior',
        'settings.deleteBehavior.meta': 'Whether “Delete” moves to trash first',
        'settings.deleteBehavior.toggle': 'Move deleted sessions to trash first',
        'settings.deleteBehavior.hint': 'Enabled by default. If disabled, deleting a session will permanently delete it.',

        'settings.trash.title': 'Trash',
        'settings.trash.meta': 'Deleted sessions (restore / purge)',
        'settings.trash.refresh': 'Refresh',
        'settings.trash.refreshing': 'Refreshing...',
        'settings.trash.clear': 'Empty trash',
        'settings.trash.clearing': 'Clearing...',
        'settings.trash.loading': 'Loading trash...',
        'settings.trash.empty': 'Trash is empty',
        'settings.trash.retry': 'Failed to load trash. Refresh to retry.',
        'settings.trash.restore': 'Restore',
        'settings.trash.restoring': 'Restoring...',
        'settings.trash.purge': 'Purge',
        'settings.trash.purging': 'Deleting...',
        'settings.trash.workspace': 'Workspace',
        'settings.trash.originalFile': 'Original file',
        'settings.trash.loadMore': 'Load more (remaining {count})',
        'settings.trash.retention': 'Auto-purge',
        'settings.trash.retentionMeta': 'Trash entries older than retention days are auto-purged',
        'settings.trash.retentionLabel': 'Retention days',
        'settings.trash.retentionHint': 'Range 1-365 days, default 30. Expired entries are purged on each trash load.',

        'settings.templateConfirm.title': 'Template apply confirmation',
        'settings.templateConfirm.meta': 'Reduce accidental writes',
        'settings.templateConfirm.toggle': 'Preview diffs before apply (Confirm → Apply)',
        'settings.templateConfirm.hint': 'When enabled: show a diff preview first, then confirm writing.',

        'settings.reset.title': 'Config reset',
        'settings.reset.meta': 'Proceed with caution',
        'settings.reset.hint': 'Backs up config.toml, then writes default config.',
        'settings.reset.button': 'Reset config',
        'settings.reset.loading': 'Resetting...',

        // Market (Skills)
        'market.title': 'Skills Overview',
        'market.subtitle': 'Switch target and inspect local skills.',
        'market.refresh': 'Refresh overview',
        'market.refreshing': 'Refreshing...',
        'market.openManager': 'Open Skills manager',
        'market.target.aria': 'Select skills target',
        'market.summary.target': 'Target',
        'market.summary.total': 'Local total',
        'market.summary.configured': 'With SKILL.md',
        'market.summary.missing': 'Missing SKILL.md',
        'market.summary.importable': 'Importable',
        'market.summary.importableDirect': 'Direct importable',
        'market.root.fallback': 'Default path',

        'market.installed.title': 'Installed skills',
        'market.installed.note': 'Showing top 6 only.',
        'market.local.refresh': 'Refresh local',
        'market.local.refreshing': 'Refreshing...',
        'market.local.loading': 'Loading local skills...',
        'market.local.empty': 'No installed skills found.',
        'market.pill.verified': 'Verified',
        'market.pill.missingSkill': 'Missing SKILL.md',

        'market.import.title': 'Import sources',
        'market.import.note': 'Scan and import into {target}.',
        'market.import.scan': 'Scan sources',
        'market.import.scanning': 'Scanning...',
        'market.import.loading': 'Scanning importable skills...',
        'market.import.empty': 'No importable skills found yet.',
        'market.pill.importableDirect': 'Direct import',
        'market.pill.importMissing': 'Missing SKILL.md',

        'market.actions.title': 'Distribution',
        'market.actions.note': 'Actions apply to the current target.',
        'market.action.manage.title': 'Manage local skills',
        'market.action.manage.copy': 'Manage installed skills for {target}',
        'market.action.crossImport.title': 'Cross-app import',
        'market.action.crossImport.copy': 'Import into {target}',
        'market.action.zipImport.title': 'ZIP import',
        'market.action.zipImport.copy': 'Import from ZIP into target',

        'market.help.title': 'How it works',
        'market.help.target.title': 'Target switch',
        'market.help.target.copy': 'Actions write into the {target} directory.',
        'market.help.crossImport.title': 'Cross-app import',
        'market.help.crossImport.copy': 'Import unmanaged skills from other hosts.',
        'market.help.zipImport.title': 'ZIP import',
        'market.help.zipImport.copy': 'Import local skills from a ZIP file.',

        // Claude config panel
        'claude.addProvider': 'Add provider',
        'claude.applyDefault': 'Applies to ~/.claude/settings.json by default.',
        'claude.presetProviders': 'Provider presets',
        'claude.customConfig': 'Custom config',
        'claude.model': 'Model',
        'claude.model.placeholder': 'e.g. claude-3-7-sonnet',
        'claude.model.hint': 'Model changes are saved and applied to the current config automatically.',
        'claude.health.title': 'Config health check',
        'claude.health.run': 'Run check',
        'claude.health.running': 'Checking...',
        'claude.health.hint': 'Runs availability probes for all Claude configs and refreshes the latency badges.',
        'claude.health.progress': '{done}/{total} done · {failed} failed',
        'claude.md.title': 'CLAUDE.md',
        'claude.md.open': 'Open CLAUDE.md',
        'claude.md.hint': 'Read/write ~/.claude/CLAUDE.md.',
        'claude.model.unset': 'Model not set',
        'claude.configured': 'Configured',
        'claude.notConfigured': 'Not configured',
        'claude.action.edit': 'Edit',
        'claude.action.delete': 'Delete',
        'claude.action.shareDisabled': 'Share import command',
        'claude.action.editAria': 'Edit Claude config: {name}',
        'claude.action.deleteAria': 'Delete Claude config: {name}',
        'claude.action.clone': 'Clone',
        'claude.action.cloneAria': 'Clone Claude config: {name}',
        'claude.localBridge.poolTitle': 'Round-robin pool',
        'claude.localBridge.poolHint': 'Select providers for load balancing',
        'claude.localBridge.noProviders': 'No providers available. Add a provider first.',
        'claude.localBridge.disabled': 'Disabled',
        'claude.localBridge.enabled': 'Enabled',

        // OpenClaw config panel
        'openclaw.applyHint': 'Writes to ~/.openclaw/openclaw.json (JSON5 supported).',
        'openclaw.agents.hint': 'Read/write Workspace AGENTS.md. Default: ~/.openclaw/workspace/AGENTS.md.',
        'openclaw.agents.open': 'Open AGENTS.md',
        'openclaw.workspaceFile': 'Workspace file',
        'openclaw.workspace.placeholder': 'e.g. SOUL.md',
        'openclaw.workspace.hint': 'Only .md files inside the Workspace are supported.',
        'openclaw.workspace.open': 'Open workspace file',
        'openclaw.configured': 'Configured',
        'openclaw.notConfigured': 'Not configured',
        'openclaw.action.edit': 'Edit',
        'openclaw.action.delete': 'Delete',
        'modal.openclaw.quick.subtitle': '3 steps: fill provider/model, write to editor, save & apply.',
        'modal.openclaw.quick.step2': 'Write to editor',
        'modal.openclaw.structured.writeHint': 'Writing to editor may reformat JSON and drop comments.',
        'openclaw.action.editAria': 'Edit OpenClaw config: {name}',
        'openclaw.action.deleteAria': 'Delete OpenClaw config: {name}'
    }
});

export { DICT };
export default DICT;
