import { configService } from './config';

// 支持的语言类型
export type LanguageType = 'zh' | 'en';

// 语言文本映射
const translations: Record<LanguageType, Record<string, string>> = {
  zh: {
    // 通用
    save: '保存',
    cancel: '取消',
    saving: '保存中...',
    delete: '删除',
    edit: '编辑',
    rename: '重命名',
    create: '创建',
    clear: '清除',
    show: '显示',
    hide: '隐藏',
    add: '添加',
    user: '用户',
    myAccount: '我的',
    login: '登录',
    inDevelopment: '正在开发中',

    // 设置
    settings: '设置',
    general: '通用',
    model: '模型',
    settingsCustomModel: '自定义模型',
    shortcuts: '快捷键',
    about: '关于',
    aboutVersion: '版本',
    aboutContactEmail: '联系邮箱',
    aboutUserManual: '用户手册',
    aboutUserCommunity: '用户社群',
    aboutServiceTerms: '服务条款',
    aboutExportLogs: '导出日志',
    aboutExportingLogs: '导出中...',
    aboutExportLogsFailed: '导出日志失败',
    aboutExportLogsSuccess: '日志导出成功',
    aboutExportLogsPartial: '日志导出成功（缺失日志已按空文件补齐）',
    testMode: '测试模式',
    theme: '主题',
    appearance: '外观',
    language: '语言',
    light: '浅色',
    dark: '深色',
    system: '跟随系统',
    themeColor: '主题色',
    'theme-name-classic-light': '经典浅色',
    'theme-name-classic-dark': '经典深色',
    'theme-name-dawn': '晨光蓝白',
    'theme-name-daylight': '日光暖白',
    'theme-name-paper': '纸墨素白',
    'theme-name-sakura': '樱花粉白',
    'theme-name-midnight': '午夜深蓝',
    'theme-name-ocean': '深海蓝黑',
    'theme-name-emerald': '翡翠暗绿',
    'theme-name-rose': '玫瑰暗红',
    'theme-name-mocha': '摩卡棕黑',
    'theme-name-sunset': '落日橙黑',
    'theme-name-nord': 'Nord 极光',
    'theme-name-cyber': '赛博霓虹',
    chinese: '中文',
    english: 'English',

    // API设置
    apiKey: 'API Key',
    apiKeyPlaceholder: '输入你的 API Key',
    getApiKey: '获取 API Key',
    visitOfficialSite: '访问官网',
    baseUrl: 'API Base URL',
    baseUrlPlaceholder: '输入 API 基础 URL',
    baseUrlHint1: 'Anthropic 兼容（以硅基流动为例）：',
    baseUrlHintExample1: 'https://api.siliconflow.cn',
    baseUrlHint2: 'OpenAI 兼容（以硅基流动为例）：',
    baseUrlHintExample2: 'https://api.siliconflow.cn/v1',
    currentModel: '当前模型',
    availableModels: '可用模型列表',
    modelSwitchHint: '在聊天界面可以切换使用的模型',

    // 模型提供商设置
    enabled: '已启用',
    disabled: '已禁用',
    providerStatusOn: '已开启',
    providerStatusOff: '未开启',
    providerSettings: '提供商设置',
    modelProviders: '模型提供商',
    addModel: '添加模型',
    editModel: '编辑模型',
    addNewModel: '添加新模型',
    modelName: '模型名称',
    modelId: '模型ID',
    modelNameAndIdRequired: '请填写模型名称和模型ID',
    modelIdExists: '模型ID已存在，请使用不同的ID',
    ollamaModelName: '模型名称',
    ollamaModelNameHint: '输入 Ollama 中已安装的模型名称，如 qwen3:8b、lfm2:latest',
    ollamaModelNamePlaceholder: 'qwen3:8b',
    ollamaDisplayName: '显示名称（可选）',
    ollamaDisplayNameHint: '自定义在列表中显示的名称，留空则使用模型名称',
    ollamaDisplayNamePlaceholder: '我的 Qwen3 模型',
    ollamaModelNameRequired: '请填写模型名称',
    lmStudioModelName: '模型名称',
    lmStudioModelNameHint: '输入 LM Studio 中已加载的模型名称',
    lmStudioModelNamePlaceholder: 'llama-3.1-8b',
    lmStudioDisplayName: '显示名称（可选）',
    lmStudioDisplayNameHint: '自定义在列表中显示的名称，留空则使用模型名称',
    lmStudioDisplayNamePlaceholder: '我的本地模型',
    lmStudioModelNameRequired: '请填写模型名称',
    supportsImageInput: '支持图像输入',
    modelNameHint: '自定义模型在列表中显示的名称',
    modelIdHint: '模型的唯一标识符，将用于 API 调用',
    supportsImageInputHint: '开启后可在对话中发送图片，实际是否支持取决于模型本身',
    contextWindow: '上下文窗口',
    contextWindowHint: '模型一次可处理的最大 token 数量，窗口越大可容纳越多对话历史与文档。较低的窗口大小可能无法体验完整功能，实际支持的窗口大小取决于模型本身。',
    customParams: '自定义参数',
    customParamsHint: '以 JSON 格式填写需要透传给模型的额外参数，如 {"reasoning_effort": "high"}。这些参数将直接传递给模型 API。',
    customParamsInvalidJson: '自定义参数格式不正确，请输入合法的 JSON 对象',
    imageInput: '图像',
    modelSuffixSecure: '（安全）',
    codingPlanSubscriptionBadge: '订阅套餐',
    inputFileLabel: '输入文件',
    imageVisionHint:
      '当前模型未启用图片输入，图片将以文件路径形式发送。若该模型本身支持图片理解，可在模型配置中开启图片输入选项。',
    copied: '已复制',
    copyrightHolder: '网易有道 版权所有',
    noModelsAvailable: '暂无可用模型',
    addFirstModel: '添加第一个模型',
    testConnection: '测试连接',
    connectionTestResult: '连接测试结果',
    testing: '测试中...',
    connectionSuccess: '连接成功',
    connectionFailed: '连接失败',
    noModelsConfigured: '请先添加模型',
    apiFormat: 'API 格式',
    apiFormatNative: 'Anthropic 兼容',
    apiFormatOpenAI: 'OpenAI 兼容',
    apiFormatHint: '请选择 API 协议兼容格式：Anthropic 兼容或 OpenAI 兼容',
    zhipuCodingPlanHint: '启用后使用 GLM Coding Plan 专属 API 端点',
    zhipuCodingPlanEndpointHint: '使用 GLM Coding Plan 时，系统将自动切换到 Coding 专属端点',
    qwenCodingPlanHint: '启用后使用阿里云百炼 Coding Plan 专属 API 端点',
    qwenCodingPlanEndpointHint: '使用 Coding Plan 时，需要配置专属的 API Key（格式：sk-sp-xxxxx）',
    volcengineCodingPlanHint: '启用后使用火山引擎 Coding Plan 专属 API 端点',
    volcengineCodingPlanEndpointHint: '使用 Coding Plan 时，系统将自动切换到 Coding 专属端点',
    moonshotCodingPlanHint: '启用后使用 Moonshot Coding Plan 专属 API 端点',
    moonshotCodingPlanEndpointHint: '使用 Coding Plan 时，系统将自动切换到 Coding 专属端点',
    qianfanCodingPlanHint: '启用后使用百度千帆 Coding Plan 专属 API 端点',
    qianfanCodingPlanEndpointHint: '使用 Coding Plan 时，系统将自动切换到 Coding 专属端点',
    xiaomiCodingPlanHint: '启用后使用小米 Coding Plan 专属 API 端点',
    xiaomiCodingPlanEndpointHint: '使用 Coding Plan 时，系统将自动切换到 Coding 专属端点',
    minimaxOAuthTabApiKey: 'API Key',
    minimaxAuthApiKeyDesc: '使用 API 密钥直接调用',
    minimaxOAuthTabOAuth: 'OAuth',
    minimaxAuthOAuthDesc: '通过 MiniMax Portal OAuth 授权',
    minimaxAuthMethodLabel: '选择鉴权方式',
    minimaxOAuthRegionLabel: '地区',
    minimaxOAuthRegionCN: '中国区 (CN)',
    minimaxOAuthRegionGlobal: '全球 (Global)',
    minimaxOAuthLogin: 'MiniMax OAuth 登录',
    minimaxOAuthLoggingIn: '正在获取授权码...',
    minimaxOAuthCancel: '取消',
    minimaxOAuthStatusPending: '等待授权，请在浏览器中完成登录...',
    minimaxOAuthStatusSuccess: 'OAuth 登录成功',
    minimaxOAuthStatusError: 'OAuth 登录失败',
    minimaxOAuthUserCode: '授权码',
    minimaxOAuthOpenBrowserHint: '已打开浏览器，请在页面中输入授权码并完成登录',
    minimaxOAuthLoggedIn: '已通过 MiniMax OAuth 登录',
    minimaxOAuthRelogin: '重新登录',
    minimaxOAuthLogout: '退出登录',
    minimaxOAuthHint: '通过 MiniMax Portal 完成 OAuth 授权，无需手动填写 API 密钥',
    openaiAuthMethodLabel: '选择鉴权方式',
    openaiAuthApiKeyDesc: '使用 OpenAI API 密钥直接调用',
    openaiAuthOAuthDesc: '使用 ChatGPT 账号订阅额度',
    openaiOAuthTabApiKey: 'API Key',
    openaiOAuthTabOAuth: 'ChatGPT',
    openaiOAuthLogin: '使用 ChatGPT 登录',
    openaiOAuthLoggingIn: '正在打开浏览器...',
    openaiOAuthCancel: '取消',
    openaiOAuthOpenBrowserHint: '已打开浏览器，请完成 ChatGPT 登录授权',
    openaiOAuthStatusPending: '等待授权，请在浏览器中完成登录...',
    openaiOAuthStatusSuccess: 'ChatGPT 登录成功',
    openaiOAuthStatusError: 'ChatGPT 登录失败',
    openaiOAuthLoggedIn: '已通过 ChatGPT 登录',
    openaiOAuthRelogin: '重新登录',
    openaiOAuthLogout: '退出登录',
    openaiOAuthHint: '使用付费 ChatGPT 订阅额度调用 Codex 模型，无需 API Key',
    addCustomProvider: '+ 添加自定义',
    customBadge: '自定义',
    customDisplayName: '显示名称',
    customDisplayNamePlaceholder: '输入自定义名称...',
    deleteCustomProvider: '删除',
    confirmDeleteCustomProvider: '确定删除此自定义模型配置？',
    import: '导入',
    export: '导出',
    importProvidersFailed: '导入失败',
    exportProvidersFailed: '导出失败',
    invalidProvidersFile: '导入文件格式不正确',
    decryptProvidersFailed: '密钥解密失败，请确认文件由当前设备导出',
    decryptProvidersPartial: '部分密钥无法解密，已保留本地密钥或留空，请手动检查',

    // 密码相关
    password: '密码',
    confirmPassword: '确认密码',
    enterPassword: '请输入密码',
    enterPasswordAgain: '请再次输入密码',
    exportPasswordTitle: '设置导出密码',
    importPasswordTitle: '输入导入密码',
    exportPasswordHint: '此密码用于加密你的 API 密钥，导入时需要使用相同的密码',
    importPasswordHint: '请输入导出时设置的密码',
    passwordRequired: '请输入密码',
    passwordMismatch: '两次输入的密码不一致',
    passwordTooShort: '密码长度至少为4位',
    wrongPassword: '密码错误，请检查后重试',

    // 快捷键
    keyboardShortcuts: '键盘快捷键',
    shortcutNotSet: '未设置',
    newChat: '新建任务',
    search: '搜索任务',
    openSettings: '打开设置',
    restartApp: '重新启动',
    sendMessageShortcut: '发送消息',
    shortcutConflict: '快捷键 "{0}" 已被 "{1}" 使用',
    shortcutSearchPlaceholder: '搜索快捷键',
    shortcutScopeHint: '快捷键仅在 LobsterAI 窗口获得焦点时生效；正在编辑输入框时不会触发全局快捷键。',
    shortcutNoResults: '没有匹配的快捷键',
    shortcutClear: '清除快捷键',
    shortcutEditCommand: '更改 {command} 的快捷键',
    shortcutPressShortcut: '按下快捷键',
    shortcutResetAll: '全部恢复默认值',
    shortcutGroupCowork: 'LobsterAI',
    shortcutGroupAgent: 'Agent',
    shortcutGroupNavigation: '导航',
    shortcutGroupSettingsTabs: '设置页',
    shortcutGroupApp: '应用',
    shortcutFocusPrompt: '聚焦输入框',
    shortcutStopCurrentTask: '停止当前任务',
    shortcutToggleArtifacts: '显示/隐藏 Artifacts 面板',
    shortcutOpenCowork: '打开 LobsterAI',
    shortcutOpenScheduledTasks: '打开定时任务',
    shortcutOpenKits: '打开专家套件',
    shortcutOpenSkills: '打开技能',
    shortcutOpenMcp: '打开 MCP 服务',
    shortcutToggleSidebar: '显示/隐藏侧边栏',
    shortcutShowShortcuts: '打开快捷键设置',
    shortcutPreviousAgent: '上一个 Agent',
    shortcutNextAgent: '下一个 Agent',
    shortcutShowCurrentAgentTasks: '查看当前 Agent 任务记录',
    shortcutOpenAgentTaskSlot: '打开当前 Agent 任务 {slot}',
    shortcutOpenSettingsTab: '打开设置：{tab}',
    shortcutDescNewChat: '开始一个新的 LobsterAI 任务',
    shortcutDescFocusPrompt: '跳回 LobsterAI 并聚焦当前输入框',
    shortcutDescStopCurrentTask: '停止正在运行的 Cowork 任务',
    shortcutDescSearch: '搜索并打开历史任务',
    shortcutDescToggleArtifacts: '在当前会话中显示或隐藏预览侧栏',
    shortcutDescSendMessage: '选择输入框里发送消息的按键方式',
    shortcutDescOpenCowork: '切换到 LobsterAI 任务视图',
    shortcutDescOpenScheduledTasks: '切换到定时任务视图',
    shortcutDescOpenKits: '切换到专家套件视图',
    shortcutDescOpenSkills: '切换到技能视图',
    shortcutDescOpenMcp: '切换到 MCP 服务视图',
    shortcutDescToggleSidebar: '收起或展开左侧导航栏',
    shortcutDescSettings: '打开应用设置',
    shortcutDescShowShortcuts: '直接打开设置里的快捷键页',
    shortcutDescPreviousAgent: '切换到左侧列表里的上一个 Agent',
    shortcutDescNextAgent: '切换到左侧列表里的下一个 Agent',
    shortcutDescShowCurrentAgentTasks: '展开当前 Agent 的历史任务记录',
    shortcutDescOpenAgentTaskSlot: '打开当前 Agent 历史任务列表中的第 {slot} 个任务',
    shortcutDescOpenSettingsTab: '切换到设置里的「{tab}」页',
    shortcutAgentTaskSlotUnavailable: '当前 Agent 没有第 {slot} 个任务记录',
    close: '关闭',
    loginNotAvailable: '登录功能暂未开放',
    collapse: '收起',
    expand: '展开',
    featureInDevelopment: '正在开发中',

    // 认证相关
    authDailyQuota: '今日额度',
    authCreditsQuota: '积分额度',
    authTopUp: '充值',
    authSubscribe: '订阅',
    authCurrentPlan: '当前套餐',
    authLogout: '退出登录',
    authLoginRequired: '请先登录后再开始对话。',
    authLoginRequiredBtn: '登录',
    authQuotaExhausted:
      '今日免费额度已用完。您可以登录 LobsterAI Portal 购买套餐或积分包继续使用，或在设置中配置自己的 API Key。',
    authTopUpLink: '充值',
    authSettingsLink: '设置',
    authLoginToChat: '登录后即可开始聊天',
    authFreeLabel: 'Free',
    authCreditsRemaining: '剩余额度',
    authCreditsUnit: '积分',
    authExpiresAt: '有效期至',
    authLearnMore: '了解更多',
    authValueAddedServices: '增值服务',
    authUsageOverview: '用量概览',
    authGoRecharge: '去充值',
    authInviteFriendsForCredits: '邀请好友赚积分',
    authZeroCredits: '0积分',
    planFree: '免费',
    planStandard: '标准',
    planAdvanced: '进阶',
    planPro: '专业',

    // 错误信息
    failedToLoadSettings: '加载设置失败',
    failedToSaveSettings: '保存设置失败',

    // 加载状态
    loading: '加载中...',

    // 侧边栏
    conversations: '对话',
    noConversations: '暂无对话',
    createNewChat: '新建对话',
    deleteConversation: '删除对话',
    renameConversation: '重命名',
    moveToProject: '移至项目',
    pinConversation: '置顶聊天',
    unpinConversation: '取消置顶',
    noProject: '无项目',
    noProjects: '暂无项目',
    confirmDelete: '确认删除',
    confirmDeleteMessage: '确定要删除这个对话吗？此操作不可撤销。',
    searchChats: '搜索聊天',
    searchConversations: '搜索任务...',
    searchRecentTasks: '近期任务',
    searchNoResults: '未找到匹配任务',
    projects: '项目',
    yourChats: '你的聊天',
    createProject: '新项目',
    projectNamePlaceholder: '项目名称',
    projectColorLabel: '颜色',
    projectIconLabel: '图标',
    project: '项目',
    projectHistory: '历史记录',
    projectPrompt: '提示词',
    projectPromptPlaceholder: '为该项目设置提示词',
    projectSettings: '项目设置',
    projectNameLabel: '项目名称',
    deleteProject: '删除项目',
    confirmDeleteProject: '确定要删除这个项目吗？项目内聊天将移回到聊天列表。此操作不可撤销。',
    folderIconDefault: '默认',
    folderIconHealth: '健康',
    folderIconStudy: '学习',
    folderIconMath: '数学',
    folderIconWork: '工作',
    folderIconCode: '代码',
    folderIconIdea: '灵感',

    // 聊天窗口
    sendMessage: '发送消息',
    typeMessage: '询问任何问题...',
    quickPrompt: '询问任何问题',
    regenerateResponse: '重新生成回复',
    copyToClipboard: '复制到剪贴板',
    coworkReEdit: '重新编辑',
    coworkSelectedTextAddToChat: '添加到对话',
    coworkSelectedTextSnippetCount: '{count} 个已选文本片段',
    coworkSelectedTextRemove: '移除文本片段',
    coworkSelectedTextInvalid: '无法添加该文本片段',
    coworkSelectedTextTooLong: '单个文本片段最多 4000 个字符',
    coworkSelectedTextTooMany: '最多添加 8 个文本片段',
    coworkSelectedTextTotalTooLong: '文本片段总长度最多 12000 个字符',
    coworkSelectedTextDuplicate: '该文本片段已经添加',
    coworkSelectedTextSourceUnavailable: '原始消息当前不可见',
    coworkSelectedTextArtifactMarkdownSource: 'Markdown 文件片段',
    coworkSelectedTextArtifactTextSource: '文本文件片段',
    coworkSelectedTextExportHeading: '已选文本片段',
    messageCopied: '消息已复制',
    copyFailed: '复制失败',
    // 代码块搜索面板
    codeSearchFind: '查找',
    codeSearchReplace: '替换',
    codeSearchNext: '下一个',
    codeSearchPrev: '上一个',
    codeSearchAll: '全选',
    codeSearchMatchCase: '区分大小写',
    codeSearchRegexp: '正则',
    codeSearchNoMatch: '无结果',
    codeSearchReplaceOne: '替换',
    codeSearchReplaceAll: '全部替换',
    codeSearchClose: '关闭',
    saveToFile: '保存为文件',
    fileSaved: '文件已保存',
    codeBlockCollapse: '折叠代码',
    codeBlockExpand: '展开代码',
    codeBlockSearch: '搜索代码 (Cmd+F)',
    codeBlockSearchClose: '关闭搜索',
    codeBlockWordWrap: '自动换行',
    codeBlockWordWrapOff: '关闭自动换行',
    codeBlockFullscreen: '放大查看',
    codeBlockFullscreenExit: '退出放大',
    clearConversation: '清空对话',
    confirmClearConversation: '确定要清空当前对话吗？此操作不可撤销。',
    today: '今天',
    yesterday: '昨天',
    daysAgo: '天前',
    justNow: '刚刚',
    minutesAgo: '分钟前',
    hoursAgo: '小时前',
    welcomeMessage: '我能帮你做什么呢？',
    thinking: '思考中...',
    reasoning: '思考过程',
    editMessage: '编辑消息',
    emptyMessage: '空消息',
    artifactOpen: '打开',
    artifactView: '查看',
    artifactViewing: '预览中',
    artifactPreview: '预览',
    artifactCode: '源码',
    artifactNoContent: '无内容',
    artifactSourceLoading: '正在加载源码...',
    artifactSourceLoadFailed: '源码加载失败',
    artifactSourceTruncated: '文件较大，仅显示前 {size}',
    markdownLargePreviewNotice: '内容较大，已显示轻量预览',
    artifactPanelToggle: '预览面板',
    artifactDownload: '下载',
    artifactOpenFolder: '打开文件夹',
    artifactOpenInBrowser: '在浏览器中打开',
    artifactCopyCode: '复制',
    artifactRefresh: '刷新',
    artifactActionsMenu: '更多操作',
    htmlShare: '分享',
    htmlShareScanning: '正在扫描...',
    htmlSharePacking: '正在打包...',
    htmlShareUploading: '正在分享...',
    htmlShareViewHint: '分享链接已生成。',
    htmlShareSuccess: '分享成功',
    htmlShareSuccessMessage: '分享链接已生成，可在此复制访问方式对应的信息。',
    htmlShareFailed: '分享失败',
    htmlShareCreateDialogTitle: '创建分享',
    htmlShareCreateAction: '创建分享',
    htmlShareManageDialogTitle: '分享设置',
    htmlShareExistingShareMessage: '此文件已分享。可复制分享信息，或更新当前分享。',
    htmlShareAccessMode: '访问方式',
    htmlShareAccessModeCode: '分享码',
    htmlShareAccessModeCodeHint: '访问者需要链接和分享码。',
    htmlShareAccessModePublic: '公开访问',
    htmlShareAccessModePublicHint: '知道链接的人无需分享码即可访问。',
    htmlShareCodeViewHint: '当前为分享码访问，访问者需要链接和分享码。',
    htmlSharePublicViewHint: '当前为公开访问，知道链接的人无需分享码即可访问。',
    htmlShareAccessModeUpdateAction: '更新访问方式',
    htmlShareAccessModeUpdating: '正在更新...',
    htmlShareAccessModeUpdateFailed: '访问方式更新失败。',
    htmlShareAccessModeUpdateComplete: '访问方式已更新。',
    htmlShareUpdateFile: '更新文件',
    htmlShareUpdate: '更新',
    htmlShareUpdatingFile: '更新中...',
    htmlShareUpdateComplete: '更新完成',
    htmlShareUpdated: '分享已更新',
    htmlShareUpdatedMessage: '原分享已更新，可在此复制链接和分享码。',
    htmlShareUpdatedClosedMessage: '原分享已更新并关闭。',
    htmlShareLink: '分享链接',
    htmlShareClipboardLinkLabel: '链接',
    htmlShareCode: '分享码',
    htmlShareCopyLink: '复制链接',
    htmlShareCopyLinkAndCode: '复制链接和分享码',
    htmlShareCopyAll: '复制全部',
    htmlShareOpenLink: '打开链接',
    htmlShareUpdateShare: '更新分享',
    htmlShareStopSharing: '停止分享',
    htmlShareStartSharing: '开启分享',
    htmlShareAvailability: '分享开关',
    htmlShareAvailabilityOpenHint: '打开后可通过当前访问方式查看分享。',
    htmlShareAvailabilityClosedHint: '关闭后其他人无法访问。',
    htmlShareCurrentStatus: '当前状态',
    htmlShareStatusLive: '已打开',
    htmlShareStatusDisabled: '已关闭',
    htmlShareStatusFailed: '处理失败',
    htmlShareStatusUpdating: '正在更新...',
    htmlShareStatusUpdateFailed: '分享开关更新失败。',
    htmlShareStoppedNotice: '该分享已停止',
    htmlShareResultStatusDisabled: '分享已关闭',
    htmlShareResultStatusFailed: '处理失败',
    htmlShareCodeUnavailable: '旧分享码无法再次显示。更新分享后会生成新的分享码。',
    htmlShareReopenUnavailable: '此分享无法重新打开。',
    htmlShareActiveLimitReached: '可打开的分享数量已达上限，请先关闭其他分享。',
    htmlShareDisabledCannotUpdate: '分享已关闭，不能更新内容。请先打开分享后再更新。',
    htmlShareLoginRequiredTitle: '登录并订阅后即可分享内容',
    htmlShareLoginRequiredMessage: '分享功能是订阅用户功能。请登录后开通订阅。',
    htmlShareSubscriptionRequiredTitle: '开通订阅后即可分享内容',
    htmlShareSubscriptionRequiredMessage:
      '分享功能需要有效订阅。开通后即可生成分享链接，并可选择分享码或公开访问。',
    htmlShareOpenSubscription: '去订阅',
    htmlShareUnavailableInProduction: '分享功能暂不可用。',
    artifactShareSourceUnavailable: '当前预览没有可分享的文件或内容。',
    artifactShareSvgRejected: 'SVG 包含不安全内容，无法分享。',
    artifactCloseTab: '关闭标签页',
    artifactAddTab: '添加标签页',
    artifactOpenFileTab: '打开文件',
    artifactBrowserTab: '浏览器',
    artifactBrowserBack: '后退',
    artifactBrowserForward: '前进',
    artifactBrowserReload: '刷新',
    artifactBrowserStop: '停止',
    artifactBrowserScreenshot: '截图',
    artifactBrowserScreenshotCopied: '已复制截屏',
    artifactBrowserScreenshotFailed: '截屏失败',
    artifactBrowserAnnotate: '注释',
    artifactBrowserAnnotating: '正在注释',
    artifactBrowserAnnotationInstruction: '悬停选择元素，点击后填写注释',
    artifactBrowserAnnotationPlaceholder: '输入注释内容',
    artifactBrowserAnnotationSend: '发送',
    artifactBrowserAnnotationCancel: '取消',
    artifactBrowserAnnotationLabelTag: '标签',
    artifactBrowserAnnotationLabelSize: '尺寸',
    artifactBrowserAnnotationLabelColor: '颜色',
    artifactBrowserAnnotationLabelFont: '字体',
    artifactBrowserAnnotationPromptTitle:
      '请根据浏览器截图中被蓝色矩形边框高亮的区域处理以下注释：',
    artifactBrowserAnnotationPromptTarget:
      '蓝色矩形框表示用户当前标注的页面元素或区域。请优先分析蓝框内的内容，并结合周围页面上下文判断用户意图。',
    artifactBrowserAnnotationPromptScreenshot: '截图尺寸',
    artifactBrowserAnnotationPromptArea: '标注区域',
    artifactBrowserAnnotationPromptPage: '页面',
    artifactBrowserAnnotationPromptElement: '元素',
    artifactBrowserAnnotationPromptComment: '用户注释',
    artifactBrowserAnnotationImageName: '浏览器注释截图',
    artifactBrowserOpenExternal: '浏览器打开',
    artifactBrowserUrlPlaceholder: '输入 URL',
    artifactBrowserEmpty: '输入 URL 后开始浏览',
    artifactBrowserLocalServices: '本地',
    artifactBrowserLocalServicesRefresh: '刷新本地服务',
    artifactBrowserLocalServicesLoading: '正在扫描本地服务',
    artifactBrowserLocalServicesEmpty: '未发现本地 Web 服务',
    artifactBrowserLocalServiceOnline: '服务在线',
    artifactBrowserMenu: '浏览器菜单',
    artifactBrowserExpandPanel: '展开面板',
    artifactBrowserRestorePanelWidth: '恢复面板宽度',
    artifactBrowserHideInput: '隐藏输入框',
    artifactBrowserShowInput: '显示输入框',
    coworkExpandedConversationPreviewLatest: '最近一条',
    coworkExpandedConversationPreviewMessages: '会话内容',
    coworkExpandedConversationPreviewExpand: '展开会话预览',
    coworkExpandedConversationPreviewCollapse: '收起会话预览',
    coworkExpandedConversationPreviewEmpty: '暂无会话内容',
    coworkExpandedConversationStatusRunning: '执行中',
    artifactBrowserBlankPage: '空白页',
    artifactBrowserShowDeviceToolbar: '显示设备工具栏',
    artifactBrowserHideDeviceToolbar: '隐藏设备工具栏',
    artifactBrowserDeviceSize: '尺寸:',
    artifactBrowserDevicePreset: '设备预设',
    artifactBrowserDeviceResponsive: '响应式',
    artifactBrowserDeviceLaptop: '笔记本电脑',
    artifactBrowserDeviceWidth: '宽度',
    artifactBrowserDeviceHeight: '高度',
    artifactBrowserDeviceRotate: '旋转',
    artifactBrowserDeviceScale: '设备缩放',
    artifactBrowserZoom: '缩放',
    artifactBrowserZoomOut: '缩小',
    artifactBrowserZoomIn: '放大',
    artifactBrowserResetZoom: '重置缩放',
    artifactBrowserClearCookies: '清除 Cookie',
    artifactBrowserClearCache: '清除缓存',
    artifactBrowserCookiesCleared: '已清除 Cookie',
    artifactBrowserCacheCleared: '已清除缓存',
    artifactBrowserClearCookiesFailed: '清除 Cookie 失败',
    artifactBrowserClearCacheFailed: '清除缓存失败',
    artifactNoPreview: '暂无预览',
    artifactImageAlt: '图片',
    artifactFiles: '文件',
    artifactFileList: '文件列表',
    artifactEmptyFiles: '当前会话暂无文件',
    artifactSearchPlaceholder: '搜索文件...',
    artifactSearchEmpty: '没有匹配的文件',
    artifactTypeHtml: '网站',
    artifactTypeSvg: 'SVG 图形',
    artifactTypeImage: '图片',
    artifactTypeVideo: '视频',
    artifactTypeMermaid: 'Mermaid 图表',
    artifactTypeReact: 'React 组件',
    artifactTypeMarkdown: 'Markdown 文档',
    artifactTypeText: '文本文件',
    artifactTypeDocument: '文档',
    artifactOpenWithApp: '使用系统应用打开',
    artifactOpenInFolder: '在文件夹中打开',
    artifactDocumentLoading: '正在加载文档...',
    artifactDocumentError: '文档加载失败',
    artifactVideoLoading: '正在加载视频...',
    artifactVideoError: '视频加载失败',
    artifactSheetTab: '工作表',
    artifactShowingRows: '显示 {shown} / {total} 行',
    artifactResizeColumn: '调整列宽',
    artifactRowCount: '行',
    artifactPdfPageCount: '页',
    artifactSlideCount: '共 {count} 页',
    artifactPptxThumbnailHint: '首页预览，点击右侧按钮打开完整文件',
    artifactSlideLabel: '第 {n} 页',
    artifactSlideNoText: '（无文本内容）',
    artifactTableView: '表格视图',
    artifactTextView: '文本视图',
    imageLimitReached: '最多上传 10 张图片',
    imageReadError: '读取图片失败',
    imageInputNotSupported: '当前模型不支持图像输入',
    localFileNotFound: '文件不存在，可能已被移动或删除',
    localFilePermissionDenied: '没有权限打开该文件',

    // 模型选择
    selectModel: '选择模型',

    // 错误提示
    errorOccurred: '发生错误',
    tryAgain: '请重试',
    networkError: '网络错误',
    apiKeyRequired: '需要设置API密钥',
    configureApiKey: '请在设置中配置您的API密钥',

    // 初始化
    initializationError: '初始化应用程序失败。请检查您的配置。',
    apiKeyNotConfigured: 'API密钥未配置。请在设置中设置您的API密钥。',

    // LobsterAI
    cowork: 'LobsterAI',
    coworkSettings: 'LobsterAI 设置',
    coworkHistory: '任务记录',
    coworkNoSessions: '暂无任务记录',
    coworkNoSessionsHint: '在右侧输入框中开始你的第一个对话',
    coworkPinSession: '置顶任务',
    coworkUnpinSession: '取消置顶',
    coworkSessionActions: '更多操作',
    coworkPlaceholder: '分配一个任务或提问任何问题',
    coworkWorkingDirectory: '工作目录',
    coworkWorkingDirectoryPlaceholder: '输入项目路径',
    coworkWorkingDirectoryHint: 'LobsterAI 将在此目录下执行命令',
    coworkSystemPrompt: '系统提示词',
    coworkSystemPromptPlaceholder: '为 LobsterAI 设置自定义指令...',
    coworkSystemPromptHint: '可选的系统提示词，用于自定义 LobsterAI 的行为',
    coworkModelSettingsRequired: '请先在模型设置中配置可用模型与 API Key。',
    coworkModelSettingsTitle: '模型设置',
    coworkModelSettingsHint: 'LobsterAI 使用模型设置中的当前模型与提供商配置。',
    coworkModelSettingsAction: '前往模型设置',
    modelGroupServer: '套餐模型',
    modelGroupUser: '自定义模型',
    modelSelectorCurrentModel: '当前使用',
    modelSelectorLockedOverlay: '订阅套餐/购买加油包解锁更多模型',
    modelSelectorLockedModelHint: '选择套餐模型前需先登录并订阅或购买加油包',
    modelSelectorLoginTitle: '套餐模型',
    modelSelectorLoginDesc: '登录并订阅或购买加油包后即可使用套餐模型',
    modelSelectorLoginBtn: '去登录',
    modelSelectorSubscribeTitle: '套餐模型',
    modelSelectorSubscribeDesc: '订阅套餐或购买加油包后即可使用更多模型',
    modelSelectorSubscribeBtn: '去购买',
    modelSelectorLearnMore: '了解订阅权益',
    modelSupportsImageInputBadge: '可读图',
    modelSupportsThinkingBadge: '深度思考',
    modelCostMultiplierLabel: '积分消耗倍率：',
    mediaTierSpecLabel: '规格',
    mediaMillionTokensUnit: '1M tokens',
    mediaTokenPricingTextInput: '文本输入',
    mediaTokenPricingImageInput: '图片输入',
    mediaTokenPricingCachedInput: '缓存输入',
    mediaTokenPricingCachedImageInput: '缓存图片输入',
    mediaTokenPricingTextOutput: '文本输出',
    mediaTokenPricingImageOutput: '图片输出',
    mediaTokenPricingThinkingOutput: '思考输出',
    mediaTokenBillingEstimateNote: '按实际 token 扣费，列表价格为默认 1 张输出的预估消耗。',
    modelSelectorNoModels: '请先在设置中配置模型',
    coworkApiConfigTitle: 'API 配置',
    coworkApiConfigHint:
      '支持 Anthropic 兼容与 OpenAI 兼容协议（OpenAI 兼容通过本地转换服务接入）。',
    coworkAgentEngine: 'Agent 引擎',
    coworkAgentEngineOpenClaw: 'OpenClaw（默认）',
    coworkAgentEngineOpenClawHint: '个人 AI 助理',
    openClawRuntimeStatusTitle: '运行状态',
    openClawGatewayAddress: '网关地址',
    openClawStartupProgressLabel: '启动进度',
    openClawStatusBadgeReady: '已就绪',
    openClawStatusBadgeRunning: '运行中',
    openClawStatusBadgeStarting: '启动中',
    openClawStatusBadgeInstalling: '安装中',
    openClawStatusBadgeError: '异常',
    openClawStatusBadgeNotInstalled: '未安装',
    settingsSavedButOpenClawSyncFailed:
      '设置已保存，但应用到 OpenClaw 运行环境失败。请重试保存，或重启 OpenClaw 后再试。',
    openClawSessionKeepAlive: '会话保持时长',
    openClawSessionKeepAliveHint:
      '决定一段对话在连续空闲多久后会被视为新的会话。只要间隔没有超过这个时间，就会继续沿用原来的上下文。设置得更长可以保留更多上下文，但也可能增加 token 消耗。',
    openClawSessionKeepAliveOneDay: '24小时',
    openClawSessionKeepAliveSevenDays: '7天',
    openClawSessionKeepAliveThirtyDays: '30天（推荐）',
    openClawSessionKeepAliveOneYear: '1年',
    coworkAgentEngineClaudeLegacy: 'Cowork',
    coworkAgentEngineClaudeLegacyHint: '内置引擎，开箱即用，推荐作为日常任务主引擎。',
    coworkOpenClawInstall: '启动 OpenClaw',
    coworkOpenClawRetryInstall: '重试启动 OpenClaw',
    coworkOpenClawStart: '启动 OpenClaw',
    coworkOpenClawInstalling: '正在启动 OpenClaw...',
    coworkOpenClawInstallHint: 'OpenClaw 运行时已内置。切换到该引擎或启动任务时会自动拉起网关。',
    coworkOpenClawGoToSettingsInstall: '查看引擎设置',
    coworkOpenClawRestartGateway: '重新启动网关',
    coworkOpenClawNotInstalledNotice:
      '未检测到内置 OpenClaw 运行时（cfmind），请先执行打包前构建脚本。',
    coworkOpenClawReadyNotice: 'OpenClaw 运行时已就绪。开始任务时会自动启动网关。',
    coworkOpenClawStarting: 'AI 引擎正在启动网关...',
    coworkOpenClawRunning: 'OpenClaw 引擎已就绪',
    engineStartingTitle: 'AI 引擎启动中',
    engineStartingSlowHint: '首次启动需要准备运行环境，可能耗时 1-2 分钟，请稍候',
    engineStartingTipLabel: '小提示',
    engineStartingTip1: '让 AI 生成 HTML、SVG 或 Mermaid 图表，右侧面板会实时预览效果',
    engineStartingTip2: '在「技能」中开启 Word、Excel、PPT 技能，AI 可以直接为你生成办公文档',
    engineStartingTip3: '用「定时任务」让 AI 在固定时间自动执行例行工作',
    engineStartingTip4: '接入微信、飞书、钉钉等聊天工具，在 IM 里随时召唤 AI',
    engineStartingTip5: '对 AI 说"记住……"，重要信息会写入长期记忆，下次对话自动生效',
    engineStartingTip6: 'AI 执行敏感操作前会先请求你的确认，可以放心交给它',
    coworkOpenClawError: 'OpenClaw 网关未能在规定时间内启动成功。',
    openClawMaintenanceTitle: '运行维护',
    openClawRepairGatewayStateTitle: '修复启动问题',
    openClawRepairGatewayStateDesc: '备份并重建 OpenClaw 配置，然后重新启动网关。',
    openClawRepairConfirmTitle: '修复 OpenClaw 启动问题？',
    openClawRepairConfirmDesc: '应用会停止当前网关，备份 openclaw.json，重新生成配置并启动网关。',
    openClawRepairConfirmSafeDesc: '不会删除聊天记录、模型配置、技能或工作区文件。',
    openClawRepairConfirmAction: '开始修复',
    openClawRepairRunning: '正在修复...',
    openClawRepairSuccess: '修复已完成，网关已使用重新生成的配置启动。',
    openClawRepairSuccessNoBackup: '未找到旧配置文件，已直接重新生成配置并启动网关。',
    openClawRepairBackupPath: '备份文件',
    openClawRepairFailed: '修复启动问题失败，请重试或手动重启网关。',
    openClawRepairBusyError: '当前仍有 Agent 任务或定时任务在运行，请停止后再修复。',
    openClawRepairConfigApplyPendingError: 'OpenClaw 正在应用配置变更，请稍后再修复。',
    openClawRepairApiUnavailable: '修复接口不可用，请重启应用后再试。',
    openClawDataBackupTitle: '数据备份',
    openClawDataBackupDesc: '备份登录态、任务记录、模型配置、技能、记忆和 OpenClaw 状态，不包含项目工作目录。',
    openClawDataBackupAction: '备份数据',
    openClawDataBackupRunning: '正在备份...',
    openClawDataBackupSuccess: '数据备份已保存。',
    openClawDataBackupFailed: '数据备份失败，请重试。',
    openClawDataBackupSavedTitle: '备份文件已保存',
    openClawDataBackupSize: '大小',
    openClawDataBackupBlockingTitle: '正在备份 LobsterAI 数据',
    openClawDataBackupBlockingDesc: '备份期间应用会暂时锁定，请等待备份完成后再继续操作。',
    openClawDataBackupBlockingWarning: '请不要关闭应用。关闭应用会中断备份，并可能留下不完整的备份文件。',
    openClawDataMigrationTitle: '数据迁移',
    openClawDataMigrationDesc: '导入另一台机器导出的备份，替换当前应用数据。',
    openClawDataMigrationAction: '导入备份',
    openClawDataMigrationRunning: '正在导入...',
    openClawDataMigrationSuccess: '数据迁移已完成。',
    openClawDataMigrationFailed: '数据迁移失败',
    openClawDataMigrationRestarting: '已选择备份文件，应用将重启并导入数据。',
    openClawDataMigrationBlockingTitle: '正在准备导入 LobsterAI 数据',
    openClawDataMigrationBlockingDesc: '导入期间应用会暂时锁定。选择备份文件后，应用会自动重启并完成导入。',
    openClawDataMigrationBlockingWarning: '请不要关闭应用。关闭应用会中断导入准备流程，可能需要重新选择备份文件。',
    openClawDataMigrationConfirmTitle: '导入 LobsterAI 数据备份？',
    openClawDataMigrationConfirmDesc: '导入会替换当前应用数据，包括登录态、会话、配置、技能、记忆和 OpenClaw 状态。',
    openClawDataMigrationConfirmSafeDesc: '应用会先为当前数据生成回滚备份，然后重启并完成导入。项目工作目录不会被导入包覆盖。',
    openClawDataMigrationConfirmAction: '选择备份并导入',
    openClawMaintenanceComingSoon: '即将支持',
    coworkMemoryTitle: '记忆',
    coworkBootstrapIdentityTitle: '助手身份',
    coworkBootstrapIdentityHint: '定义助手是谁，包括名字、角色定位和能力范围。',
    coworkBootstrapUserTitle: '关于你',
    coworkBootstrapUserHint: '关于你自己的信息（姓名、偏好等），助手会记住你。',
    coworkBootstrapSoulTitle: '助手性格',
    coworkBootstrapSoulHint: '助手的性格、语气和行为准则。会强制助手遵循此设定。',
    coworkBootstrapPlaceholder: '支持 Markdown 格式，可用中文或英文书写',
    coworkBootstrapSaveFailed: 'Agent 设定保存失败',
    coworkMemoryEnabled: '启用用户记忆',
    coworkMemoryEnabledHint: 'OpenClaw 会自动索引 MEMORY.md 文件，为 Agent 提供长期记忆检索。',
    coworkMemoryFilePath: '记忆文件路径',
    coworkMemoryLlmJudgeEnabled: '启用 LLM 二级判定',
    coworkMemoryLlmJudgeEnabledHint:
      '仅对规则边界样本调用模型复核，提升准确率（会增加少量 API 调用）。',
    coworkMemoryLegacyNotice: '当前为 OpenClaw 引擎模式。本页功能仅对 Cowork 生效。',
    coworkMemoryAutoWrite: '自动写入记忆',
    coworkMemoryCaptureEachTurn: '启用隐式更新',
    coworkMemoryGuardLevel: '写入门槛',
    coworkMemoryGuardStrict: '严格',
    coworkMemoryGuardStandard: '标准',
    coworkMemoryGuardRelaxed: '宽松',
    coworkMemoryMaxResults: '注入条目上限',
    coworkMemoryMaxResultsHint: '可选范围 1-60，建议 12',
    coworkMemoryMinScore: '最小相关性阈值',
    coworkMemoryMaxInjectChars: '最大注入字符数',
    coworkMemoryRecallInterval: '自动回忆间隔（轮）',
    coworkMemoryRecallIntervalHint: '每 N 轮自动注入一次记忆，建议 3',
    coworkMemoryCrudTitle: '记忆条目管理',
    coworkMemoryManageHint: '你可以在这里查看、搜索、新增、编辑或删除记忆内容。',
    coworkMemoryTotalLabel: '记忆总数',
    coworkMemoryActiveLabel: '生效中',
    coworkMemoryInactiveLabel: '暂不使用',
    coworkMemoryStatusActive: '生效中',
    coworkMemoryStatusInactive: '暂不使用',
    coworkMemoryStatusDeleted: '已删除',
    coworkMemoryUpdatedAt: '最后更新',
    coworkMemoryEditingTag: '正在编辑当前记忆',
    coworkMemoryRebuildIndex: '重建索引',
    coworkMemoryRebuildSuccess: '记忆索引重建完成',
    coworkMemoryRebuildFailed: '记忆索引重建失败',
    coworkMemoryStatsSummary: '已管理条目数',
    coworkMemorySearchPlaceholder: '搜索记忆内容/来源',
    coworkMemoryCategoryAll: '全部分类',
    coworkMemoryEmpty: '暂无记忆条目',
    coworkMemoryCrudTextPlaceholder: '输入要保存的记忆内容',
    coworkMemoryCrudContentLabel: '记忆内容',
    coworkMemoryCrudCreate: '新增条目',
    coworkMemoryCrudUpdate: '更新条目',
    coworkMemoryCrudSaveFailed: '保存记忆条目失败',
    coworkMemoryCrudDeleteFailed: '删除记忆条目失败',
    coworkMemoryAdvancedShow: '显示高级设置',
    coworkMemoryAdvancedHide: '隐藏高级设置',
    coworkMemoryEmbeddingEnabled: '启用 Embedding 语义搜索',
    coworkMemoryEmbeddingEnabledHint: '在词法检索基础上用向量相似度重排结果，提升召回质量',
    coworkMemoryEmbeddingModel: 'Embedding 模型',
    coworkMemoryEmbeddingModelHint:
      '留空使用提供者默认模型。如 OpenAI 默认 text-embedding-3-large，Gemini 默认 gemini-embedding-001',
    coworkMemoryEmbeddingLocalModelPath: '本地模型目录（可选）',
    coworkMemoryEmbeddingLocalModelPathHint: '填写后优先加载本地目录；留空时按模型名加载',
    coworkMemoryEmbeddingAutoDownload: '允许自动下载模型',
    coworkMemoryEmbeddingAutoDownloadHint: '关闭后必须提供本地模型目录',
    coworkMemoryEmbeddingDownload: '下载 / 校验模型',
    coworkMemoryEmbeddingDownloading: '下载中...',
    coworkMemoryEmbeddingDownloadHint:
      '手动触发模型下载（或校验本地模型目录），下载过程可能较慢，请等待进度完成',
    coworkMemoryEmbeddingDownloadSuccess: 'Embedding 模型已就绪',
    coworkMemoryEmbeddingDownloadFailed: 'Embedding 模型下载失败',
    coworkMemoryEmbeddingProgressPreparing: '准备下载任务',
    coworkMemoryEmbeddingProgressInit: '初始化环境',
    coworkMemoryEmbeddingProgressDownload: '下载模型文件',
    coworkMemoryEmbeddingProgressLoad: '加载模型',
    coworkMemoryEmbeddingProgressEncode: '模型预热',
    coworkMemoryEmbeddingProgressDone: '完成',
    coworkMemoryEmbeddingProgressError: '失败',
    coworkMemoryEmbeddingWeight: '语义重排权重',
    coworkMemoryEmbeddingWeightHint: '范围 0-1，值越大越依赖 embedding 相似度，建议 0.62',
    coworkMemoryEmbeddingProvider: 'Embedding 提供者',
    coworkMemoryEmbeddingProviderHint: '选择 embedding 的运行方式',
    coworkMemoryEmbeddingProviderLocal: '本地 (GGUF)',
    coworkMemoryEmbeddingProviderOpenai: 'OpenAI',
    coworkMemoryEmbeddingProviderGemini: 'Gemini',
    coworkMemoryEmbeddingProviderVoyage: 'Voyage',
    coworkMemoryEmbeddingProviderMistral: 'Mistral',
    coworkMemoryEmbeddingProviderOllama: 'Ollama',
    coworkMemoryEmbeddingRemoteBaseUrl: 'API Base URL',
    coworkMemoryEmbeddingRemoteBaseUrlHint:
      '填写到域名/版本号即可，无需包含 /embeddings 路径。例如 https://api.openai.com/v1',
    coworkMemoryEmbeddingRemoteApiKey: 'API Key',
    coworkMemoryEmbeddingRemoteApiKeyHint: '用于远程 embedding 服务的 API 密钥',
    coworkMemoryDreamingEnabled: '启用 Dreaming 记忆整理',
    coworkMemoryDreamingEnabledHint:
      '后台定时运行记忆整合，将高价值条目提升为永久记忆，并生成 Dream Diary',
    coworkMemoryDreamingFrequency: '运行频率',
    coworkMemoryDreamingFrequencyHint: '设置 Dreaming 的定时计划',
    coworkMemoryDreamingFreqNightly3am: '每晚凌晨 3 点',
    coworkMemoryDreamingFreqMidnight: '每晚午夜 12 点',
    coworkMemoryDreamingFreqTwiceDaily: '每天两次（正午和午夜）',
    coworkMemoryDreamingFreqEvery6h: '每 6 小时',
    coworkMemoryDreamingFreqWeekly: '每周日凌晨 3 点',
    coworkMemoryDreamingFreqCustom: '自定义 Cron 表达式',
    coworkMemoryDreamingFreqCustomPlaceholder: '输入 cron 表达式，如 0 3 * * *',
    coworkMemoryDreamingTimezone: '时区',
    coworkMemoryDreamingTimezoneHint: '留空使用本地时区',
    coworkMemoryDreamingModel: 'Dream Diary 模型',
    coworkMemoryDreamingModelHint: '可选，覆盖生成 Dream Diary 的模型，留空使用主模型',
    // Memory tab names
    coworkMemoryTabEntries: '记忆条目管理',
    coworkMemoryTabEmbedding: 'Embedding 语义搜索',
    coworkMemoryTabDreaming: '梦境',
    // Dreaming content display
    coworkDreamingSubTabScene: '场景',
    coworkDreamingSubTabDiary: '日记',
    coworkDreamingSubTabAdvanced: '高级',
    coworkDreamingHeaderTitle: '梦境',
    coworkDreamingHeaderSubtitle: '睡眠时进行记忆巩固。',
    coworkDreamingSwitchOn: '已开启',
    coworkDreamingSwitchOff: '已关闭',
    coworkDreamingInsightBrewing: '正在培育初现的洞见...',
    coworkDreamingInsightMessages:
      '正在重新整理记忆阁楼...，正在轻轻索引这一天...，正在培育出现的洞见...，正在酝酿尚未成形的想法...，正在整合记忆...，正在向向量存储轻声低语...，正在整合记忆...，正在整理知识图谱...，正在重放今天的对话...，正在将短期记忆编织进长期记忆...，正在整理心智宫殿的碎片...，正在归档零散思绪...，正在连接遥远的线索...，正在将旧上下文窗口化作养分...，正在为潜意识按字母排序...，正在提升有希望的直觉...，正在遗忘无关紧要的噪音...',
    coworkDreamingSettingsTitle: '运行设置',
    coworkDreamingContentTitle: '梦境内容',
    coworkDreamingStatusActive: '运行中',
    coworkDreamingStatusIdle: '空闲',
    coworkDreamingPromoted: '已提升',
    coworkDreamingNextSweep: '下次扫描',
    coworkDreamingPhaseLight: '浅睡',
    coworkDreamingPhaseDeep: '深睡',
    coworkDreamingPhaseRem: 'REM',
    coworkDreamingPhaseOff: '关闭',
    coworkDreamingDiaryTitle: '梦境日记',
    coworkDreamingDiaryHint: '系统在回放和整合记忆时写下的原始梦境日记，用于检查记忆系统关注的内容',
    coworkDreamingDiaryEmpty: '还没有梦境日记',
    coworkDreamingDiaryEmptyHint: '启用 Dreaming 后，系统会在后台生成梦境日记',
    coworkDreamingDiaryRefresh: '刷新',
    coworkDreamingDiaryRefreshing: '刷新中...',
    coworkDreamingAdvancedTitle: '每日记忆信号',
    coworkDreamingAdvancedHint: '检视已扎根的回放信号、等待中的短期条目、以及今日已提升的条目',
    coworkDreamingAdvancedGroundedTitle: '已扎根信号',
    coworkDreamingAdvancedGroundedDesc: '来自每日日志回放的短期条目',
    coworkDreamingAdvancedGroundedEmpty: '暂无已扎根信号',
    coworkDreamingAdvancedWaitingTitle: '等待中条目',
    coworkDreamingAdvancedWaitingDesc: '等待提升的短期条目',
    coworkDreamingAdvancedWaitingEmpty: '暂无等待中条目',
    coworkDreamingAdvancedPromotedTitle: '今日已提升',
    coworkDreamingAdvancedPromotedDesc: '最近提升为永久记忆的条目',
    coworkDreamingAdvancedPromotedEmpty: '今日暂无提升',
    coworkDreamingAdvancedSortRecent: '最近',
    coworkDreamingAdvancedSortSignals: '信号',
    coworkDreamingAdvancedOriginLive: '实时',
    coworkDreamingAdvancedOriginDailyLog: '日志回放',
    coworkDreamingAdvancedOriginMixed: '混合',
    coworkDreamingAdvancedSummaryFromDailyLog: '来自日志',
    coworkDreamingAdvancedSummaryWaiting: '等待中',
    coworkDreamingAdvancedSummaryPromotedToday: '今日已提升',
    coworkDreamingLoadError: '加载 Dreaming 数据失败',
    coworkDreamingGatewayUnavailable: '引擎未连接，无法加载 Dreaming 数据',
    coworkConfigSaveFailed: '保存 LobsterAI 配置失败，请稍后重试。',
    coworkApiProviderModel: '从模型设置选择',
    coworkApiProviderModelCustom: '自定义',
    coworkApiProviderModelHint: '仅显示已启用且已配置 API Key/地址的模型',
    coworkApiBaseUrl: 'API 基础地址',
    coworkApiKey: 'API Key',
    coworkApiModel: '模型名称',
    coworkApiKeyRequired: '需要填写 API Key',
    coworkApiBaseUrlRequired: '需要填写 API 地址',
    coworkApiModelRequired: '需要填写模型名称',
    coworkApiBaseUrlInvalid: 'API 地址格式无效',
    coworkApiConfigSaveFailed: '保存 API 配置失败',
    coworkApiConfigLoadFailed: '加载 API 配置失败',
    coworkStatusIdle: '已停止',
    coworkStatusRunning: '运行中',
    coworkStatusCompleted: '已完成',
    coworkStatusError: '错误',
    coworkPermissionRequired: '需要权限确认',
    coworkPermissionDescription: 'LobsterAI 请求执行以下操作',
    coworkSelectionRequired: '请选择',
    coworkSelectionDescription: 'LobsterAI 需要你做出选择',
    coworkToolName: '工具名称',
    coworkToolInput: '工具参数',
    coworkToolResult: '执行结果',
    coworkToolRunning: '执行中',
    coworkContextMaintenanceRunning: '正在整理上下文...',
    coworkToolNoErrorDetail: '执行失败（无详细错误输出）',
    coworkToolOutputLine: '行',
    coworkToolOutputLines: '行',
    coworkToolOutputLineCount: '{count} {unit}输出',
    coworkToolLargeOutput: '大段输出（{size}）',
    coworkTodosTitle: 'Todos',
    coworkTodoItems: '项',
    coworkTodoCompleted: '已完成',
    coworkTodoInProgress: '进行中',
    coworkTodoPending: '待处理',
    coworkTodoUntitled: '未命名待办',
    coworkTodoUnknownStatus: '未知状态',
    subagentWorking: 'Agent 工作中...',
    subagentCompleted: '已完成',
    subTaskRoleUser: '任务指令',
    subTaskRoleTool: '工具调用',
    subTaskNoHistory: '暂无对话记录',
    subTaskMessages: '条消息',
    subTaskToolProcessing: '处理中...',
    subTaskToolDone: '已完成',
    subagentError: '出错',
    subagentUnnamed: '子任务',
    coworkDangerousOperation: '警告：此操作可能会修改文件或执行系统命令，请仔细检查。',
    coworkDestructiveOperation: '高危操作：此命令可能导致不可逆的数据丢失，请务必确认。',
    coworkCautionOperation: '注意：此命令可能会修改文件或系统状态，请仔细检查。',
    dangerReasonRecursiveDelete: '递归删除文件',
    dangerReasonGitForcePush: 'Git 强制推送',
    dangerReasonGitResetHard: 'Git 硬重置',
    dangerReasonDiskOverwrite: '磁盘写入操作',
    dangerReasonDiskFormat: '磁盘格式化',
    dangerReasonFileDelete: '文件删除操作',
    dangerReasonGitPush: 'Git 推送',
    dangerReasonProcessKill: '终止进程',
    dangerReasonPermissionChange: '修改文件权限',
    coworkApprove: '允许',
    coworkDeny: '拒绝',
    coworkConfirmSelection: '提交当前选择',
    coworkDenyRequest: '直接拒绝请求',
    coworkQuestionWizardTitle: '需要您的确认',
    coworkQuestionWizardSkip: '跳过',
    coworkQuestionWizardPrevious: '上一个',
    coworkQuestionWizardNext: '下一个',
    coworkQuestionWizardSubmit: '提交',
    coworkQuestionWizardOther: '其他',
    coworkQuestionWizardOtherPlaceholder: '请输入自定义答案...',
    coworkQuestionWizardSelectAtLeastOne: '请至少选择一个选项',
    coworkQuestionWizardAnswerRequired: '请选择或输入答案',
    coworkWelcome: 'LobsterAI',
    coworkDescription: '7×24 小时帮你干活的全场景个人助理 Agent',
    coworkCurrentAgent: '当前 Agent',
    coworkSelectAgent: '选择 Agent',

    // Multi-Agent 管理
    createAgent: '创建 Agent',
    myAgents: '我的 Agent',
    defaultAgentDisplayName: '主 Agent',
    myAgentSidebarPinned: '置顶',
    myAgentSidebarExpandMore: '展开显示',
    myAgentSidebarCollapse: '折叠显示',
    myAgentSidebarNoAgents: '还没有 Agent',
    myAgentSidebarNoTasks: '暂无任务',
    myAgentSidebarNewTask: '新建任务',
    myAgentSidebarRunning: '运行中',
    myAgentSidebarUnreadResult: '有新结果',
    myAgentSidebarLoadFailed: '加载失败，点击重试',
    myAgentSidebarMinuteShort: '分钟',
    myAgentSidebarHourShort: '小时',
    myAgentSidebarDayShort: '天',
    myAgentSidebarWeekShort: '周',
    myAgentSidebarMonthShort: '月',
    myAgentSidebarYearShort: '年',
    agentPin: '置顶',
    agentUnpin: '取消置顶',
    agentPinFailed: '更新 Agent 置顶失败',
    customCreate: '自定义创建',
    choosePreset: '选择预设',
    agentUseTemplate: '使用模板',
    agentTemplateTitle: 'Agent 模板',
    agentTemplateNew: '新建',
    agentTemplateEmpty: '暂无可用模板',
    agentSettings: 'Agent 设置',
    agentName: '名称',
    agentNamePlaceholder: 'Agent 名称',
    agentAvatarPickerTitle: '选择头像',
    agentAvatarPickerDone: '完成',
    agentAvatarSvgLobster: '龙虾',
    agentAvatarSvgCode: '代码',
    agentAvatarSvgRepair: '修理',
    agentAvatarSvgBriefcase: '公文包',
    agentAvatarSvgShoppingCart: '购物车',
    agentAvatarSvgData: '数据',
    agentAvatarSvgDocument: '文档',
    agentAvatarSvgFolder: '文件夹',
    agentAvatarSvgTag: '标签',
    agentAvatarSvgBrain: '大脑',
    agentAvatarSvgGraduationCap: '博士帽',
    agentAvatarSvgBooks: '书籍',
    agentAvatarSvgExperiment: '实验',
    agentAvatarSvgDiagnosis: '诊断',
    agentAvatarSvgScales: '天平',
    agentAvatarSvgTranslation: '翻译',
    agentAvatarSvgTranslationAlt: '翻译备用',
    agentAvatarSvgCreation: '创作',
    agentAvatarSvgArtboard: '画板',
    agentAvatarSvgMusic: '音乐',
    agentAvatarSvgEntertainment: '娱乐',
    agentAvatarSvgHeadphones: '耳机',
    agentAvatarSvgInspiration: '灵感',
    agentAvatarSvgLightning: '闪电',
    agentAvatarSvgTravel: '旅行',
    agentAvatarSvgFitness: '健身',
    agentAvatarSvgMeditation: '冥想',
    agentAvatarSvgHeart: '爱心',
    agentAvatarSvgPottedPlant: '盆栽',
    agentAvatarSvgPet: '萌宠',
    agentAvatarColorInk: '白色',
    agentAvatarColorCoral: '珊瑚红',
    agentAvatarColorOrange: '橙色',
    agentAvatarColorAmber: '黄色',
    agentAvatarColorGreen: '绿色',
    agentAvatarColorBlue: '蓝色',
    agentAvatarColorViolet: '紫色',
    agentAvatarColorPink: '粉色',
    agentAvatarGlyphFolder: '通用项目',
    agentAvatarGlyphFinance: '金融',
    agentAvatarGlyphBook: '知识',
    agentAvatarGlyphEducation: '教育',
    agentAvatarGlyphWriting: '写作',
    agentAvatarGlyphDesign: '设计',
    agentAvatarGlyphCode: '编程',
    agentAvatarGlyphTerminal: '终端',
    agentAvatarGlyphMusic: '音乐',
    agentAvatarGlyphMedia: '媒体',
    agentAvatarGlyphArt: '艺术',
    agentAvatarGlyphOperations: '运营',
    agentAvatarGlyphResearch: '研究',
    agentAvatarGlyphAutomation: '自动化',
    agentAvatarGlyphGrowth: '增长',
    agentAvatarGlyphBusiness: '商务',
    agentAvatarGlyphAnalytics: '数据分析',
    agentAvatarGlyphSupport: '协作支持',
    agentAvatarGlyphTraining: '训练',
    agentAvatarGlyphNotes: '笔记',
    agentAvatarGlyphLegal: '法律',
    agentAvatarGlyphVoice: '语音',
    agentAvatarGlyphTravel: '出行',
    agentAvatarGlyphGlobal: '全球化',
    agentAvatarGlyphTools: '工具',
    agentAvatarGlyphScience: '科学',
    agentAvatarGlyphMemory: '记忆',
    agentAvatarGlyphCare: '关怀',
    agentAvatarGlyphGift: '礼物',
    agentAvatarGlyphLaunch: '启动',
    agentDescription: '描述',
    agentDescriptionPlaceholder: '简短描述',
    agentIdentity: '身份',
    agentIdentityPlaceholder: '身份描述（IDENTITY.md）...',
    agentDefaultModel: 'Agent 默认模型',
    agentDefaultWorkingDirectory: 'Agent 默认工作目录',
    agentDefaultWorkingDirectoryHint: '新建会话默认在此目录执行',
    agentModelInvalidHint: '当前模型已不可用，请重新选择',
    agentSystemPromptPlaceholder:
      '定义这个 Agent 的角色、工作方式和回答风格，例如：你是专业的办公文档助理，擅长起草报告、润色邮件、整理表格要点，并保持格式清晰。',
    agentSkills: '技能',
    agentSkillsHint: '选择该 Agent 可使用的技能。不选则使用所有已启用技能。',
    agentSkillsSearch: '搜索技能...',
    agentSkillsNoInstalled: '暂无已启用技能',
    agentSkillsNoMatches: '没有匹配的技能',
    agentSkillsNone: '点击选择技能',
    agentsSubtitle: '为您的智能体提供专属人设与技能组合',
    presetAgents: '预设 Agent',
    myCustomAgents: '我创建的 Agent',
    createNewAgent: '新建 Agent',
    addAgent: '添加',
    agentTabPrompt: '提示词',
    agentTabBasic: '基础信息',
    agentTabSkills: '技能',
    agentTabIM: 'IM 渠道',
    agentIMConfigured: '已配置',
    agentIMNotConfigured: '未配置',
    agentIMNotConfiguredHint: '请先在 设置 > IM 机器人 中配置',
    agentIMBound: '已绑定',
    agentIMBoundToOther: '→ {agent}',
    agentIMBindHint: '选择此 Agent 响应的 IM 渠道',
    agentCreateFailed: '创建 Agent 失败',
    agentSaveFailed: '保存 Agent 设置失败',
    agentDeleteFailed: '删除 Agent 失败',
    agentDefaultCannotDelete: '主 Agent 不能删除',
    agentDeleteConfirmTitle: '确认删除 Agent',
    agentDeleteConfirmMessage: '确定要删除 Agent「{name}」及其任务记录吗？此操作不可撤销。',
    agentUnsavedTitle: '未保存的更改',
    agentUnsavedMessage: '离开后，当前 Agent 设置中的修改将丢失。',
    agentUnsavedStay: '继续编辑',
    agentUnsavedDiscard: '放弃更改',
    discard: '放弃',
    noPresetsAvailable: '所有预设已添加',
    creating: '创建中...',

    coworkNewSession: '新会话',
    coworkDefaultSessionTitle: '新对话',
    coworkContinuePlaceholder: '继续对话...',
    coworkRemoteManagedPlaceholder: '该会话由 IM 通道创建，请在对应的 IM 平台操作',
    aiGeneratedDisclaimer: '内容由 AI 生成，仅供参考',
    updateAvailablePill: '有新版本',
    updateAvailableTitle: '检测到新版本',
    updateAvailableMessage: '检测到新版本，请前往官网下载并覆盖安装。',
    updateAvailableConfirm: '立即更新',
    updateAvailableCancel: '取消',
    updateOpenFailed: '打开下载页面失败',
    updateDownloading: '正在下载更新...',
    updateDownloadingBackground: '正在后台下载更新...',
    updateDownloadingPill: '正在下载',
    updateDownloadCancel: '取消下载',
    updateReadyTitle: '检测到新版本',
    updateReadyConfirm: '立即更新',
    updateReadyLater: '稍后',
    updateReadyPill: '有新版本',
    updateErrorPill: '更新失败',
    updateInstalling: '正在安装更新，请稍候...',
    updateDownloadFailed: '下载失败',
    updateInstallFailed: '安装失败',
    updateInstallIncomplete: '上次更新未完成，请重新安装',
    updateRetry: '重试',
    checkForUpdate: '检查更新',
    updateChecking: '检查中...',
    updateUpToDate: '已是最新版本',
    updateCheckFailed: '检查失败',
    coworkStartingSession: '正在启动会话...',
    coworkPreparingEnvironment: '准备环境中，请稍候',
    coworkAddFile: '添加文件',
    voiceInput: '语音输入',
    voiceInputStopRecording: '停止录音并识别',
    voiceInputRecognizing: '正在识别语音',
    voiceInputLoginRequired: '登录后可使用语音输入',
    voiceInputLoginTitle: '语音输入需要登录',
    voiceInputLoginDesc: '该功能仅登录后可使用，请先登录后再使用语音输入。',
    voiceInputFailed: '语音输入失败，请稍后重试',
    voiceInputMicrophoneDenied: '无法访问麦克风，请检查系统麦克风权限',
    voiceInputMicrophoneUnavailable: '未检测到可用麦克风',
    voiceInputNoAudioCaptured: '未录到有效音频，请重试',
    voiceInputAudioInvalid: '录音格式不符合要求，请重试',
    voiceInputAudioTooLarge: '录音文件过大，请缩短录音后重试',
    voiceInputAudioTooLong: '单次语音输入最长 60 秒',
    voiceInputDailyLimitExceeded: '今日语音输入额度已用完，明天可继续使用',
    voiceInputRateLimited: '语音识别服务繁忙，请稍后重试',
    voiceInputRecognitionFailed: '未识别到有效语音，请重试',
    voiceInputServiceUnavailable: '语音识别服务暂不可用，请稍后重试',
    voiceInputRecognitionMode: '语音输入模式',
    voiceInputRecognitionModeDescription: '选择语音输入的识别方式，实时识别会边说边转换文字',
    voiceInputRecognitionModeRealtime: '实时识别',
    voiceInputRecognitionModeShort: '一次性录入',
    coworkDropFileHint: '拖拽文件到此处，或直接粘贴文件',
    coworkAddImage: '添加图片',
    coworkInputFileLabel: '输入文件',
    coworkAttachmentRemove: '移除',
    coworkShareSession: '分享',
    coworkExportImageInProgress: '正在导出图片...',
    coworkExportImageSuccess: '图片导出成功',
    coworkExportImageFailed: '导出图片失败',
    coworkExportAs: '导出为',
    coworkExportImage: '图片',
    coworkExportImageDesc: '保存为 PNG 截图',
    coworkExportMarkdown: 'Markdown',
    coworkExportMarkdownDesc: '适合阅读和二次编辑',
    coworkExportJSON: 'JSON',
    coworkExportJSONDesc: '结构化数据，方便程序处理',
    coworkExportTextSuccess: '导出成功',
    coworkExportTextFailed: '导出失败',
    coworkExportCreatedAt: '创建时间',
    deleteSession: '删除',
    turnIndex: '对话索引',
    deleteTaskConfirmTitle: '确认删除任务',
    deleteTaskConfirmMessage: '此操作无法撤销，任务的所有消息记录将被永久删除。',
    batchOperations: '批量操作',
    batchSelectAll: '全选',
    batchDelete: '删除',
    batchCancel: '取消',
    batchSelectionScope: '{agent} · 已选 {count} 个',
    batchDeleteConfirmTitle: '确认批量删除',
    batchDeleteConfirmMessage: '确定要删除选中的 {count} 个任务吗？此操作不可撤销。',
    coworkForkSession: '分叉会话',
    coworkForkConfirmTitle: '从当前会话创建分支？',
    coworkForkConfirmMessage: '这会复制当前会话历史，并创建一个新的任务继续探索。',
    coworkForkFileStateWarning:
      '当前文件和工作树状态会保持不变，不会回滚到早期消息当时。如果后续轮次改过文件，新分支上下文可能与当前磁盘内容不一致。',
    coworkForkToLocal: '派生到本地',
    coworkForkFromMessage: '从此处分叉',
    coworkForkCreated: '已创建分叉会话',
    coworkForkFailed: '分叉会话失败',
    coworkForkRunningBlocked: '请先停止当前任务，再创建分叉。',
    back: '返回',
    browse: '浏览',
    addFolder: '添加文件夹',
    recentFolders: '最近使用',
    noFolderSelected: '未选择文件夹',
    coworkSelectFolderFirst: '请选择任务目录后再提交',
    noRecentFolders: '暂无最近文件夹',
    folderDriveRootNotAllowed:
      '不支持使用磁盘根目录作为工作目录，请选择一个子文件夹（例如 D:\\Projects）。',
    coworkOpenFolder: '打开文件夹',
    coworkSessionStillRunning: '当前任务仍在运行，请等待完成后继续。',
    coworkImageAttachmentTooLarge: '单张图片 {name} 大小超过 {limit}，请压缩后再发送。',
    coworkImageAttachmentPreviewFailed: '无法生成图片 {name} 的预览，请压缩后再发送。',
    coworkImageAttachmentOriginalMissing: '无法重新编辑该图片消息：原始图片文件不存在或不可读取。',
    coworkContextUsageUnknown: '上下文使用量暂不可用',
    coworkContextUsagePercent: '上下文：{percent}% 已用',
    coworkContextUsageTokens: '已用 {used} tokens，共 {total}',
    coworkContextUsageCompactHint: '点击可压缩上下文',
    coworkContextCompactAction: '压缩上下文',
    coworkContextCompactConfirmTitle: '压缩上下文',
    coworkContextCompactConfirm: '确定要压缩当前会话上下文吗？',
    coworkContextCompactConfirmAction: '开始压缩',
    coworkContextCompactConfirmActionShort: '压缩',
    coworkContextCompactBlockedRunning: '当前任务仍在运行，完成后再压缩上下文。',
    coworkContextCompacting: '上下文压缩中',
    coworkContextCompactingSendBlocked: '正在压缩上下文，请稍后继续。',
    coworkContextAutoCompacted: '上下文压缩已完成',
    coworkContextManualCompacted: '上下文压缩已完成',
    coworkContextManualCompactNoop: '当前上下文无需压缩',
    coworkContextCompactionRunning: '上下文压缩中',
    coworkContextCompactionCompleted: '上下文压缩已完成',
    coworkContextCompactionRetrying: '上下文压缩已完成，正在继续任务',
    coworkContextCompactionFailed: '上下文压缩未完成',

    // Cowork 错误消息
    coworkErrorAuthInvalid: 'API 密钥无效或已过期，请在设置中检查并更新您的 API 密钥。',
    coworkErrorFreeQuotaExhausted:
      '当前模型的免费额度已用完，升级套餐后可继续使用。\n\n[立即升级](https://lobsterai.youdao.com/portal)',
    coworkErrorInsufficientBalance: 'API 余额不足，请充值后重试。',
    coworkErrorInputTooLong: '输入内容过长，超出模型上下文限制，请缩短对话内容后重试。',
    coworkErrorMessageTooLarge:
      '本次消息过大，请减少附件、压缩图片或拆分提交。（单次整体需小于 30MB）',
    coworkErrorCouldNotProcessPdf: '无法处理 PDF 文件。请尝试将 PDF 转换为文本格式后重新发送。',
    coworkErrorModelNotFound: '请求的模型不存在或不可用，请在设置中检查模型配置。',
    coworkGatewaySessionSyncTimeout: 'OpenClaw 引擎响应缓慢，消息尚未发送。请等待 1~2 分钟后重新发送；若频繁出现，请检查系统内存与磁盘占用，并将 LobsterAI 加入杀毒软件白名单。',
    coworkErrorGatewayDisconnected: 'AI 引擎连接中断，请重试。如果问题持续，请尝试重启应用。',
    coworkErrorServiceRestart: 'AI 引擎正在重启，请稍后重试。',
    coworkErrorGatewayDraining: 'AI 引擎正在重启中，请稍等片刻后重试。',
    coworkErrorNetworkError: '网络连接失败，请检查网络设置后重试。',
    coworkErrorRateLimit: '请求过于频繁，请稍后再试。',
    coworkErrorContentFiltered: '内容未通过安全审核，请修改后重试。',
    coworkErrorServerError: '服务端出现错误，请稍后重试。',
    coworkErrorSessionStartFailed: '会话启动失败：{error}',
    coworkErrorSessionContinueFailed: '发送消息失败：{error}',
    coworkModelSwitchFailed: '模型切换失败，请稍后重试。',
    coworkErrorEngineNotReady: 'AI 引擎正在启动中，请稍等几秒后重试。',
    coworkErrorUnknown: '任务执行出错，请重试。如果问题持续出现，请检查模型配置。',

    // Media Generation
    mediaGeneration: '媒体生成',
    mediaImage: '图片',
    mediaVideo: '视频',
    mediaAuto: '自动',
    mediaNone: '无',
    mediaModelPicker: '选择生成模型',
    mediaImageModels: '图片模型',
    mediaVideoModels: '视频模型',
    mediaQuotaExhausted: '积分不足',
    mediaSubscriptionRequired: '媒体生成为订阅会员专属权益',
    mediaDailyLimitReached: '今日额度已用完，将于明天重置',
    mediaCycleLimitReached: '本周期额度已用完，将于下个订阅周期重置',
    mediaNoModels: '暂无可用模型',
    mediaLoadingModels: '加载模型中...',
    mediaLoginTitle: '图片/视频生成服务',
    mediaLoginDesc: '付费用户的专属权益，登录并订阅或购买加油包即可使用',
    mediaLoginBtn: '去登录',
    mediaSubscribeTitle: '图片/视频生成服务',
    mediaSubscribeDesc: '付费用户的专属权益，订阅或购买加油包即可使用',
    mediaSubscribeBtn: '去购买',
    mediaLearnMore: '了解订阅权益',
    mediaGenerating: '生成中...',
    mediaGeneratingVideo: '视频生成中...',
    mediaGeneratingImage: '图片生成中...',
    mediaGenerationComplete: '生成完成',
    mediaVideoGeneratedPath: '视频已生成：',
    mediaPollingCount: '已查询 {count} 次',
    mediaTaskCancel: '取消',
    mediaStatusQueryCount: '状态查询第{count}次',

    // Skills
    skills: '技能',
    useSkill: '使用技能',
    searchSkills: '搜索技能',
    manageSkills: '管理技能',
    officialSkills: '官方技能',
    addSkill: '添加',
    addSkillSecurityTip: '添加第三方技能前请确认其安全性',
    uploadSkillZip: '上传 .zip',
    uploadSkillFolder: '上传文件夹',
    remoteImport: '远程导入',
    remoteImportTitle: '远程导入',
    createSkillByChat: '通过对话创建',
    skillCreatorPrompt:
      '使用你的skill-creator技能，来创建一个技能。首先，请询问我这个技能需要干什么。',
    skillCreatorNotInstalled: '请先安装 skill-creator 技能',
    skillCreatorNotEnabled: '请先启用 skill-creator 技能',
    githubTabLabel: 'GitHub',
    githubImportDescription: '支持仓库链接与子目录链接；若仓库内有多个技能，将自动全部导入。',
    githubImportUrlLabel: 'URL',
    githubSkillPlaceholder: '例如：owner/repo 或 GitHub tree/blob 链接',
    githubImportExamples:
      '示例：owner/repo；https://github.com/owner/repo/tree/main/SKILLs/my-skill',
    clawhubTabLabel: 'ClawHub',
    clawhubImportDescription: '粘贴 clawhub.ai 的技能页面链接，将自动安装对应技能。',
    clawhubImportUrlLabel: 'ClawHub URL',
    clawhubSkillPlaceholder: '例如：https://clawhub.ai/skills/owner/skill-name',
    clawhubImportExamples: '示例：https://clawhub.ai/skills/owner/skill-name',
    importSourceMismatchClawhub: '请输入 clawhub.ai 的链接，或切换到 GitHub 标签页导入。',
    importSourceMismatchGithub:
      '请输入 GitHub 链接或 owner/repo 格式，或切换到 ClawHub 标签页导入。',
    importSkill: '导入',
    importingSkill: '导入中...',
    skillImportSuccess: '技能已添加',
    official: '官方',
    noSkillsAvailable: '暂无可用技能',
    skillsDescription: '为您的智能体提供预封装且可重复的最佳实践与工具',
    skillInstalled: '已安装',
    skillMarketplace: '技能市场',
    skillMarketplaceEmpty: '暂无可用技能',
    skillCategoryAll: '全部',
    skillInstall: '安装',
    skillInstalling: '安装中',
    skillInstallFailed: '安装失败',
    skillAlreadyInstalled: '已安装',

    // Security scan
    lobsterGuardEnabled: '安全防护中',
    securityScanTitle: '技能安全扫描',
    securityRisk_safe: '风险评估',
    securityRisk_low: '风险评估',
    securityRisk_medium: '风险评估',
    securityRisk_high: '风险评估',
    securityRisk_critical: '风险评估',
    securityIssuesFound: '{name} 技能的以下行为请悉知：',
    securityInstallAnyway: '仍然安装',
    securityInstallDisabled: '安装但禁用',
    securityDimFileAccess: '文件访问',
    securityDimDangerousCmd: '危险命令',
    securityDimNetwork: '网络安全',
    securityDimProcess: '进程安全',
    securityDimScreenInput: '屏幕/输入',
    securityDimPayment: '支付/金融',
    securityDimPromptInjection: '提示注入',
    securityDimWebContent: '网页内容',
    securityFindingSshKeyAccess: '访问 SSH 密钥',
    securityFindingAwsCredentials: '访问 AWS 凭证',
    securityFindingBrowserData: '访问浏览器数据',
    securityFindingTokenAccess: '访问令牌/凭证文件',
    securityFindingKeychainAccess: '访问系统钥匙串',
    securityFindingEnvSecrets: '读取敏感环境变量',
    securityFindingRmRf: '递归强制删除命令',
    securityFindingDiskFormat: '磁盘格式化命令',
    securityFindingSudo: '提权命令',
    securityFindingDestructiveGit: '破坏性 Git 操作',
    securityFindingSystemModify: '修改系统配置',
    securityFindingForkBomb: 'Fork 炸弹',
    securityFindingDataExfil: '数据外传 (curl/wget)',
    securityFindingDataExfilJs: '可疑网络请求',
    securityFindingWebhookExfil: 'Webhook 数据外传',
    securityFindingDnsExfil: 'DNS 数据外传',
    securityFindingEncodedUrl: '编码的 URL',
    securityFindingReverseShell: '反弹 Shell',
    securityFindingCryptoMiner: '加密货币挖矿',
    securityFindingBackgroundProcess: '后台驻留进程',
    securityFindingScreenshot: '截屏操作',
    securityFindingKeylogger: '键盘记录',
    securityFindingClipboard: '读取剪贴板',
    securityFindingPaymentApi: '调用支付 API',
    securityFindingCryptoWallet: '加密货币钱包操作',
    securityFindingInlineScript: '内联脚本',
    securityFindingSvgScript: 'SVG 中的脚本',
    securityFindingExternalResource: '外部资源引用',
    securityFindingPromptOverride: '覆盖系统指令',
    securityFindingHiddenInstructions: '隐藏指令',
    securityFindingDataExfilInstruction: '数据窃取指令',
    securityFindingPrivilegeEscalation: '权限提升指令',
    securityFindingUnicodeObfuscation: 'Unicode 混淆',
    securityFindingRoleHijack: '角色劫持',
    securityFindingExcessiveHiddenContent: '过量隐藏内容',
    securityFindingInstallScript: '安装脚本钩子',
    securityFindingParseError: '文件解析失败',
    securityFindingJsxray_serialize_environment: '序列化环境变量 (process.env)',
    securityFindingJsxray_unsafe_stmt: '不安全的语句 (eval/Function)',
    securityFindingJsxray_data_exfiltration: '数据外传',
    securityFindingJsxray_unsafe_command: '不安全的命令执行',
    securityFindingJsxray_obfuscated_code: '混淆代码',
    securityFindingJsxray_encoded_literal: '编码字符串',
    securityFindingJsxray_shady_link: '可疑链接',
    securityFindingJsxray_unsafe_import: '不安全的导入',
    securityFindingJsxray_weak_crypto: '弱加密算法',
    securityFindingJsxray_suspicious_file: '可疑文件',
    securityFindingJsxray_insecure_random: '不安全的随机数',
    securityFindingJsxray_monkey_patch: '原型修改',
    securityFindingJsxray_prototype_pollution: '原型污染',
    securityFindingJsxray_sql_injection: 'SQL 注入',
    skillDetailVersion: '版本',
    skillDetailSource: '来源',
    skillDetailAuthor: '作者',
    skillsRoot: '技能目录',
    skillSourcePlaceholder: 'Git URL 或本地路径',
    downloadSkill: '下载技能',
    downloadingSkill: '正在下载...',
    deleteSkill: '删除技能',
    skillDeleteConfirm: '确定删除技能“{name}”吗？',
    skillDeleteFailed: '删除技能失败',
    skillBuiltInCannotDelete: '系统内置技能不允许删除',
    skillDownloadFailed: '下载技能失败',
    skillUpdateFailed: '更新技能失败',
    skillUpgrade: '更新',
    skillUpgradeAll: '更新全部 ({count})',
    skillUpgrading: '正在更新技能 ({current}/{total})',
    skillUpgradingCurrent: '当前：{name} v{version}',
    skillUpgradeFailed: '更新失败',
    skillUpgradeAvailable: '有新版本',
    skillUpgradeCancel: '取消更新',
    activeSkill: '当前技能',
    clearSkill: '清除技能',
    clearAll: '全部清除',
    clearAllSkills: '清除所有已选技能',

    // 技能同步 (OpenClaw)
    syncSkillsFromOpenClaw: '从 OpenClaw 同步',
    skillsSyncTitle: '发现新技能',
    skillsSyncFound: '检测到 {count} 个可从 OpenClaw 同步的技能：',
    skillsSyncNow: '立即同步',
    skillsSyncSkip: '暂不同步',
    skillsSyncLater: '如果现在不同步，后续可以在「添加」菜单中的「从 OpenClaw 同步」手动操作。',
    skillsSyncNoneFound: '未发现新技能',
    skillsSyncing: '正在同步技能...',
    skillsSyncSuccess: '已成功同步技能',
    skillsSyncFailed: '同步技能失败',

    // 专家套件 (Kits)
    kits: '专家套件',
    newFeatureBadge: 'NEW',
    kitSearchPlaceholder: '搜索套件或能力，如“设计”、“营销”、“数据分析”',
    kitInstall: '安装',
    kitInstalling: '安装中...',
    kitUninstall: '卸载',
    kitUninstallConfirm: '确定卸载套件“{name}”吗？',
    kitUninstalling: '卸载中...',
    kitInstalled: '已安装',
    kitReinstallRequiredBadge: '需重新安装',
    kitReinstallRequiredDetail: '已安装版本 v{installedVersion}，当前版本 v{currentVersion}。请先卸载后重新安装以使用新版本。',
    kitLoading: '加载中...',
    kitEmpty: '暂无套件',
    kitBack: '返回',
    kitTryAsking: '试试这样问...',
    kitSkills: '技能',
    kitDescription: '按工作场景安装能力包，组合常用技能后直接使用',
    kitMarketplace: '市场',
    kitSkillCount: '{count} 个技能',
    kitOfficial: '官方',
    manageKits: '管理套件',
    searchKits: '搜索套件',
    clearKit: '清除套件',
    noKitsInstalled: '暂未安装专家套件',
    kitInstallGuideDescription: '基于工作场景的标准能力包',
    kitGoInstall: '去安装',
    kitSearchNoResults: '未找到匹配套件',
    kitInstallRequired: '需要安装',
    kitInstallRequiredDesc: '该套件尚未安装，是否立即安装并体验？',

    // MCP 服务
    mcpServers: 'MCP',
    mcpDescription: '配置和管理 MCP（Model Context Protocol）服务器，为您的智能体扩展工具能力',
    searchMcpServers: '搜索 MCP 服务',
    addMcpServer: '自定义',
    editMcpServer: '编辑 MCP 服务',
    deleteMcpServer: '删除 MCP 服务',
    mcpServerName: '服务名称',
    mcpServerNamePlaceholder: '输入服务名称',
    mcpServerDescription: '描述',
    mcpServerDescriptionPlaceholder: '描述此 MCP 服务的用途',
    mcpTransportType: '传输类型',
    mcpCommand: '命令',
    mcpCommandPlaceholder: '例如: node, npx, uvx, python',
    mcpArgs: '参数',
    mcpArgsPlaceholder: '每行一个参数',
    mcpEnvVars: '环境变量',
    mcpUrl: 'URL',
    mcpUrlPlaceholder: '例如: http://localhost:3000/mcp',
    mcpHeaders: 'HTTP 请求头',
    mcpHeaderKey: '键',
    mcpHeaderValue: '值',
    noMcpServersAvailable: '暂无 MCP 服务',
    mcpDeleteConfirm: '确定删除 MCP 服务"{name}"吗？',
    mcpDeleteFailed: '删除 MCP 服务失败',
    mcpCreateFailed: '创建 MCP 服务失败',
    mcpUpdateFailed: '更新 MCP 服务失败',
    mcpBridgeSyncing: '正在同步 MCP 工具...',
    mcpBridgeSyncDone: 'MCP 工具同步完成',
    mcpLaunchPending: '等待解析',
    mcpLaunchInstalling: '正在安装',
    mcpLaunchReady: '已优化',
    mcpLaunchFailed: '安装失败',
    mcpLaunchUnsupported: '使用原始命令',
    mcpLaunchRetry: '重试',
    mcpBridgeSyncError: '同步失败',
    mcpNameRequired: '请填写服务名称',
    mcpCommandRequired: 'stdio 类型需要填写命令',
    mcpUrlRequired: 'SSE/HTTP 类型需要填写 URL',
    mcpUrlInvalid: '请输入有效的 HTTP/HTTPS URL',
    mcpUrlMultiple: '检测到多个 URL，请只保留一个 MCP 服务 URL',
    mcpNameExists: '服务名称已存在',
    mcpTransportStdio: '标准输入输出 (stdio)',
    mcpTransportSse: '服务器推送事件 (SSE)',
    mcpTransportHttp: 'HTTP 流式传输',
    addKeyValue: '添加',
    saveMcpServer: '保存',
    // MCP 市场 & 注册表
    mcpInstalled: '已安装',
    mcpMarketplace: '市场',
    mcpCustom: '自定义',
    mcpCustomDescription: '手动配置 MCP 服务器',
    mcpResetForm: '重置',
    mcpInstall: '安装',
    mcpInstallFromUrl: '通过 URL 安装',
    mcpInstallFromUrlTitle: '通过 URL 安装 MCP',
    mcpInstallFromUrlPlaceholder: '输入 npm 包名或 URL',
    mcpInstallFromUrlHint:
      '支持 npm 包名（如 @modelcontextprotocol/server-filesystem）、npx 命令或 HTTP/HTTPS URL',
    mcpRequiredConfig: '必填配置',
    mcpEnvRequired: '此字段为必填项',
    mcpOptionalConfig: '可选配置',
    mcpViewOnGithub: '在 GitHub 上查看',
    mcpNoInstalledServers: '尚未安装任何 MCP 服务',
    mcpCategoryAll: '全部',
    mcpCategorySearch: '搜索',
    mcpCategoryBrowser: '浏览器',
    mcpCategoryDeveloper: '开发工具',
    mcpCategoryProductivity: '效率工具',
    mcpCategoryDesign: '设计',
    mcpCategoryDataApi: '数据 & API',
    mcpDesc_tavily: '实时网页搜索、智能数据提取和网站爬取',
    mcpDesc_github: 'GitHub 平台集成：仓库、Issues、PR、Actions 管理',
    mcpDesc_gitlab: 'GitLab API 集成：项目管理、合并请求、流水线',
    mcpDesc_context7: '为 AI 编程提供最新的库文档和代码示例',
    mcpDesc_google_drive: 'Google Drive 文件访问和搜索，自动导出 Workspace 文件',
    mcpDesc_gmail: 'Gmail 邮件管理：读取、发送、搜索邮件，支持自动认证',
    mcpDesc_google_calendar: 'Google Calendar 日程管理：创建、查询、更新日历事件',
    mcpDesc_notion: 'Notion API：搜索、创建/更新页面、管理数据库',
    mcpDesc_slack: 'Slack 工作区：频道管理、消息发送、用户查询',
    mcpDesc_todoist: '任务管理：创建、更新、完成和组织待办事项',
    mcpDesc_playwright: '高级浏览器自动化，支持 Chromium/Firefox/WebKit',
    mcpDesc_canva: 'Canva 设计平台：创建和管理设计、模板操作',
    mcpDesc_firecrawl: '网页抓取与数据提取：支持批处理、结构化提取和内容分析',
    mcpDesc_fetch: '网页内容抓取和 HTML 转 Markdown，适合 LLM 消费',

    // 邮箱技能配置
    emailTab: '邮箱',
    emailConfig: '邮箱配置',
    emailProvider: '邮箱服务商',
    emailSelectProvider: '请选择邮箱服务商',
    emailCustomProvider: '自定义',
    emailAdvancedSettings: '高级设置',
    emailAllowInsecureCert: '允许不安全的证书',
    emailAllowInsecureCertHint: '跳过 TLS 证书验证，适用于代理/VPN 导致的自签名证书问题',
    emailMailbox: '默认收件箱',
    emailConfigSaved: '邮箱配置已保存',
    emailConfigError: '保存配置失败',
    emailHintGmail: '如果开启了两步验证，请使用应用专用密码（App Password）',
    emailHint163: '请使用授权码，而非账户密码。需先在网页端设置中开启 IMAP/SMTP 服务',
    emailHintQQ: '请使用授权码，而非账户密码。需先在网页端设置中开启 IMAP/SMTP 服务',

    // 文件操作
    openFile: '打开文件',
    openFolder: '打开文件夹',
    showInFolder: '在文件夹中显示',
    outputFiles: '输出文件',
    openFileFailed: '打开文件失败',
    showInFolderFailed: '打开文件所在目录失败',
    fileCreated: '文件已创建',

    // 插件管理
    pluginsTab: '插件',
    pluginsTitle: '插件管理',
    pluginsDesc: '安装和管理 OpenClaw 插件，扩展应用功能。',
    pluginsInstall: '安装插件',
    pluginsInstallTitle: '安装插件',
    pluginsUninstall: '卸载',
    pluginsUninstalling: '卸载中...',
    pluginsUninstallConfirm: '确定要卸载此插件吗？',
    pluginsSource: '来源',
    pluginsSourceNpm: 'npm',
    pluginsSourceClawhub: 'ClawHub',
    pluginsSourceGit: 'Git',
    pluginsSourceLocal: '本地路径',
    pluginsPackageName: '包名',
    pluginsVersion: '版本',
    pluginsVersionPlaceholder: '可选，默认 latest',
    pluginsRegistry: 'Registry URL',
    pluginsRegistryPlaceholder: '可选，默认官方 npm registry',
    pluginsGitUrl: 'Git URL',
    pluginsGitUrlPlaceholder: '如 https://github.com/org/plugin',
    pluginsLocalPath: '路径',
    pluginsSelectPath: '选择文件或目录',
    pluginsInstalling: '安装中...',
    pluginsInstallSuccess: '插件安装成功',
    pluginsInstallFailed: '插件安装失败',
    pluginsEmpty: '暂无已安装插件',
    pluginsEmptyHint: '点击右上角"安装插件"开始',
    pluginsEnabled: '已启用',
    pluginsDisabled: '已禁用',
    pluginsConfigTitle: '插件配置',
    pluginsConfigSave: '保存',
    pluginsConfigSaved: '已保存',
    pluginsConfigSaving: '保存中...',
    pluginsConfigBack: '返回',
    pluginsConfigNoSchema: '此插件没有可配置项',
    pluginsConfigLoadError: '加载配置失败',
    pluginsSourceOpenclaw: 'OpenClaw',
    pluginsSyncTitle: '发现新插件',
    pluginsSyncDesc: '从 OpenClaw 发现并同步插件到管理列表。',
    pluginsSyncButton: '发现插件',
    pluginsSyncing: '正在同步插件...',
    pluginsSyncFound: '检测到 {count} 个可从 OpenClaw 同步的插件：',
    pluginsSyncNone: '未发现新插件',
    pluginsSyncNow: '立即同步',
    pluginsSyncSkip: '暂不同步',
    pluginsSyncLater: '如果现在不同步，后续可以在「安装插件」页面的 OpenClaw 分类下手动操作。',
    pluginsUnsavedTitle: '未保存的更改',
    pluginsUnsavedMessage: '插件设置的修改将丢失，确认离开吗？',
    pluginsUnsavedStay: '继续编辑',
    pluginsUnsavedDiscard: '放弃更改',
    pluginsCheckUpdates: '检查更新',
    pluginsChecking: '检查中...',
    pluginsUpdate: '更新',
    pluginsUpdating: '更新中...',
    pluginsUpdateConfirm: '确认更新插件',

    // IM Bot
    imBot: 'IM 机器人',
    dingtalk: '钉钉',
    feishu: '飞书',
    qq: 'QQ',
    telegram: 'Telegram',
    discord: 'Discord',
    nim: '云信',
    'netease-bee': '小蜜蜂',
    weixin: '微信',
    wecom: '企业微信',
    popo: 'POPO',
    connected: '已连接',
    disconnected: '未连接',
    connecting: '连接中',
    pendingSave: '待保存',
    imAgentBinding: '响应 Agent',
    imAgentBindingDefault: '默认（主 Agent）',
    imAgentBindingHint: '选择用于响应该平台消息的 Agent，不同 Agent 有不同的人设和技能配置。',
    kickedByOtherClient: '账号已在其它地方登录',
    starting: '启动中',
    start: '启动',
    stop: '停止',
    messageType: '消息类型',
    domain: '域名',
    feishuChina: '飞书（中国）',
    renderMode: '渲染模式',
    textMode: '文本',
    cardMode: '卡片',
    chatSettings: '对话设置',
    enableSkills: '启用技能',
    systemPrompt: '系统提示词',
    systemPromptPlaceholder: '为 IM 机器人设置自定义指令...',
    saveConfig: '保存配置',
    imConnectivitySectionTitle: '连通性诊断',
    imConnectivityTest: '测试连通性',
    imConnectivityRetest: '重新测试',
    imConnectivityTesting: '测试中...',
    imNavInstanceCount: '已连接 {connected}/{total}',
    imChannelBotsTitle: '{platform}机器人',
    imInstanceSummary: '已连接 {connected} 个 / 共 {total} 个',
    imChannelEnabledPendingSave: '{platform}已开启，保存后会重启 Gateway 并生效。',
    imChannelConnecting: '{platform}正在连接，通常需要 10-30 秒。',
    imChannelConnectionFailed: '{platform}连接失败，请重新扫码或测试连通性。',
    imAddBot: '添加机器人',
    imBackToBotList: '返回{platform}列表',
    imCredentialConfigured: '已配置凭证',
    imCredentialMissing: '未配置凭证',
    imInstanceActionMenu: '机器人操作',
    imDeleteBotConfirmTitle: '确认删除机器人',
    imDeleteBotConfirmMessage: '确定要删除{platform}机器人「{name}」吗？此操作不可撤销。',
    imRescan: '重新扫码',
    imAccountSection: '账号',
    imAccountIdLabel: 'Account ID',
    imReceivePermission: '接收权限',
    imDmPolicyLabel: 'DM Policy',
    imAllowFromLabel: 'Allow From (User IDs)',
    imAllowFromPlaceholder: 'wxid_xxx@im.wechat',
    imConnectivityNoResult: '尚未执行诊断。建议启用后立即测试。',
    imConnectivityLastChecked: '最近测试',
    imConnectivitySuggestion: '建议',
    imConnectivityVerdict_pass: '可对话',
    imConnectivityVerdict_warn: '需关注',
    imConnectivityVerdict_fail: '不可用',
    imConnectivityCheckTitle_missing_credentials: '配置项缺失',
    imConnectivityCheckTitle_auth_check: '凭证鉴权',
    imConnectivityCheckTitle_gateway_running: 'IM 渠道启用状态',
    imConnectivityCheckTitle_inbound_activity: '入站消息活动',
    imConnectivityCheckTitle_outbound_activity: '出站消息活动',
    imConnectivityCheckTitle_platform_last_error: '平台最近错误',
    imConnectivityCheckTitle_feishu_group_requires_mention: '飞书群聊触发规则',
    imConnectivityCheckTitle_feishu_event_subscription_required: '飞书事件订阅要求',
    imConnectivityCheckTitle_discord_group_requires_mention: 'Discord 群聊触发规则',
    imConnectivityCheckTitle_telegram_privacy_mode_hint: 'Telegram Privacy Mode',
    imConnectivityCheckTitle_dingtalk_bot_membership_hint: '钉钉会话权限',
    imConnectivityCheckTitle_nim_p2p_only_hint: '云信私聊模式',
    imConnectivityCheckSuggestion_missing_credentials: '补全必填配置项后重试。',
    imConnectivityCheckSuggestion_auth_check: '核对平台凭证、应用权限和发布状态。',
    imConnectivityCheckSuggestion_gateway_running:
      '若显示未启用，请点击对应 IM 渠道胶囊按钮启用；启用后确认网络可访问平台服务。',
    imConnectivityCheckSuggestion_inbound_activity: '向机器人发一条测试消息；群聊场景请 @机器人。',
    imConnectivityCheckSuggestion_outbound_activity:
      '检查机器人发消息权限、可见范围和会话回包权限。',
    imConnectivityCheckSuggestion_platform_last_error: '根据错误提示修复后再重测。',
    imConnectivityCheckSuggestion_feishu_group_requires_mention: '在群聊中使用 @机器人 + 内容。',
    imConnectivityCheckSuggestion_feishu_event_subscription_required:
      '在飞书后台开启 im.message.receive_v1 并发布版本。',
    imConnectivityCheckSuggestion_discord_group_requires_mention: '在频道中使用 @机器人 + 内容。',
    imConnectivityCheckSuggestion_telegram_privacy_mode_hint:
      '在 @BotFather 调整 Privacy Mode 设置。',
    imConnectivityCheckSuggestion_dingtalk_bot_membership_hint:
      '确认机器人已加入目标会话并允许收发消息。',
    imConnectivityCheckSuggestion_nim_p2p_only_hint: '通过私聊方式向机器人账号发送消息。',
    nimAccountPlaceholder: '机器人账号ID',
    nimAccountHint: '在云信控制台"账号管理"中创建的 IM 账号 ID',
    nimCredentialsGuide: '如何获取云信凭证：',
    nimGuideStep1: '登录网易云信控制台（yunxin.163.com）',
    nimGuideStep2: '创建或选择应用，获取 App Key',
    nimGuideStep3: '在"账号数-子功能配置"中创建 IM 账号（accid）',
    nimGuideStep4: '为该账号生成 Token（密码）- 建议长期有效',
    nimAppKeyLabel: 'App Key',
    nimAccountLabel: '账号 ID',
    nimTokenLabel: 'Token',
    imNimAddInstance: '添加云信实例',
    imNimClickToRename: '点击重命名云信实例',
    imNimEnableInstance: '启用云信实例',
    imNimDisableInstance: '禁用云信实例',
    imNimDeleteInstance: '删除云信实例',
    imNimQrLogin: '扫码创建机器人',
    imNimQrLoginHintPrefix: '请使用',
    imNimQrLoginHintSuffix: '扫描二维码创建机器人。',
    imNimQrGenerating: '正在生成二维码...',
    imNimQrScanPromptPrefix: '请使用网易云信客户端扫描下方二维码并完成绑定。如未安装，可先下载',
    imNimQrDemoLink: '云信 IM',
    imNimQrScanPromptSuffix: '。',
    imNimQrExpiresIn: '二维码将在 {seconds} 秒后过期',
    imNimQrExpired: '二维码已过期，请刷新',
    imNimQrRefresh: '刷新二维码',
    imNimQrCancel: '取消',
    imNimQrSuccess: '已获取配置，保存后生效',
    imNimQrFailed: '扫码登录失败',
    imNimQrFailedWithCode: '扫码登录失败（错误码：{code}）',
    imNimQrOrManual: '或 手动填写、修改已有机器人信息',
    imNimQrUnsupported: '当前环境不支持云信扫码登录，请改用手动填写',
    imNimDownloadModalTitle: '下载云信 IM',
    imNimDownloadModalDesc: '请选择平台并使用手机扫描对应二维码下载客户端。',
    imNimDownloadPlatformAndroid: 'Android',
    imNimDownloadPlatformIos: 'iOS',
    imNimDownloadModalHint: '使用 {platform} 设备扫描二维码即可下载云信 IM。',
    imNimDownloadQrAlt: '{platform} 下载二维码',
    nimAppKeyHint: '从云信控制台应用信息中获取',
    nimTokenHint: '为该账号生成的访问凭证（建议设置为长期有效）',
    nimAccountWhitelist: '白名单账号',
    nimAccountWhitelistHint:
      '填写允许与机器人对话的云信账号，多个账号用逗号分隔。留空则不限制，响应所有账号的消息。',
    nimTeamPolicy: '群消息策略',
    nimTeamPolicyDisabled: '禁用 - 不响应群消息',
    nimTeamPolicyOpen: '开放 - 响应所有群的@消息',
    nimTeamPolicyAllowlist: '白名单 - 仅响应指定群的@消息',
    nimTeamPolicyHint: '群消息仅响应@机器人的消息',
    nimTeamAllowlist: '群白名单',
    nimTeamAllowlistHint: '填写允许响应的群ID，多个用逗号分隔',
    nimQChatEnabled: '启用圈组 (QChat)',
    nimQChatEnabledHint: '订阅圈组消息，仅响应@机器人的消息',
    nimQChatServerIds: '圈组服务器 ID',
    nimQChatServerIdsPlaceholder: '留空自动发现所有已加入的服务器',
    nimQChatServerIdsHint:
      '指定要订阅的服务器 ID，多个用逗号分隔。留空则自动订阅所有已加入的服务器。',
    neteaseBeeChanClientIdPlaceholder: '小蜜蜂助理Client ID',

    // IM 设置页面 - POPO 配置
    imPopoAesKeyLengthWarning: 'AES Key 需要为 32 个字符',
    imPopoAesKeyLengthCurrent: '当前',
    imPopoWebhookPlaceholder: '外部域名（可选，不填则自动检测本机 IP）',
    imPopoUserIdPlaceholder: '输入用户 ID 后回车添加',
    imPopoGroupIdPlaceholder: '输入群组 ID 后回车添加',

    // IM 设置页面国际化
    imAdvancedSettings: '高级设置',
    imPairingApproval: '配对码审批',
    imPairingCodePlaceholder: '输入配对码',
    imPairingApprove: '批准',
    imPairingCodeApproved: '配对码 {code} 已批准',
    imPairingCodeInvalid: '配对码无效或已过期',
    imDebugMode: 'Debug 模式',
    imSessionTimeout: '会话超时（分钟，已废弃）',
    imSeparateSessionByConversation: '按会话隔离 Session',
    imSeparateSessionByConversationDesc: '单聊、群聊、不同群分别维护独立会话',
    imGroupSessionScope: '群聊会话隔离策略',
    imGroupSessionScopeGroup: '群共享',
    imGroupSessionScopeGroupSender: '群内用户独立',
    imSharedMemoryAcrossConversations: '跨会话共享记忆',
    imSharedMemoryAcrossConversationsDesc: '不同会话间共享记忆（默认隔离）',
    imGatewayBaseUrl: 'Gateway 自定义 URL',
    imGatewayBaseUrlPlaceholder: '如 https://proxy.example.com',
    imSendThinkingMessage: '发送"思考中"消息',
    imDmPolicyOpen: '开放',
    imDmPolicyPairing: '配对码验证',
    imDmPolicyAllowlist: '白名单',
    imDmPolicyDisabled: '禁用',
    imGroupPolicyOpen: '开放',
    imGroupPolicyAllowlist: '白名单',
    imGroupPolicyDisabled: '禁用',
    imFeishuDomainFeishu: '飞书 (feishu.cn)',
    imFeishuDomainLark: 'Lark (larksuite.com)',
    imFeishuUserIdPlaceholder: '输入飞书 User ID',
    imFeishuChatIdPlaceholder: '输入飞书群 Chat ID',
    imReplyModeAuto: '自动选择',
    imReplyModeStatic: '静态回复',
    imReplyModeStreaming: '流式回复',
    imFeishuStreaming: '流式输出',
    imFeishuStreamingDesc: '开启后，自动模式下私聊使用流式卡片、群聊使用静态回复',
    imFeishuBlockStreaming: '分块流式',
    imFeishuBlockStreamingDesc: '静态模式下工具调用期间即时输出文字',
    imFeishuFooterStatus: '显示状态指示',
    imFeishuFooterElapsed: '显示耗时',
    imDingtalkUserIdPlaceholder: '输入钉钉 User ID',
    imQQCredentialHint: '从 QQ 开放平台获取 AppID 和 AppSecret',
    imQQUserIdPlaceholder: '输入 QQ OpenID',
    imQQImageServerHint: '图床服务器公网地址，用于发送图片',
    imQQAddInstance: '添加实例',
    imTelegramAddInstance: '添加实例',
    imQQClickToRename: '点击重命名',
    imQQDeleteInstance: '删除此实例',
    imQQEnableInstance: '启用此实例',
    imQQDisableInstance: '禁用此实例',
    imInstanceFillCredentials: '请先填写必要的凭证信息',
    imFeishuAddInstance: '添加实例',
    imFeishuDeleteInstance: '删除实例',
    imFeishuDeleteConfirm: '确定要删除此飞书 Bot 实例吗？',
    imFeishuInstanceName: '实例名称',
    imFeishuMaxInstances: '已达最大实例数量',
    imDingTalkAddInstance: '添加实例',
    imDingTalkDeleteInstance: '删除此实例',
    imDingTalkDeleteConfirm: '确定要删除此钉钉 Bot 实例吗？',
    imDingTalkInstanceName: '实例名称',
    imDingTalkMaxInstances: '已达最大实例数量',
    imTelegramClickToRename: '点击重命名',
    imTelegramDeleteInstance: '删除此实例',
    imTelegramEnableInstance: '启用此实例',
    imTelegramDisableInstance: '禁用此实例',
    imTelegramTokenHint: '从 @BotFather 获取 Bot Token',
    imTelegramUserIdPlaceholder: '输入 Telegram User ID（如 tg:123456789）',
    imDiscordClickToRename: '点击重命名',
    imDiscordDeleteInstance: '删除此实例',
    imDiscordEnableInstance: '启用此实例',
    imDiscordDisableInstance: '禁用此实例',
    imDiscordTokenHint: '从 Discord Developer Portal 获取 Bot Token',
    imDiscordUserIdPlaceholder: '输入 Discord User ID',
    imDiscordServerIdPlaceholder: '输入 Discord Server ID',
    imDiscordGuildIdPlaceholder: '输入 Guild ID 并回车',
    imWecomCredentialHint: '从企业微信管理后台获取 Bot ID 和 Secret',
    imWecomUserIdPlaceholder: '输入企业微信 User ID',
    imWecomBotIdPlaceholder: '您的 Bot ID',
    imWecomScanBtn: '扫码创建机器人',
    imWecomScanHint: '企业微信扫码，自动获取 BotID 和 Secret',
    imWecomOrManual: '或 手动填写、修改已有机器人信息',
    imWecomQuickSetupPending: '等待扫码授权...',
    imWecomQuickSetupSuccess: '已获取配置，保存后生效',
    imWecomQuickSetupError: '创建失败',
    imWecomAddInstance: '添加实例',
    imViewGuide: '配置手册',
    imDingtalkGuideStep1: '前往钉钉开放平台，在"应用开发 > 机器人"中创建或选择一个企业内部应用',
    imDingtalkGuideStep2: '从应用凭证页获取 Client ID（AppKey）与 Client Secret（AppSecret）',
    imDingtalkGuideStep3: '启用"机器人"能力，并将 Client ID 和 Client Secret 填入下方',
    imDingtalkGuideStep4: '保存后机器人将自动通过 Stream 模式建立长连接',
    dingtalkBotCreateWizardScanBtn: '扫码配置机器人',
    dingtalkBotCreateWizardScanHint: '使用钉钉客户端扫描二维码，一键创建并配置机器人',
    dingtalkBotCreateWizardOrManual: '或 手动填写机器人凭证',
    dingtalkBotCreateWizardQrcodeDesc: '使用钉钉客户端扫描二维码，完成机器人创建与授权。',
    dingtalkBotCreateWizardQrcodeExpired: '二维码已过期，请点击重新扫码',
    dingtalkBotCreateWizardSuccessTitle: '已获取配置，保存后生效',
    dingtalkBotCreateWizardGenerating: '正在生成二维码…',
    imFeishuGuideStep1: '在下方填写飞书机器人的 App ID 和 App Secret 即可完成配置',
    imFeishuGuideStep2: '可在飞书开放平台查看应用凭证，详情参考配置手册。',
    feishuBotCreateWizardTitle: '创建机器人',
    feishuBotCreateWizardScanBtn: '扫码创建机器人',
    feishuBotCreateWizardScanHint: '使用飞书客户端扫描二维码，一键创建并配置机器人',
    feishuBotCreateWizardOrManual: '或 手动填写、修改已有机器人信息',
    feishuBotCreateWizardOptionNew: '新建机器人',
    feishuBotCreateWizardOptionExisting: '关联已有机器人',
    feishuBotCreateWizardQrcodeDesc:
      '使用飞书客户端扫描二维码，选择「一键创建飞书机器人」完成配置。',
    feishuBotCreateWizardQrcodeExpired: '二维码已过期，请点击刷新',
    feishuBotCreateWizardQrcodeRefresh: '刷新二维码',
    feishuBotCreateWizardVerify: '验证',
    feishuBotCreateWizardVerifying: '验证中…',
    feishuBotCreateWizardSuccessTitle: '已获取配置，保存后生效',
    feishuBotCreateWizardSuccessDesc: '保存后机器人配置生效。',
    feishuBotCreateWizardErrorRetry: '重试',
    feishuBotCreateWizardDone: '完成',
    feishuBotCreateWizardAppIdPlaceholder: '输入 App ID',
    feishuBotCreateWizardAppSecretPlaceholder: '输入 App Secret',
    imWecomGuideStep1: '在企业微信管理后台创建一个新的机器人应用',
    imWecomGuideStep2: '获取对应的 BotID 与 Secret 凭证',
    imWecomGuideStep3: '将 BotID 和 Secret 填入下方表单',
    imWeixinGuideStep1: '点击「扫码连接微信」按钮',
    imWeixinGuideStep2: '使用微信扫描二维码完成连接',
    imWeixinGuideStep3: '连接成功后，即可通过微信发送消息与 AI 对话',
    imWeixinScanBtn: '扫码连接微信',
    imWeixinScanHint: '使用微信扫描二维码，连接微信 IM 机器人',
    imWeixinQrLoading: '正在获取二维码...',
    imWeixinQrScanPrompt: '请使用微信扫描下方二维码',
    imWeixinQrWaiting: '等待扫码确认...',
    imWeixinQrSuccess: '已获取配置，保存后生效',
    imWeixinQrFailed: '连接失败',
    imWeixinQrExpired: '二维码已过期，请重新获取',
    imWeixinQrAccountMissing:
      '微信已连接过此 OpenClaw，但未找到本地账号 ID。请重新加载状态后再试。',
    imWeixinCredentialsMissing: '微信登录凭据缺失，请重新扫码连接。',
    imPopoCredentialHint: '从 POPO 开发者后台获取 AppKey、AppSecret 和 AES Key',
    imPopoGuideStep1: '点击「扫码绑定 POPO 机器人」或手动填写凭证',
    imPopoGuideStep2: '使用 POPO 扫描二维码完成机器人绑定',
    imPopoGuideStep3: '绑定成功后凭证将自动填入，保存并启用即可',
    imPopoConnectionMode: '连接方式',
    imPopoConnectionModeWebsocket: '长连接（WebSocket）',
    imPopoConnectionModeWebhook: '回调（Webhook）',
    imPopoScanBtn: '扫码绑定 POPO 机器人',
    imPopoScanHint: '使用 POPO 扫描二维码，自动创建并关联机器人',
    imPopoQrLoading: '正在生成二维码...',
    imPopoQrScanPrompt: '请使用 POPO 扫描下方二维码',
    imPopoQrSuccess: '已获取配置，保存后生效',
    imPopoQrFailed: '绑定失败',
    imPopoQrExpired: '二维码已过期，请重新获取',
    imPopoQrWaiting: '等待扫码绑定...',
    imQQGuideStep1: '在 QQ 开放平台（q.qq.com）注册并创建一个机器人应用',
    imQQGuideStep2: '进入"开发设置"页获取 AppID（纯数字）与 Client Secret',
    imQQGuideStep3: '在下方填入 AppID 和 Client Secret',
    imQQGuideStep4: '保存后机器人将自动通过 WebSocket 模式建立长连接',
    imTelegramGuideStep1: '在 Telegram 中搜索 @BotFather',
    imTelegramGuideStep2: '发送 /newbot 并按提示完成创建',
    imTelegramGuideStep3: '复制生成的机器人令牌（Bot Token）',
    imTelegramGuideStep4: '将令牌粘贴到下方输入框',
    imDiscordGuideStep1: '打开 Discord Developer Portal，创建一个新的应用程序',
    imDiscordGuideStep2: '在 Bot 部分添加机器人并复制令牌',
    imDiscordGuideStep3: '在 Bot – Privileged Gateway Intents 中开启消息内容和服务器成员意图',
    imDiscordGuideStep4: '在 OAuth2 URL 生成器中勾选"bot"与"applications.commands"并添加消息权限',
    imDiscordGuideStep5: '通过生成的链接将机器人邀请到目标服务器',
    imDiscordGuideStep6: '将机器人令牌粘贴到下方输入框',

    // 通用设置
    autoLaunch: '开机自启动',
    autoLaunchDescription: '系统启动时自动运行应用',
    useSystemProxy: '使用系统代理',
    useSystemProxyDescription: '开启后网络请求将跟随系统代理（保存后生效）',
    browserWebAccessTab: '浏览器',
    browserWebAccessTitle: '浏览器',
    browserWebAccessDescription: '使用 LobsterAI 独立浏览器，管理网页打开方式和访问规则。',
    browserSectionTitle: '浏览器',
    browserEnableTool: '启用浏览器',
    browserEnableToolDescription: '允许 Agent 打开和操作网页。',
    browserProfileManaged: '独立浏览器（推荐）',
    browserProfileManagedDescription: 'LobsterAI 启动一个专用浏览器，稳定、干净。',
    browserProfileUser: '我的 Chrome',
    browserProfileUserDescription: '适合需要登录态的网站，例如 X、Google 或内部系统。',
    browserNetworkSectionTitle: '网络访问模式',
    browserSystemProxyOn: '当前应用已开启系统代理，浏览器会跟随这个总开关。',
    browserSystemProxyOff: '当前应用未开启系统代理；这里不会自动打开系统代理。',
    browserNetworkOpen: '优先保证网页能打开（推荐）',
    browserNetworkOpenDescription: '更适合日常浏览器任务，特别是开启系统代理时。',
    browserNetworkStrict: '严格保护本机和内网',
    browserNetworkStrictDescription: '阻止访问本机、内网和特殊地址段；开启代理时可能导致部分网页打不开。',
    browserNetworkStrictProxyWarning: '当前已开启系统代理，严格模式可能重新触发网页打不开的问题。',
    browserWebFetchSectionTitle: '网页抓取',
    browserWebFetchEnable: '启用网页抓取',
    browserWebFetchEnableDescription: '用于读取普通文章、文档网页和轻量页面。',
    browserWebFetchReadability: '提取正文内容',
    browserWebFetchReadabilityDescription: '尽量去掉导航栏、广告等无关内容。',
    browserDiagnosticsTitle: '诊断',
    browserDiagnosticsDescription: '自动检查浏览器是否能启动并打开测试网页。',
    browserDiagnosticsRun: '测试浏览器',
    browserDiagnosticsRunning: '测试中...',
    browserDiagnosticFailed: '浏览器诊断失败',
    browserDiagnosticGatewayReady: 'OpenClaw 运行环境已启动',
    browserDiagnosticGatewayNotRunning: 'OpenClaw 运行环境未启动',
    browserDiagnosticGatewayFailed: 'OpenClaw 运行环境检查失败',
    browserDiagnosticProfilesReady: '浏览器配置已读取',
    browserDiagnosticProfilesFailed: '读取浏览器配置失败',
    browserDiagnosticStatusReady: '浏览器控制连接可用',
    browserDiagnosticStatusWarning: '浏览器状态检查有警告',
    browserDiagnosticStartReady: '浏览器已启动',
    browserDiagnosticStartFailed: '浏览器启动失败',
    browserDiagnosticOpenPageReady: '测试网页已打开',
    browserDiagnosticOpenPageFailed: '测试网页打开失败',
    browserResetManagedData: '清除独立浏览器数据',
    browserResetting: '清除中...',
    browserResetConfirm: '确定要清除独立浏览器数据吗？这会移除该浏览器中的网站数据和缓存。',
    browserResetFailed: '清除独立浏览器数据失败',
    browserAdvancedTitle: '高级设置',
    browserFollowGlobalProxy: '浏览器跟随全局代理',
    browserFollowGlobalProxyDescription: '默认开启。关闭后仅作为 LobsterAI 配置保留，当前版本仍受浏览器自身代理设置影响。',
    browserEvaluateEnabled: '允许页面内执行脚本',
    browserEvaluateEnabledDescription: '关闭后更保守，但部分复杂网页操作可能不可用。',
    browserEfficientSnapshot: '使用精简网页快照',
    browserEfficientSnapshotDescription: '减少网页内容占用，更适合日常任务。',
    browserHeadless: '无界面运行浏览器',
    browserHeadlessDescription: '适合自动化环境；日常桌面使用不建议开启。',
    browserAttachOnly: '只连接已启动的浏览器',
    browserAttachOnlyDescription: '不会自动启动浏览器，仅用于高级调试。',
    browserExecutablePath: '浏览器程序路径',
    browserExecutablePathDescription: '指定 Chrome、Brave 或 Edge 的程序路径；留空自动检测。',
    browserCdpUrl: '远程浏览器地址',
    browserCdpUrlDescription: '用于连接远程 Chrome DevTools 或 Browserless；普通用户无需配置。',
    browserCdpUrlInvalid: '请输入 http、https、ws 或 wss 开头的地址。',
    browserAllowedHostnames: '允许的域名',
    browserAllowedHostnamesDescription: '无需询问即可打开的域名',
    browserBlockedHostnames: '已屏蔽的域名',
    browserBlockedHostnamesDescription: 'LobsterAI 不会打开这些网站',
    browserHostnameListEmpty: '尚未添加域名',
    browserHostnameInputPlaceholder: 'example.com',
    browserAddBlockedHostnameTitle: '添加已屏蔽域名',
    browserAddBlockedHostnameDescription: '这意味着 LobsterAI 不会打开此 URL',
    browserAddAllowedHostnameTitle: '添加允许域名',
    browserAddAllowedHostnameDescription: '这意味着 LobsterAI 可以打开此域名',
    browserRemoteCdpTimeout: '远程连接超时（毫秒）',
    browserRemoteCdpHandshakeTimeout: '远程握手超时（毫秒）',
    browserExtraArgs: '浏览器启动参数',
    browserExtraArgsDescription: '每行一个 Chrome 启动参数；配置错误可能导致浏览器无法启动。',
    browserWebFetchTimeout: '网页抓取超时（秒）',
    browserWebFetchFollowGlobalProxy: '网页抓取跟随全局代理',
    browserWebFetchFollowGlobalProxyDescription: '开启后，仅当应用总开关“使用系统代理”已开启时，网页抓取才使用系统代理。',
    browserWebFetchMaxRedirects: '最大重定向次数',
    browserWebFetchMaxChars: '最大返回字符数',
    browserWebFetchUserAgent: '网页抓取 User-Agent',
    browserWebFetchAllowFakeIp: '允许 fake-IP 代理网段',
    browserWebFetchAllowFakeIpDescription: '仅在 Clash TUN、Surge 等代理环境需要时开启。',
    sqliteAutoBackupEnabled: '启用自动备份与恢复',
    sqliteAutoBackupEnabledDescription: '开启后将自动备份数据，并在启动时尝试恢复损坏的数据',
    taskCompletionNotifications: '任务完成通知',
    taskCompletionNotificationsDescription: '应用不在前台时，任务完成后显示系统提醒',
    preventSleep: '防止休眠',
    preventSleepDescription: '防止系统在应用运行时进入睡眠模式',
    skipMissedJobs: '跳过未执行任务',
    skipMissedJobsDescription: '启动时跳过离线期间未触发的定时任务，不补充执行（保存后生效）',

    // 定时任务
    scheduledTasks: '定时任务',
    scheduledTasksTitle: '定时任务',
    scheduledTasksNewTask: '新建任务',
    scheduledTasksTemplateTitle: '定时任务模板',
    scheduledTasksTemplateSubtitle: '选择一个常见办公自动化场景，系统会自动填好周期和提示词',
    scheduledTasksTemplateUse: '使用模版',
    scheduledTasksTemplateNew: '新建',
    scheduledTasksTemplateEmpty: '暂无可用模板',
    scheduledTasksTemplateTechBriefingTitle: '科技早报',
    scheduledTasksTemplateTechBriefingDesc:
      '工作日早晨汇总科技、AI 和产品动态，筛出适合办公人群快速浏览的重点。',
    scheduledTasksTemplateTechBriefingSchedule: '工作日 08:30',
    scheduledTasksTemplateTechBriefingPrompt:
      '请收集并总结过去 24 小时的科技、AI 与产品动态，筛选 5-8 条与办公、研发和产品人群相关的重点。每条包含事件、影响、可跟进行动，并在结尾列出今天值得关注的关键词。',
    scheduledTasksTemplateWorkdayWrapTitle: '每日工作收尾',
    scheduledTasksTemplateWorkdayWrapDesc:
      '下班前整理当天进展、风险和明日待办，适合个人复盘或团队同步。',
    scheduledTasksTemplateWorkdayWrapSchedule: '工作日 18:00',
    scheduledTasksTemplateWorkdayWrapPrompt:
      '请整理今天的工作收尾摘要，按「已完成」「进行中」「遇到的问题」「明日待办」输出。内容要简洁、可执行，并提醒我哪些事项需要提前同步给同事。',
    scheduledTasksTemplateMeetingPrepTitle: '会议准备',
    scheduledTasksTemplateMeetingPrepDesc:
      '每天开始前梳理会议目标、待确认问题和需要提前准备的材料。',
    scheduledTasksTemplateMeetingPrepSchedule: '工作日 08:45',
    scheduledTasksTemplateMeetingPrepPrompt:
      '请基于可访问的日程、待办或工作记录，为今天的会议和重点事项做准备。列出每个会议的目标、需要提前看的材料、待确认问题，以及会后应跟进的动作。',
    scheduledTasksTemplateWeeklyReportTitle: '周报草稿',
    scheduledTasksTemplateWeeklyReportDesc:
      '每周五生成一份结构化周报草稿，减少临下班补材料的成本。',
    scheduledTasksTemplateWeeklyReportSchedule: '周五 17:30',
    scheduledTasksTemplateWeeklyReportPrompt:
      '请整理本周工作周报草稿，包含本周完成、关键进展、数据或结果、问题与风险、下周计划。请用适合直接发给主管或团队的语气输出。',
    scheduledTasksTemplateProjectHealthTitle: '项目健康巡检',
    scheduledTasksTemplateProjectHealthDesc:
      '定期检查项目状态、近期变更和潜在风险，适合研发或运营项目。',
    scheduledTasksTemplateProjectHealthSchedule: '每天 10:00',
    scheduledTasksTemplateProjectHealthPrompt:
      '请检查当前项目的健康状态，关注最近变更、测试或构建状态、明显的 TODO/风险点和可改进项。请给出简短巡检报告，并把需要人工处理的事项列为清单。',
    scheduledTasksTemplateMonthlyAdminTitle: '月度行政提醒',
    scheduledTasksTemplateMonthlyAdminDesc: '月底前提醒整理发票、报销、续费、合同和常规行政待办。',
    scheduledTasksTemplateMonthlyAdminSchedule: '每月 25 日 10:00',
    scheduledTasksTemplateMonthlyAdminPrompt:
      '请提醒我整理本月行政待办，包括发票、报销、订阅续费、合同、设备和其他月底前需要处理的事项。请输出一份可勾选清单，并标出建议优先级。',
    scheduledTasksEmptyState: '暂无定时任务',
    scheduledTasksEmptyHint: '创建定时任务，让 AI 按计划自动执行',
    scheduledTasksListColTitle: '标题',
    scheduledTasksListColSchedule: '计划于',
    scheduledTasksListColStatus: '状态',
    scheduledTasksListColMore: '更多',
    scheduledTasksTabTasks: '任务',
    scheduledTasksTabHistory: '历史',
    scheduledTasksHistoryEmpty: '暂无运行记录',
    scheduledTasksHistoryColTitle: '标题',
    scheduledTasksHistoryColTime: '执行时间',
    scheduledTasksHistoryColStatus: '状态',
    scheduledTasksFormName: '标题',
    scheduledTasksFormNamePlaceholder: '输入任务标题',
    scheduledTasksFormDescription: '描述',
    scheduledTasksFormDescriptionPlaceholder: '可选的任务描述',
    scheduledTasksFormAgentId: 'Agent ID',
    scheduledTasksFormAgentIdPlaceholder: '可选，留空使用主 Agent',
    scheduledTasksFormScheduleType: '计划',
    scheduledTasksFormScheduleModeEvery: '每隔',
    scheduledTasksFormScheduleModeAt: '指定时间',
    scheduledTasksFormScheduleModeCron: 'Cron',
    scheduledTasksFormScheduleModeOnce: '不重复',
    scheduledTasksFormScheduleModeDaily: '每天',
    scheduledTasksFormScheduleModeWeekly: '每周',
    scheduledTasksFormScheduleModeMonthly: '每月',
    scheduledTasksFormScheduleModeHourly: '每小时',
    scheduledTasksFormWeekSun: '周日',
    scheduledTasksFormWeekMon: '周一',
    scheduledTasksFormWeekTue: '周二',
    scheduledTasksFormWeekWed: '周三',
    scheduledTasksFormWeekThu: '周四',
    scheduledTasksFormWeekFri: '周五',
    scheduledTasksFormWeekSat: '周六',
    scheduledTasksFormWeekShortMon: '一',
    scheduledTasksFormWeekShortTue: '二',
    scheduledTasksFormWeekShortWed: '三',
    scheduledTasksFormWeekShortThu: '四',
    scheduledTasksFormWeekShortFri: '五',
    scheduledTasksFormWeekShortSat: '六',
    scheduledTasksFormWeekShortSun: '日',
    scheduledTasksFormHourlyAtMinute: '第',
    scheduledTasksFormHourlyMinuteSuffix: '分',
    scheduledTasksFormValidationWeekdayRequired: '请至少选择一天',
    scheduledTasksFormValidationTimeRequired: '请选择时间',
    scheduledTasksFormValidationWorkingDirectoryRequired: '请选择任务工作目录',
    scheduledTasksFormMonthDaySuffix: '日',
    scheduledTasksFormScheduleAt: '定时执行',
    scheduledTasksFormScheduleAtHint: '在指定时间执行一次',
    scheduledTasksFormScheduleInterval: '间隔执行',
    scheduledTasksFormScheduleIntervalHint: '按固定间隔重复执行',
    scheduledTasksFormScheduleCron: 'Cron 表达式',
    scheduledTasksFormScheduleCronHint: '使用 Cron 表达式定义复杂调度',
    scheduledTasksFormDatetime: '执行时间',
    scheduledTasksFormRunAt: '运行时间',
    scheduledTasksFormEveryAmount: '间隔数值',
    scheduledTasksFormEveryUnit: '间隔单位',
    scheduledTasksFormInterval: '间隔时间',
    scheduledTasksFormIntervalMinutes: '分钟',
    scheduledTasksFormIntervalHours: '小时',
    scheduledTasksFormIntervalDays: '天',
    scheduledTasksFormCronExpression: 'Cron 表达式',
    scheduledTasksFormCronPlaceholder: '例如: */5 * * * * (每5分钟)',
    scheduledTasksFormCronHelp: '格式: 分 时 日 月 周 (5段)',
    scheduledTasksFormCronTimezone: 'Cron 时区',
    scheduledTasksFormCronTimezonePlaceholder: '例如 Asia/Shanghai',
    scheduledTasksFormPrompt: '执行提示词',
    scheduledTasksFormPromptPlaceholder: '输入要执行的提示词...',
    scheduledTasksFormSessionTarget: '会话目标',
    scheduledTasksFormSessionTargetMain: '主会话',
    scheduledTasksFormSessionTargetIsolated: '隔离会话',
    scheduledTasksFormWakeMode: '唤醒模式',
    scheduledTasksFormWakeModeNow: '立即唤醒',
    scheduledTasksFormWakeModeNextHeartbeat: '下次心跳',
    scheduledTasksFormPayloadKind: '任务载荷',
    scheduledTasksFormPayloadKindSystemEvent: '系统事件',
    scheduledTasksFormPayloadKindAgentTurn: 'Agent 对话',
    scheduledTasksFormPayloadTextSystem: '系统文本',
    scheduledTasksFormPayloadTextAgent: 'Agent 消息',
    scheduledTasksFormTimeoutSeconds: '超时秒数',
    scheduledTasksFormTimeoutSecondsPlaceholder: '可选，0 或留空表示默认',
    scheduledTasksFormWorkingDirectory: '工作目录',
    scheduledTasksFormWorkingDirectoryPlaceholder: '输入项目路径',
    scheduledTasksFormSystemPrompt: '系统提示词',
    scheduledTasksFormSystemPromptPlaceholder: '可选的系统提示词...',
    scheduledTasksFormExecutionMode: '执行模式',
    scheduledTasksFormExecutionModeAuto: '自动',
    scheduledTasksFormExecutionModeLocal: '本地',
    scheduledTasksFormExecutionModeSandbox: '沙箱',
    scheduledTasksFormEnabled: '启用任务',
    scheduledTasksFormModel: '模型',
    scheduledTasksFormCreate: '创建任务',
    scheduledTasksFormUpdate: '更新任务',
    scheduledTasksFormValidationNameRequired: '请输入任务标题',
    scheduledTasksFormValidationPromptRequired: '请输入执行提示词',
    scheduledTasksFormValidationModelRequired: '请选择任务模型',
    scheduledTasksFormValidationModelUnavailable: '当前任务模型已不可用，请重新选择',
    scheduledTasksFormValidationDatetimeFuture: '执行时间必须在未来',
    scheduledTasksFormValidationIntervalPositive: '间隔时间必须大于 0',
    scheduledTasksFormValidationCronRequired: '请输入 Cron 表达式',
    scheduledTasksFormValidationPayloadMismatch:
      '主会话只能使用系统事件，隔离会话只能使用 Agent 对话',
    scheduledTasksFormValidationWebhookRequired: '请输入 Webhook URL',
    scheduledTasksFormValidationTimeout: '超时秒数必须是大于等于 0 的整数',
    scheduledTasksFormSubmitError: '保存失败：',
    scheduledTasksEdit: '编辑',
    scheduledTasksDelete: '删除',
    scheduledTasksDeleteConfirm: '确定要删除任务「{name}」吗？此操作不可撤销。',
    scheduledTasksRun: '立即运行',
    scheduledTasksStop: '停止',
    scheduledTasksEnabled: '已启用',
    scheduledTasksDisabled: '已禁用',
    scheduledTasksDetail: '任务详情',
    scheduledTasksConfiguration: '配置信息',
    scheduledTasksSchedule: '计划',
    scheduledTasksPrompt: '提示词',
    scheduledTasksWorkingDirectory: '工作目录',
    scheduledTasksSystemPrompt: '系统提示词',
    scheduledTasksExecutionMode: '执行模式',
    scheduledTasksStatus: '运行状态',
    scheduledTasksNextRun: '下次运行',
    scheduledTasksLastRun: '上次运行',
    scheduledTasksLastDuration: '上次耗时',
    scheduledTasksLastError: '最近错误',
    scheduledTasksConsecutiveErrors: '连续错误',
    scheduledTasksRunHistory: '运行历史',
    scheduledTasksNoRuns: '暂无运行记录',
    scheduledTasksLoadMore: '加载更多',
    scheduledTasksViewSession: '查看会话',
    scheduledTasksFilterStatus: '状态',
    scheduledTasksFilterStatusAll: '全部状态',
    scheduledTasksFilterStartDate: '开始日期',
    scheduledTasksFilterEndDate: '结束日期',
    scheduledTasksFilterClear: '清除筛选',
    scheduledTasksFilterNoResults: '当前筛选条件下暂无记录',
    scheduledTasksSessionNotSynced: '会话记录同步失败，请稍后重试',
    scheduledTasksSessionSyncing: '正在同步会话记录...',
    scheduledTasksSessionRetry: '重试',
    scheduledTasksStatusSuccess: '成功',
    scheduledTasksStatusError: '失败',
    scheduledTasksStatusSkipped: '跳过',
    scheduledTasksStatusRunning: '运行中',
    scheduledTasksStatusIdle: '空闲',
    scheduledTasksNotSet: '未设置',
    scheduledTasksNone: '无',
    scheduledTasksScheduleAtLabel: '定时',
    scheduledTasksScheduleIntervalLabel: '间隔',
    scheduledTasksScheduleCronLabel: 'Cron',
    scheduledTasksScheduleEvery: '每',
    scheduledTasksCronEveryDay: '每天',
    scheduledTasksCronEveryNMinutes: '每 {n} 分钟',
    scheduledTasksCronEveryMinute: '每分钟',
    scheduledTasksCronEveryNHours: '每 {n} 小时',
    scheduledTasksCronEveryHour: '每小时',
    scheduledTasksCronWeekdays: '工作日',
    scheduledTasksCronWeekends: '周末',
    scheduledTasksCronEveryWeek: '每周',
    scheduledTasksCronEveryMonth: '每月',
    scheduledTasksCronAtTime: '{schedule} {time}',
    scheduledTasksCronAtMonthDay: '{schedule} {day}日 {time}',
    scheduledTasksCronEveryHourAtMinute: '每小时第 {min} 分钟',
    scheduledTasksAutoDisabledErrors: '连续错误过多，任务已自动禁用',
    scheduledTasksCreateFailed: '创建任务失败',
    scheduledTasksUpdateFailed: '更新任务失败',
    scheduledTasksDeleteFailed: '删除任务失败',
    scheduledTasksRunFailed: '运行任务失败',
    scheduledTasksStopFailed: '停止任务失败',
    scheduledTasksFormExpiresAt: '到期时间',
    scheduledTasksFormOptional: '（可选）',
    scheduledTasksFormExpiresAtHint: '可选，到期后任务不再运行',
    scheduledTasksFormExpiresAtClear: '清除',
    scheduledTasksFormExpiresAtNone: '永不过期',
    scheduledTasksDetailExpiresAt: '到期时间',
    scheduledTasksFormNotify: 'IM 通知',
    scheduledTasksFormNotifyHint: '可选，任务完成后通过 IM 发送结果通知',
    scheduledTasksFormNotifyDingtalk: '钉钉',
    scheduledTasksFormNotifyFeishu: '飞书',
    scheduledTasksFormNotifyQq: 'QQ',
    scheduledTasksFormNotifyTelegram: 'Telegram',
    scheduledTasksFormNotifyDiscord: 'Discord',
    scheduledTasksFormNotifyNim: '云信',
    scheduledTasksFormNotifyXiaomifeng: '小蜜蜂',
    scheduledTasksFormNotifyWecom: '企业微信',
    scheduledTasksFormNotifyWeixin: '微信',
    scheduledTasksFormNotifyPopo: 'POPO',
    scheduledTasksFormNotifyNone: '无',
    scheduledTasksFormNotifyNotConfigured: '未配置',
    scheduledTasksFormDeliveryMode: '投递方式',
    scheduledTasksFormDeliveryModeNone: '不投递',
    scheduledTasksFormDeliveryModeAnnounce: '播报摘要',
    scheduledTasksFormDeliveryModeWebhook: 'Webhook',
    scheduledTasksFormDeliveryChannel: '投递频道',
    scheduledTasksFormDeliveryTo: '发送目标',
    scheduledTasksFormDeliveryToPlaceholder: '选择或输入目标 ID',
    scheduledTasksFormDeliveryToDm: '私聊',
    scheduledTasksFormDeliveryToGroup: '群聊',
    scheduledTasksFormDeliveryToAuto: '自动检测',
    scheduledTasksFormWebhookUrl: 'Webhook URL',
    scheduledTasksDetailNotify: '通知',
    scheduledTasksDetailModel: '模型',
    scheduledTasksDetailPlan: '计划',
    scheduledTasksAdvancedSchedule: '高级调度（仅可通过对话修改）',
    scheduledTasksFormNotifyChannel: '通知渠道',
    scheduledTasksFormNotifyChannelNone: '不通知',
    scheduledTasksChannelUnsupported: '暂不支持',
    scheduledTasksSessionKey: '会话键',
    scheduledTasksFormNotifyConversation: '通知会话',
    scheduledTasksFormNotifyConversationPlaceholder: '选择通知目标会话',
    scheduledTasksFormNotifyConversationLoading: '加载会话列表...',
    scheduledTasksFormNotifyConversationNone: '无可用会话',
    scheduledTasksToggleWarningAtPast: '该任务的执行时间已过，启用后将不会运行',
    scheduledTasksToggleWarningExpired: '该任务已过期，启用后将不会运行',
    scheduledTasksFormAdvancedEditAsCron: '转为可编辑 Cron',
    scheduledTasksFormPromptTemplateTitle: '快速填入场景模板',
    scheduledTasksFormPromptTemplateDailySummary: '每日总结',
    scheduledTasksFormPromptTemplateDailySummaryText:
      '请总结今天的工作进展，列出已完成的事项、遇到的问题以及明日待办清单。',
    scheduledTasksFormPromptTemplateDataCheck: '数据巡检',
    scheduledTasksFormPromptTemplateDataCheckText:
      '检查项目中的最新日志和运行状态，如发现异常请给出简要报告和修复建议。',
    scheduledTasksFormPromptTemplateCodeReview: '代码审查',
    scheduledTasksFormPromptTemplateCodeReviewText:
      '对最近提交的代码进行审查，指出潜在的 Bug、性能问题和不符合最佳实践的写法。',
    scheduledTasksFormCronModeBuilder: '可视化',
    scheduledTasksFormCronModeRaw: '表达式',
    scheduledTasksFormCronField_minute: '分钟',
    scheduledTasksFormCronField_hour: '小时',
    scheduledTasksFormCronField_dom: '日期',
    scheduledTasksFormCronField_month: '月份',
    scheduledTasksFormCronField_dow: '星期',
    scheduledTasksFormScheduleModeCronCustom: '自定义（Cron）',
    scheduledTasksFormCronInputLabel: 'Cron 表达式',
    scheduledTasksFormCronInputPlaceholder: '例如：0 9 * * 1-5（工作日早 9 点）',
    scheduledTasksFormCronInputHint: '格式：分 时 日 月 周，共 5 段',
    scheduledTasksFormCronPreview: '解析为',
    scheduledTasksFormCronPreviewInvalid: '无效的 Cron 表达式',
    scheduledTasksFormCronQuickTitle: '常用示例',
    scheduledTasksFormCronQuickEveryDay: '每天 9:00',
    scheduledTasksFormCronQuickWeekday: '工作日 9:00',
    scheduledTasksFormCronQuickEveryHour: '每小时',
    scheduledTasksFormCronQuickEvery15min: '每 15 分钟',
    scheduledTasksFormPayloadTextAgentHint: '描述你希望 AI 执行的任务，越详细效果越好',
    scheduledTasksFormCharCount: '{count} 字符',
    scheduledTasksDataAnomalyWarning:
      '定时任务「{name}」存在异常数据，已自动修正显示，建议重新编辑该任务',

    // 隐私协议弹窗
    privacyDialogTitle: '网易有道LobsterAI服务协议',
    privacyDialogDesc: '在使用网易有道LobsterAI之前，请您仔细阅读{link}内容，并进行确认。',
    privacyDialogLinkText: '网易有道LobsterAI服务协议',
    privacyDialogAccept: '我已阅读并同意',
    privacyDialogReject: '拒绝',
    welcomeTitle: '欢迎使用LobsterAI',
    welcomeSubtitle: '超多AI功能等你探索～',
    welcomePromo: '新用户限时送百万Token',
    welcomeLogin: '登录',
    welcomeCustomModel: '自定义模型',
    githubCopilotAuth: 'GitHub 账号认证',
    githubCopilotSignIn: '使用 GitHub 登录',
    githubCopilotSignOut: '退出登录',
    githubCopilotRequesting: '正在请求设备码...',
    githubCopilotEnterCode: '请在浏览器中打开以下链接，输入设备码完成授权：',
    githubCopilotWaiting: '等待授权完成...',
    githubCopilotConnected: '已连接',
    githubCopilotNoSubscription: '您没有有效的 GitHub Copilot 订阅',
    copy: '复制',

    'settings.enterprise.managed': '由企业统一管理',

    // TaskForm unsaved changes confirmation
    taskFormUnsavedChanges: '有未保存的修改',
    taskFormLeaveConfirm: '离开后修改将丢失，确认离开吗？',
    taskFormLeave: '离开',
    taskFormStay: '继续编辑',

    email: '龙虾邮箱',
    // Email Channel
    channelPrefixEmail: '邮件',
    emailSettings: '邮件设置',
    emailInstance: '邮箱账号',
    addEmailInstance: '添加邮箱账号',
    emailInstanceName: '账号名称',
    emailInstanceNamePlaceholder: '例如：工作邮箱',
    emailAddress: '邮箱地址',
    emailAddressPlaceholder: 'user@example.com',
    emailPassword: '密码',
    emailPasswordPlaceholder: '邮箱密码或应用专用密码',
    emailApiKey: 'API Key',
    emailApiKeyPlaceholder: 'ck_live_xxxxxxxx',
    apiKeyHint: '点击「获取 API Key」按钮在浏览器中完成邮箱验证',
    emailTransportMode: '传输模式',
    emailTransportImap: 'IMAP/SMTP（传统模式）',
    emailTransportWs: 'WebSocket（安全模式，无需密码）',
    emailAgentBinding: '绑定 Agent',
    emailAgentBindingHint: '该邮箱的所有邮件对话将路由到选定的 Agent',
    emailAllowFrom: '允许的发件人（白名单）',
    emailAllowFromPlaceholder: 'user@example.com, *.trusted-domain.com, *@company.com',
    emailAllowFromHint: '支持通配符，多个用逗号分隔。留空表示接受所有发件人。',
    emailAdvancedOptions: '高级选项',
    emailImapSmtpConfig: 'IMAP/SMTP 服务器配置',
    emailImapHost: 'IMAP Host',
    emailImapPort: 'IMAP Port',
    emailSmtpHost: 'SMTP Host',
    emailSmtpPort: 'SMTP Port',
    emailServerConfigHint: '留空则自动根据邮箱域名推断',
    emailReplyStrategy: '回复策略',
    emailReplyMode: '回复模式',
    emailReplyModeImmediate: '立即发送（流式，每个块一封邮件）',
    emailReplyModeAccumulated: '累积发送（流式，缓冲后一封邮件）',
    emailReplyModeComplete: '完成后发送（等待完整回复）',
    emailReplyTo: '回复范围',
    emailReplyToSender: '仅回复发件人',
    emailReplyToAll: '回复发件人 + 所有收件人',
    emailA2aConfig: 'Agent-to-Agent 配置',
    emailA2aEnabled: '启用 A2A',
    emailA2aAgentDomains: 'Agent 域名',
    emailA2aAgentDomainsPlaceholder: 'agents.example.com',
    emailA2aAgentDomainsHint: '允许进行 Agent 协作的域名，多个用逗号分隔',
    emailA2aMaxTurns: 'A2A最大往返次数',
    emailConnectivityFailAlert: '连通性测试失败，请检查配置',
    emailConnectivityAskAI: 'AI 诊断',
    emailConnected: '已连接',
    emailDisconnected: '未连接',
    emailSaveSuccess: '配置已保存',
    emailSaveError: '保存失败',
    emailValidationError: '配置验证失败',
    emailMaxInstancesExceeded: '最多支持 {count} 个邮箱账号',
    emailDuplicateEmail: '邮箱地址「{email}」重复',
    emailDuplicateInstanceId: '实例 ID「{id}」重复',
    emailInvalidEmail: '邮箱地址格式不正确',
    emailMissingPassword: '实例「{name}」使用 IMAP 模式但未填写密码',
    emailMissingApiKey: '实例「{name}」使用 WebSocket 模式但未填写 API Key',
    emailInvalidApiKey: '实例「{name}」的 API Key 格式不正确（应以 ck_ 开头）',
    emailGatewayRestarting: '正在重启 OpenClaw Gateway...',
    emailDeleteConfirm: '确定要删除邮箱账号「{name}」吗？',
    emailEnterValidEmailFirst: '请先填写有效的邮箱地址',
    emailVerifyInBrowserAndPaste: '请在浏览器中完成验证，然后将 API Key 粘贴回来',
    emailTestSuccess: '连接测试成功！',
    emailTestFailed: '连接测试失败：{error}',
    imEmailAddInstance: '添加账号',
    imEmailNoInstances: '尚未添加邮箱账号，点击下方按钮添加',
    imEmailSelectInstance: '请在左侧选择一个邮箱账号',
    emailEnabledLabel: '启用此账号',
    emailSaving: '保存中...',
    emailDeleting: '删除中...',
  },
  en: {
    // Common
    save: 'Save',
    cancel: 'Cancel',
    saving: 'Saving...',
    delete: 'Delete',
    edit: 'Edit',
    rename: 'Rename',
    create: 'Create',
    clear: 'Clear',
    show: 'Show',
    hide: 'Hide',
    add: 'Add',
    user: 'User',
    myAccount: 'Me',
    login: 'Login',
    inDevelopment: 'In development',

    // Settings
    settings: 'Settings',
    general: 'General',
    model: 'Model',
    settingsCustomModel: 'Custom Model',
    shortcuts: 'Shortcuts',
    about: 'About',
    aboutVersion: 'Version',
    aboutContactEmail: 'Contact Email',
    aboutUserManual: 'User Manual',
    aboutUserCommunity: 'User Community',
    aboutServiceTerms: 'Terms of Service',
    aboutExportLogs: 'Export Logs',
    aboutExportingLogs: 'Exporting...',
    aboutExportLogsFailed: 'Failed to export logs',
    aboutExportLogsSuccess: 'Logs exported successfully',
    aboutExportLogsPartial: 'Logs exported (missing logs were filled as empty files)',
    testMode: 'Test Mode',
    theme: 'Theme',
    appearance: 'Appearance',
    language: 'Language',
    light: 'Light',
    dark: 'Dark',
    system: 'System',
    themeColor: 'Color Themes',
    'theme-name-classic-light': 'Classic Light',
    'theme-name-classic-dark': 'Classic Dark',
    'theme-name-dawn': 'Dawn',
    'theme-name-daylight': 'Daylight',
    'theme-name-paper': 'Paper',
    'theme-name-sakura': 'Sakura',
    'theme-name-midnight': 'Midnight',
    'theme-name-ocean': 'Ocean',
    'theme-name-emerald': 'Emerald',
    'theme-name-rose': 'Rose',
    'theme-name-mocha': 'Mocha',
    'theme-name-sunset': 'Sunset',
    'theme-name-nord': 'Nord Aurora',
    'theme-name-cyber': 'Cyber Neon',
    chinese: 'Chinese',
    english: 'English',

    // API Settings
    apiKey: 'API Key',
    apiKeyPlaceholder: 'Enter your API Key',
    getApiKey: 'Get API Key',
    visitOfficialSite: 'Visit official site',
    baseUrl: 'API Base URL',
    baseUrlPlaceholder: 'Enter API Base URL',
    baseUrlHint1: 'Anthropic compatible (e.g. SiliconFlow):',
    baseUrlHintExample1: 'https://api.siliconflow.cn',
    baseUrlHint2: 'OpenAI compatible (e.g. SiliconFlow):',
    baseUrlHintExample2: 'https://api.siliconflow.cn/v1',
    currentModel: 'Current Model',
    availableModels: 'Available Models',
    modelSwitchHint: 'You can switch models in the chat interface',

    // Model Provider Settings
    enabled: 'Enabled',
    disabled: 'Disabled',
    providerStatusOn: 'on',
    providerStatusOff: 'off',
    providerSettings: 'Provider Settings',
    modelProviders: 'Model Providers',
    addModel: 'Add Model',
    editModel: 'Edit Model',
    addNewModel: 'Add New Model',
    modelName: 'Model Name',
    modelId: 'Model ID',
    modelNameAndIdRequired: 'Model name and model ID are required',
    modelIdExists: 'Model ID already exists. Use a different one',
    ollamaModelName: 'Model Name',
    ollamaModelNameHint:
      'Enter the name of a model installed in Ollama, e.g. qwen3:8b, lfm2:latest',
    ollamaModelNamePlaceholder: 'qwen3:8b',
    ollamaDisplayName: 'Display Name (optional)',
    ollamaDisplayNameHint:
      'Custom name shown in the model list. Leave empty to use the model name.',
    ollamaDisplayNamePlaceholder: 'My Qwen3 Model',
    ollamaModelNameRequired: 'Model name is required',
    lmStudioModelName: 'Model Name',
    lmStudioModelNameHint: 'Enter the name of a model loaded in LM Studio',
    lmStudioModelNamePlaceholder: 'llama-3.1-8b',
    lmStudioDisplayName: 'Display Name (optional)',
    lmStudioDisplayNameHint:
      'Custom name shown in the model list. Leave empty to use the model name.',
    lmStudioDisplayNamePlaceholder: 'My Local Model',
    lmStudioModelNameRequired: 'Model name is required',
    supportsImageInput: 'Supports image input',
    modelNameHint: 'Custom name displayed in the model list',
    modelIdHint: 'Unique model identifier used for API calls',
    supportsImageInputHint:
      'Enables image sending in conversations. Actual support depends on the model',
    contextWindow: 'Context Window',
    contextWindowHint:
      'Maximum tokens the model can process at once. A larger window fits more conversation history and documents. A smaller window may limit features. Actual supported size depends on the model itself.',
    customParams: 'Custom Params',
    customParamsHint: 'Extra parameters to pass through to the model API in JSON format, e.g. {"reasoning_effort": "high"}.',
    customParamsInvalidJson: 'Invalid JSON format. Please enter a valid JSON object.',
    imageInput: 'Image',
    modelSuffixSecure: '(Secure)',
    codingPlanSubscriptionBadge: 'Subscription',
    inputFileLabel: 'Input Files',
    imageVisionHint:
      'Image input is not enabled for the current model. Images will be sent as file paths. If the model supports vision, you can enable image input in the model configuration.',
    copied: 'Copied',
    copyrightHolder: 'NetEase Youdao. All rights reserved.',
    noModelsAvailable: 'No models available',
    addFirstModel: 'Add First Model',
    testConnection: 'Test Connection',
    connectionTestResult: 'Connection Test Result',
    testing: 'Testing...',
    connectionSuccess: 'Connection successful',
    connectionFailed: 'Connection failed',
    noModelsConfigured: 'Please add a model first',
    apiFormat: 'API Format',
    apiFormatNative: 'Anthropic Compatible',
    apiFormatOpenAI: 'OpenAI Compatible',
    apiFormatHint: 'Select protocol compatibility: Anthropic Compatible or OpenAI Compatible',
    zhipuCodingPlanHint: 'When enabled, uses the GLM Coding Plan dedicated API endpoint',
    zhipuCodingPlanEndpointHint:
      'When using GLM Coding Plan, the system will automatically switch to the dedicated Coding endpoint',
    qwenCodingPlanHint:
      'When enabled, uses the Alibaba Cloud Bailian Coding Plan dedicated API endpoint',
    qwenCodingPlanEndpointHint:
      'When using Coding Plan, you need a dedicated API Key (format: sk-sp-xxxxx)',
    qwenOAuthTab: 'OAuth Login',
    qwenOAuthLogin: 'OAuth Login',
    qwenOAuthLoginFree: 'OAuth Login',
    qwenOAuthLoggingIn: 'Logging in...',
    qwenOAuthLoggedIn: 'OAuth Logged In',
    qwenOAuthLogout: 'Logout',
    qwenOAuthTokenExpires: 'Token expires at {date}',
    qwenOAuthSuccess: 'OAuth login successful!',
    qwenOAuthFailed: 'OAuth login failed',
    qwenAuthMethod: 'Authentication Method',
    qwenApiKeyOptional: 'API Key (Optional)',
    qwenApiKeyPriority: 'sk-xxxxx (Traditional method, higher priority than OAuth)',
    qwenAuthPriorityHint:
      '💡 Authentication Priority: API Key > OAuth. If both are configured, API Key will be used first.',
    qwenOrUseApiKey: 'Or use API Key',
    volcengineCodingPlanHint:
      'When enabled, uses the Volcengine Coding Plan dedicated API endpoint',
    volcengineCodingPlanEndpointHint:
      'When using Coding Plan, the system will automatically switch to the dedicated Coding endpoint',
    moonshotCodingPlanHint: 'When enabled, uses the Moonshot Coding Plan dedicated API endpoint',
    moonshotCodingPlanEndpointHint:
      'When using Coding Plan, the system will automatically switch to the dedicated Coding endpoint',
    qianfanCodingPlanHint:
      'When enabled, uses the Baidu Qianfan Coding Plan dedicated API endpoint',
    qianfanCodingPlanEndpointHint:
      'When using Coding Plan, the system will automatically switch to the dedicated Coding endpoint',
    xiaomiCodingPlanHint: 'When enabled, uses the Xiaomi Coding Plan dedicated API endpoint',
    xiaomiCodingPlanEndpointHint:
      'When using Coding Plan, the system will automatically switch to the dedicated Coding endpoint',
    minimaxOAuthTabApiKey: 'API Key',
    minimaxAuthApiKeyDesc: 'Call directly using an API key',
    minimaxOAuthTabOAuth: 'OAuth',
    minimaxAuthOAuthDesc: 'Authorize via MiniMax Portal OAuth',
    minimaxAuthMethodLabel: 'Select auth method',
    minimaxOAuthRegionLabel: 'Region',
    minimaxOAuthRegionCN: 'China (CN)',
    minimaxOAuthRegionGlobal: 'Global',
    minimaxOAuthLogin: 'Login with MiniMax OAuth',
    minimaxOAuthLoggingIn: 'Requesting authorization code...',
    minimaxOAuthCancel: 'Cancel',
    minimaxOAuthStatusPending: 'Waiting for authorization, please complete login in browser...',
    minimaxOAuthStatusSuccess: 'OAuth login successful',
    minimaxOAuthStatusError: 'OAuth login failed',
    minimaxOAuthUserCode: 'Authorization code',
    minimaxOAuthOpenBrowserHint:
      'Browser opened, please enter the authorization code and complete login',
    minimaxOAuthLoggedIn: 'Logged in via MiniMax OAuth',
    minimaxOAuthRelogin: 'Re-login',
    minimaxOAuthLogout: 'Log out',
    minimaxOAuthHint: 'Authorize via MiniMax Portal OAuth, no need to enter API key manually',
    openaiAuthMethodLabel: 'Select auth method',
    openaiAuthApiKeyDesc: 'Call directly with an OpenAI API key',
    openaiAuthOAuthDesc: 'Use your paid ChatGPT subscription',
    openaiOAuthTabApiKey: 'API Key',
    openaiOAuthTabOAuth: 'ChatGPT',
    openaiOAuthLogin: 'Sign in with ChatGPT',
    openaiOAuthLoggingIn: 'Opening browser...',
    openaiOAuthCancel: 'Cancel',
    openaiOAuthOpenBrowserHint: 'Browser opened, please complete the ChatGPT sign-in',
    openaiOAuthStatusPending: 'Waiting for authorization, please complete sign-in in browser...',
    openaiOAuthStatusSuccess: 'Signed in with ChatGPT',
    openaiOAuthStatusError: 'ChatGPT sign-in failed',
    openaiOAuthLoggedIn: 'Signed in with ChatGPT',
    openaiOAuthRelogin: 'Re-login',
    openaiOAuthLogout: 'Sign out',
    openaiOAuthHint: 'Use your paid ChatGPT subscription to run Codex models — no API key required',
    addCustomProvider: '+ Add Custom',
    customBadge: 'Custom',
    customDisplayName: 'Display Name',
    customDisplayNamePlaceholder: 'Enter custom name...',
    deleteCustomProvider: 'Delete',
    confirmDeleteCustomProvider: 'Delete this custom model configuration?',
    import: 'Import',
    export: 'Export',
    importProvidersFailed: 'Failed to import providers',
    exportProvidersFailed: 'Failed to export providers',
    invalidProvidersFile: 'Invalid providers file',
    decryptProvidersFailed:
      'Failed to decrypt API key. Make sure the file was exported on this device.',
    decryptProvidersPartial:
      'Some keys could not be decrypted. Existing keys were kept or left blank.',

    // Password related
    password: 'Password',
    confirmPassword: 'Confirm Password',
    enterPassword: 'Enter password',
    enterPasswordAgain: 'Enter password again',
    exportPasswordTitle: 'Set Export Password',
    importPasswordTitle: 'Enter Import Password',
    exportPasswordHint:
      'This password encrypts your API keys. Use the same password when importing.',
    importPasswordHint: 'Enter the password you set when exporting',
    passwordRequired: 'Password is required',
    passwordMismatch: 'Passwords do not match',
    passwordTooShort: 'Password must be at least 4 characters',
    wrongPassword: 'Wrong password, please try again',

    // Shortcuts
    keyboardShortcuts: 'Keyboard Shortcuts',
    shortcutNotSet: 'Not set',
    newChat: 'New Task',
    search: 'Search Tasks',
    openSettings: 'Open Settings',
    restartApp: 'Restart',
    sendMessageShortcut: 'Send Message',
    shortcutConflict: 'Shortcut "{0}" is already used by "{1}"',
    shortcutSearchPlaceholder: 'Search shortcuts',
    shortcutScopeHint: 'Shortcuts only run while the LobsterAI window is focused; global shortcuts are ignored while editing text fields.',
    shortcutNoResults: 'No matching shortcuts',
    shortcutClear: 'Clear shortcut',
    shortcutEditCommand: 'Change {command} shortcut',
    shortcutPressShortcut: 'Press shortcut',
    shortcutResetAll: 'Reset all to defaults',
    shortcutGroupCowork: 'LobsterAI',
    shortcutGroupAgent: 'Agent',
    shortcutGroupNavigation: 'Navigation',
    shortcutGroupSettingsTabs: 'Settings Tabs',
    shortcutGroupApp: 'App',
    shortcutFocusPrompt: 'Focus Prompt',
    shortcutStopCurrentTask: 'Stop Current Task',
    shortcutToggleArtifacts: 'Show or Hide Artifacts Panel',
    shortcutOpenCowork: 'Open LobsterAI',
    shortcutOpenScheduledTasks: 'Open Scheduled Tasks',
    shortcutOpenKits: 'Open Kits',
    shortcutOpenSkills: 'Open Skills',
    shortcutOpenMcp: 'Open MCP Servers',
    shortcutToggleSidebar: 'Show or Hide Sidebar',
    shortcutShowShortcuts: 'Open Shortcut Settings',
    shortcutPreviousAgent: 'Previous Agent',
    shortcutNextAgent: 'Next Agent',
    shortcutShowCurrentAgentTasks: 'Show Current Agent Tasks',
    shortcutOpenAgentTaskSlot: 'Open Current Agent Task {slot}',
    shortcutOpenSettingsTab: 'Open Settings: {tab}',
    shortcutDescNewChat: 'Start a new LobsterAI task',
    shortcutDescFocusPrompt: 'Return to LobsterAI and focus the current prompt',
    shortcutDescStopCurrentTask: 'Stop the running Cowork task',
    shortcutDescSearch: 'Search and open task history',
    shortcutDescToggleArtifacts: 'Show or hide the preview side panel in the current session',
    shortcutDescSendMessage: 'Choose which key sends the prompt input message',
    shortcutDescOpenCowork: 'Switch to the LobsterAI task view',
    shortcutDescOpenScheduledTasks: 'Switch to the scheduled tasks view',
    shortcutDescOpenKits: 'Switch to the kits view',
    shortcutDescOpenSkills: 'Switch to the skills view',
    shortcutDescOpenMcp: 'Switch to the MCP servers view',
    shortcutDescToggleSidebar: 'Collapse or expand the left navigation sidebar',
    shortcutDescSettings: 'Open app settings',
    shortcutDescShowShortcuts: 'Open the shortcuts tab in settings directly',
    shortcutDescPreviousAgent: 'Switch to the previous agent in the sidebar',
    shortcutDescNextAgent: 'Switch to the next agent in the sidebar',
    shortcutDescShowCurrentAgentTasks: 'Expand the current agent task history',
    shortcutDescOpenAgentTaskSlot: 'Open task {slot} in the current agent history list',
    shortcutDescOpenSettingsTab: 'Switch to the {tab} tab in settings',
    shortcutAgentTaskSlotUnavailable: 'The current agent does not have task {slot}',
    close: 'Close',
    loginNotAvailable: 'Login is not available yet',
    collapse: 'Collapse',
    expand: 'Expand',
    featureInDevelopment: 'In development',

    // Auth
    authDailyQuota: 'Daily Quota',
    authCreditsQuota: 'Credits',
    authTopUp: 'Top Up',
    authSubscribe: 'Subscribe',
    authCurrentPlan: 'Current Plan',
    authLogout: 'Log Out',
    authLoginRequired: 'Please log in to start a conversation.',
    authLoginRequiredBtn: 'Log In',
    authQuotaExhausted:
      'Daily free quota exhausted. Visit LobsterAI Portal to purchase a plan or credits, or configure your own API Key in Settings.',
    authTopUpLink: 'Top Up',
    authSettingsLink: 'Settings',
    authLoginToChat: 'Log in to start chatting',
    authFreeLabel: 'Free',
    authCreditsRemaining: 'Credits Remaining',
    authCreditsUnit: 'credits',
    authExpiresAt: 'Expires',
    authLearnMore: 'Learn More',
    authValueAddedServices: 'Premium Services',
    authUsageOverview: 'Usage Overview',
    authGoRecharge: 'Top Up',
    authInviteFriendsForCredits: 'Invite Friends',
    authZeroCredits: '0 credits',
    planFree: 'Free',
    planStandard: 'Standard',
    planAdvanced: 'Advanced',
    planPro: 'Pro',

    // Error Messages
    failedToLoadSettings: 'Failed to load settings',
    failedToSaveSettings: 'Failed to save settings',

    // Loading State
    loading: 'Loading...',

    // Sidebar
    conversations: 'Conversations',
    noConversations: 'No conversations',
    createNewChat: 'New Chat',
    deleteConversation: 'Delete Conversation',
    renameConversation: 'Rename',
    moveToProject: 'Move to project',
    pinConversation: 'Pin chat',
    unpinConversation: 'Unpin chat',
    noProject: 'No project',
    noProjects: 'No projects',
    confirmDelete: 'Confirm Delete',
    confirmDeleteMessage:
      'Are you sure you want to delete this conversation? This action cannot be undone.',
    searchChats: 'Search Chats',
    searchConversations: 'Search tasks...',
    searchRecentTasks: 'Recent tasks',
    searchNoResults: 'No matching tasks',
    projects: 'Projects',
    yourChats: 'Your Chats',
    createProject: 'New Project',
    projectNamePlaceholder: 'Project name',
    projectColorLabel: 'Color',
    projectIconLabel: 'Icon',
    project: 'Project',
    projectHistory: 'History',
    projectPrompt: 'Prompt',
    projectPromptPlaceholder: 'Add a prompt for this project',
    projectSettings: 'Project settings',
    projectNameLabel: 'Project name',
    deleteProject: 'Delete project',
    confirmDeleteProject:
      'Are you sure you want to delete this project? Chats in this project will be moved to your chat list. This action cannot be undone.',
    folderIconDefault: 'Default',
    folderIconHealth: 'Health',
    folderIconStudy: 'Study',
    folderIconMath: 'Math',
    folderIconWork: 'Work',
    folderIconCode: 'Code',
    folderIconIdea: 'Ideas',

    // Chat Window
    sendMessage: 'Send Message',
    typeMessage: 'Type a message...',
    quickPrompt: 'Ask anything...',
    regenerateResponse: 'Regenerate Response',
    copyToClipboard: 'Copy to Clipboard',
    coworkReEdit: 'Re-edit',
    coworkSelectedTextAddToChat: 'Add to chat',
    coworkSelectedTextSnippetCount: '{count} selected text excerpt(s)',
    coworkSelectedTextRemove: 'Remove text excerpt',
    coworkSelectedTextInvalid: 'Unable to add this text excerpt',
    coworkSelectedTextTooLong: 'Each text excerpt can contain up to 4000 characters',
    coworkSelectedTextTooMany: 'You can add up to 8 text excerpts',
    coworkSelectedTextTotalTooLong: 'Selected text excerpts can contain up to 12000 characters in total',
    coworkSelectedTextDuplicate: 'This text excerpt has already been added',
    coworkSelectedTextSourceUnavailable: 'The source message is not currently visible',
    coworkSelectedTextArtifactMarkdownSource: 'Markdown file excerpt',
    coworkSelectedTextArtifactTextSource: 'Text file excerpt',
    coworkSelectedTextExportHeading: 'Selected Text Excerpts',
    messageCopied: 'Message copied',
    copyFailed: 'Copy failed',
    // Code block search panel
    codeSearchFind: 'Find',
    codeSearchReplace: 'Replace',
    codeSearchNext: 'next',
    codeSearchPrev: 'previous',
    codeSearchAll: 'all',
    codeSearchMatchCase: 'match case',
    codeSearchRegexp: 'regexp',
    codeSearchNoMatch: 'no results',
    codeSearchReplaceOne: 'replace',
    codeSearchReplaceAll: 'replace all',
    codeSearchClose: 'close',
    saveToFile: 'Save to file',
    fileSaved: 'File saved',
    codeBlockCollapse: 'Collapse code',
    codeBlockExpand: 'Expand code',
    codeBlockSearch: 'Search in code (Cmd+F)',
    codeBlockSearchClose: 'Close search',
    codeBlockWordWrap: 'Enable word wrap',
    codeBlockWordWrapOff: 'Disable word wrap',
    codeBlockFullscreen: 'Expand view',
    codeBlockFullscreenExit: 'Exit expanded view',
    clearConversation: 'Clear Conversation',
    confirmClearConversation:
      'Are you sure you want to clear the current conversation? This action cannot be undone.',
    today: 'Today',
    yesterday: 'Yesterday',
    daysAgo: 'days ago',
    justNow: 'Just now',
    minutesAgo: 'minutes ago',
    hoursAgo: 'hours ago',
    welcomeMessage: 'How can I help you today?',
    thinking: 'Thinking...',
    reasoning: 'Reasoning',
    editMessage: 'Edit message',
    emptyMessage: 'Empty message',
    artifactOpen: 'Open',
    artifactView: 'View',
    artifactViewing: 'Viewing',
    artifactPreview: 'Preview',
    artifactCode: 'Source',
    artifactNoContent: 'No content',
    artifactSourceLoading: 'Loading source...',
    artifactSourceLoadFailed: 'Failed to load source',
    artifactSourceTruncated: 'Large file, showing the first {size}',
    markdownLargePreviewNotice: 'Large content, showing a lightweight preview',
    artifactPanelToggle: 'Artifacts',
    artifactDownload: 'Download',
    artifactOpenFolder: 'Open in Folder',
    artifactOpenInBrowser: 'Open in Browser',
    artifactCopyCode: 'Copy',
    artifactRefresh: 'Refresh',
    artifactActionsMenu: 'More actions',
    htmlShare: 'Share',
    htmlShareScanning: 'Scanning...',
    htmlSharePacking: 'Packing...',
    htmlShareUploading: 'Sharing...',
    htmlShareViewHint: 'The share link is ready.',
    htmlShareSuccess: 'Share created',
    htmlShareSuccessMessage: 'The share link is ready. You can copy the details for the selected access mode.',
    htmlShareFailed: 'Share failed',
    htmlShareCreateDialogTitle: 'Create share',
    htmlShareCreateAction: 'Create share',
    htmlShareManageDialogTitle: 'Share settings',
    htmlShareExistingShareMessage: 'This file is already shared. Copy the share details, or update the share.',
    htmlShareAccessMode: 'Access mode',
    htmlShareAccessModeCode: 'Share code',
    htmlShareAccessModeCodeHint: 'Viewers need the link and share code.',
    htmlShareAccessModePublic: 'Public',
    htmlShareAccessModePublicHint: 'Anyone with the link can view without a code.',
    htmlShareCodeViewHint: 'This share requires a share code. Viewers need the link and code.',
    htmlSharePublicViewHint: 'This share is public. Anyone with the link can view without a code.',
    htmlShareAccessModeUpdateAction: 'Update access mode',
    htmlShareAccessModeUpdating: 'Updating...',
    htmlShareAccessModeUpdateFailed: 'Failed to update access mode.',
    htmlShareAccessModeUpdateComplete: 'Access mode updated.',
    htmlShareUpdateFile: 'Update file',
    htmlShareUpdate: 'Update',
    htmlShareUpdatingFile: 'Updating...',
    htmlShareUpdateComplete: 'Update complete',
    htmlShareUpdated: 'Share updated',
    htmlShareUpdatedMessage: 'The share has been updated. You can copy the link and code here.',
    htmlShareUpdatedClosedMessage: 'The share has been updated and closed.',
    htmlShareLink: 'Share link',
    htmlShareClipboardLinkLabel: 'Link',
    htmlShareCode: 'Share code',
    htmlShareCopyLink: 'Copy link',
    htmlShareCopyLinkAndCode: 'Copy link and code',
    htmlShareCopyAll: 'Copy all',
    htmlShareOpenLink: 'Open link',
    htmlShareUpdateShare: 'Update share',
    htmlShareStopSharing: 'Stop sharing',
    htmlShareStartSharing: 'Open sharing',
    htmlShareAvailability: 'Share access',
    htmlShareAvailabilityOpenHint: 'When open, people can view it with the current access mode.',
    htmlShareAvailabilityClosedHint: 'When closed, other people cannot access it.',
    htmlShareCurrentStatus: 'Current status',
    htmlShareStatusLive: 'Open',
    htmlShareStatusDisabled: 'Closed',
    htmlShareStatusFailed: 'Failed',
    htmlShareStatusUpdating: 'Updating...',
    htmlShareStatusUpdateFailed: 'Failed to update share access.',
    htmlShareStoppedNotice: 'This share is stopped',
    htmlShareResultStatusDisabled: 'Share closed',
    htmlShareResultStatusFailed: 'Failed',
    htmlShareCodeUnavailable: 'The legacy share code cannot be shown again. Update the share to generate a new code.',
    htmlShareReopenUnavailable: 'This share cannot be reopened.',
    htmlShareActiveLimitReached: 'The active share limit has been reached. Close another share first.',
    htmlShareDisabledCannotUpdate: 'This share is closed, so its content cannot be updated. Open the share first.',
    htmlShareLoginRequiredTitle: 'Log in and subscribe to share content',
    htmlShareLoginRequiredMessage:
      'Sharing is available to subscribers. Log in and subscribe to continue.',
    htmlShareSubscriptionRequiredTitle: 'Subscribe to share content',
    htmlShareSubscriptionRequiredMessage:
      'Sharing requires an active subscription. After subscribing, you can create links with share-code or public access.',
    htmlShareOpenSubscription: 'View subscription',
    htmlShareUnavailableInProduction: 'Sharing is currently unavailable.',
    artifactShareSourceUnavailable: 'The current preview has no shareable file or content.',
    artifactShareSvgRejected: 'The SVG contains unsafe content and cannot be shared.',
    artifactCloseTab: 'Close tab',
    artifactAddTab: 'Add tab',
    artifactOpenFileTab: 'Open file',
    artifactBrowserTab: 'Browser',
    artifactBrowserBack: 'Back',
    artifactBrowserForward: 'Forward',
    artifactBrowserReload: 'Reload',
    artifactBrowserStop: 'Stop',
    artifactBrowserScreenshot: 'Screenshot',
    artifactBrowserScreenshotCopied: 'Screenshot copied',
    artifactBrowserScreenshotFailed: 'Screenshot failed',
    artifactBrowserAnnotate: 'Annotate',
    artifactBrowserAnnotating: 'Annotating',
    artifactBrowserAnnotationInstruction: 'Hover an element, click it, then enter a note',
    artifactBrowserAnnotationPlaceholder: 'Enter annotation',
    artifactBrowserAnnotationSend: 'Send',
    artifactBrowserAnnotationCancel: 'Cancel',
    artifactBrowserAnnotationLabelTag: 'Tag',
    artifactBrowserAnnotationLabelSize: 'Size',
    artifactBrowserAnnotationLabelColor: 'Color',
    artifactBrowserAnnotationLabelFont: 'Font',
    artifactBrowserAnnotationPromptTitle:
      'Please handle the note for the area highlighted by the blue rectangle border in the browser screenshot:',
    artifactBrowserAnnotationPromptTarget:
      'The blue rectangle marks the page element or area currently annotated by the user. Prioritize the content inside the blue box and use surrounding page context to infer intent.',
    artifactBrowserAnnotationPromptScreenshot: 'Screenshot size',
    artifactBrowserAnnotationPromptArea: 'Annotation area',
    artifactBrowserAnnotationPromptPage: 'Page',
    artifactBrowserAnnotationPromptElement: 'Element',
    artifactBrowserAnnotationPromptComment: 'User note',
    artifactBrowserAnnotationImageName: 'Browser annotation screenshot',
    artifactBrowserOpenExternal: 'Open in browser',
    artifactBrowserUrlPlaceholder: 'Enter URL',
    artifactBrowserEmpty: 'Enter a URL to start browsing',
    artifactBrowserLocalServices: 'Local',
    artifactBrowserLocalServicesRefresh: 'Refresh local services',
    artifactBrowserLocalServicesLoading: 'Scanning local services',
    artifactBrowserLocalServicesEmpty: 'No local web services found',
    artifactBrowserLocalServiceOnline: 'Service online',
    artifactBrowserMenu: 'Browser menu',
    artifactBrowserExpandPanel: 'Expand panel',
    artifactBrowserRestorePanelWidth: 'Restore panel width',
    artifactBrowserHideInput: 'Hide input',
    artifactBrowserShowInput: 'Show input',
    coworkExpandedConversationPreviewLatest: 'Latest',
    coworkExpandedConversationPreviewMessages: 'Conversation',
    coworkExpandedConversationPreviewExpand: 'Expand conversation preview',
    coworkExpandedConversationPreviewCollapse: 'Collapse conversation preview',
    coworkExpandedConversationPreviewEmpty: 'No conversation yet',
    coworkExpandedConversationStatusRunning: 'Running',
    artifactBrowserBlankPage: 'Blank page',
    artifactBrowserShowDeviceToolbar: 'Show device toolbar',
    artifactBrowserHideDeviceToolbar: 'Hide device toolbar',
    artifactBrowserDeviceSize: 'Size:',
    artifactBrowserDevicePreset: 'Device preset',
    artifactBrowserDeviceResponsive: 'Responsive',
    artifactBrowserDeviceLaptop: 'Laptop',
    artifactBrowserDeviceWidth: 'Width',
    artifactBrowserDeviceHeight: 'Height',
    artifactBrowserDeviceRotate: 'Rotate',
    artifactBrowserDeviceScale: 'Device scale',
    artifactBrowserZoom: 'Zoom',
    artifactBrowserZoomOut: 'Zoom out',
    artifactBrowserZoomIn: 'Zoom in',
    artifactBrowserResetZoom: 'Reset zoom',
    artifactBrowserClearCookies: 'Clear Cookie',
    artifactBrowserClearCache: 'Clear cache',
    artifactBrowserCookiesCleared: 'Cookie cleared',
    artifactBrowserCacheCleared: 'Cache cleared',
    artifactBrowserClearCookiesFailed: 'Failed to clear Cookie',
    artifactBrowserClearCacheFailed: 'Failed to clear cache',
    artifactNoPreview: 'No preview available',
    artifactImageAlt: 'Image',
    artifactFiles: 'Files',
    artifactFileList: 'File List',
    artifactEmptyFiles: 'No files in this session',
    artifactSearchPlaceholder: 'Search files...',
    artifactSearchEmpty: 'No matching files',
    artifactTypeHtml: 'Website',
    artifactTypeSvg: 'SVG Image',
    artifactTypeImage: 'Image',
    artifactTypeVideo: 'Video',
    artifactTypeMermaid: 'Mermaid Diagram',
    artifactTypeReact: 'React Component',
    artifactTypeMarkdown: 'Markdown Document',
    artifactTypeText: 'Text File',
    artifactTypeDocument: 'Document',
    artifactOpenWithApp: 'Open with System App',
    artifactOpenInFolder: 'Reveal in Folder',
    artifactDocumentLoading: 'Loading document...',
    artifactDocumentError: 'Failed to load document',
    artifactVideoLoading: 'Loading video...',
    artifactVideoError: 'Failed to load video',
    artifactSheetTab: 'Sheet',
    artifactShowingRows: 'Showing {shown} of {total} rows',
    artifactResizeColumn: 'Resize column',
    artifactRowCount: 'rows',
    artifactPdfPageCount: 'pages',
    artifactSlideCount: '{count} slides',
    artifactPptxThumbnailHint: 'First slide preview. Click to open full file.',
    artifactSlideLabel: 'Slide {n}',
    artifactSlideNoText: '(No text content)',
    artifactTableView: 'Table View',
    artifactTextView: 'Text View',
    imageLimitReached: 'Up to 10 images',
    imageReadError: 'Failed to read image',
    imageInputNotSupported: 'Current model does not support images',
    localFileNotFound: 'The file does not exist. It may have been moved or deleted.',
    localFilePermissionDenied: 'You do not have permission to open this file.',

    // Model Selection
    selectModel: 'Select Model',

    // Error Messages
    errorOccurred: 'An error occurred',
    tryAgain: 'Please try again',
    networkError: 'Network error',
    apiKeyRequired: 'API Key Required',
    configureApiKey: 'Please configure your API key in settings',

    // Initialization
    initializationError: 'Failed to initialize application. Please check your configuration.',
    apiKeyNotConfigured: 'API key not configured. Please set up your API key in settings.',

    // LobsterAI
    cowork: 'LobsterAI',
    coworkSettings: 'LobsterAI Settings',
    coworkHistory: 'Task History',
    coworkNoSessions: 'No tasks yet',
    coworkNoSessionsHint: 'Start your first conversation in the input box',
    coworkPinSession: 'Pin task',
    coworkUnpinSession: 'Unpin task',
    coworkSessionActions: 'More actions',
    coworkPlaceholder: 'Assign a task or ask any question',
    coworkWorkingDirectory: 'Working Directory',
    coworkWorkingDirectoryPlaceholder: 'Enter project path',
    coworkWorkingDirectoryHint: 'LobsterAI will execute commands in this directory',
    coworkSystemPrompt: 'System Prompt',
    coworkSystemPromptPlaceholder: 'Set custom instructions for LobsterAI...',
    coworkSystemPromptHint: "Optional system prompt to customize LobsterAI's behavior",
    coworkModelSettingsRequired: 'Please configure models and API keys in Model Settings first.',
    coworkModelSettingsTitle: 'Model Settings',
    coworkModelSettingsHint:
      'LobsterAI uses the current model and provider configuration from Model Settings.',
    coworkModelSettingsAction: 'Go to Model Settings',
    modelGroupServer: 'Plan Models',
    modelGroupUser: 'Custom Models',
    modelSelectorCurrentModel: 'In use',
    modelSelectorLockedOverlay: 'Subscribe or purchase a booster pack to unlock more models',
    modelSelectorLockedModelHint: 'Log in and subscribe or purchase a booster pack before selecting plan models',
    modelSelectorLoginTitle: 'Plan Models',
    modelSelectorLoginDesc: 'Log in and subscribe or purchase a booster pack to use plan models',
    modelSelectorLoginBtn: 'Log in',
    modelSelectorSubscribeTitle: 'Plan Models',
    modelSelectorSubscribeDesc: 'Subscribe or purchase a booster pack to unlock more models',
    modelSelectorSubscribeBtn: 'Purchase',
    modelSelectorLearnMore: 'Learn about subscription',
    modelSupportsImageInputBadge: 'Reads images',
    modelSupportsThinkingBadge: 'Deep thinking',
    modelCostMultiplierLabel: 'Cost multiplier: ',
    mediaTierSpecLabel: 'Spec',
    mediaMillionTokensUnit: '1M tokens',
    mediaTokenPricingTextInput: 'Text input',
    mediaTokenPricingImageInput: 'Image input',
    mediaTokenPricingCachedInput: 'Cached input',
    mediaTokenPricingCachedImageInput: 'Cached image input',
    mediaTokenPricingTextOutput: 'Text output',
    mediaTokenPricingImageOutput: 'Image output',
    mediaTokenPricingThinkingOutput: 'Thinking output',
    mediaTokenBillingEstimateNote: 'Billed by actual tokens. List price is the estimate for the default 1-image output.',
    modelSelectorNoModels: 'Please configure models in settings first',
    coworkApiConfigTitle: 'API Configuration',
    coworkApiConfigHint:
      'Supports Anthropic-compatible and OpenAI-compatible APIs (OpenAI compatibility is bridged by a local adapter).',
    coworkAgentEngine: 'Agent Engine',
    coworkAgentEngineOpenClaw: 'OpenClaw (Default)',
    coworkAgentEngineOpenClawHint: 'Personal AI assistant',
    openClawRuntimeStatusTitle: 'Runtime status',
    openClawGatewayAddress: 'Gateway address',
    openClawStartupProgressLabel: 'Startup progress',
    openClawStatusBadgeReady: 'Ready',
    openClawStatusBadgeRunning: 'Running',
    openClawStatusBadgeStarting: 'Starting',
    openClawStatusBadgeInstalling: 'Installing',
    openClawStatusBadgeError: 'Error',
    openClawStatusBadgeNotInstalled: 'Not installed',
    settingsSavedButOpenClawSyncFailed:
      'Settings were saved locally, but applying them to the running OpenClaw environment failed. Please save again or restart OpenClaw.',
    openClawSessionKeepAlive: 'Session continuity',
    openClawSessionKeepAliveHint:
      'Determines how long a conversation can stay continuously idle before it is treated as a new session. As long as the gap does not exceed this duration, the existing context will continue to be used. Longer durations preserve more context, but may also increase token usage.',
    openClawSessionKeepAliveOneDay: '24 hours',
    openClawSessionKeepAliveSevenDays: '7 days',
    openClawSessionKeepAliveThirtyDays: '30 days (Recommended)',
    openClawSessionKeepAliveOneYear: '1 year',
    coworkAgentEngineClaudeLegacy: 'Cowork',
    coworkAgentEngineClaudeLegacyHint:
      'Built-in engine, ready out of the box, recommended for daily tasks.',
    coworkOpenClawInstall: 'Start OpenClaw',
    coworkOpenClawRetryInstall: 'Retry OpenClaw Startup',
    coworkOpenClawStart: 'Start OpenClaw',
    coworkOpenClawInstalling: 'Starting OpenClaw...',
    coworkOpenClawInstallHint:
      'OpenClaw runtime is bundled. Switching to this engine or starting a task will auto-start the gateway.',
    coworkOpenClawGoToSettingsInstall: 'View Engine Settings',
    coworkOpenClawRestartGateway: 'Restart Gateway',
    coworkOpenClawNotInstalledNotice:
      'Bundled OpenClaw runtime (cfmind) was not found. Build the runtime before packaging.',
    coworkOpenClawReadyNotice:
      'OpenClaw runtime is ready. The gateway will auto-start when you run a task.',
    coworkOpenClawStarting: 'AI engine is starting the gateway...',
    coworkOpenClawRunning: 'OpenClaw engine is ready',
    engineStartingTitle: 'Starting AI engine',
    engineStartingSlowHint: 'First launch prepares the runtime environment and may take 1-2 minutes',
    engineStartingTipLabel: 'Tip',
    engineStartingTip1: 'Ask AI for HTML, SVG, or Mermaid diagrams — the side panel previews them live',
    engineStartingTip2: 'Enable Word, Excel, and PPT skills in Skills, and AI can generate office documents for you',
    engineStartingTip3: 'Use Scheduled Tasks to have AI run routine work automatically at fixed times',
    engineStartingTip4: 'Connect WeChat, Feishu, DingTalk and more to summon AI right from your IM apps',
    engineStartingTip5: 'Tell AI to "remember..." and it saves key facts to long-term memory for future chats',
    engineStartingTip6: 'AI asks for your approval before sensitive operations, so you stay in control',
    coworkOpenClawError: 'OpenClaw gateway failed to become healthy in time.',
    openClawMaintenanceTitle: 'Run Maintenance',
    openClawRepairGatewayStateTitle: 'Repair Startup',
    openClawRepairGatewayStateDesc: 'Back up and rebuild the OpenClaw config, then restart the gateway.',
    openClawRepairConfirmTitle: 'Repair OpenClaw startup?',
    openClawRepairConfirmDesc:
      'The app will stop the current gateway, back up openclaw.json, regenerate the config, and start the gateway.',
    openClawRepairConfirmSafeDesc:
      'Chat history, model settings, skills, and workspace files will not be deleted.',
    openClawRepairConfirmAction: 'Start Repair',
    openClawRepairRunning: 'Repairing...',
    openClawRepairSuccess: 'Repair completed. The gateway started with regenerated config.',
    openClawRepairSuccessNoBackup:
      'No old config file was found. The config was regenerated and the gateway started.',
    openClawRepairBackupPath: 'Backup file',
    openClawRepairFailed: 'Failed to repair startup. Try again or restart the gateway manually.',
    openClawRepairBusyError:
      'Agent tasks or scheduled tasks are still running. Stop them before repairing.',
    openClawRepairConfigApplyPendingError:
      'OpenClaw is still applying configuration changes. Try repairing again shortly.',
    openClawRepairApiUnavailable: 'The repair API is unavailable. Restart the app and try again.',
    openClawDataBackupTitle: 'Data Backup',
    openClawDataBackupDesc:
      'Back up login state, task records, model settings, skills, memory, and OpenClaw state. Project folders are not included.',
    openClawDataBackupAction: 'Back Up Data',
    openClawDataBackupRunning: 'Backing up...',
    openClawDataBackupSuccess: 'Data backup was saved.',
    openClawDataBackupFailed: 'Failed to back up data. Please try again.',
    openClawDataBackupSavedTitle: 'Backup file saved',
    openClawDataBackupSize: 'Size',
    openClawDataBackupBlockingTitle: 'Backing up LobsterAI data',
    openClawDataBackupBlockingDesc:
      'The app is temporarily locked while the backup is running. Wait for the backup to finish before continuing.',
    openClawDataBackupBlockingWarning:
      'Do not close the app. Closing it will interrupt the backup and may leave an incomplete backup file.',
    openClawDataMigrationTitle: 'Data Migration',
    openClawDataMigrationDesc: 'Import a backup exported from another machine and replace current app data.',
    openClawDataMigrationAction: 'Import Backup',
    openClawDataMigrationRunning: 'Importing...',
    openClawDataMigrationSuccess: 'Data migration completed.',
    openClawDataMigrationFailed: 'Data migration failed',
    openClawDataMigrationRestarting: 'Backup file selected. The app will restart and import the data.',
    openClawDataMigrationBlockingTitle: 'Preparing to import LobsterAI data',
    openClawDataMigrationBlockingDesc:
      'The app is temporarily locked during import preparation. After you choose a backup file, the app will restart and finish the import.',
    openClawDataMigrationBlockingWarning:
      'Do not close the app. Closing it will interrupt import preparation and may require choosing the backup file again.',
    openClawDataMigrationConfirmTitle: 'Import LobsterAI data backup?',
    openClawDataMigrationConfirmDesc:
      'Importing replaces current app data, including login state, sessions, settings, skills, memory, and OpenClaw state.',
    openClawDataMigrationConfirmSafeDesc:
      'The app creates a rollback backup first, then restarts to finish the import. Project folders are not overwritten by the import package.',
    openClawDataMigrationConfirmAction: 'Choose Backup and Import',
    openClawMaintenanceComingSoon: 'Coming soon',
    coworkMemoryTitle: 'Memory',
    coworkBootstrapIdentityTitle: 'Assistant Identity',
    coworkBootstrapIdentityHint: 'Define who the assistant is — name, role, and capabilities.',
    coworkBootstrapUserTitle: 'About You',
    coworkBootstrapUserHint:
      'Information about yourself (name, preferences, etc.) that the assistant will remember.',
    coworkBootstrapSoulTitle: 'Assistant Personality',
    coworkBootstrapSoulHint:
      'Assistant personality, tone, and behavior guidelines. The assistant will be instructed to follow this.',
    coworkBootstrapPlaceholder: 'Supports Markdown. Write in any language.',
    coworkBootstrapSaveFailed: 'Failed to save agent settings',
    coworkMemoryEnabled: 'Enable user memories',
    coworkMemoryEnabledHint:
      'OpenClaw automatically indexes MEMORY.md for long-term memory retrieval by the Agent.',
    coworkMemoryFilePath: 'Memory file path',
    coworkMemoryLlmJudgeEnabled: 'Enable LLM secondary judge',
    coworkMemoryLlmJudgeEnabledHint:
      'Only borderline rule cases are reviewed by the model for better accuracy (adds a small number of API calls).',
    coworkMemoryLegacyNotice: 'OpenClaw engine mode is active. This page only applies to Cowork.',
    coworkMemoryAutoWrite: 'Auto-write memory',
    coworkMemoryCaptureEachTurn: 'Enable implicit updates',
    coworkMemoryGuardLevel: 'Write guard level',
    coworkMemoryGuardStrict: 'Strict',
    coworkMemoryGuardStandard: 'Standard',
    coworkMemoryGuardRelaxed: 'Relaxed',
    coworkMemoryMaxResults: 'Max injected items',
    coworkMemoryMaxResultsHint: 'Range: 1-60, recommended: 12',
    coworkMemoryMinScore: 'Minimum relevance threshold',
    coworkMemoryMaxInjectChars: 'Max injected characters',
    coworkMemoryRecallInterval: 'Auto recall interval (turns)',
    coworkMemoryRecallIntervalHint: 'Inject memory every N turns, recommended: 3',
    coworkMemoryCrudTitle: 'Managed memory entries',
    coworkMemoryManageHint: 'View, search, add, edit, and delete memory entries here.',
    coworkMemoryTotalLabel: 'Total',
    coworkMemoryActiveLabel: 'Active',
    coworkMemoryInactiveLabel: 'Inactive',
    coworkMemoryStatusActive: 'Active',
    coworkMemoryStatusInactive: 'Inactive',
    coworkMemoryStatusDeleted: 'Deleted',
    coworkMemoryUpdatedAt: 'Updated',
    coworkMemoryEditingTag: 'Editing selected memory',
    coworkMemoryRebuildIndex: 'Rebuild index',
    coworkMemoryRebuildSuccess: 'Memory index rebuilt',
    coworkMemoryRebuildFailed: 'Failed to rebuild memory index',
    coworkMemoryStatsSummary: 'Managed entries',
    coworkMemorySearchPlaceholder: 'Search memory text/source',
    coworkMemoryCategoryAll: 'All categories',
    coworkMemoryEmpty: 'No memory entries yet',
    coworkMemoryCrudTextPlaceholder: 'Enter memory text',
    coworkMemoryCrudContentLabel: 'Memory content',
    coworkMemoryCrudCreate: 'Create entry',
    coworkMemoryCrudUpdate: 'Update entry',
    coworkMemoryCrudSaveFailed: 'Failed to save memory entry',
    coworkMemoryCrudDeleteFailed: 'Failed to delete memory entry',
    coworkMemoryAdvancedShow: 'Show advanced settings',
    coworkMemoryAdvancedHide: 'Hide advanced settings',
    coworkMemoryEmbeddingEnabled: 'Enable embedding semantic search',
    coworkMemoryEmbeddingEnabledHint:
      'Rerank lexical hits with vector similarity for better recall quality',
    coworkMemoryEmbeddingModel: 'Embedding model',
    coworkMemoryEmbeddingModelHint:
      'Leave empty to use the provider default. e.g. OpenAI defaults to text-embedding-3-large, Gemini to gemini-embedding-001',
    coworkMemoryEmbeddingLocalModelPath: 'Local model path (optional)',
    coworkMemoryEmbeddingLocalModelPathHint:
      'If set, load model from this directory first; if empty, load by model id',
    coworkMemoryEmbeddingAutoDownload: 'Allow auto model download',
    coworkMemoryEmbeddingAutoDownloadHint: 'When disabled, you must provide a local model path',
    coworkMemoryEmbeddingDownload: 'Download / Validate model',
    coworkMemoryEmbeddingDownloading: 'Downloading...',
    coworkMemoryEmbeddingDownloadHint:
      'Manually trigger model download (or validate local path). This can take a while, wait for progress to finish',
    coworkMemoryEmbeddingDownloadSuccess: 'Embedding model is ready',
    coworkMemoryEmbeddingDownloadFailed: 'Failed to download embedding model',
    coworkMemoryEmbeddingProgressPreparing: 'Preparing download task',
    coworkMemoryEmbeddingProgressInit: 'Initializing',
    coworkMemoryEmbeddingProgressDownload: 'Downloading model files',
    coworkMemoryEmbeddingProgressLoad: 'Loading model',
    coworkMemoryEmbeddingProgressEncode: 'Warming up model',
    coworkMemoryEmbeddingProgressDone: 'Completed',
    coworkMemoryEmbeddingProgressError: 'Failed',
    coworkMemoryEmbeddingWeight: 'Semantic rerank weight',
    coworkMemoryEmbeddingWeightHint:
      'Range 0-1. Higher means more embedding influence. Recommended: 0.62',
    coworkMemoryEmbeddingProvider: 'Embedding provider',
    coworkMemoryEmbeddingProviderHint: 'Choose how embeddings are computed',
    coworkMemoryEmbeddingProviderLocal: 'Local (GGUF)',
    coworkMemoryEmbeddingProviderOpenai: 'OpenAI',
    coworkMemoryEmbeddingProviderGemini: 'Gemini',
    coworkMemoryEmbeddingProviderVoyage: 'Voyage',
    coworkMemoryEmbeddingProviderMistral: 'Mistral',
    coworkMemoryEmbeddingProviderOllama: 'Ollama',
    coworkMemoryEmbeddingRemoteBaseUrl: 'API Base URL',
    coworkMemoryEmbeddingRemoteBaseUrlHint:
      'Base URL only — do not include /embeddings path. e.g. https://api.openai.com/v1',
    coworkMemoryEmbeddingRemoteApiKey: 'API Key',
    coworkMemoryEmbeddingRemoteApiKeyHint: 'API key for the remote embedding service',
    coworkMemoryDreamingEnabled: 'Enable Dreaming memory consolidation',
    coworkMemoryDreamingEnabledHint:
      'Run background memory consolidation on a schedule, promoting high-value entries to permanent memory and generating a Dream Diary',
    coworkMemoryDreamingFrequency: 'Schedule',
    coworkMemoryDreamingFrequencyHint: 'Set the cron schedule for Dreaming runs',
    coworkMemoryDreamingFreqNightly3am: 'Every night at 3 AM',
    coworkMemoryDreamingFreqMidnight: 'Every night at midnight',
    coworkMemoryDreamingFreqTwiceDaily: 'Twice daily (noon & midnight)',
    coworkMemoryDreamingFreqEvery6h: 'Every 6 hours',
    coworkMemoryDreamingFreqWeekly: 'Weekly (Sunday 3 AM)',
    coworkMemoryDreamingFreqCustom: 'Custom cron expression',
    coworkMemoryDreamingFreqCustomPlaceholder: 'Enter cron expression, e.g. 0 3 * * *',
    coworkMemoryDreamingTimezone: 'Timezone',
    coworkMemoryDreamingTimezoneHint: 'Leave empty to use your local timezone',
    coworkMemoryDreamingModel: 'Dream Diary model',
    coworkMemoryDreamingModelHint:
      'Optional. Override the model used for Dream Diary generation. Leave empty to use the primary model.',
    // Memory tab names
    coworkMemoryTabEntries: 'Memory Entries',
    coworkMemoryTabEmbedding: 'Embedding Search',
    coworkMemoryTabDreaming: 'Dreaming',
    // Dreaming content display
    coworkDreamingSubTabScene: 'Scene',
    coworkDreamingSubTabDiary: 'Diary',
    coworkDreamingSubTabAdvanced: 'Advanced',
    coworkDreamingHeaderTitle: 'Dreaming',
    coworkDreamingHeaderSubtitle: 'Consolidate memory while you sleep.',
    coworkDreamingSwitchOn: 'On',
    coworkDreamingSwitchOff: 'Off',
    coworkDreamingInsightBrewing: 'Cultivating emerging insights...',
    coworkDreamingInsightMessages:
      "Rearranging the memory attic...,Gently indexing the day...,Cultivating emerging insights...,Brewing unformed ideas...,Consolidating memory...,Whispering softly to the vector store...,Consolidating memory...,Organizing the knowledge graph...,Replaying today's conversations...,Weaving short-term memory into long-term memory...,Sorting fragments of the mind palace...,Archiving scattered thoughts...,Connecting distant clues...,Turning old context windows into nutrients...,Alphabetizing the subconscious...,Promoting promising intuitions...,Forgetting irrelevant noise...",
    coworkDreamingSettingsTitle: 'Run Settings',
    coworkDreamingContentTitle: 'Dream Content',
    coworkDreamingStatusActive: 'Active',
    coworkDreamingStatusIdle: 'Idle',
    coworkDreamingPromoted: 'Promoted',
    coworkDreamingNextSweep: 'Next sweep',
    coworkDreamingPhaseLight: 'Light',
    coworkDreamingPhaseDeep: 'Deep',
    coworkDreamingPhaseRem: 'REM',
    coworkDreamingPhaseOff: 'Off',
    coworkDreamingDiaryTitle: 'Dream Diary',
    coworkDreamingDiaryHint:
      'Raw dream diary written while replaying and consolidating memory; inspect what the memory system is noticing',
    coworkDreamingDiaryEmpty: 'No dream diary yet',
    coworkDreamingDiaryEmptyHint:
      'Once Dreaming is enabled, the system will generate dream diary entries in the background',
    coworkDreamingDiaryRefresh: 'Refresh',
    coworkDreamingDiaryRefreshing: 'Refreshing...',
    coworkDreamingAdvancedTitle: 'Daily Memory Signals',
    coworkDreamingAdvancedHint:
      "Inspect grounded replay signals, waiting short-term entries, and today's promoted entries",
    coworkDreamingAdvancedGroundedTitle: 'Grounded Signals',
    coworkDreamingAdvancedGroundedDesc: 'Short-term entries from daily log replays',
    coworkDreamingAdvancedGroundedEmpty: 'No grounded signals yet',
    coworkDreamingAdvancedWaitingTitle: 'Waiting Entries',
    coworkDreamingAdvancedWaitingDesc: 'Short-term entries pending promotion',
    coworkDreamingAdvancedWaitingEmpty: 'No waiting entries',
    coworkDreamingAdvancedPromotedTitle: 'Promoted Today',
    coworkDreamingAdvancedPromotedDesc: 'Entries recently promoted to permanent memory',
    coworkDreamingAdvancedPromotedEmpty: 'No promotions today',
    coworkDreamingAdvancedSortRecent: 'Recent',
    coworkDreamingAdvancedSortSignals: 'Signals',
    coworkDreamingAdvancedOriginLive: 'Live',
    coworkDreamingAdvancedOriginDailyLog: 'Daily log',
    coworkDreamingAdvancedOriginMixed: 'Mixed',
    coworkDreamingAdvancedSummaryFromDailyLog: 'from daily log',
    coworkDreamingAdvancedSummaryWaiting: 'waiting',
    coworkDreamingAdvancedSummaryPromotedToday: 'promoted today',
    coworkDreamingLoadError: 'Failed to load Dreaming data',
    coworkDreamingGatewayUnavailable: 'Engine not connected, unable to load Dreaming data',
    coworkConfigSaveFailed: 'Failed to save LobsterAI settings. Please try again.',
    coworkApiProviderModel: 'Select from provider models',
    coworkApiProviderModelCustom: 'Custom',
    coworkApiProviderModelHint:
      'Only shows enabled providers with configured API key and base URL.',
    coworkApiBaseUrl: 'API Base URL',
    coworkApiKey: 'API Key',
    coworkApiModel: 'Model Name',
    coworkApiKeyRequired: 'API key is required',
    coworkApiBaseUrlRequired: 'Base URL is required',
    coworkApiModelRequired: 'Model name is required',
    coworkApiBaseUrlInvalid: 'Invalid Base URL format',
    coworkApiConfigSaveFailed: 'Failed to save API configuration',
    coworkApiConfigLoadFailed: 'Failed to load API configuration',
    coworkStatusIdle: 'Idle',
    coworkStatusRunning: 'Running',
    coworkStatusCompleted: 'Completed',
    coworkStatusError: 'Error',
    coworkPermissionRequired: 'Permission Required',
    coworkPermissionDescription: 'LobsterAI is requesting to perform the following action',
    coworkSelectionRequired: 'Please Choose',
    coworkSelectionDescription: 'LobsterAI needs your input',
    coworkToolName: 'Tool Name',
    coworkToolInput: 'Tool Input',
    coworkToolResult: 'Result',
    coworkToolRunning: 'Running...',
    coworkContextMaintenanceRunning: 'Organizing context...',
    coworkToolNoErrorDetail: 'Failed (no error details)',
    coworkToolOutputLine: 'line',
    coworkToolOutputLines: 'lines',
    coworkToolOutputLineCount: '{count} {unit} of output',
    coworkToolLargeOutput: 'Large output ({size})',
    coworkTodosTitle: 'Todos',
    coworkTodoItems: 'items',
    coworkTodoCompleted: 'completed',
    coworkTodoInProgress: 'in progress',
    coworkTodoPending: 'pending',
    coworkTodoUntitled: 'Untitled todo',
    coworkTodoUnknownStatus: 'Unknown status',
    subagentWorking: 'Agent working...',
    subagentCompleted: 'Completed',
    subTaskRoleUser: 'Task',
    subTaskRoleTool: 'Tool Call',
    subTaskNoHistory: 'No history yet',
    subTaskMessages: 'messages',
    subTaskToolProcessing: 'Processing...',
    subTaskToolDone: 'Done',
    subagentError: 'Error',
    subagentUnnamed: 'Subtask',
    coworkDangerousOperation:
      'Warning: This operation may modify files or execute system commands. Please review carefully.',
    coworkDestructiveOperation:
      'Destructive operation: This command may cause irreversible data loss. Please confirm carefully.',
    coworkCautionOperation:
      'Caution: This command may modify files or system state. Please review carefully.',
    dangerReasonRecursiveDelete: 'Recursive file deletion',
    dangerReasonGitForcePush: 'Git force push',
    dangerReasonGitResetHard: 'Git hard reset',
    dangerReasonDiskOverwrite: 'Disk write operation',
    dangerReasonDiskFormat: 'Disk format',
    dangerReasonFileDelete: 'File deletion',
    dangerReasonGitPush: 'Git push',
    dangerReasonProcessKill: 'Process termination',
    dangerReasonPermissionChange: 'File permission change',
    coworkApprove: 'Approve',
    coworkDeny: 'Deny',
    coworkConfirmSelection: 'Submit selection',
    coworkDenyRequest: 'Deny request',
    coworkQuestionWizardTitle: 'Confirmation Needed',
    coworkQuestionWizardSkip: 'Skip',
    coworkQuestionWizardPrevious: 'Previous',
    coworkQuestionWizardNext: 'Next',
    coworkQuestionWizardSubmit: 'Submit',
    coworkQuestionWizardOther: 'Other',
    coworkQuestionWizardOtherPlaceholder: 'Enter custom answer...',
    coworkQuestionWizardSelectAtLeastOne: 'Please select at least one option',
    coworkQuestionWizardAnswerRequired: 'Please select or enter an answer',
    coworkWelcome: 'LobsterAI',
    coworkDescription: 'A 24/7 personal assistant agent that gets work done for you',
    coworkCurrentAgent: 'Current Agent',
    coworkSelectAgent: 'Select Agent',

    // Multi-Agent management
    createAgent: 'Create Agent',
    myAgents: 'My Agents',
    defaultAgentDisplayName: 'Primary Agent',
    myAgentSidebarPinned: 'Pinned',
    myAgentSidebarExpandMore: 'Show more',
    myAgentSidebarCollapse: 'Show less',
    myAgentSidebarNoAgents: 'No agents yet',
    myAgentSidebarNoTasks: 'No tasks yet',
    myAgentSidebarNewTask: 'New task',
    myAgentSidebarRunning: 'Running',
    myAgentSidebarUnreadResult: 'New result',
    myAgentSidebarLoadFailed: 'Failed to load. Click to retry',
    myAgentSidebarMinuteShort: 'm',
    myAgentSidebarHourShort: 'h',
    myAgentSidebarDayShort: 'd',
    myAgentSidebarWeekShort: 'w',
    myAgentSidebarMonthShort: 'mo',
    myAgentSidebarYearShort: 'y',
    agentPin: 'Pin',
    agentUnpin: 'Unpin',
    agentPinFailed: 'Failed to update Agent pin',
    customCreate: 'Custom Create',
    choosePreset: 'Choose Preset',
    agentUseTemplate: 'Use Template',
    agentTemplateTitle: 'Agent Templates',
    agentTemplateNew: 'New',
    agentTemplateEmpty: 'No templates available',
    agentSettings: 'Agent Settings',
    agentName: 'Name',
    agentNamePlaceholder: 'Agent name',
    agentAvatarPickerTitle: 'Choose avatar',
    agentAvatarPickerDone: 'Done',
    agentAvatarSvgLobster: 'Lobster',
    agentAvatarSvgCode: 'Code',
    agentAvatarSvgRepair: 'Repair',
    agentAvatarSvgBriefcase: 'Briefcase',
    agentAvatarSvgShoppingCart: 'Shopping Cart',
    agentAvatarSvgData: 'Data',
    agentAvatarSvgDocument: 'Document',
    agentAvatarSvgFolder: 'Folder',
    agentAvatarSvgTag: 'Tag',
    agentAvatarSvgBrain: 'Brain',
    agentAvatarSvgGraduationCap: 'Graduation Cap',
    agentAvatarSvgBooks: 'Books',
    agentAvatarSvgExperiment: 'Experiment',
    agentAvatarSvgDiagnosis: 'Diagnosis',
    agentAvatarSvgScales: 'Scales',
    agentAvatarSvgTranslation: 'Translation',
    agentAvatarSvgTranslationAlt: 'Translation Alt',
    agentAvatarSvgCreation: 'Creation',
    agentAvatarSvgArtboard: 'Artboard',
    agentAvatarSvgMusic: 'Music',
    agentAvatarSvgEntertainment: 'Entertainment',
    agentAvatarSvgHeadphones: 'Headphones',
    agentAvatarSvgInspiration: 'Inspiration',
    agentAvatarSvgLightning: 'Lightning',
    agentAvatarSvgTravel: 'Travel',
    agentAvatarSvgFitness: 'Fitness',
    agentAvatarSvgMeditation: 'Meditation',
    agentAvatarSvgHeart: 'Heart',
    agentAvatarSvgPottedPlant: 'Potted Plant',
    agentAvatarSvgPet: 'Pet',
    agentAvatarColorInk: 'White',
    agentAvatarColorCoral: 'Coral',
    agentAvatarColorOrange: 'Orange',
    agentAvatarColorAmber: 'Yellow',
    agentAvatarColorGreen: 'Green',
    agentAvatarColorBlue: 'Blue',
    agentAvatarColorViolet: 'Violet',
    agentAvatarColorPink: 'Pink',
    agentAvatarGlyphFolder: 'General project',
    agentAvatarGlyphFinance: 'Finance',
    agentAvatarGlyphBook: 'Knowledge',
    agentAvatarGlyphEducation: 'Education',
    agentAvatarGlyphWriting: 'Writing',
    agentAvatarGlyphDesign: 'Design',
    agentAvatarGlyphCode: 'Coding',
    agentAvatarGlyphTerminal: 'Terminal',
    agentAvatarGlyphMusic: 'Music',
    agentAvatarGlyphMedia: 'Media',
    agentAvatarGlyphArt: 'Art',
    agentAvatarGlyphOperations: 'Operations',
    agentAvatarGlyphResearch: 'Research',
    agentAvatarGlyphAutomation: 'Automation',
    agentAvatarGlyphGrowth: 'Growth',
    agentAvatarGlyphBusiness: 'Business',
    agentAvatarGlyphAnalytics: 'Analytics',
    agentAvatarGlyphSupport: 'Support',
    agentAvatarGlyphTraining: 'Training',
    agentAvatarGlyphNotes: 'Notes',
    agentAvatarGlyphLegal: 'Legal',
    agentAvatarGlyphVoice: 'Voice',
    agentAvatarGlyphTravel: 'Travel',
    agentAvatarGlyphGlobal: 'Global',
    agentAvatarGlyphTools: 'Tools',
    agentAvatarGlyphScience: 'Science',
    agentAvatarGlyphMemory: 'Memory',
    agentAvatarGlyphCare: 'Care',
    agentAvatarGlyphGift: 'Gift',
    agentAvatarGlyphLaunch: 'Launch',
    agentDescription: 'Description',
    agentDescriptionPlaceholder: 'Brief description',
    agentIdentity: 'Identity',
    agentIdentityPlaceholder: 'Identity description (IDENTITY.md)...',
    agentDefaultModel: 'Agent Default Model',
    agentDefaultWorkingDirectory: 'Agent Default Working Directory',
    agentDefaultWorkingDirectoryHint: 'New sessions run in this directory by default',
    agentModelInvalidHint: 'Model unavailable. Please select another',
    agentSystemPromptPlaceholder:
      "Define this Agent's role, workflow, and response style. Example: you are a professional office document assistant who drafts reports, polishes emails, summarizes spreadsheet highlights, and keeps formatting clear.",
    agentSkills: 'Skills',
    agentSkillsHint:
      'Select skills available to this Agent. Leave empty to use all enabled skills.',
    agentSkillsSearch: 'Search skills...',
    agentSkillsNoInstalled: 'No enabled skills',
    agentSkillsNoMatches: 'No matching skills',
    agentSkillsNone: 'Click to select skills',
    agentsSubtitle: 'Custom personas and skill sets for your AI agents',
    presetAgents: 'Preset Agents',
    myCustomAgents: 'My Custom Agents',
    createNewAgent: 'New Agent',
    addAgent: 'Add',
    agentTabPrompt: 'Prompt',
    agentTabBasic: 'Basic Info',
    agentTabSkills: 'Skills',
    agentTabIM: 'IM Channels',
    agentIMConfigured: 'Configured',
    agentIMNotConfigured: 'Not configured',
    agentIMNotConfiguredHint: 'Please configure in Settings > IM Bots first',
    agentIMBound: 'Bound',
    agentIMBoundToOther: '→ {agent}',
    agentIMBindHint: 'Select IM channels this Agent responds to',
    agentCreateFailed: 'Failed to create Agent',
    agentSaveFailed: 'Failed to save Agent settings',
    agentDeleteFailed: 'Failed to delete Agent',
    agentDefaultCannotDelete: 'The primary Agent cannot be deleted',
    agentDeleteConfirmTitle: 'Confirm Delete Agent',
    agentDeleteConfirmMessage:
      'Are you sure you want to delete Agent "{name}" and its task history? This action cannot be undone.',
    agentUnsavedTitle: 'Unsaved Changes',
    agentUnsavedMessage: 'Your Agent setting changes will be lost if you leave.',
    agentUnsavedStay: 'Keep Editing',
    agentUnsavedDiscard: 'Discard Changes',
    discard: 'Discard',
    noPresetsAvailable: 'All presets have been added',
    creating: 'Creating...',

    coworkNewSession: 'New Session',
    coworkDefaultSessionTitle: 'New Chat',
    coworkContinuePlaceholder: 'Continue the conversation...',
    coworkRemoteManagedPlaceholder:
      'This session was created via IM. Please use the corresponding IM platform.',
    aiGeneratedDisclaimer: 'AI-generated for reference only.',
    updateAvailablePill: 'New update',
    updateAvailableTitle: 'New version available',
    updateAvailableMessage:
      'A new version is available. Please download it from the official website and install over the current version.',
    updateAvailableConfirm: 'Update Now',
    updateAvailableCancel: 'Cancel',
    updateOpenFailed: 'Failed to open download page',
    updateDownloading: 'Downloading update...',
    updateDownloadingBackground: 'Downloading update in the background...',
    updateDownloadingPill: 'Downloading',
    updateDownloadCancel: 'Cancel Download',
    updateReadyTitle: 'New version available',
    updateReadyConfirm: 'Install and Restart',
    updateReadyLater: 'Later',
    updateReadyPill: 'New update',
    updateErrorPill: 'Update failed',
    updateInstalling: 'Installing update, please wait...',
    updateDownloadFailed: 'Download failed',
    updateInstallFailed: 'Installation failed',
    updateInstallIncomplete: 'The previous update did not finish. Please install it again.',
    updateRetry: 'Retry',
    checkForUpdate: 'Check for Updates',
    updateChecking: 'Checking...',
    updateUpToDate: 'Up to date',
    updateCheckFailed: 'Check failed',
    coworkStartingSession: 'Starting session...',
    coworkPreparingEnvironment: 'Preparing environment, please wait',
    coworkAddFile: 'Add File',
    voiceInput: 'Voice input',
    voiceInputStopRecording: 'Stop recording and transcribe',
    voiceInputRecognizing: 'Transcribing voice',
    voiceInputLoginRequired: 'Sign in to use voice input',
    voiceInputLoginTitle: 'Sign in required for voice input',
    voiceInputLoginDesc: 'Voice input is available only after you sign in.',
    voiceInputFailed: 'Voice input failed. Please try again later.',
    voiceInputMicrophoneDenied: 'Microphone access is blocked. Check system microphone permissions.',
    voiceInputMicrophoneUnavailable: 'No available microphone was detected.',
    voiceInputNoAudioCaptured: 'No valid audio was recorded. Please try again.',
    voiceInputAudioInvalid: 'The recording format is invalid. Please try again.',
    voiceInputAudioTooLarge: 'The recording is too large. Shorten it and try again.',
    voiceInputAudioTooLong: 'Voice input is limited to 60 seconds each time.',
    voiceInputDailyLimitExceeded: 'Today’s voice input quota has been used up. Try again tomorrow.',
    voiceInputRateLimited: 'Voice recognition is busy. Please try again later.',
    voiceInputRecognitionFailed: 'No valid speech was recognized. Please try again.',
    voiceInputServiceUnavailable: 'Voice recognition is temporarily unavailable. Please try again later.',
    voiceInputRecognitionMode: 'Voice input mode',
    voiceInputRecognitionModeDescription: 'Choose how voice input is transcribed. Realtime mode converts speech while you speak.',
    voiceInputRecognitionModeRealtime: 'Realtime',
    voiceInputRecognitionModeShort: 'Record then transcribe',
    coworkDropFileHint: 'Drop files here, or paste files directly',
    coworkAddImage: 'Add Image',
    coworkInputFileLabel: 'Input file',
    coworkAttachmentRemove: 'Remove',
    coworkShareSession: 'Share',
    coworkExportImageInProgress: 'Exporting image...',
    coworkExportImageSuccess: 'Image exported successfully',
    coworkExportImageFailed: 'Failed to export image',
    coworkExportAs: 'Export as',
    coworkExportImage: 'Image',
    coworkExportImageDesc: 'Save as PNG screenshot',
    coworkExportMarkdown: 'Markdown',
    coworkExportMarkdownDesc: 'Readable and editable format',
    coworkExportJSON: 'JSON',
    coworkExportJSONDesc: 'Structured data for programmatic use',
    coworkExportTextSuccess: 'Exported successfully',
    coworkExportTextFailed: 'Export failed',
    coworkExportCreatedAt: 'Created at',
    deleteSession: 'Delete',
    turnIndex: 'Turn index',
    deleteTaskConfirmTitle: 'Confirm Deletion',
    deleteTaskConfirmMessage:
      'This action cannot be undone. All messages in this task will be permanently deleted.',
    batchOperations: 'Batch Operations',
    batchSelectAll: 'Select All',
    batchDelete: 'Delete',
    batchCancel: 'Cancel',
    batchSelectionScope: '{agent} · {count} selected',
    batchDeleteConfirmTitle: 'Confirm Batch Deletion',
    batchDeleteConfirmMessage:
      'Are you sure you want to delete {count} selected tasks? This action cannot be undone.',
    coworkForkSession: 'Fork session',
    coworkForkConfirmTitle: 'Create a branch from this session?',
    coworkForkConfirmMessage:
      'This copies the current session history and creates a new task to continue exploring.',
    coworkForkFileStateWarning:
      'Your current files and worktree stay unchanged. They will not roll back to an earlier message. If later turns changed files, the new branch context may not match what is currently on disk.',
    coworkForkToLocal: 'Fork locally',
    coworkForkFromMessage: 'Fork from here',
    coworkForkCreated: 'Forked session created',
    coworkForkFailed: 'Failed to fork session',
    coworkForkRunningBlocked: 'Stop the current task before creating a fork.',
    back: 'Back',
    browse: 'Browse',
    addFolder: 'Add Folder',
    recentFolders: 'Recent Folders',
    noFolderSelected: 'No folder selected',
    coworkSelectFolderFirst: 'Please select a task folder before submitting',
    noRecentFolders: 'No recent folders',
    folderDriveRootNotAllowed:
      'Drive root directories are not supported as working directories. Please select a subfolder (e.g. D:\\Projects).',
    coworkOpenFolder: 'Open folder',
    coworkSessionStillRunning: 'The current task is still running. Please wait for it to finish.',
    coworkImageAttachmentTooLarge: 'Image {name} is larger than {limit}. Compress it before sending.',
    coworkImageAttachmentPreviewFailed: 'Could not create a preview for image {name}. Compress it before sending.',
    coworkImageAttachmentOriginalMissing: 'Cannot re-edit this image message because the original image file is missing or unreadable.',
    coworkContextUsageUnknown: 'Context usage is unavailable',
    coworkContextUsagePercent: 'Context: {percent}% used',
    coworkContextUsageTokens: 'Used {used} tokens, total {total}',
    coworkContextUsageCompactHint: 'Click to compact context',
    coworkContextCompactAction: 'Compact context',
    coworkContextCompactConfirmTitle: 'Compact context',
    coworkContextCompactConfirm: 'Compact context for the current session?',
    coworkContextCompactConfirmAction: 'Start compaction',
    coworkContextCompactConfirmActionShort: 'Compact',
    coworkContextCompactBlockedRunning:
      'The current task is still running. Compact context after it finishes.',
    coworkContextCompacting: 'Context compaction in progress',
    coworkContextCompactingSendBlocked: 'Context compaction is running. Please try again shortly.',
    coworkContextAutoCompacted: 'Context compaction completed',
    coworkContextManualCompacted: 'Context compaction completed',
    coworkContextManualCompactNoop: 'No context compaction was needed',
    coworkContextCompactionRunning: 'Compacting context',
    coworkContextCompactionCompleted: 'Context compaction completed',
    coworkContextCompactionRetrying: 'Context compaction completed, continuing task',
    coworkContextCompactionFailed: 'Context compaction did not complete',

    // Cowork error messages
    coworkErrorAuthInvalid:
      'Invalid or expired API key. Please check and update your API key in settings.',
    coworkErrorFreeQuotaExhausted:
      'The current model\'s free quota has been used up. Upgrade your plan to continue.\n\n[Upgrade now](https://lobsterai.youdao.com/portal)',
    coworkErrorInsufficientBalance: 'Insufficient API balance. Please top up and try again.',
    coworkErrorInputTooLong:
      'Input too long, exceeding model context limit. Please shorten the conversation and try again.',
    coworkErrorMessageTooLarge:
      'This message is too large. Reduce attachments, compress images, or split it up. (Keep each message under about 30 MB.)',
    coworkErrorCouldNotProcessPdf:
      'Unable to process the PDF file. Please try converting the PDF to text format and resend.',
    coworkErrorModelNotFound:
      'The requested model does not exist or is unavailable. Please check the model configuration in settings.',
    coworkGatewaySessionSyncTimeout:
      'The OpenClaw engine is responding slowly and your message has not been sent. Please wait a minute or two and resend. If this happens frequently, check system memory and disk usage, and add LobsterAI to your antivirus allowlist.',
    coworkErrorGatewayDisconnected:
      'AI engine connection lost. Please retry. If the issue persists, try restarting the app.',
    coworkErrorServiceRestart: 'AI engine is restarting. Please try again later.',
    coworkErrorGatewayDraining: 'AI engine is restarting. Please wait a moment and try again.',
    coworkErrorNetworkError:
      'Network connection failed. Please check your network settings and try again.',
    coworkErrorRateLimit: 'Too many requests. Please try again later.',
    coworkErrorContentFiltered:
      'Content did not pass the safety review. Please modify and try again.',
    coworkErrorServerError: 'Server error occurred. Please try again later.',
    coworkErrorSessionStartFailed: 'Failed to start session: {error}',
    coworkErrorSessionContinueFailed: 'Failed to send message: {error}',
    coworkModelSwitchFailed: 'Failed to switch model. Please try again later.',
    coworkErrorEngineNotReady: 'AI engine is starting up. Please wait a few seconds and try again.',
    coworkErrorUnknown:
      'Task failed due to an unexpected error. Please retry. If the issue persists, check your model configuration.',

    // Media Generation
    mediaGeneration: 'Media Generation',
    mediaImage: 'Image',
    mediaVideo: 'Video',
    mediaAuto: 'Auto',
    mediaNone: 'None',
    mediaModelPicker: 'Select generation model',
    mediaImageModels: 'Image Models',
    mediaVideoModels: 'Video Models',
    mediaQuotaExhausted: 'Insufficient credits',
    mediaSubscriptionRequired: 'Media generation is a subscriber-only feature',
    mediaDailyLimitReached: 'Daily limit reached, resets tomorrow',
    mediaCycleLimitReached: 'Period limit reached, resets next billing cycle',
    mediaNoModels: 'No models available',
    mediaLoadingModels: 'Loading models...',
    mediaLoginTitle: 'Image/Video Generation Service',
    mediaLoginDesc: 'Exclusive for plan users. Log in and subscribe or purchase a booster pack to use',
    mediaLoginBtn: 'Log in',
    mediaSubscribeTitle: 'Image/Video Generation Service',
    mediaSubscribeDesc: 'Exclusive for plan users. Subscribe or purchase a booster pack to use',
    mediaSubscribeBtn: 'Purchase',
    mediaLearnMore: 'Learn about subscription',
    mediaGenerating: 'Generating...',
    mediaGeneratingVideo: 'Generating video...',
    mediaGeneratingImage: 'Generating image...',
    mediaGenerationComplete: 'Generation complete',
    mediaVideoGeneratedPath: 'Video generated:',
    mediaPollingCount: 'Checked {count} times',
    mediaTaskCancel: 'Cancel',
    mediaStatusQueryCount: 'Status query #{count}',

    // Skills
    skills: 'Skills',
    useSkill: 'Use Skill',
    searchSkills: 'Search skills',
    manageSkills: 'Manage Skills',
    officialSkills: 'Official Skills',
    addSkill: 'Add',
    addSkillSecurityTip: 'Verify the safety of third-party skills before adding',
    uploadSkillZip: 'Upload .zip',
    uploadSkillFolder: 'Upload folder',
    remoteImport: 'Remote Import',
    remoteImportTitle: 'Remote Import',
    createSkillByChat: 'Create via Conversation',
    skillCreatorPrompt:
      'Use your skill-creator skill to create a new skill. First, please ask me what this skill should do.',
    skillCreatorNotInstalled: 'Please install the skill-creator skill first',
    skillCreatorNotEnabled: 'Please enable the skill-creator skill first',
    githubTabLabel: 'GitHub',
    githubImportDescription:
      'Supports both repository and subdirectory links. If a repo contains multiple skills, all will be imported.',
    githubImportUrlLabel: 'URL',
    githubSkillPlaceholder: 'e.g. owner/repo or a GitHub tree/blob URL',
    githubImportExamples:
      'Examples: owner/repo; https://github.com/owner/repo/tree/main/SKILLs/my-skill',
    clawhubTabLabel: 'ClawHub',
    clawhubImportDescription:
      'Paste a clawhub.ai skill page URL to automatically install the skill.',
    clawhubImportUrlLabel: 'ClawHub URL',
    clawhubSkillPlaceholder: 'e.g. https://clawhub.ai/skills/owner/skill-name',
    clawhubImportExamples: 'Example: https://clawhub.ai/skills/owner/skill-name',
    importSourceMismatchClawhub: 'Please enter a clawhub.ai URL, or switch to the GitHub tab.',
    importSourceMismatchGithub:
      'Please enter a GitHub URL or owner/repo, or switch to the ClawHub tab.',
    importSkill: 'Import',
    importingSkill: 'Importing...',
    skillImportSuccess: 'Skill added',
    official: 'Official',
    noSkillsAvailable: 'No skills available',
    skillsDescription: 'Pre-packaged best practices and tools for your AI agent',
    skillInstalled: 'Installed',
    skillMarketplace: 'Marketplace',
    skillMarketplaceEmpty: 'No skills available yet',
    skillCategoryAll: 'All',
    skillInstall: 'Install',
    skillInstalling: 'Installing',
    skillInstallFailed: 'Install failed',
    skillAlreadyInstalled: 'Installed',

    // Security scan
    lobsterGuardEnabled: 'Security Active',
    securityScanTitle: 'Skill Security Scan',
    securityRisk_safe: 'Risk Assessment',
    securityRisk_low: 'Risk Assessment',
    securityRisk_medium: 'Risk Assessment',
    securityRisk_high: 'Risk Assessment',
    securityRisk_critical: 'Risk Assessment',
    securityIssuesFound: 'Please be aware of the following behaviors in {name}:',
    securityInstallAnyway: 'Install Anyway',
    securityInstallDisabled: 'Install Disabled',
    securityDimFileAccess: 'File Access',
    securityDimDangerousCmd: 'Dangerous Commands',
    securityDimNetwork: 'Network Security',
    securityDimProcess: 'Process Security',
    securityDimScreenInput: 'Screen / Input',
    securityDimPayment: 'Payment / Finance',
    securityDimPromptInjection: 'Prompt Injection',
    securityDimWebContent: 'Web Content',
    securityFindingSshKeyAccess: 'Accesses SSH keys',
    securityFindingAwsCredentials: 'Accesses AWS credentials',
    securityFindingBrowserData: 'Accesses browser data',
    securityFindingTokenAccess: 'Accesses token/credential files',
    securityFindingKeychainAccess: 'Accesses system keychain',
    securityFindingEnvSecrets: 'Reads sensitive environment variables',
    securityFindingRmRf: 'Recursive forced deletion',
    securityFindingDiskFormat: 'Disk format command',
    securityFindingSudo: 'Privilege escalation command',
    securityFindingDestructiveGit: 'Destructive git operation',
    securityFindingSystemModify: 'Modifies system configuration',
    securityFindingForkBomb: 'Fork bomb',
    securityFindingDataExfil: 'Data exfiltration (curl/wget)',
    securityFindingDataExfilJs: 'Suspicious network request',
    securityFindingWebhookExfil: 'Webhook data exfiltration',
    securityFindingDnsExfil: 'DNS data exfiltration',
    securityFindingEncodedUrl: 'Encoded URL',
    securityFindingReverseShell: 'Reverse shell',
    securityFindingCryptoMiner: 'Cryptocurrency miner',
    securityFindingBackgroundProcess: 'Background daemon process',
    securityFindingScreenshot: 'Screen capture',
    securityFindingKeylogger: 'Keylogger',
    securityFindingClipboard: 'Clipboard access',
    securityFindingPaymentApi: 'Payment API call',
    securityFindingCryptoWallet: 'Cryptocurrency wallet operation',
    securityFindingInlineScript: 'Inline script',
    securityFindingSvgScript: 'Script in SVG',
    securityFindingExternalResource: 'External resource reference',
    securityFindingPromptOverride: 'Override system instructions',
    securityFindingHiddenInstructions: 'Hidden instructions',
    securityFindingDataExfilInstruction: 'Data theft instruction',
    securityFindingPrivilegeEscalation: 'Privilege escalation instruction',
    securityFindingUnicodeObfuscation: 'Unicode obfuscation',
    securityFindingRoleHijack: 'Role hijack',
    securityFindingExcessiveHiddenContent: 'Excessive hidden content',
    securityFindingInstallScript: 'Install script hook',
    securityFindingParseError: 'File parse error',
    securityFindingJsxray_serialize_environment: 'Serializes environment variables (process.env)',
    securityFindingJsxray_unsafe_stmt: 'Unsafe statement (eval/Function)',
    securityFindingJsxray_data_exfiltration: 'Data exfiltration',
    securityFindingJsxray_unsafe_command: 'Unsafe command execution',
    securityFindingJsxray_obfuscated_code: 'Obfuscated code',
    securityFindingJsxray_encoded_literal: 'Encoded literal',
    securityFindingJsxray_shady_link: 'Suspicious link',
    securityFindingJsxray_unsafe_import: 'Unsafe import',
    securityFindingJsxray_weak_crypto: 'Weak cryptography',
    securityFindingJsxray_suspicious_file: 'Suspicious file',
    securityFindingJsxray_insecure_random: 'Insecure random number',
    securityFindingJsxray_monkey_patch: 'Monkey patching',
    securityFindingJsxray_prototype_pollution: 'Prototype pollution',
    securityFindingJsxray_sql_injection: 'SQL injection',
    skillDetailVersion: 'Version',
    skillDetailSource: 'Source',
    skillDetailAuthor: 'Author',
    skillsRoot: 'Skills folder',
    skillSourcePlaceholder: 'Git URL or local path',
    downloadSkill: 'Download Skill',
    downloadingSkill: 'Downloading...',
    deleteSkill: 'Delete Skill',
    skillDeleteConfirm: 'Delete skill \"{name}\"?',
    skillDeleteFailed: 'Failed to delete skill',
    skillBuiltInCannotDelete: 'Built-in skills cannot be deleted',
    skillDownloadFailed: 'Failed to download skill',
    skillUpdateFailed: 'Failed to update skill',
    skillUpgrade: 'Update',
    skillUpgradeAll: 'Update All ({count})',
    skillUpgrading: 'Updating skills ({current}/{total})',
    skillUpgradingCurrent: 'Current: {name} v{version}',
    skillUpgradeFailed: 'Update failed',
    skillUpgradeAvailable: 'Update available',
    skillUpgradeCancel: 'Cancel Update',
    activeSkill: 'Active Skill',
    clearSkill: 'Clear Skill',
    clearAll: 'Clear All',
    clearAllSkills: 'Clear all selected skills',

    // Skill Sync (OpenClaw)
    syncSkillsFromOpenClaw: 'Sync from OpenClaw',
    skillsSyncTitle: 'New Skills Detected',
    skillsSyncFound: 'Detected {count} skill(s) available to sync from OpenClaw:',
    skillsSyncNow: 'Sync Now',
    skillsSyncSkip: 'Not Now',
    skillsSyncLater: 'You can always sync later from the "Add" menu under "Sync from OpenClaw".',
    skillsSyncNoneFound: 'No new skills found',
    skillsSyncing: 'Syncing skills...',
    skillsSyncSuccess: 'Skills synced successfully',
    skillsSyncFailed: 'Failed to sync skills',

    // Kits
    kits: 'Kits',
    newFeatureBadge: 'NEW',
    kitSearchPlaceholder: 'Search kits or capabilities, such as "design", "marketing", "data analysis"',
    kitInstall: 'Install',
    kitInstalling: 'Installing...',
    kitUninstall: 'Uninstall',
    kitUninstallConfirm: 'Uninstall kit "{name}"?',
    kitUninstalling: 'Uninstalling...',
    kitInstalled: 'Installed',
    kitReinstallRequiredBadge: 'Reinstall needed',
    kitReinstallRequiredDetail:
      'Installed version v{installedVersion}, current version v{currentVersion}. Uninstall and install again to use the new version.',
    kitLoading: 'Loading...',
    kitEmpty: 'No kits available',
    kitBack: 'Back',
    kitTryAsking: 'Try asking...',
    kitSkills: 'Skills',
    kitDescription: 'Install capability packs for common work scenarios and use their skills directly',
    kitMarketplace: 'Marketplace',
    kitSkillCount: '{count} skills',
    kitOfficial: 'Official',
    manageKits: 'Manage Kits',
    searchKits: 'Search kits',
    clearKit: 'Clear Kit',
    noKitsInstalled: 'No expert kits installed yet',
    kitInstallGuideDescription: 'Standard capability packs for work scenarios',
    kitGoInstall: 'Install kits',
    kitSearchNoResults: 'No matching kits found',
    kitInstallRequired: 'Installation Required',
    kitInstallRequiredDesc: 'This kit is not installed yet. Install it now to try?',

    // MCP Servers
    mcpServers: 'MCP',
    mcpDescription:
      "Configure and manage MCP (Model Context Protocol) servers to extend your agent's tool capabilities",
    searchMcpServers: 'Search MCP servers',
    addMcpServer: 'Custom',
    editMcpServer: 'Edit MCP Server',
    deleteMcpServer: 'Delete MCP Server',
    mcpServerName: 'Server Name',
    mcpServerNamePlaceholder: 'Enter server name',
    mcpServerDescription: 'Description',
    mcpServerDescriptionPlaceholder: 'Describe what this MCP server does',
    mcpTransportType: 'Transport Type',
    mcpCommand: 'Command',
    mcpCommandPlaceholder: 'e.g. node, npx, uvx, python',
    mcpArgs: 'Arguments',
    mcpArgsPlaceholder: 'One argument per line',
    mcpEnvVars: 'Environment Variables',
    mcpUrl: 'URL',
    mcpUrlPlaceholder: 'e.g. http://localhost:3000/mcp',
    mcpHeaders: 'HTTP Headers',
    mcpHeaderKey: 'Key',
    mcpHeaderValue: 'Value',
    noMcpServersAvailable: 'No MCP servers configured',
    mcpDeleteConfirm: 'Delete MCP server "{name}"?',
    mcpDeleteFailed: 'Failed to delete MCP server',
    mcpCreateFailed: 'Failed to create MCP server',
    mcpUpdateFailed: 'Failed to update MCP server',
    mcpBridgeSyncing: 'Syncing MCP tools...',
    mcpBridgeSyncDone: 'MCP tools synced',
    mcpLaunchPending: 'Pending',
    mcpLaunchInstalling: 'Installing',
    mcpLaunchReady: 'Optimized',
    mcpLaunchFailed: 'Install failed',
    mcpLaunchUnsupported: 'Using original command',
    mcpLaunchRetry: 'Retry',
    mcpBridgeSyncError: 'Sync failed',
    mcpNameRequired: 'Server name is required',
    mcpCommandRequired: 'Command is required for stdio transport',
    mcpUrlRequired: 'URL is required for SSE/HTTP transport',
    mcpUrlInvalid: 'Enter a valid HTTP/HTTPS URL',
    mcpUrlMultiple: 'Multiple URLs detected. Keep only one MCP server URL.',
    mcpNameExists: 'Server name already exists',
    mcpTransportStdio: 'Standard I/O (stdio)',
    mcpTransportSse: 'Server-Sent Events (SSE)',
    mcpTransportHttp: 'Streamable HTTP',
    addKeyValue: 'Add',
    saveMcpServer: 'Save',
    // MCP Marketplace & Registry
    mcpInstalled: 'Installed',
    mcpMarketplace: 'Marketplace',
    mcpCustom: 'Custom',
    mcpCustomDescription: 'Manually configure an MCP server',
    mcpResetForm: 'Reset',
    mcpInstall: 'Install',
    mcpInstallFromUrl: 'Install from URL',
    mcpInstallFromUrlTitle: 'Install MCP from URL',
    mcpInstallFromUrlPlaceholder: 'Enter npm package name or URL',
    mcpInstallFromUrlHint:
      'Supports npm package names (e.g. @modelcontextprotocol/server-filesystem), npx commands, or HTTP/HTTPS URLs',
    mcpRequiredConfig: 'Required Configuration',
    mcpEnvRequired: 'This field is required',
    mcpOptionalConfig: 'Optional Configuration',
    mcpViewOnGithub: 'View on GitHub',
    mcpNoInstalledServers: 'No MCP servers installed yet',
    mcpCategoryAll: 'All',
    mcpCategorySearch: 'Search',
    mcpCategoryBrowser: 'Browser',
    mcpCategoryDeveloper: 'Dev Tools',
    mcpCategoryProductivity: 'Productivity',
    mcpCategoryDesign: 'Design',
    mcpCategoryDataApi: 'Data & API',
    mcpDesc_tavily: 'Real-time web search, intelligent data extraction and web crawling',
    mcpDesc_github: 'GitHub platform integration: repos, issues, PRs, Actions management',
    mcpDesc_gitlab: 'GitLab API integration: project management, merge requests, pipelines',
    mcpDesc_context7: 'Up-to-date library documentation and code examples for AI coding',
    mcpDesc_google_drive:
      'Google Drive file access and search with auto-export for Workspace files',
    mcpDesc_gmail: 'Gmail management: read, send, search emails with auto authentication',
    mcpDesc_google_calendar: 'Google Calendar management: create, query, update calendar events',
    mcpDesc_notion: 'Notion API: search, create/update pages, manage databases',
    mcpDesc_slack: 'Slack workspace: channel management, messaging, user queries',
    mcpDesc_todoist: 'Task management: create, update, complete and organize to-do items',
    mcpDesc_playwright: 'Advanced browser automation supporting Chromium/Firefox/WebKit',
    mcpDesc_canva: 'Canva design platform: create and manage designs, template operations',
    mcpDesc_firecrawl:
      'Web scraping and data extraction: batch processing, structured extraction and content analysis',
    mcpDesc_fetch: 'Web content fetching and HTML-to-markdown conversion for LLM consumption',

    // Email Skill Config
    emailTab: 'Email',
    emailConfig: 'Email Configuration',
    emailProvider: 'Email Provider',
    emailSelectProvider: 'Select email provider',
    emailCustomProvider: 'Custom',
    emailAdvancedSettings: 'Advanced Settings',
    emailAllowInsecureCert: 'Allow insecure certificates',
    emailAllowInsecureCertHint:
      'Skip TLS certificate verification, useful when proxy/VPN causes self-signed certificate errors',
    emailMailbox: 'Default Mailbox',
    emailConfigSaved: 'Email configuration saved',
    emailConfigError: 'Failed to save configuration',
    emailHintGmail: 'If 2FA is enabled, use an App Password instead of your account password',
    emailHint163:
      'Use an authorization code, not your account password. Enable IMAP/SMTP in web settings first',
    emailHintQQ:
      'Use an authorization code, not your account password. Enable IMAP/SMTP in web settings first',

    // File operations
    openFile: 'Open File',
    openFolder: 'Open Folder',
    showInFolder: 'Show in Folder',
    outputFiles: 'Output Files',
    openFileFailed: 'Failed to open file',
    showInFolderFailed: 'Failed to show file in folder',
    fileCreated: 'File created',

    // Plugins
    pluginsTab: 'Plugins',
    pluginsTitle: 'Plugin Management',
    pluginsDesc: 'Install and manage OpenClaw plugins to extend functionality.',
    pluginsInstall: 'Install Plugin',
    pluginsInstallTitle: 'Install Plugin',
    pluginsUninstall: 'Uninstall',
    pluginsUninstalling: 'Uninstalling...',
    pluginsUninstallConfirm: 'Are you sure you want to uninstall this plugin?',
    pluginsSource: 'Source',
    pluginsSourceNpm: 'npm',
    pluginsSourceClawhub: 'ClawHub',
    pluginsSourceGit: 'Git',
    pluginsSourceLocal: 'Local Path',
    pluginsPackageName: 'Package Name',
    pluginsVersion: 'Version',
    pluginsVersionPlaceholder: 'Optional, defaults to latest',
    pluginsRegistry: 'Registry URL',
    pluginsRegistryPlaceholder: 'Optional, defaults to npm registry',
    pluginsGitUrl: 'Git URL',
    pluginsGitUrlPlaceholder: 'e.g. https://github.com/org/plugin',
    pluginsLocalPath: 'Path',
    pluginsSelectPath: 'Select file or directory',
    pluginsInstalling: 'Installing...',
    pluginsInstallSuccess: 'Plugin installed successfully',
    pluginsInstallFailed: 'Plugin installation failed',
    pluginsEmpty: 'No plugins installed',
    pluginsEmptyHint: 'Click "Install Plugin" to get started',
    pluginsEnabled: 'Enabled',
    pluginsDisabled: 'Disabled',
    pluginsConfigTitle: 'Plugin Settings',
    pluginsConfigSave: 'Save',
    pluginsConfigSaved: 'Saved',
    pluginsConfigSaving: 'Saving...',
    pluginsConfigBack: 'Back',
    pluginsConfigNoSchema: 'This plugin has no configurable settings',
    pluginsConfigLoadError: 'Failed to load config',
    pluginsSourceOpenclaw: 'OpenClaw',
    pluginsSyncTitle: 'New Plugins Detected',
    pluginsSyncDesc: 'Discover and sync plugins from OpenClaw.',
    pluginsSyncButton: 'Discover Plugins',
    pluginsSyncing: 'Syncing plugins...',
    pluginsSyncFound: 'Detected {count} plugin(s) available to sync from OpenClaw:',
    pluginsSyncNone: 'No new plugins found',
    pluginsSyncNow: 'Sync Now',
    pluginsSyncSkip: 'Not Now',
    pluginsSyncLater: 'You can always sync later from the "Install Plugin" dialog under the OpenClaw tab.',
    pluginsUnsavedTitle: 'Unsaved Changes',
    pluginsUnsavedMessage: 'Plugin setting changes will be lost. Leave anyway?',
    pluginsUnsavedStay: 'Keep Editing',
    pluginsUnsavedDiscard: 'Discard Changes',
    pluginsCheckUpdates: 'Check Updates',
    pluginsChecking: 'Checking...',
    pluginsUpdate: 'Update',
    pluginsUpdating: 'Updating...',
    pluginsUpdateConfirm: 'Confirm Plugin Update',

    // IM Bot
    imBot: 'IM Bot',
    dingtalk: 'DingTalk',
    feishu: 'Feishu',
    qq: 'QQ',
    telegram: 'Telegram',
    discord: 'Discord',
    nim: 'NetEase IM',
    'netease-bee': 'Netease Bee',
    weixin: 'WeChat',
    wecom: 'WeCom',
    popo: 'POPO',
    connected: 'Connected',
    disconnected: 'Disconnected',
    connecting: 'Connecting',
    pendingSave: 'Pending save',
    imAgentBinding: 'Responding Agent',
    imAgentBindingDefault: 'Default (Primary Agent)',
    imAgentBindingHint:
      'Select the Agent that responds to messages on this platform. Different Agents have different personas and skill configurations.',
    kickedByOtherClient: 'Account logged in elsewhere',
    starting: 'Starting',
    start: 'Start',
    stop: 'Stop',
    messageType: 'Message Type',
    domain: 'Domain',
    feishuChina: 'Feishu (China)',
    renderMode: 'Render Mode',
    textMode: 'Text',
    cardMode: 'Card',
    chatSettings: 'Chat Settings',
    enableSkills: 'Enable Skills',
    systemPrompt: 'System Prompt',
    systemPromptPlaceholder: 'Set custom instructions for IM bot...',
    saveConfig: 'Save Config',
    imConnectivitySectionTitle: 'Connectivity Diagnostics',
    imConnectivityTest: 'Test Connectivity',
    imConnectivityRetest: 'Retest',
    imConnectivityTesting: 'Testing...',
    imNavInstanceCount: '{connected}/{total} connected',
    imChannelBotsTitle: '{platform} Bots',
    imInstanceSummary: '{connected} connected / {total} total',
    imChannelEnabledPendingSave: '{platform} is enabled. Save to restart the gateway and apply.',
    imChannelConnecting: '{platform} is connecting. This usually takes 10-30 seconds.',
    imChannelConnectionFailed: '{platform} failed to connect. Rescan or test connectivity.',
    imAddBot: 'Add Bot',
    imBackToBotList: 'Back to {platform} list',
    imCredentialConfigured: 'Credentials configured',
    imCredentialMissing: 'Credentials missing',
    imInstanceActionMenu: 'Bot actions',
    imDeleteBotConfirmTitle: 'Confirm Delete Bot',
    imDeleteBotConfirmMessage: 'Delete {platform} bot "{name}"? This action cannot be undone.',
    imRescan: 'Rescan',
    imAccountSection: 'Account',
    imAccountIdLabel: 'Account ID',
    imReceivePermission: 'Receive Permission',
    imDmPolicyLabel: 'DM Policy',
    imAllowFromLabel: 'Allow From (User IDs)',
    imAllowFromPlaceholder: 'wxid_xxx@im.wechat',
    imConnectivityNoResult: 'No diagnostics yet. Test after enabling the gateway.',
    imConnectivityLastChecked: 'Last checked',
    imConnectivitySuggestion: 'Suggestion',
    imConnectivityVerdict_pass: 'Ready',
    imConnectivityVerdict_warn: 'Attention Needed',
    imConnectivityVerdict_fail: 'Unavailable',
    imConnectivityCheckTitle_missing_credentials: 'Missing Credentials',
    imConnectivityCheckTitle_auth_check: 'Credential Authentication',
    imConnectivityCheckTitle_gateway_running: 'IM Channel Enablement',
    imConnectivityCheckTitle_inbound_activity: 'Inbound Message Activity',
    imConnectivityCheckTitle_outbound_activity: 'Outbound Message Activity',
    imConnectivityCheckTitle_platform_last_error: 'Recent Platform Error',
    imConnectivityCheckTitle_feishu_group_requires_mention: 'Feishu Group Trigger Rule',
    imConnectivityCheckTitle_feishu_event_subscription_required:
      'Feishu Event Subscription Requirement',
    imConnectivityCheckTitle_discord_group_requires_mention: 'Discord Group Trigger Rule',
    imConnectivityCheckTitle_telegram_privacy_mode_hint: 'Telegram Privacy Mode',
    imConnectivityCheckTitle_dingtalk_bot_membership_hint: 'DingTalk Conversation Permission',
    imConnectivityCheckTitle_nim_p2p_only_hint: 'NetEase IM P2P Mode',
    imConnectivityCheckSuggestion_missing_credentials: 'Fill required credentials and test again.',
    imConnectivityCheckSuggestion_auth_check:
      'Verify credentials, permissions, and app release status.',
    imConnectivityCheckSuggestion_gateway_running:
      'If disabled, click the IM channel pill to enable it, then verify platform endpoints are reachable.',
    imConnectivityCheckSuggestion_inbound_activity:
      'Send a test message to the bot; mention it in group chats.',
    imConnectivityCheckSuggestion_outbound_activity:
      'Check bot send permissions and conversation reply scope.',
    imConnectivityCheckSuggestion_platform_last_error:
      'Fix the reported error and run diagnostics again.',
    imConnectivityCheckSuggestion_feishu_group_requires_mention:
      'Use @bot plus your message in group chats.',
    imConnectivityCheckSuggestion_feishu_event_subscription_required:
      'Enable im.message.receive_v1 and publish app version.',
    imConnectivityCheckSuggestion_discord_group_requires_mention:
      'Use @bot plus your message in channels.',
    imConnectivityCheckSuggestion_telegram_privacy_mode_hint:
      'Review Privacy Mode in @BotFather settings.',
    imConnectivityCheckSuggestion_dingtalk_bot_membership_hint:
      'Ensure the bot is in the target conversation with send/receive rights.',
    imConnectivityCheckSuggestion_nim_p2p_only_hint:
      'Send messages via direct chat to the bot account.',
    nimAccountPlaceholder: 'Bot account ID',
    nimAccountHint: 'IM account ID (accid) created in NetEase IM console account management',
    nimCredentialsGuide: 'How to obtain NetEase IM credentials:',
    nimGuideStep1: 'Log in to NetEase IM console (yunxin.163.com)',
    nimGuideStep2: 'Create or select an app to get the App Key',
    nimGuideStep3: 'Create an IM account (accid) in "Account Numbers - Sub-feature Configuration"',
    nimGuideStep4: 'Generate a Token (password) for this account - long-term validity recommended',
    nimAppKeyLabel: 'App Key',
    nimAccountLabel: 'Account ID',
    nimTokenLabel: 'Token',
    imNimAddInstance: 'Add NIM Instance',
    imNimClickToRename: 'Click to rename NIM instance',
    imNimEnableInstance: 'Enable NIM instance',
    imNimDisableInstance: 'Disable NIM instance',
    imNimDeleteInstance: 'Delete NIM instance',
    imNimQrLogin: 'Scan QR Code to Create Bot',
    imNimQrLoginHintPrefix: 'Use',
    imNimQrLoginHintSuffix: 'to scan the QR code and create a bot.',
    imNimQrGenerating: 'Generating QR code...',
    imNimQrScanPromptPrefix:
      'Scan the QR code below with the NetEase IM client to finish binding. If it is not installed, download ',
    imNimQrDemoLink: 'NetEase IM',
    imNimQrScanPromptSuffix: ' first.',
    imNimQrExpiresIn: 'QR code expires in {seconds}s',
    imNimQrExpired: 'QR code expired, please refresh',
    imNimQrRefresh: 'Refresh QR Code',
    imNimQrCancel: 'Cancel',
    imNimQrSuccess: 'Configuration received. Save to apply.',
    imNimQrFailed: 'QR login failed',
    imNimQrFailedWithCode: 'QR login failed (code: {code})',
    imNimQrOrManual: 'or manually enter / edit existing bot credentials',
    imNimQrUnsupported:
      'QR login is not supported in this environment. Please enter credentials manually.',
    imNimDownloadModalTitle: 'Download NetEase IM',
    imNimDownloadModalDesc:
      'Choose a platform and scan the matching QR code with your phone to download the client.',
    imNimDownloadPlatformAndroid: 'Android',
    imNimDownloadPlatformIos: 'iOS',
    imNimDownloadModalHint: 'Scan this QR code with your {platform} device to download NetEase IM.',
    imNimDownloadQrAlt: '{platform} download QR code',
    nimAppKeyHint: 'Obtain from app information in NetEase IM console',
    nimTokenHint: 'Access credential generated for this account (long-term validity recommended)',
    nimAccountWhitelist: 'Account Whitelist',
    nimAccountWhitelistHint:
      'Enter NIM accounts allowed to chat with the bot, separated by commas. Leave empty to allow all accounts.',
    nimTeamPolicy: 'Team Message Policy',
    nimTeamPolicyDisabled: 'Disabled - Do not respond to team messages',
    nimTeamPolicyOpen: 'Open - Respond to @mentions in all teams',
    nimTeamPolicyAllowlist: 'Allowlist - Only respond to @mentions in specified teams',
    nimTeamPolicyHint: 'Bot only responds when @-mentioned in team messages',
    nimTeamAllowlist: 'Team Allowlist',
    nimTeamAllowlistHint: 'Enter team IDs to allow, separated by commas',
    nimQChatEnabled: 'Enable QChat (Circle Groups)',
    nimQChatEnabledHint: 'Subscribe to QChat messages, only responds to @mentions',
    nimQChatServerIds: 'QChat Server IDs',
    nimQChatServerIdsPlaceholder: 'Leave empty to auto-discover all joined servers',
    nimQChatServerIdsHint:
      'Specify server IDs to subscribe, separated by commas. Leave empty to auto-subscribe all joined servers.',
    neteaseBeeChanClientIdPlaceholder: 'Netease Bee IM Client ID',

    // IM settings page - POPO config
    imPopoAesKeyLengthWarning: 'AES Key must be 32 characters',
    imPopoAesKeyLengthCurrent: 'current',
    imPopoWebhookPlaceholder: 'External domain (optional, auto-detects local IP)',
    imPopoUserIdPlaceholder: 'Enter user ID and press Enter',
    imPopoGroupIdPlaceholder: 'Enter group ID and press Enter',

    // IM settings page i18n
    imAdvancedSettings: 'Advanced Settings',
    imPairingApproval: 'Pairing Code Approval',
    imPairingCodePlaceholder: 'Enter pairing code',
    imPairingApprove: 'Approve',
    imPairingCodeApproved: 'Pairing code {code} approved',
    imPairingCodeInvalid: 'Invalid or expired pairing code',
    imDebugMode: 'Debug Mode',
    imSessionTimeout: 'Session Timeout (min, deprecated)',
    imSeparateSessionByConversation: 'Separate Session by Conversation',
    imSeparateSessionByConversationDesc:
      'Maintain independent sessions for DMs, groups, and different groups',
    imGroupSessionScope: 'Group Session Scope',
    imGroupSessionScopeGroup: 'Shared in group',
    imGroupSessionScopeGroupSender: 'Per user in group',
    imSharedMemoryAcrossConversations: 'Share Memory Across Conversations',
    imSharedMemoryAcrossConversationsDesc:
      'Share memory across different conversations (isolated by default)',
    imGatewayBaseUrl: 'Custom Gateway URL',
    imGatewayBaseUrlPlaceholder: 'e.g. https://proxy.example.com',
    imSendThinkingMessage: 'Send "thinking" message',
    imDmPolicyOpen: 'Open',
    imDmPolicyPairing: 'Pairing',
    imDmPolicyAllowlist: 'Allowlist',
    imDmPolicyDisabled: 'Disabled',
    imGroupPolicyOpen: 'Open',
    imGroupPolicyAllowlist: 'Allowlist',
    imGroupPolicyDisabled: 'Disabled',
    imFeishuDomainFeishu: 'Feishu (feishu.cn)',
    imFeishuDomainLark: 'Lark (larksuite.com)',
    imFeishuUserIdPlaceholder: 'Enter Feishu User ID',
    imFeishuChatIdPlaceholder: 'Enter Feishu Chat ID',
    imReplyModeAuto: 'Auto',
    imReplyModeStatic: 'Static',
    imReplyModeStreaming: 'Streaming',
    imFeishuStreaming: 'Streaming Output',
    imFeishuStreamingDesc:
      'When enabled, auto mode uses streaming cards for DMs and static replies for groups',
    imFeishuBlockStreaming: 'Block Streaming',
    imFeishuBlockStreamingDesc: 'In static mode, flush text immediately during tool calls',
    imFeishuFooterStatus: 'Show Status Indicator',
    imFeishuFooterElapsed: 'Show Elapsed Time',
    imDingtalkUserIdPlaceholder: 'Enter DingTalk User ID',
    imQQCredentialHint: 'Get AppID and AppSecret from QQ Open Platform',
    imQQUserIdPlaceholder: 'Enter QQ OpenID',
    imQQImageServerHint: 'Public image server URL for sending images',
    imQQAddInstance: 'Add Instance',
    imTelegramAddInstance: 'Add Instance',
    imQQClickToRename: 'Click to rename',
    imQQDeleteInstance: 'Delete this instance',
    imQQEnableInstance: 'Enable this instance',
    imQQDisableInstance: 'Disable this instance',
    imInstanceFillCredentials: 'Please fill in required credentials first',
    imFeishuAddInstance: 'Add Instance',
    imFeishuDeleteInstance: 'Delete Instance',
    imFeishuDeleteConfirm: 'Delete this Feishu bot instance?',
    imFeishuInstanceName: 'Instance Name',
    imFeishuMaxInstances: 'Maximum instances reached',
    imDingTalkAddInstance: 'Add Instance',
    imDingTalkDeleteInstance: 'Delete Instance',
    imDingTalkDeleteConfirm: 'Delete this DingTalk bot instance?',
    imDingTalkInstanceName: 'Instance Name',
    imDingTalkMaxInstances: 'Maximum instances reached',
    imTelegramClickToRename: 'Click to rename',
    imTelegramDeleteInstance: 'Delete this instance',
    imTelegramEnableInstance: 'Enable this instance',
    imTelegramDisableInstance: 'Disable this instance',
    imTelegramTokenHint: 'Get Bot Token from @BotFather',
    imTelegramUserIdPlaceholder: 'Enter Telegram User ID (e.g. tg:123456789)',
    imDiscordClickToRename: 'Click to rename',
    imDiscordDeleteInstance: 'Delete this instance',
    imDiscordEnableInstance: 'Enable this instance',
    imDiscordDisableInstance: 'Disable this instance',
    imDiscordTokenHint: 'Get Bot Token from Discord Developer Portal',
    imDiscordUserIdPlaceholder: 'Enter Discord User ID',
    imDiscordServerIdPlaceholder: 'Enter Discord Server ID',
    imDiscordGuildIdPlaceholder: 'Enter Guild ID and press Enter',
    imWecomCredentialHint: 'Get Bot ID and Secret from WeCom Admin Console',
    imWecomUserIdPlaceholder: 'Enter WeCom User ID',
    imWecomBotIdPlaceholder: 'Your Bot ID',
    imWecomScanBtn: 'Scan to Create Bot',
    imWecomScanHint: 'Scan with WeCom to auto-fill BotID and Secret',
    imWecomOrManual: 'or manually enter / edit bot credentials',
    imWecomQuickSetupPending: 'Waiting for QR code authorization...',
    imWecomQuickSetupSuccess: 'Configuration received. Save to apply.',
    imWecomQuickSetupError: 'Creation failed',
    imWecomAddInstance: 'Add Instance',
    imViewGuide: 'Setup Manual',
    imDingtalkGuideStep1:
      'Go to DingTalk Open Platform, create or pick an enterprise app under "App Development > Bot"',
    imDingtalkGuideStep2:
      'Copy the Client ID (AppKey) and Client Secret (AppSecret) from the credentials page',
    imDingtalkGuideStep3:
      'Turn on the "Bot" capability and enter Client ID and Client Secret below',
    imDingtalkGuideStep4: 'Once saved, the bot will auto-connect via Stream mode',
    dingtalkBotCreateWizardScanBtn: 'Scan QR Code to Configure Bot',
    dingtalkBotCreateWizardScanHint:
      'Scan the QR code with DingTalk mobile app to create and configure a bot in one step',
    dingtalkBotCreateWizardOrManual: 'or manually enter bot credentials',
    dingtalkBotCreateWizardQrcodeDesc:
      'Scan the QR code with DingTalk mobile app to complete bot creation and authorization.',
    dingtalkBotCreateWizardQrcodeExpired: 'QR code expired, please scan again',
    dingtalkBotCreateWizardSuccessTitle: 'Configuration received. Save to apply.',
    dingtalkBotCreateWizardGenerating: 'Generating QR code...',
    imFeishuGuideStep1: 'Enter the Feishu bot App ID and App Secret below to complete setup',
    imFeishuGuideStep2:
      'App credentials are available on the Feishu Open Platform. See the setup manual for details.',
    feishuBotCreateWizardTitle: 'Create Bot',
    feishuBotCreateWizardScanBtn: 'Scan QR Code to Create Bot',
    feishuBotCreateWizardScanHint:
      'Scan the QR code with your Feishu app to create and configure a bot in one step',
    feishuBotCreateWizardOrManual: 'or manually enter / edit bot credentials',
    feishuBotCreateWizardOptionNew: 'Create a new bot',
    feishuBotCreateWizardOptionExisting: 'Use an existing bot',
    feishuBotCreateWizardQrcodeDesc:
      'Scan the QR code with your Feishu app and select "One-click create Feishu bot" to complete setup.',
    feishuBotCreateWizardQrcodeExpired: 'QR code expired, please refresh',
    feishuBotCreateWizardQrcodeRefresh: 'Refresh QR Code',
    feishuBotCreateWizardVerify: 'Verify',
    feishuBotCreateWizardVerifying: 'Verifying...',
    feishuBotCreateWizardSuccessTitle: 'Configuration received. Save to apply.',
    feishuBotCreateWizardSuccessDesc: 'Save to apply the bot configuration.',
    feishuBotCreateWizardErrorRetry: 'Retry',
    feishuBotCreateWizardDone: 'Done',
    feishuBotCreateWizardAppIdPlaceholder: 'Enter App ID',
    feishuBotCreateWizardAppSecretPlaceholder: 'Enter App Secret',
    imWecomGuideStep1: 'Create a new bot application in the WeCom Admin Console',
    imWecomGuideStep2: 'Copy the BotID and Secret credentials',
    imWecomGuideStep3: 'Enter BotID and Secret in the form below',
    imWeixinGuideStep1: 'Click the "Scan to Connect WeChat" button',
    imWeixinGuideStep2: 'Scan the QR code with WeChat to connect',
    imWeixinGuideStep3: 'Once connected, you can chat with AI via WeChat messages',
    imWeixinScanBtn: 'Scan to Connect WeChat',
    imWeixinScanHint: 'Scan the QR code with WeChat to connect IM bot',
    imWeixinQrLoading: 'Getting QR code...',
    imWeixinQrScanPrompt: 'Scan the QR code below with WeChat',
    imWeixinQrWaiting: 'Waiting for scan confirmation...',
    imWeixinQrSuccess: 'Configuration received. Save to apply.',
    imWeixinQrFailed: 'Connection failed',
    imWeixinQrExpired: 'QR code expired, please try again',
    imWeixinQrAccountMissing:
      'WeChat is already connected to this OpenClaw, but no local account ID was found. Refresh status and try again.',
    imWeixinCredentialsMissing: 'WeChat login credentials are missing. Please scan the QR code again.',
    imPopoCredentialHint: 'Get AppKey, AppSecret and AES Key from the POPO Developer Portal',
    imPopoGuideStep1: 'Click "Scan to Bind POPO Bot" or enter credentials manually',
    imPopoGuideStep2: 'Scan the QR code with POPO to bind the bot',
    imPopoGuideStep3: 'Credentials will be filled automatically after binding',
    imPopoConnectionMode: 'Connection Mode',
    imPopoConnectionModeWebsocket: 'Long Connection (WebSocket)',
    imPopoConnectionModeWebhook: 'Callback (Webhook)',
    imPopoScanBtn: 'Scan to Bind POPO Bot',
    imPopoScanHint: 'Scan the QR code with POPO to create and bind a bot',
    imPopoQrLoading: 'Generating QR code...',
    imPopoQrScanPrompt: 'Scan the QR code below with POPO',
    imPopoQrSuccess: 'Configuration received. Save to apply.',
    imPopoQrFailed: 'Binding failed',
    imPopoQrExpired: 'QR code expired, please try again',
    imPopoQrWaiting: 'Waiting for scan...',
    imQQGuideStep1: 'Sign up on QQ Open Platform (q.qq.com) and create a bot application',
    imQQGuideStep2: 'Find the AppID (numeric) and Client Secret under "Development Settings"',
    imQQGuideStep3: 'Enter AppID and Client Secret below',
    imQQGuideStep4: 'Once saved, the bot will auto-connect via WebSocket mode',
    imTelegramGuideStep1: 'Search for @BotFather in Telegram',
    imTelegramGuideStep2: 'Send /newbot and follow the prompts to create your bot',
    imTelegramGuideStep3: 'Copy the generated Bot Token',
    imTelegramGuideStep4: 'Paste the token into the field below',
    imDiscordGuideStep1: 'Open Discord Developer Portal and create a new application',
    imDiscordGuideStep2: 'Under the Bot section, add a bot and copy its token',
    imDiscordGuideStep3:
      'Under Bot – Privileged Gateway Intents, enable Message Content and Server Members intents',
    imDiscordGuideStep4:
      'In the OAuth2 URL Generator, select "bot" and "applications.commands" with messaging permissions',
    imDiscordGuideStep5: 'Invite the bot to your server using the generated URL',
    imDiscordGuideStep6: 'Paste the bot token into the field below',

    // General Settings
    autoLaunch: 'Launch at Login',
    autoLaunchDescription: 'Automatically start the app when you log in',
    useSystemProxy: 'Use System Proxy',
    useSystemProxyDescription: 'When enabled, network requests follow system proxy settings (applies after Save)',
    browserWebAccessTab: 'Browser',
    browserWebAccessTitle: 'Browser',
    browserWebAccessDescription: 'Use the LobsterAI separate browser and manage page access rules.',
    browserSectionTitle: 'Browser',
    browserEnableTool: 'Enable browser',
    browserEnableToolDescription: 'Allow the agent to open and operate web pages.',
    browserProfileManaged: 'Separate browser (recommended)',
    browserProfileManagedDescription: 'LobsterAI starts a dedicated browser that is stable and clean.',
    browserProfileUser: 'My Chrome',
    browserProfileUserDescription: 'Use this for sites that need your login state, such as X, Google, or internal systems.',
    browserNetworkSectionTitle: 'Network access mode',
    browserSystemProxyOn: 'System proxy is enabled for the app, and the browser follows that global switch.',
    browserSystemProxyOff: 'System proxy is not enabled for the app; this page will not turn it on automatically.',
    browserNetworkOpen: 'Prefer opening pages successfully (recommended)',
    browserNetworkOpenDescription: 'Better for everyday browser tasks, especially when system proxy is enabled.',
    browserNetworkStrict: 'Strictly protect local and private networks',
    browserNetworkStrictDescription: 'Blocks localhost, private networks, and special address ranges; some pages may fail when proxy is enabled.',
    browserNetworkStrictProxyWarning: 'System proxy is currently enabled, so strict mode may make some pages fail again.',
    browserWebFetchSectionTitle: 'Web fetch',
    browserWebFetchEnable: 'Enable web fetch',
    browserWebFetchEnableDescription: 'Read regular articles, documentation pages, and lightweight web pages.',
    browserWebFetchReadability: 'Extract main content',
    browserWebFetchReadabilityDescription: 'Try to remove navigation, ads, and unrelated page content.',
    browserDiagnosticsTitle: 'Diagnostics',
    browserDiagnosticsDescription: 'Automatically checks whether the browser can start and open a test page.',
    browserDiagnosticsRun: 'Test browser',
    browserDiagnosticsRunning: 'Testing...',
    browserDiagnosticFailed: 'Browser diagnostic failed',
    browserDiagnosticGatewayReady: 'OpenClaw runtime is running',
    browserDiagnosticGatewayNotRunning: 'OpenClaw runtime is not running',
    browserDiagnosticGatewayFailed: 'OpenClaw runtime check failed',
    browserDiagnosticProfilesReady: 'Browser profiles were loaded',
    browserDiagnosticProfilesFailed: 'Failed to load browser profiles',
    browserDiagnosticStatusReady: 'Browser control connection is available',
    browserDiagnosticStatusWarning: 'Browser status check returned a warning',
    browserDiagnosticStartReady: 'Browser started',
    browserDiagnosticStartFailed: 'Browser failed to start',
    browserDiagnosticOpenPageReady: 'Test page opened',
    browserDiagnosticOpenPageFailed: 'Failed to open test page',
    browserResetManagedData: 'Clear separate browser data',
    browserResetting: 'Clearing...',
    browserResetConfirm: 'Clear separate browser data? This removes website data and cache from that browser.',
    browserResetFailed: 'Failed to clear separate browser data',
    browserAdvancedTitle: 'Advanced settings',
    browserFollowGlobalProxy: 'Browser follows global proxy',
    browserFollowGlobalProxyDescription: 'Enabled by default. Turning it off is stored for LobsterAI, but this version can still be affected by the browser proxy settings.',
    browserEvaluateEnabled: 'Allow scripts inside pages',
    browserEvaluateEnabledDescription: 'Turning this off is more conservative, but some complex page actions may stop working.',
    browserEfficientSnapshot: 'Use compact page snapshots',
    browserEfficientSnapshotDescription: 'Reduces page content size and works better for everyday tasks.',
    browserHeadless: 'Run browser without a visible window',
    browserHeadlessDescription: 'Useful for automation environments; not recommended for normal desktop use.',
    browserAttachOnly: 'Only connect to an already running browser',
    browserAttachOnlyDescription: 'Does not start a browser automatically. Intended for advanced debugging.',
    browserExecutablePath: 'Browser executable path',
    browserExecutablePathDescription: 'Specify the Chrome, Brave, or Edge executable path. Leave empty to auto-detect.',
    browserCdpUrl: 'Remote browser URL',
    browserCdpUrlDescription: 'Connect to remote Chrome DevTools or Browserless. Most users do not need this.',
    browserCdpUrlInvalid: 'Enter a URL starting with http, https, ws, or wss.',
    browserAllowedHostnames: 'Allowed domains',
    browserAllowedHostnamesDescription: 'Domains that can be opened without asking',
    browserBlockedHostnames: 'Blocked domains',
    browserBlockedHostnamesDescription: 'LobsterAI will not open these websites',
    browserHostnameListEmpty: 'No domains added yet',
    browserHostnameInputPlaceholder: 'example.com',
    browserAddBlockedHostnameTitle: 'Add blocked domain',
    browserAddBlockedHostnameDescription: 'This means LobsterAI will not open this URL',
    browserAddAllowedHostnameTitle: 'Add allowed domain',
    browserAddAllowedHostnameDescription: 'This means LobsterAI can open this domain',
    browserRemoteCdpTimeout: 'Remote connection timeout (ms)',
    browserRemoteCdpHandshakeTimeout: 'Remote handshake timeout (ms)',
    browserExtraArgs: 'Browser launch arguments',
    browserExtraArgsDescription: 'One Chrome launch argument per line. Incorrect values may prevent the browser from starting.',
    browserWebFetchTimeout: 'Web fetch timeout (seconds)',
    browserWebFetchFollowGlobalProxy: 'Web fetch follows global proxy',
    browserWebFetchFollowGlobalProxyDescription: 'When enabled, web fetch uses the system proxy only if the app-wide Use System Proxy switch is on.',
    browserWebFetchMaxRedirects: 'Maximum redirects',
    browserWebFetchMaxChars: 'Maximum returned characters',
    browserWebFetchUserAgent: 'Web fetch User-Agent',
    browserWebFetchAllowFakeIp: 'Allow fake-IP proxy range',
    browserWebFetchAllowFakeIpDescription: 'Only enable this when using proxy setups such as Clash TUN or Surge.',
    sqliteAutoBackupEnabled: 'Enable Auto Backup and Recovery',
    sqliteAutoBackupEnabledDescription:
      'When enabled, the app automatically backs up data and tries to restore corrupted data on startup',
    taskCompletionNotifications: 'Task Completion Notifications',
    taskCompletionNotificationsDescription:
      'Show a system alert when a task completes while the app is not in the foreground',
    preventSleep: 'Prevent Sleep',
    preventSleepDescription: 'Prevent the system from sleeping while the app is running',
    skipMissedJobs: 'Skip Missed Scheduled Jobs',
    skipMissedJobsDescription:
      'Skip jobs that were missed while the app was offline (applies after Save)',

    // Scheduled Tasks
    scheduledTasks: 'Scheduled Tasks',
    scheduledTasksTitle: 'Scheduled Tasks',
    scheduledTasksNewTask: 'New Task',
    scheduledTasksTemplateTitle: 'Scheduled Task Templates',
    scheduledTasksTemplateSubtitle:
      'Pick a common office automation scenario to prefill the plan and prompt',
    scheduledTasksTemplateUse: 'Use template',
    scheduledTasksTemplateNew: 'New',
    scheduledTasksTemplateEmpty: 'No templates available',
    scheduledTasksTemplateTechBriefingTitle: 'Tech Morning Brief',
    scheduledTasksTemplateTechBriefingDesc:
      'Summarize technology, AI, and product updates on workday mornings for quick scanning.',
    scheduledTasksTemplateTechBriefingSchedule: 'Weekdays 08:30',
    scheduledTasksTemplateTechBriefingPrompt:
      'Collect and summarize technology, AI, and product updates from the past 24 hours. Select 5-8 items relevant to office, engineering, and product teams. For each item, include what happened, why it matters, and a possible follow-up action. End with keywords worth watching today.',
    scheduledTasksTemplateWorkdayWrapTitle: 'Workday Wrap-up',
    scheduledTasksTemplateWorkdayWrapDesc:
      'Review daily progress, risks, and tomorrow tasks before the end of each workday.',
    scheduledTasksTemplateWorkdayWrapSchedule: 'Weekdays 18:00',
    scheduledTasksTemplateWorkdayWrapPrompt:
      "Prepare today's work wrap-up with sections for completed items, in-progress work, blockers, and tomorrow's to-do list. Keep it concise and actionable, and call out items that should be synced with teammates.",
    scheduledTasksTemplateMeetingPrepTitle: 'Meeting Prep',
    scheduledTasksTemplateMeetingPrepDesc:
      'Prepare goals, open questions, and materials before the day starts.',
    scheduledTasksTemplateMeetingPrepSchedule: 'Weekdays 08:45',
    scheduledTasksTemplateMeetingPrepPrompt:
      "Use accessible calendar, task, or work records to prepare for today's meetings and priorities. List each meeting's goal, materials to review, questions to confirm, and follow-up actions to track afterward.",
    scheduledTasksTemplateWeeklyReportTitle: 'Weekly Report Draft',
    scheduledTasksTemplateWeeklyReportDesc:
      'Draft a structured weekly report every Friday before the end of the day.',
    scheduledTasksTemplateWeeklyReportSchedule: 'Friday 17:30',
    scheduledTasksTemplateWeeklyReportPrompt:
      "Draft this week's work report with completed work, key progress, measurable outcomes, problems and risks, and next week's plan. Use a tone suitable for sending directly to a manager or team.",
    scheduledTasksTemplateProjectHealthTitle: 'Project Health Check',
    scheduledTasksTemplateProjectHealthDesc:
      'Check project status, recent changes, and potential risks on a regular schedule.',
    scheduledTasksTemplateProjectHealthSchedule: 'Daily 10:00',
    scheduledTasksTemplateProjectHealthPrompt:
      'Check the current project health. Focus on recent changes, test or build status, obvious TODOs or risks, and improvement opportunities. Provide a brief inspection report and list items that need human follow-up.',
    scheduledTasksTemplateMonthlyAdminTitle: 'Monthly Admin Reminder',
    scheduledTasksTemplateMonthlyAdminDesc:
      'Remind me to handle invoices, expenses, renewals, contracts, and routine admin tasks.',
    scheduledTasksTemplateMonthlyAdminSchedule: 'Monthly on the 25th at 10:00',
    scheduledTasksTemplateMonthlyAdminPrompt:
      "Remind me to organize this month's admin tasks, including invoices, expenses, subscription renewals, contracts, equipment, and other items that should be handled before month end. Output a checklist and mark suggested priority.",
    scheduledTasksEmptyState: 'No scheduled tasks',
    scheduledTasksEmptyHint: 'Create scheduled tasks to automate AI execution on a schedule',
    scheduledTasksListColTitle: 'Title',
    scheduledTasksListColSchedule: 'Scheduled For',
    scheduledTasksListColStatus: 'Status',
    scheduledTasksListColMore: 'More',
    scheduledTasksTabTasks: 'Tasks',
    scheduledTasksTabHistory: 'History',
    scheduledTasksHistoryEmpty: 'No run history',
    scheduledTasksHistoryColTitle: 'Title',
    scheduledTasksHistoryColTime: 'Run Time',
    scheduledTasksHistoryColStatus: 'Status',
    scheduledTasksFormName: 'Title',
    scheduledTasksFormNamePlaceholder: 'Enter task title',
    scheduledTasksFormDescription: 'Description',
    scheduledTasksFormDescriptionPlaceholder: 'Optional task description',
    scheduledTasksFormAgentId: 'Agent ID',
    scheduledTasksFormAgentIdPlaceholder: 'Optional, leave blank to use Primary Agent',
    scheduledTasksFormScheduleType: 'Plan',
    scheduledTasksFormScheduleModeEvery: 'Every',
    scheduledTasksFormScheduleModeAt: 'At',
    scheduledTasksFormScheduleModeCron: 'Cron',
    scheduledTasksFormScheduleModeOnce: 'Once',
    scheduledTasksFormScheduleModeDaily: 'Daily',
    scheduledTasksFormScheduleModeWeekly: 'Weekly',
    scheduledTasksFormScheduleModeMonthly: 'Monthly',
    scheduledTasksFormScheduleModeHourly: 'Hourly',
    scheduledTasksFormWeekSun: 'Sunday',
    scheduledTasksFormWeekMon: 'Monday',
    scheduledTasksFormWeekTue: 'Tuesday',
    scheduledTasksFormWeekWed: 'Wednesday',
    scheduledTasksFormWeekThu: 'Thursday',
    scheduledTasksFormWeekFri: 'Friday',
    scheduledTasksFormWeekSat: 'Saturday',
    scheduledTasksFormWeekShortMon: 'Mo',
    scheduledTasksFormWeekShortTue: 'Tu',
    scheduledTasksFormWeekShortWed: 'We',
    scheduledTasksFormWeekShortThu: 'Th',
    scheduledTasksFormWeekShortFri: 'Fr',
    scheduledTasksFormWeekShortSat: 'Sa',
    scheduledTasksFormWeekShortSun: 'Su',
    scheduledTasksFormHourlyAtMinute: 'at minute',
    scheduledTasksFormHourlyMinuteSuffix: 'min',
    scheduledTasksFormValidationWeekdayRequired: 'Please select at least one day',
    scheduledTasksFormValidationTimeRequired: 'Please select a time',
    scheduledTasksFormValidationWorkingDirectoryRequired: 'Task working directory is required',
    scheduledTasksFormMonthDaySuffix: '',
    scheduledTasksFormScheduleAt: 'One-time',
    scheduledTasksFormScheduleAtHint: 'Run once at a specified time',
    scheduledTasksFormScheduleInterval: 'Interval',
    scheduledTasksFormScheduleIntervalHint: 'Repeat at fixed intervals',
    scheduledTasksFormScheduleCron: 'Cron Expression',
    scheduledTasksFormScheduleCronHint: 'Define complex schedules with Cron',
    scheduledTasksFormDatetime: 'Execution Time',
    scheduledTasksFormRunAt: 'Run At',
    scheduledTasksFormEveryAmount: 'Interval Amount',
    scheduledTasksFormEveryUnit: 'Interval Unit',
    scheduledTasksFormInterval: 'Interval',
    scheduledTasksFormIntervalMinutes: 'minutes',
    scheduledTasksFormIntervalHours: 'hours',
    scheduledTasksFormIntervalDays: 'days',
    scheduledTasksFormCronExpression: 'Cron Expression',
    scheduledTasksFormCronPlaceholder: 'e.g. */5 * * * * (every 5 minutes)',
    scheduledTasksFormCronHelp: 'Format: min hour day month weekday (5 fields)',
    scheduledTasksFormCronTimezone: 'Cron Timezone',
    scheduledTasksFormCronTimezonePlaceholder: 'e.g. Asia/Shanghai',
    scheduledTasksFormPrompt: 'Execution Prompt',
    scheduledTasksFormPromptPlaceholder: 'Enter the prompt to execute...',
    scheduledTasksFormSessionTarget: 'Session Target',
    scheduledTasksFormSessionTargetMain: 'Main',
    scheduledTasksFormSessionTargetIsolated: 'Isolated',
    scheduledTasksFormWakeMode: 'Wake Mode',
    scheduledTasksFormWakeModeNow: 'Now',
    scheduledTasksFormWakeModeNextHeartbeat: 'Next heartbeat',
    scheduledTasksFormPayloadKind: 'Payload',
    scheduledTasksFormPayloadKindSystemEvent: 'System event',
    scheduledTasksFormPayloadKindAgentTurn: 'Agent turn',
    scheduledTasksFormPayloadTextSystem: 'System text',
    scheduledTasksFormPayloadTextAgent: 'Agent message',
    scheduledTasksFormTimeoutSeconds: 'Timeout (seconds)',
    scheduledTasksFormTimeoutSecondsPlaceholder: 'Optional, blank or 0 uses the default',
    scheduledTasksFormWorkingDirectory: 'Working Directory',
    scheduledTasksFormWorkingDirectoryPlaceholder: 'Enter project path',
    scheduledTasksFormSystemPrompt: 'System Prompt',
    scheduledTasksFormSystemPromptPlaceholder: 'Optional system prompt...',
    scheduledTasksFormExecutionMode: 'Execution Mode',
    scheduledTasksFormExecutionModeAuto: 'Auto',
    scheduledTasksFormExecutionModeLocal: 'Local',
    scheduledTasksFormExecutionModeSandbox: 'Sandbox',
    scheduledTasksFormEnabled: 'Enable Task',
    scheduledTasksFormModel: 'Model',
    scheduledTasksFormCreate: 'Create Task',
    scheduledTasksFormUpdate: 'Update Task',
    scheduledTasksFormValidationNameRequired: 'Task title is required',
    scheduledTasksFormValidationPromptRequired: 'Execution prompt is required',
    scheduledTasksFormValidationModelRequired: 'Task model is required',
    scheduledTasksFormValidationModelUnavailable:
      'The task model is unavailable. Please select another',
    scheduledTasksFormValidationDatetimeFuture: 'Execution time must be in the future',
    scheduledTasksFormValidationIntervalPositive: 'Interval must be greater than 0',
    scheduledTasksFormValidationCronRequired: 'Cron expression is required',
    scheduledTasksFormValidationPayloadMismatch:
      'Main sessions require system events, isolated sessions require agent turns',
    scheduledTasksFormValidationWebhookRequired: 'Webhook URL is required',
    scheduledTasksFormValidationTimeout: 'Timeout must be an integer greater than or equal to 0',
    scheduledTasksFormSubmitError: 'Save failed: ',
    scheduledTasksEdit: 'Edit',
    scheduledTasksDelete: 'Delete',
    scheduledTasksDeleteConfirm:
      'Are you sure you want to delete task "{name}"? This cannot be undone.',
    scheduledTasksRun: 'Run Now',
    scheduledTasksStop: 'Stop',
    scheduledTasksEnabled: 'Enabled',
    scheduledTasksDisabled: 'Disabled',
    scheduledTasksDetail: 'Task Detail',
    scheduledTasksConfiguration: 'Configuration',
    scheduledTasksSchedule: 'Plan',
    scheduledTasksPrompt: 'Prompt',
    scheduledTasksWorkingDirectory: 'Working Directory',
    scheduledTasksSystemPrompt: 'System Prompt',
    scheduledTasksExecutionMode: 'Execution Mode',
    scheduledTasksStatus: 'Status',
    scheduledTasksNextRun: 'Next Run',
    scheduledTasksLastRun: 'Last Run',
    scheduledTasksLastDuration: 'Last Duration',
    scheduledTasksLastError: 'Last Error',
    scheduledTasksConsecutiveErrors: 'Consecutive Errors',
    scheduledTasksRunHistory: 'Run History',
    scheduledTasksNoRuns: 'No runs yet',
    scheduledTasksLoadMore: 'Load More',
    scheduledTasksViewSession: 'View Session',
    scheduledTasksFilterStatus: 'Status',
    scheduledTasksFilterStatusAll: 'All Statuses',
    scheduledTasksFilterStartDate: 'Start Date',
    scheduledTasksFilterEndDate: 'End Date',
    scheduledTasksFilterClear: 'Clear Filters',
    scheduledTasksFilterNoResults: 'No records match the current filters',
    scheduledTasksSessionNotSynced: 'Failed to sync session. Please try again later.',
    scheduledTasksSessionSyncing: 'Syncing session...',
    scheduledTasksSessionRetry: 'Retry',
    scheduledTasksStatusSuccess: 'Success',
    scheduledTasksStatusError: 'Failed',
    scheduledTasksStatusSkipped: 'Skipped',
    scheduledTasksStatusRunning: 'Running',
    scheduledTasksStatusIdle: 'Idle',
    scheduledTasksNotSet: 'Not set',
    scheduledTasksNone: 'None',
    scheduledTasksScheduleAtLabel: 'One-time',
    scheduledTasksScheduleIntervalLabel: 'Interval',
    scheduledTasksScheduleCronLabel: 'Cron',
    scheduledTasksScheduleEvery: 'Every',
    scheduledTasksCronEveryDay: 'Every day',
    scheduledTasksCronEveryNMinutes: 'Every {n} minutes',
    scheduledTasksCronEveryMinute: 'Every minute',
    scheduledTasksCronEveryNHours: 'Every {n} hours',
    scheduledTasksCronEveryHour: 'Every hour',
    scheduledTasksCronWeekdays: 'Weekdays',
    scheduledTasksCronWeekends: 'Weekends',
    scheduledTasksCronEveryWeek: 'Every',
    scheduledTasksCronEveryMonth: 'Monthly',
    scheduledTasksCronAtTime: '{schedule} at {time}',
    scheduledTasksCronAtMonthDay: '{schedule} on the {day}th at {time}',
    scheduledTasksCronEveryHourAtMinute: 'Every hour at minute {min}',
    scheduledTasksAutoDisabledErrors: 'Task auto-disabled due to too many consecutive errors',
    scheduledTasksCreateFailed: 'Failed to create task',
    scheduledTasksUpdateFailed: 'Failed to update task',
    scheduledTasksDeleteFailed: 'Failed to delete task',
    scheduledTasksRunFailed: 'Failed to run task',
    scheduledTasksStopFailed: 'Failed to stop task',
    scheduledTasksFormExpiresAt: 'Expiration Date',
    scheduledTasksFormOptional: '(Optional)',
    scheduledTasksFormExpiresAtHint: 'Optional. Task will stop running after this date',
    scheduledTasksFormExpiresAtClear: 'Clear',
    scheduledTasksFormExpiresAtNone: 'Never expires',
    scheduledTasksDetailExpiresAt: 'Expiration Date',
    scheduledTasksFormNotify: 'IM Notification',
    scheduledTasksFormNotifyHint: 'Optional. Send task results via IM after completion',
    scheduledTasksFormNotifyDingtalk: 'DingTalk',
    scheduledTasksFormNotifyFeishu: 'Feishu',
    scheduledTasksFormNotifyQq: 'QQ',
    scheduledTasksFormNotifyTelegram: 'Telegram',
    scheduledTasksFormNotifyDiscord: 'Discord',
    scheduledTasksFormNotifyNim: 'NetEase IM',
    scheduledTasksFormNotifyXiaomifeng: 'Xiaomifeng',
    scheduledTasksFormNotifyWecom: 'WeCom',
    scheduledTasksFormNotifyWeixin: 'WeChat',
    scheduledTasksFormNotifyPopo: 'POPO',
    scheduledTasksFormNotifyNone: 'None',
    scheduledTasksFormNotifyNotConfigured: 'Not configured',
    scheduledTasksFormDeliveryMode: 'Delivery',
    scheduledTasksFormDeliveryModeNone: 'None',
    scheduledTasksFormDeliveryModeAnnounce: 'Announce summary',
    scheduledTasksFormDeliveryModeWebhook: 'Webhook',
    scheduledTasksFormDeliveryChannel: 'Channel',
    scheduledTasksFormDeliveryTo: 'Delivery Target',
    scheduledTasksFormDeliveryToPlaceholder: 'Select or enter target ID',
    scheduledTasksFormDeliveryToDm: 'DM',
    scheduledTasksFormDeliveryToGroup: 'Group',
    scheduledTasksFormDeliveryToAuto: 'Auto-detect',
    scheduledTasksFormWebhookUrl: 'Webhook URL',
    scheduledTasksDetailNotify: 'Notification',
    scheduledTasksDetailModel: 'Model',
    scheduledTasksDetailPlan: 'Plan',
    scheduledTasksAdvancedSchedule: 'Advanced schedule (edit via conversation only)',
    scheduledTasksFormNotifyChannel: 'Notification Channel',
    scheduledTasksFormNotifyChannelNone: 'None',
    scheduledTasksChannelUnsupported: 'Not supported',
    scheduledTasksSessionKey: 'Session Key',
    scheduledTasksFormNotifyConversation: 'Notify Conversation',
    scheduledTasksFormNotifyConversationPlaceholder: 'Select target conversation',
    scheduledTasksFormNotifyConversationLoading: 'Loading conversations...',
    scheduledTasksFormNotifyConversationNone: 'No conversations available',
    scheduledTasksToggleWarningAtPast:
      'The execution time of this task has passed. It will not run after enabling',
    scheduledTasksToggleWarningExpired: 'This task has expired. It will not run after enabling',
    scheduledTasksFormAdvancedEditAsCron: 'Edit as Cron',
    scheduledTasksFormPromptTemplateTitle: 'Quick templates',
    scheduledTasksFormPromptTemplateDailySummary: 'Daily summary',
    scheduledTasksFormPromptTemplateDailySummaryText:
      "Please summarize today's work progress, list completed items, blockers encountered, and tomorrow's to-do list.",
    scheduledTasksFormPromptTemplateDataCheck: 'Data inspection',
    scheduledTasksFormPromptTemplateDataCheckText:
      'Check the latest logs and runtime status of the project. If anomalies are found, provide a brief report and fix suggestions.',
    scheduledTasksFormPromptTemplateCodeReview: 'Code review',
    scheduledTasksFormPromptTemplateCodeReviewText:
      'Review the latest code commits for potential bugs, performance issues, and deviations from best practices.',
    scheduledTasksFormCronModeBuilder: 'Visual',
    scheduledTasksFormCronModeRaw: 'Expression',
    scheduledTasksFormCronField_minute: 'Min',
    scheduledTasksFormCronField_hour: 'Hour',
    scheduledTasksFormCronField_dom: 'Day',
    scheduledTasksFormCronField_month: 'Month',
    scheduledTasksFormCronField_dow: 'Weekday',
    scheduledTasksFormScheduleModeCronCustom: 'Custom (Cron)',
    scheduledTasksFormCronInputLabel: 'Cron Expression',
    scheduledTasksFormCronInputPlaceholder: 'e.g. 0 9 * * 1-5 (weekdays at 9 AM)',
    scheduledTasksFormCronInputHint: 'Format: min hour day month weekday (5 fields)',
    scheduledTasksFormCronPreview: 'Parsed as',
    scheduledTasksFormCronPreviewInvalid: 'Invalid Cron expression',
    scheduledTasksFormCronQuickTitle: 'Quick examples',
    scheduledTasksFormCronQuickEveryDay: 'Every day at 9:00',
    scheduledTasksFormCronQuickWeekday: 'Weekdays at 9:00',
    scheduledTasksFormCronQuickEveryHour: 'Every hour',
    scheduledTasksFormCronQuickEvery15min: 'Every 15 minutes',
    scheduledTasksFormPayloadTextAgentHint:
      'Describe what you want the AI to do. The more detail you provide, the better the results.',
    scheduledTasksFormCharCount: '{count} characters',
    scheduledTasksDataAnomalyWarning:
      'Scheduled task "{name}" has abnormal data. Display has been auto-corrected. Consider re-editing this task',

    // Privacy dialog
    privacyDialogTitle: 'NetEase Youdao LobsterAI Terms of Service',
    privacyDialogDesc:
      'Before using NetEase Youdao LobsterAI, please carefully read the {link} and confirm.',
    privacyDialogLinkText: 'NetEase Youdao LobsterAI Terms of Service',
    privacyDialogAccept: 'I have read and agree',
    privacyDialogReject: 'Decline',
    welcomeTitle: 'Welcome to LobsterAI',
    welcomeSubtitle: 'Explore a world of AI features~',
    welcomePromo: 'New users get 1M free tokens',
    welcomeLogin: 'Login',
    welcomeCustomModel: 'Custom Model',
    githubCopilotAuth: 'GitHub Account Authentication',
    githubCopilotSignIn: 'Sign in with GitHub',
    githubCopilotSignOut: 'Sign Out',
    githubCopilotRequesting: 'Requesting device code...',
    githubCopilotEnterCode:
      'Open the link below in your browser and enter the device code to authorize:',
    githubCopilotWaiting: 'Waiting for authorization...',
    githubCopilotConnected: 'Connected',
    githubCopilotNoSubscription: 'You do not have an active GitHub Copilot subscription',
    copy: 'Copy',

    'settings.enterprise.managed': 'Managed by enterprise',

    // TaskForm unsaved changes confirmation
    taskFormUnsavedChanges: 'Unsaved Changes',
    taskFormLeaveConfirm: 'Your changes will be lost if you leave. Are you sure you want to leave?',
    taskFormLeave: 'Leave',
    taskFormStay: 'Keep Editing',

    email: 'clawEmail',
    // Email Channel
    channelPrefixEmail: 'Email',
    emailSettings: 'Email Settings',
    emailInstance: 'Email Account',
    addEmailInstance: 'Add Email Account',
    emailInstanceName: 'Account Name',
    emailInstanceNamePlaceholder: 'e.g., Work Email',
    emailAddress: 'Email Address',
    emailAddressPlaceholder: 'user@example.com',
    emailPassword: 'Password',
    emailPasswordPlaceholder: 'Email password or app-specific password',
    emailApiKey: 'API Key',
    emailApiKeyPlaceholder: 'ck_live_xxxxxxxx',
    apiKeyHint: 'Click "Get API Key" to verify your email in browser',
    emailTransportMode: 'Transport Mode',
    emailTransportImap: 'IMAP/SMTP (Traditional)',
    emailTransportWs: 'WebSocket (Secure, no password required)',
    emailAgentBinding: 'Agent Binding',
    emailAgentBindingHint: 'All email conversations will be routed to the selected Agent',
    emailAllowFrom: 'Allowed Senders (Whitelist)',
    emailAllowFromPlaceholder: 'user@example.com, *.trusted-domain.com, *@company.com',
    emailAllowFromHint: 'Supports wildcards, comma-separated. Empty = accept all senders.',
    emailAdvancedOptions: 'Advanced Options',
    emailImapSmtpConfig: 'IMAP/SMTP Server Configuration',
    emailImapHost: 'IMAP Host',
    emailImapPort: 'IMAP Port',
    emailSmtpHost: 'SMTP Host',
    emailSmtpPort: 'SMTP Port',
    emailServerConfigHint: 'Leave empty to auto-detect from email domain',
    emailReplyStrategy: 'Reply Strategy',
    emailReplyMode: 'Reply Mode',
    emailReplyModeImmediate: 'Immediate (streaming, one email per block)',
    emailReplyModeAccumulated: 'Accumulated (streaming, buffered)',
    emailReplyModeComplete: 'Complete (wait for full response)',
    emailReplyTo: 'Reply Recipients',
    emailReplyToSender: 'Sender only',
    emailReplyToAll: 'Sender + all recipients',
    emailA2aConfig: 'Agent-to-Agent Configuration',
    emailA2aEnabled: 'Enable A2A',
    emailA2aAgentDomains: 'Agent Domains',
    emailA2aAgentDomainsPlaceholder: 'agents.example.com',
    emailA2aAgentDomainsHint: 'Domains allowed for agent collaboration, comma-separated',
    emailA2aMaxTurns: 'A2A Max Ping-Pong Turns',
    emailConnectivityFailAlert: 'Connectivity test failed, please check your configuration',
    emailConnectivityAskAI: 'AI Diagnostics',
    emailConnected: 'Connected',
    emailDisconnected: 'Disconnected',
    emailSaveSuccess: 'Configuration saved',
    emailSaveError: 'Save failed',
    emailValidationError: 'Configuration validation failed',
    emailMaxInstancesExceeded: 'Maximum {count} email accounts supported',
    emailDuplicateEmail: 'Email address "{email}" is duplicated',
    emailDuplicateInstanceId: 'Instance ID "{id}" is duplicated',
    emailInvalidEmail: 'Invalid email address format',
    emailMissingPassword: 'Instance "{name}" uses IMAP mode but password is missing',
    emailMissingApiKey: 'Instance "{name}" uses WebSocket mode but API Key is missing',
    emailInvalidApiKey: 'Instance "{name}" has invalid API Key format (should start with ck_)',
    emailGatewayRestarting: 'Restarting OpenClaw Gateway...',
    emailDeleteConfirm: 'Delete email account "{name}"?',
    emailEnterValidEmailFirst: 'Please enter a valid email address first',
    emailVerifyInBrowserAndPaste:
      'Please complete verification in browser, then paste API Key here',
    emailTestSuccess: 'Connection test successful!',
    emailTestFailed: 'Connection test failed: {error}',
    imEmailAddInstance: 'Add Account',
    imEmailNoInstances: 'No email accounts yet. Click below to add one.',
    imEmailSelectInstance: 'Select an email account from the sidebar.',
    emailEnabledLabel: 'Enable this account',
    emailSaving: 'Saving...',
    emailDeleting: 'Deleting...',
  },
};

class I18nService {
  private currentLanguage: LanguageType = 'zh';
  private listeners = new Set<() => void>();

  constructor() {
    // 默认使用中文
    this.currentLanguage = 'zh';
  }

  // 初始化语言设置
  async initialize(): Promise<void> {
    try {
      const config = configService.getConfig();

      // 检查是否已经初始化过语言设置
      const languageInitialized = config.language_initialized;

      if (languageInitialized !== true) {
        // 可能是首次启动或旧版本用户升级
        // 为了保护旧用户的语言设置,检查是否有非默认的语言配置
        const hasCustomLanguage = config.language && config.language !== 'zh';

        if (hasCustomLanguage) {
          // 旧用户已手动设置过语言(非默认值),保留他们的设置
          console.log(`[i18n] Legacy user detected with custom language: ${config.language}`);
          this.currentLanguage = config.language;
          configService.updateConfig({
            language_initialized: true,
          });
        } else {
          // 新用户或使用默认中文的旧用户:检测系统语言
          try {
            const systemLocale = await window.electron.appInfo.getSystemLocale();
            const defaultLanguage = this.inferLanguageFromLocale(systemLocale);

            console.log(
              `[i18n] First run detected. System locale: ${systemLocale}, default language: ${defaultLanguage}`,
            );

            this.currentLanguage = defaultLanguage;

            // 保存语言配置和初始化标记
            configService.updateConfig({
              language: defaultLanguage,
              language_initialized: true,
            });
          } catch (error) {
            console.error('Failed to get system locale:', error);
            // 如果获取系统语言失败,默认使用英文
            this.currentLanguage = 'en';
            configService.updateConfig({
              language: 'en',
              language_initialized: true,
            });
          }
        }
      } else {
        // 非首次启动:使用已保存的语言配置
        if (config.language && (config.language === 'zh' || config.language === 'en')) {
          this.currentLanguage = config.language;
        } else {
          // 如果配置无效,fallback 到英文
          this.currentLanguage = 'en';
          configService.updateConfig({
            language: 'en',
          });
        }
      }
    } catch (error) {
      console.error('Failed to initialize language:', error);
      // 默认使用英文
      this.currentLanguage = 'en';
    }
  }

  // 根据系统语言推断应用语言
  private inferLanguageFromLocale(systemLocale: string): LanguageType {
    // 只有 zh-CN (简体中文) 才使用中文,其他所有情况都使用英文
    if (systemLocale === 'zh-CN') {
      return 'zh';
    }
    return 'en'; // 默认英文 (包括 zh-TW, zh-HK, en-*, 以及其他所有语言)
  }

  // 设置语言
  setLanguage(language: LanguageType, options: { persist?: boolean } = {}): void {
    const { persist = true } = options;
    const hasChanged = this.currentLanguage !== language;
    this.currentLanguage = language;

    if (hasChanged) {
      this.listeners.forEach(listener => listener());
    }

    if (!persist) {
      return;
    }

    // 更新配置
    try {
      const config = configService.getConfig();
      configService.updateConfig({
        ...config,
        language,
      });
    } catch (error) {
      console.error('Failed to save language setting:', error);
    }
  }

  // 获取当前语言
  getLanguage(): LanguageType {
    return this.currentLanguage;
  }

  // 获取翻译文本
  t(key: string): string {
    const translation = translations[this.currentLanguage][key];
    if (!translation) {
      console.warn(`Translation missing for key: ${key} in language: ${this.currentLanguage}`);
      // 尝试从另一种语言获取
      const fallbackTranslation = translations[this.currentLanguage === 'zh' ? 'en' : 'zh'][key];
      return fallbackTranslation || key;
    }
    return translation;
  }

  subscribe(listener: () => void): () => void {
    this.listeners.add(listener);
    return () => {
      this.listeners.delete(listener);
    };
  }
}

export const i18nService = new I18nService();
