export default {
    meta: {
        title: "无限画布",
        description: "一个无限画布创作工具",
    },
    theme: { toggle: "切换主题" },
    common: {
        cancel: "取消",
        save: "保存",
        edit: "编辑",
        done: "完成",
        delete: "删除",
        copy: "复制",
        copied: "已复制",
        details: "详情",
        addToAssets: "加入我的资产",
        addedToAssets: "已加入我的资产",
        copyPrompt: "复制提示词",
        promptCopied: "提示词已复制",
        created: "创建：{{date}}",
        updated: "更新：{{date}}",
        all: "全部",
        view: "查看",
        download: "下载",
        upload: "上传",
        requestCanceled: "请求已取消",
        durationMinutes: "{{minutes}}分{{seconds}}秒",
        durationSeconds: "{{seconds}}秒",
        imageReadFailed: "读取图片失败",
    },
    settingsPanels: {
        common: { auto: "自动", low: "低", medium: "中", high: "高", xhigh: "极高" },
        image: { title: "图像设置", quality: "质量", size: "尺寸", align16: "16 倍数对齐", align16Hint: "输入完成后自动向上补成 16 的倍数", aspectRatio: "宽高比", transparent: "透明背景", transparentHint: "开启后生成无背景的透明图像（仅部分模型可用）", count: "生成张数", images: "{{count}} 张" },
        video: { title: "视频设置", quality: "清晰度", size: "尺寸", seconds: "秒数", resolution: "分辨率", ratio: "比例", duration: "时长", smart: "智能", output: "输出", generateAudio: "生成声音", watermark: "添加水印", adaptive: "自适应", sizes: { landscape: "横屏", portrait: "竖屏", square: "方形", widescreen: "宽屏", tall: "长图", auto: "自动" }, ratios: { landscape: "横屏", portrait: "竖屏", square: "方形", standardLandscape: "标准横屏", standardPortrait: "标准竖屏", cinematic: "宽银幕", adaptive: "自适应" } },
        audio: { title: "音频设置", voice: "声音", format: "格式", speed: "语速", instructions: "声音指令", instructionsPlaceholder: "例如：自然、温暖、适合旁白。" },
        text: { title: "文本设置", reasoning: "推理强度", count: "生成次数" },
        model: { select: "选择模型", assign: "请先在渠道里为{{capability}}指定模型", noMatch: "暂无匹配的{{capability}}模型", addFirst: "请先到配置里添加渠道和模型", capabilities: { image: "生图", video: "视频", text: "文本", audio: "音频" } },
    },
    generation: { pending: ["正在创建图片", "马上就好了", "再等等", "正在整理细节"] },
    imageReferences: { label: "图片{{index}}", separator: "、", promptPrefix: "参考图片编号：{{labels}}。请按这些编号理解提示词中的图片引用。\n\n{{prompt}}" },
    modelPlugin: {
        pollTimeout: "插件轮询超时，请检查调用脚本或稍后重试", executionFailed: "模型调用脚本执行失败：{{message}}", noImages: "模型调用脚本没有返回图片",
        variables: { prompt: "用户输入的提示词（已拼接系统提示词）", images: "参考图，dataURL 数组（改图 / 图生视频时有值）", messages: "对话消息数组，含系统消息", params: "生成参数：生图 {size,quality,count}、视频 {seconds,size,resolution,ratio,generateAudio,watermark}、音频 {voice,format,speed,instructions}", model: "模型名称（不含渠道前缀）", baseUrl: "渠道接口地址（原样，未拼 /v1）", apiKey: "渠道 API Key，请求头里自己带上", systemPrompt: "系统提示词原文", reasoningEffort: "文本推理强度；auto 表示由脚本决定是否传递", http: "便捷请求：http.post(path, body, {headers,params,responseType})、http.get(path, opts)、http.url(path)；默认带 Authorization: Bearer apiKey，可用 headers 覆盖；path 相对时按 baseUrl 拼 /v1", request: "原始请求 request({ method, url, headers, params, data, responseType })，不加任何默认头，鉴权头自己写；url 相对时按 baseUrl 拼接（不加 /v1）", poll: "轮询 poll(request, extract, {intervalMs,timeoutMs})，extract 返回真值即结束", sleep: "sleep(ms) 延时", signal: "取消信号，可透传给 http/request", onDelta: "onDelta(text) 推送流式文本（文本模型）" },
        returns: { image: "文生图（images 为空）和图生图（images 有参考图）接口不同，脚本需自行区分；返回图片 URL 或 dataURL 字符串，也可返回它们的数组，或 [{ dataUrl }] / [{ url }] / [{ b64_json }]", video: "脚本内部完成轮询，返回 { url } 或 { blob } 或视频 URL 字符串", audio: "返回 Blob，或 base64 / dataURL 字符串，或 { b64_json } / { data } / { url }", text: "用 onDelta(text) 推送流式，最终 return 完整文本字符串" },
        templates: { openai: "OpenAI 规范", gemini: "Gemini 规范", imageOpenai: "生图 / 改图：两者接口不同，用 images 是否为空来区分。", availableImage: "可用：prompt、images(dataURL[])、params{size,quality,count}、model、baseUrl、apiKey", textToImage: "文生图：/images/generations（JSON）", imageToImage: "图生图：/images/edits（multipart/form-data，参考图作为文件上传）", formDataHeader: "不要手动设 Content-Type，交给浏览器带 boundary", imageGemini: "Gemini 文生图 / 图生图：都走 generateContent，参考图放进 parts 的 inline_data。", availableImageGemini: "可用：prompt、images(dataURL[])、model、baseUrl、apiKey", videoOpenai: "视频（脚本内部自行轮询）。可用：prompt、images(dataURL[])、params{seconds,size,resolution,ratio}", videoGemini: "Gemini(Veo) 视频：predictLongRunning 提交，轮询 operation 拿视频 URI。", availableVideoGemini: "可用：prompt、images(dataURL[])、params、model、baseUrl、apiKey", geminiNoVideoUri: "Gemini 未返回视频 URI", audioOpenai: "音频 TTS。可用：prompt、params{voice,format,speed,instructions}、model", audioGemini: "Gemini TTS：generateContent + AUDIO 模态，返回 base64 PCM（音频数据在 inlineData.data）。", availableAudioGemini: "可用：prompt、params{voice}、model、baseUrl、apiKey", geminiNoAudio: "Gemini 未返回音频", textOpenai: "文本对话（OpenAI Responses 接口）。可用：messages([{role,content}])、systemPrompt、model、reasoningEffort", textGemini: "Gemini 文本：generateContent，system 消息放 systemInstruction。", availableTextGemini: "可用：messages([{role,content}])、systemPrompt、model、baseUrl、apiKey" },
    },
    apiErrors: { requestFailed: "请求失败", requestCanceled: "请求已取消", baseUrlRequired: "请先配置 Base URL", apiKeyRequired: "请先配置 API Key", authenticationFailed: "鉴权失败，请检查 API Key、套餐权限或模型权限", rateLimited: "请求被限流或额度不足，请稍后重试", notFound: "接口地址不存在（404），请检查 Base URL 和模型选择", badGateway: "网关错误（502），接口服务暂时不可用，请稍后重试", serviceBusy: "服务繁忙（503），请稍后重试", httpFailed: "请求失败（HTTP {{status}}），请检查 Base URL 和 API Key 是否正确", htmlError: "服务返回了 HTML 错误页面（{{preview}}）", audioModelRequired: "请先配置音频模型", audioGenerationFailed: "音频生成失败", scriptNoAudio: "模型调用脚本没有返回音频", geminiAudioUnsupported: "Gemini 调用格式暂不支持音频生成，请使用 OpenAI 格式渠道", invalidImageSizeFormat: "图像尺寸格式不支持，请使用 auto、9:16 或 1024x1024", positiveImageRatio: "图像比例必须是正数，例如 9:16", imageRatioLimit: "图像宽高比不能超过 3:1，请调整尺寸", positiveImageDimensions: "图像尺寸必须是正整数，例如 1024x1024", imageDimensionStep: "图像尺寸的宽高必须是 16 的倍数，请调整尺寸", imageEdgeLimit: "图像尺寸最长边不能超过 3840px，请调整尺寸", imagePixelLimit: "图像总像素需在 655360 到 8294400 之间，请调整尺寸", unknownImageResponse: "接口返回了未知格式的数据（字段：{{fields}}），请检查模型或接口兼容性", noImageReturned: "接口没有返回图片，请检查提示词是否触发安全审核或模型是否支持该操作", geminiRejected: "Gemini 拒绝了本次请求：{{reason}}", geminiNoImage: "Gemini 接口没有返回图片", geminiMaskUnsupported: "Gemini 调用格式暂不支持蒙版编辑", maskModelUnsupported: "蒙版编辑暂不支持该模型，请使用其他渠道", noContent: "没有返回内容", modelReadFailed: "读取模型失败", videoTimeout: "{{provider}}视频生成超时，请稍后重试", pluginVideoExpired: "插件视频任务已失效，请重新生成", scriptNoVideo: "模型调用脚本没有返回视频", noPlayableVideo: "视频接口没有返回可播放的视频", noVideoTaskId: "视频接口没有返回任务 ID", videoTaskCreateFailed: "视频任务创建失败", videoGenerationFailed: "视频生成失败", videoTaskQueryFailed: "视频任务查询失败", videoPromptRequired: "请输入视频提示词，或连接参考图片/视频/音频", referenceImageReadFailed: "参考图读取失败，请换一张图片或重新上传", invalidReferenceVideo: "参考视频必须是公网 URL、资产 ID，或本地已保存的视频", invalidReferenceAudio: "参考音频必须是公网 URL、资产 ID，或本地已保存的音频", videoModelRequired: "请先配置视频模型", geminiVideoUnsupported: "Gemini 调用格式暂不支持视频生成，请使用 OpenAI 格式渠道", noVideoTask: "接口没有返回视频任务", videoDownloadFailed: "视频下载失败", localAssetReadFailed: "读取本地资产失败" },
    prompts: {
        title: "提示词中心",
        library: "提示词库",
        total: "当前共 {{count}} 条提示词",
        category: "分类",
        tags: "标签",
        search: "搜索标题、内容或标签",
        searchTitle: "按标题查询",
        loadFailed: "获取提示词失败",
        sourceMissing: "提示词来源不存在",
        use: "使用此提示词",
        empty: "没有找到匹配的提示词",
        loading: "加载中...",
        loadMore: "继续向下滚动加载更多",
        end: "已经到底了",
    },
    assets: {
        title: "我的资产",
        description: "收藏常用文本和图片，按类型、标题和标签快速查找。",
        search: "搜索标题、内容、标签或来源",
        type: "类型",
        export: "导出资产",
        import: "导入资产",
        add: "新增资产",
        edit: "编辑资产",
        empty: "没有找到资产",
        manual: "手动添加",
        selectImage: "请选择图片文件",
        updated: "资产已更新",
        saved: "资产已保存",
        textCopied: "文本已复制",
        noneToExport: "暂无资产可导出",
        imported: "已导入 {{count}} 个资产",
        importFailed: "导入失败，请选择有效的资产压缩包",
        deleted: "资产已删除",
        packageName: "我的资产.zip",
        kinds: { text: "文本", image: "图片", video: "视频" },
        fields: {
            title: "标题",
            titleRequired: "请输入标题",
            titlePlaceholder: "给资产起一个容易检索的名字",
            coverUrl: "封面 URL",
            coverPlaceholder: "可粘贴图片 URL，也可以上传本地封面",
            tags: "标签",
            tagsPlaceholder: "输入标签后回车",
            source: "来源",
            sourcePlaceholder: "手动添加 / 画布 / 提示词库",
            note: "备注",
            optional: "可选",
            textContent: "文本内容",
            textRequired: "请输入文本内容",
            textPlaceholder: "保存提示词、说明文案、参考描述等文本资产",
            imageContent: "图片内容",
        },
        selectImageFile: "选择图片文件",
        noImageSelected: "未选择图片",
        preview: "预览",
        noCover: "暂无封面",
        untitled: "未命名资产",
        noTags: "无标签",
        untagged: "未打标签",
        unknownSource: "未标注来源",
        details: "资产详情",
        deleteTitle: "删除资产",
        deleteConfirm: "确定删除「{{name}}」吗？删除后会从我的资产中移除。",
        copyText: "复制文本",
        downloadImage: "下载图片",
        downloadVideo: "下载视频",
    },
    notFound: {
        title: "页面不存在",
        description: "这个地址没有对应的页面，可能已经移动或被合并到其他入口。",
        home: "返回首页",
    },
    workbench: {
        logs: "生成记录",
        settings: "参数",
        prompt: "提示词",
        viewPrompts: "查看提示词库",
        viewAssets: "查看我的资产",
        clipboard: "剪切板",
        upload: "上传",
        adjust: "调整",
        generate: "开始生成",
        results: "生成结果",
        waiting: "等待 {{time}}",
        model: "模型",
        generating: "生成中",
        success: "成功",
        failed: "生成失败",
        retry: "重试",
        new: "新建",
        selectAll: "全选",
        noLogs: "暂无生成记录",
        deleteLogs: "删除生成记录",
        deleteLogsConfirm: "确定删除选中的 {{count}} 条生成记录吗？",
        successCount: "成功 {{count}}",
        failCount: "失败 {{count}}",
        itemCount: "{{count}} 张",
        untitled: "未命名",
        configFirst: "请先完成配置",
        generationFailed: "生成失败",
        retrySuccess: "重试成功",
    },
    imageWorkbench: {
        title: "生图工作台",
        promptPlaceholder: "描述画面主体、风格、构图、光线和用途",
        references: "参考图",
        removeReference: "移除参考图",
        dropReferences: "松开即可添加参考图",
        noReferences: "暂无参考图，可将图片拖到这里",
        clipboardEmpty: "剪切板里没有可读取的图片",
        clipboardAdded: "已读取 {{count}} 张参考图",
        promptRequired: "请输入生图提示词",
        configIncomplete: "生图配置不完整",
        invalidParams: "生图参数无效",
        busy: "生图工作台已有任务正在运行",
        generated: "图片已生成",
        addedReference: "已加入参考图",
        resultTitle: "生成结果 {{count}}",
        source: "生图工作台",
        unsupportedAsset: "生图工作台只能使用文本或图片资产",
        missingResult: "接口没有返回图片",
        empty: "还没有生成图片",
        resultAlt: "生成结果 {{count}}",
        addReference: "加入参考图",
    },
    videoWorkbench: {
        title: "视频创作台",
        promptPlaceholder: "描述镜头运动、主体动作、场景氛围和画面风格",
        references: "参考图",
        videoReferences: "参考视频",
        audioReferences: "参考音频",
        removeImage: "移除参考图",
        removeVideo: "移除参考视频",
        removeAudio: "移除参考音频",
        dropReferences: "松开即可上传参考资产",
        noImages: "暂无参考图，可拖入文件，最多 9 张",
        noVideos: "暂无参考视频，可拖入文件，最多 3 个",
        noAudio: "暂无参考音频，可拖入文件，最多 3 个，mp3/wav，单个 15MB 内",
        unsupportedFiles: "已忽略不支持的参考资产，请使用图片、mp4/mov 视频或 mp3/wav 音频",
        imageTooLarge: "已忽略超过 30MB 的参考图",
        videoTooLarge: "已忽略超过 200MB 的参考视频",
        audioTooLarge: "已忽略超过 15MB 的参考音频",
        audioDurationInvalid: "已忽略不符合时长要求的参考音频：单个 2-15 秒，总时长不超过 15 秒",
        clipboardEmpty: "剪切板里没有可读取的图片",
        clipboardAdded: "已读取 {{count}} 张参考图",
        promptRequired: "请输入视频提示词",
        referenceError: "{{error}}。{{hint}}",
        invalidParams: "视频生成参数无效",
        busy: "视频工作台已有任务正在运行",
        generated: "视频已生成",
        timeout: "视频生成超时，请稍后重试",
        resultTitle: "生成视频",
        source: "视频创作台",
        empty: "还没有生成视频",
    },
    canvas: {
        defaultTitle: "无限画布 {{count}}",
        library: "画布库",
        title: "无限画布",
        imported: "已导入 {{count}} 个画布",
        importFailed: "导入失败，请选择有效的画布压缩包",
        opening: "正在打开画布...",
        loading: "正在加载画布...",
        exportSelected: "导出选中",
        deleteSelected: "删除选中",
        deleteAll: "删除全部",
        import: "导入画布",
        create: "新建画布",
        empty: "还没有画布",
        emptyDescription: "新建一个画布后，就可以独立保存节点、连线和画布外观。",
        collapsePanel: "收起面板",
        expandPanel: "展开面板",
        home: "主页",
        docs: "文档",
        projects: "我的画布",
        deleteCurrent: "删除当前画布",
        importAsset: "导入资产",
        exportCurrent: "导出当前画布",
        undo: "撤销",
        redo: "重做",
        openMenu: "打开画布菜单",
        renameHint: "双击修改画布名称",
        shortcuts: "快捷键",
        miniMapOpen: "打开小地图",
        miniMapClose: "关闭小地图",
        resetView: "重置视图",
        zoom: "放大/缩小画布",
        agentConnected: "Codex 已连接",
        agentConnecting: "Codex {{activity}}",
        agentDisconnected: "Codex 未连接",
        connecting: "连接中",
        openAgent: "打开本地 Codex 面板",
        nodeTypes: { image: "图片", text: "文本", config: "生成配置", video: "视频", audio: "音频", group: "组" },
        toolbar: {
            select: "选择", pan: "移动", text: "文本", image: "图片", video: "视频", audio: "音频", config: "生成配置", group: "组", extensions: "扩展节点", upload: "上传资产", appearance: "画布外观", clear: "清空画布",
            themeMode: "主题模式", light: "浅色", dark: "深色", gridStyle: "网格样式", dots: "点", lines: "线", blank: "空白", imageInfo: "图片信息",
        },
        project: {
            untitled: "未命名画布", imported: "导入画布",
            select: "选择 {{name}}", stats: "{{nodes}} 个节点 · {{connections}} 条连线", updated: "更新于 {{date}}", saveName: "保存名称", cancelRename: "取消重命名", export: "导出", rename: "重命名", delete: "删除",
            deleteTitle: "删除画布？", deleteDescription: "将删除 {{count}} 个画布，里面的节点和连线也会一起移除。",
        },
        export: { defaultProjectName: "无限画布", defaultNodesName: "画布元素", item: "元素" },
        createMenu: {
            fromNode: "引用该节点生成", close: "关闭", text: "文本生成", textDescription: "脚本、广告词、品牌文案", image: "图片生成", video: "视频生成", audio: "音频参考", config: "配置节点", configDescription: "模型、尺寸、数量和输入顺序", select: "选择节点",
        },
        node: {
            node: "节点",
            untitled: "未命名节点", renameHint: "双击修改节点名称", group: "组", nodeCount: "{{count}} 个节点", generating: "生成中", failed: "生成失败", retry: "重试", missingPlugin: "缺少插件", missingPluginDescription: "节点类型“{{type}}”的插件未安装或未启用", generateImage: "用文本生图", generate: "生图", editText: "双击编辑文字", emptyImage: "空图片节点", emptyVideo: "空视频节点", emptyAudio: "空音频节点", audio: "音频", batchExpanded: "图片组已展开", batchCollapsed: "图片组已收起", textBatchExpanded: "备选文本已展开", textBatchCollapsed: "备选文本已收起", createCopy: "创建副本", setPrimary: "设为主图", setPrimaryText: "设为主文本",
        },
        videoFrames: { first: "截取首帧", last: "截取尾帧", current: "截取当前帧", firstTitle: "{{name}} 首帧", lastTitle: "{{name}} 尾帧", currentTitle: "{{name}} 当前帧", captured: "已生成图片节点", failed: "无法截取该画面，请重试" },
        sidePanel: {
            canvas: "画布", assets: "资产", prompts: "提示词库", resize: "调整左侧面板宽度", elements: "画布元素", select: "选择", searchNodes: "搜索节点", focusNode: "定位到节点", preview: "放大预览", noNodes: "画布暂无节点", clearAll: "取消全选", selected: "已选 {{count}}", exporting: "正在导出选中元素…", exportName: "画布元素-{{count}}个", exported: "已导出 {{count}} 个元素", exportFailed: "导出失败，请重试",
            addingAssets: "正在添加资产…", addedAssets: "已添加 {{count}} 个资产", mediaOnly: "仅支持图片或视频文件", addFailed: "添加失败，请重试", searchAssets: "搜索资产", add: "添加", noAssets: "暂无资产", inserted: "插入画布", removeAssetTitle: "移除该资产？", remove: "移除", removeAsset: "移除资产", assetRemoved: "资产已移除",
            searchPrompts: "搜索提示词", noPrompts: "暂无提示词", promptCopied: "已复制提示词", copyFailed: "复制失败", loadFailedRetry: "加载失败，点击重试", noMatchingPrompts: "无匹配提示词", sourceEmpty: "该来源暂无提示词", viewDetails: "查看详情",
            filter: { image: "图片", video: "视频", text: "文本", audio: "音频", config: "配置", group: "分组" },
        },
        assetPicker: { title: "选择资产", insert: "插入", search: "搜索资产", empty: "没有资产" },
        imageTools: { copyPrompt: "复制提示词", copyPromptTitle: "复制生成该图片的提示词", reversePrompt: "反推提示词", reversePromptTitle: "创建反推提示词的文本和配置节点", replace: "替换图片", locked: "锁比例", free: "自由比例", lockTitle: "切换为等比缩放", freeTitle: "切换为自由比例", mask: "局部编辑", maskTitle: "添加蒙版遮罩后局部修改", crop: "裁剪", cropTitle: "裁剪并生成新节点", split: "切图", splitTitle: "按行列切分图片", upscale: "放大", upscaleTitle: "放大图片分辨率", superResolve: "超分", superResolveTitle: "AI 超分", angle: "多角度", angleTitle: "生成角度", view: "查看大图", viewTitle: "查看图片详情", more: "更多", configure: "配置快捷工具", customize: "自定义工具栏", showLabels: "显示按钮文字", description: "选择你想在图片节点编辑栏中使用的快捷工具。", preview: "节点预览", imageNode: "图片节点", quickTools: "快捷工具" },
        nodeToolbar: { noPrompt: "暂无可复制的提示词", infoTitle: "查看节点信息", info: "信息", removeTitle: "移除节点", retryTitle: "重新生成", saveAsset: "存资产", downloadAudio: "下载音频", downloadVideo: "下载视频", downloadImage: "下载图片", editTextTitle: "编辑文本", editText: "编辑文字", decreaseFont: "减小字号", increaseFont: "增大字号", zoomOut: "缩小", zoomIn: "放大", uploadImage: "上传图片", replaceVideo: "替换视频", uploadVideo: "上传视频", replaceAudio: "替换音频", uploadAudio: "上传音频", nodeInfo: "节点信息", name: "名称", type: "类型", size: "尺寸", position: "位置", status: "状态", imageGroup: "图片组", imageSize: "图片大小" },
        configNode: { title: "生成配置", image: "生图", text: "文本", video: "视频", audio: "音频", prompt: "提示词", references: "参考图", videoReferences: "参考视频", audioReferences: "参考音频", items: "{{count}} 个", images: "{{count}} 张", compose: "组装提示词", stop: "停止", generate: "开始生成" },
        projectPage: {
            stopTitle: "停止生成？", stopDescription: "当前生成请求会被中断，已经生成完成的内容会保留。", stop: "停止", continue: "继续生成", configConnection: "配置节点之间不能连接", notFound: "未找到当前画布", exporting: "正在导出当前画布…", exported: "已导出当前画布", clipboardText: "剪切板文本", clipboardImageAdded: "已从剪切板添加图片", clipboardTextAdded: "已从剪切板添加文本", noTextToSave: "没有可保存的文本", canvasText: "画布文本", noVideoToSave: "没有可保存的视频", canvasVideo: "画布视频", noImageToSave: "没有可保存的图片", canvasImage: "画布图片", emptyReverse: "图片节点为空，无法反推提示词", reverseTitle: "反推提示词", reverseConfigTitle: "反推提示词配置", splitTitle: "{{name}} {{row}}-{{column}}", splitSuccess: "已切分为 {{count}} 个子节点", maskResult: "局部编辑结果", maskFailed: "局部修改失败", generationFailed: "生成失败", partialFailed: "部分图片生成失败", partialTextFailed: "部分文本生成失败", allFailed: "全部图片生成失败", retryPromptMissing: "找不到提示词，无法重试", referenceMissing: "参考图片已丢失，无法继续重试", emptyTextImage: "文本节点为空，无法生图", untitledCanvas: "未命名画布", superResolve: "AI 超分", notImplemented: "暂未实现", imageDetails: "图片详情", clearTitle: "清空画布？", clear: "清空", clearDescription: "这会删除当前画布上的所有节点和连线。", reversePreset: "请根据参考图片反推一段适合用于 AI 生图的提示词。\n\n要求：\n1. 只输出提示词正文，不要解释。\n2. 覆盖主体、构图、风格、光线、色彩、材质、镜头和氛围。\n3. 尽量写成可直接用于生图模型的完整提示词。", maskPrompt: "只修改蒙版透明区域，其他区域保持不变。{{prompt}}", editTextPrompt: "请根据要求修改以下文本。\n\n原文：\n{{source}}\n\n修改要求：\n{{prompt}}"
        },
        reverseComposer: "参考图片：@[node:{{imageId}}]\n任务说明：@[node:{{textId}}]",
        editors: {
            reset: "重置", zoomOut: "缩小", zoomIn: "放大", loading: "读取中", unknown: "未知", cancel: "取消",
            angleTitle: "AI 多角度", angleDescription: "左侧只预览方向，结果会基于原图重新生成", horizontal: "左右角度", pitch: "俯仰角度", distance: "镜头距离", lens: "广角镜头", standard: "标准", wide: "广角", aiGenerate: "AI 生成",
            upscaleTitle: "图片放大", source: "源图", targetPixels: "目标像素", maxReached: "图片已达到 4K，无需放大", targetReached: "图片已达到当前目标像素，无需放大", algorithm: "放大算法", outputSize: "输出尺寸", upscale: "生成放大图", high: "高清插值", highDescription: "适合照片和细节图", bilinear: "双线性", bilinearDescription: "平滑、速度快", nearest: "最近邻", nearestDescription: "适合像素风格",
            cropTitle: "裁剪图片", adjustCrop: "调整裁剪框", cropHint: "滚轮缩放 · 中键或空格+左键拖动画面", cropSize: "裁剪尺寸 {{size}}", ratio: "比例 {{ratio}}", original: "原图 {{width}} x {{height}}", confirmCrop: "确认裁剪", free: "自由", fixed: "固定", originalMode: "原图",
            maskTitle: "局部遮罩编辑", maskHint: "滚轮缩放 · 中键或空格+左键拖动画面 · Alt+左/右键横拖调笔刷 · Ctrl/Cmd+Z 撤回 · Ctrl/Cmd+Shift+Z 重做", brush: "画笔", erase: "擦除", undoMaskTitle: "撤回局部涂抹 (Ctrl/Cmd+Z)", undoMask: "撤回局部涂抹", redoMaskTitle: "重做局部涂抹 (Ctrl/Cmd+Shift+Z)", redoMask: "重做局部涂抹", brushSize: "笔刷大小", editInstructions: "修改要求", maskPlaceholder: "例如：把选中区域改成金属材质，保持原图光影", maskPromptRequired: "请输入修改要求", maskRequired: "请先涂抹局部区域", aiEdit: "AI 修改",
            splitTitle: "切分图片", splitDescription: "生成 {{count}} 个图片子节点，并按原图网格排列到画布右侧", splitHint: "滚轮缩放 · 中键或空格+左键拖动画面 · Delete 删除选中线 · Ctrl/Cmd+Z 撤回 · Ctrl/Cmd+Shift+Z 重做", undoSplitTitle: "撤回切图调整 (Ctrl/Cmd+Z)", undoSplit: "撤回切图调整", redoSplitTitle: "重做切图调整 (Ctrl/Cmd+Shift+Z)", redoSplit: "重做切图调整", rows: "行数", columns: "列数", horizontalLine: "横向线", verticalLine: "纵向线", deleteLine: "删除线", resetLines: "重置线", pieceCount: "切片数量", pieces: "{{count}} 个", averageSize: "平均约", generateChildren: "生成子节点",
        },
        plugins: { title: "节点插件", installedPlugin: "已安装插件 {{name}}", installed: "已安装 {{name}}", installFailed: "安装失败：{{error}}", enabled: "已启用", disabled: "已禁用", upgradeAvailable: "有新版本，点击升级", updateFromSource: "从来源更新", updated: "已更新", uninstallTitle: "卸载该插件？", uninstall: "卸载", newVersion: "有新版本可升级", officialDescription: "本项目官方插件，来自仓库注册表", refresh: "刷新", loadFailed: "加载失败：{{error}}", loadingOfficial: "正在获取官方插件…", noOfficial: "暂无官方插件", install: "安装", urlPlaceholder: "输入插件 JS 文件 URL，例如 https://.../plugin.js", noThirdParty: "还没有安装第三方插件", official: "官方插件", local: "本地插件", thirdParty: "第三方插件", warning: "插件代码会在当前页面内直接执行，可访问本地数据（包含 AI API Key）。请仅安装你信任来源的插件。", aiConfigRequired: "AI 配置未就绪，请先在设置里配置模型与密钥", interactiveTitle: "当前：交互中。点击切回「移动」——拖动可移动节点", movableTitle: "当前：可移动。点击切到「交互」——可操作节点内容（如转动全景）", move: "移动", interact: "交互" },
        promptPanel: { video: "描述要生成的视频内容", audio: "描述要生成的音频内容", image: "描述要生成的图片内容", text: "请输入你想要生成的文本内容", editImage: "请输入你想要把这张图修改成什么", editText: "请输入你想要将本段文本修改成什么", expandEditor: "放大编辑", editorTitle: "编辑提示词", stopGeneration: "停止生成", generate: "生成", stop: "停止" },
        references: { title: "参考内容", select: "从画布选择参考节点", uploadImage: "上传本地参考图", disconnect: "断开参考连接", empty: "暂无内容", selecting: "正在添加参考", choose: "选择", selectingHint: "从画布选择参考 · ESC 返回输入框" },
        composer: { title: "组装提示词", description: "@ 引用已连接资产，发送前按当前连接重新编号", placeholder: "输入提示词，按 @ 引用连接的图片、文本或组", imagePreview: "引用图片预览", resources: { image: "图片{{index}}", video: "视频{{index}}", audio: "音频{{index}}", text: "文本{{index}}", group: "组{{index}}" } },
        controls: { ratio: "比例", duplicate: "复制", delete: "删除", images: "{{count}} 张", texts: "{{count}} 条", generations: "{{count}} 次", reasoning: "推理" },
        generation: { interrupted: "页面刷新后生成已中断，请重新生成。", front: "正面视角", rotateRight: "向右旋转 {{angle}} 度", rotateLeft: "向左旋转 {{angle}} 度", level: "水平视角", topDown: "俯视 {{angle}} 度", lowAngle: "仰视 {{angle}} 度", angleLabel: "AI 多角度：{{horizontal}}，{{pitch}}，镜头距离 {{distance}}，{{lens}}镜头", anglePrompt: "基于参考图重新生成同一主体的新视角，保持主体、颜色、材质和画面风格一致，不要只做透视变形。{{angle}}。" },
        agentOps: { add_node: "新增节点", update_node: "更新节点", delete_node: "删除节点", delete_connections: "删除连线", connect_nodes: "连接", set_viewport: "调整视图", select_nodes: "选择节点", run_generation: "触发生成" },
        pluginErrors: { invalidExport: "插件未导出有效对象", missingFields: "插件缺少 id 或 nodes", downloadFailed: "下载失败 (HTTP {{status}})", registryFailed: "获取官方插件列表失败 (HTTP {{status}})" },
        shortcut: {
            dragCanvas: "拖动画布",
            pan: "平移视图",
            toggleTool: "临时切换选择 / 移动",
            wheel: "滚轮",
            zoom: "缩放画布",
            zoomSlider: "缩放滑杆",
            preciseZoom: "精确调整缩放",
            boxSelect: "框选多个节点",
            addSelection: "追加选择节点",
            selectAll: "全选节点",
            copyPaste: "复制 / 粘贴节点，或粘贴剪切板文本/图片",
            copyPasteNodes: "复制 / 粘贴节点",
            delete: "删除选中",
            escape: "取消选择并关闭浮层",
            dropMedia: "拖入图片/视频/音频",
            upload: "上传到画布",
            drag: "拖动",
            click: "点击",
        },
    },
    navigation: {
        canvas: "我的画布",
        image: "生图工作台",
        video: "视频创作台",
        prompts: "提示词库",
        assets: "我的资产",
        config: "配置",
    },
    topNav: {
        openMenu: "打开导航菜单",
        menu: "导航菜单",
        navigation: "导航",
        openAgent: "打开 Agent",
        closeAgent: "收起 Agent",
        plugins: "节点插件",
        docs: "文档",
        switchLanguage: "切换到 {{language}}",
        shortcuts: "快捷键",
        lightTheme: "切换到浅色主题",
        darkTheme: "切换到深色主题",
    },
    home: {
        promptError: "获取提示词失败",
        description: "在 <canvas>无限画布</canvas> 中生成、连接和重组 <content>图片、文字与图形</content>，让创作从单次生成变成连续推演。",
        start: "开始使用",
        openCanvas: "打开画布",
        showcaseTitle: "沉淀每一次好结果",
        showcaseDescription: "收藏稳定出图的提示词、参考风格和结果图片，让下一次创作从已有经验开始。",
        viewPrompts: "查看提示词库",
    },
    version: {
        viewUpdates: "查看版本更新",
        title: "版本更新",
        currentVersion: "当前版本",
        latestVersion: "最新版本",
        checking: "检查中...",
        checkUpdates: "检查更新",
        unreleased: "未发布",
        latest: "最新",
        current: "当前",
        readFailed: "版本读取失败",
        changelogFailed: "更新日志读取失败",
        updated: "已获取最新版本信息",
        updateFailed: "获取最新版本信息失败",
        types: { added: "新增", fixed: "修复", changed: "调整", optimized: "优化", docs: "文档" },
    },
    config: {
        title: "配置与用户偏好",
        invalidFile: "配置文件格式不正确",
        description: "渠道聚合、模型选择、同步与本地存储",
        modalDescription: "渠道聚合、默认模型、同步与本地存储",
        tabs: {
            channels: "渠道",
            preferences: "偏好设置",
            promptSources: "提示词来源",
            localStorage: "本地存储",
        },
        localStorage: {
            title: "IndexedDB 存储使用情况",
            description: "查看 Infinite Canvas 在浏览器中保存的数据量，并按对象仓库统计内容体积。",
            indexedDbUsage: "IndexedDB 占用",
            siteUsage: "站点总占用",
            quota: "可用配额",
            contentEstimate: "按仓库内容估算",
            siteUsageHint: "包含 IndexedDB 等站点数据",
            quotaHint: "由浏览器动态分配",
            quotaProgress: "站点配额使用率",
            mainDatabase: "Infinite Canvas 主数据",
            records: "{{count}} 条",
            refresh: "刷新统计",
            readFailed: "读取本地存储失败",
            stores: { appState: "应用状态", images: "图片文件", media: "音视频文件", imageLogs: "生图记录", videoLogs: "视频记录", agentMessages: "Agent 消息", promptCache: "提示词缓存" },
        },
        promptSources: {
            add: "新增来源",
            deleteTitle: "删除「{{name}}」？",
            deleteDescription: "来源配置会被移除，已经加入我的资产的内容不受影响。",
            refreshed: "「{{name}}」已更新 {{count}} 条",
            refreshFailedCached: "更新失败，已保留旧缓存",
            refreshPartial: "更新完成：{{success}} 个成功，{{failed}} 个失败，失败来源已保留旧缓存",
            refreshAllSuccess: "已更新 {{sources}} 个来源，共 {{total}} 条",
            refreshFailed: "更新失败",
            builtIn: "内置",
            itemCount: "{{count}} 条",
            failed: "失败",
            healthy: "正常",
            unsynced: "未同步",
            lastSuccess: "上次成功 {{time}}",
            neverFetched: "尚未拉取",
            view: "查看内容",
            refresh: "立即拉取",
            edit: "编辑来源",
            schedule: "定时拉取",
            interval: "拉取周期",
            refreshAll: "全部立即拉取",
            lastFetched: "上次拉取 {{time}}",
            neverScheduled: "尚未定时拉取",
            scheduleDescription: "开启周期后，页面打开期间会按周期自动拉取所有启用的来源。",
            intervals: {
                disabled: "关闭定时",
                minutes30: "每 30 分钟",
                hour1: "每 1 小时",
                hours6: "每 6 小时",
                hours24: "每 24 小时",
            },
            editor: {
                addTitle: "新增提示词来源",
                editTitle: "编辑提示词来源",
                nameRequired: "请输入来源名称",
                invalidUrl: "请输入有效的 JSON URL",
                invalidHomepage: "请输入有效的主页地址",
                name: "来源名称",
                namePlaceholder: "用于分类展示",
                homepage: "来源主页（可选）",
                enabled: "启用来源",
                jsonFormat: "JSON 格式",
            },
            content: {
                loadFailed: "拉取提示词失败",
                title: "{{name}} · 提示词内容",
                count: "共 {{count}} 条",
                refresh: "立即更新",
                empty: "暂无提示词",
                cover: "封面",
                titleColumn: "标题",
                tags: "标签",
                actions: "操作",
            },
            runtime: { requestFailed: "请求失败（{{status}}）", urlRequired: "JSON URL 不能为空", fetchFailed: "「{{name}}」拉取失败：{{error}}", noPrompts: "「{{name}}」未解析到有效提示词", invalidRoot: "「{{name}}」格式错误：根节点必须是数组" },
        },
        fileSecurity: "JSON 文件包含 API Key 和 WebDAV 凭据，请妥善保管。",
        import: "导入配置",
        export: "导出配置",
        imported: "配置与用户偏好已导入",
        importedDirectConfig: "已导入本地直连配置",
        importFailed: "配置文件读取失败",
        saved: "配置已保存",
        savedContinue: "配置已保存，请继续刚才的请求",
        channels: {
            description: "每个渠道选择一个协议并拉取模型，为每个模型指定能力（生图/视频/文本/音频），并可自定义调用脚本。",
            add: "新增渠道",
            unnamed: "未命名渠道",
            numberedName: "渠道 {{count}}",
            modelCount: "{{count}} 个模型",
            missingUrl: "未填写接口地址",
            keepOne: "至少保留一个渠道",
            defaultName: "默认渠道",
            newName: "新渠道",
            indexedName: "渠道 {{index}}",
        },
        preferences: {
            interface: "界面偏好",
            language: "界面语言",
            languageDescription: "切换应用界面及组件语言。",
            defaultModels: "默认模型",
            defaultImageModel: "默认生图模型",
            defaultVideoModel: "默认视频模型",
            defaultTextModel: "默认文本模型",
            defaultAudioModel: "默认音频模型",
            generation: "生成偏好",
            canvasImageCount: "画布默认生图张数",
            canvasImageCountDescription: "新建画布生图和配置节点默认使用，单个节点仍可单独覆盖。",
            audioVoice: "默认音频声音",
            audioFormat: "默认音频格式",
            audioSpeed: "默认音频语速",
            audioInstructions: "默认音频指令",
            audioInstructionsPlaceholder: "例如：自然、温暖、适合旁白。",
            systemPrompt: "系统提示词",
            systemPromptPlaceholder: "例如：你是一位擅长电影感写实摄影的视觉导演。",
        },
        channelEditor: {
            title: "编辑渠道",
            name: "渠道名称",
            protocol: "协议",
            baseUrl: "接口地址",
            models: "渠道模型",
            modelDescription: "已选 {{count}} 个；为每个模型指定能力并可自定义调用脚本。",
            selectModels: "选择模型",
            scriptReady: "脚本已设",
            script: "调用脚本",
            empty: "点击「选择模型」拉取或手动增加模型。",
            capabilities: {
                image: "生图",
                video: "视频",
                text: "文本",
                audio: "音频",
            },
        },
        modelSelect: {
            missingConfig: "请先填写接口地址和 API Key",
            fetched: "已拉取 {{count}} 个模型",
            fetchFailed: "拉取模型失败",
            title: "选择渠道模型",
            selected: "已选择 {{selected}} / {{total}}",
            confirm: "确定",
            search: "搜索模型",
            modelName: "输入模型名称",
            add: "增加模型",
            fetch: "拉取模型列表",
            description: "如果上游不提供 OpenAI /models 模型列表接口，请在这里手动增加模型名称。",
            fetchedTab: "新获取的模型 ({{count}})",
            existingTab: "已有的模型 ({{count}})",
            visibleSelected: "当前列表已选择 {{selected}} / {{total}}",
            selectVisible: "全选当前列表",
            clearVisible: "取消当前列表",
            fetchedEmpty: "点击「拉取模型列表」获取上游模型，或手动增加模型名称。",
            existingEmpty: "暂无已选择的模型。",
        },
        scriptEditor: {
            description: "脚本是一段异步函数体，直接使用下方变量，最后 return 结果；留空则使用系统默认调用。",
            insertTemplate: "插入{{name}}模板",
            restoreDefault: "恢复默认调用",
            returnRequirements: "返回要求",
            variables: "可用变量",
            insert: "点击插入",
            placeholder: "// 留空使用系统默认调用；点击右下角「插入模板」查看示例。",
        },
        webdav: {
            title: "WebDAV 同步",
            description: "同步画布、我的资产、生成记录和本地媒体文件，不包含 AI API Key；浏览器会直接连接 WebDAV 服务。",
            lastSynced: "上次同步 {{time}}",
            neverSynced: "尚未同步",
            url: "WebDAV 地址",
            directory: "远程目录",
            directoryDescription: "会在该目录下分业务目录保存，每个目录包含 {{manifest}} 和 files/",
            username: "用户名",
            password: "密码 / 应用密码",
            test: "测试连接",
            syncing: "同步中",
            syncNow: "立即同步",
            missingUrl: "请先填写 WebDAV 地址",
            available: "WebDAV 连接可用",
            testFailed: "WebDAV 连接测试失败",
            preparing: "准备同步",
            failed: "WebDAV 同步失败",
            completed: "同步完成：{{projects}} 个画布，{{assets}} 个资产，{{records}} 条记录，本次上传 {{files}} 个文件 {{bytes}}",
            domains: {
                canvas: "画布",
                assets: "我的资产",
                imageWorkbench: "生图工作台",
                videoWorkbench: "视频创作台",
            },
            stages: {
                waiting: "等待同步",
                localWaiting: "等待本地数据加载",
                syncComplete: "同步完成",
                remoteManifest: "读取远端清单",
                localData: "读取本地数据",
                downloadMedia: "下载缺失媒体",
                writeMerge: "写入本地合并结果",
                uploadMedia: "上传新增媒体",
                mediaReady: "媒体已齐全",
                mediaSkipped: "媒体无需上传",
                checkMissingMedia: "检查缺失媒体",
                downloadMediaFile: "下载媒体",
                checkLocalMedia: "检查本地媒体",
                uploadMediaFile: "上传媒体 {{size}}",
                uploadManifest: "上传清单 {{size}}",
                complete: "完成",
            },
            errors: { testFailed: "WebDAV 连接测试失败", downloadFailed: "读取 WebDAV 同步文件失败", downloadTimeout: "读取 WebDAV 同步文件超时", emptyUpload: "上传文件为空，已取消上传", uploadFailed: "上传 WebDAV 同步文件失败", directoryFailed: "创建 WebDAV 远程目录失败", requestTimeout: "WebDAV 请求超时，请检查网络或远端服务状态", connectionFailed: "无法连接 WebDAV，请检查地址、HTTPS 证书、CORS 或网络状态", urlRequired: "请先填写 WebDAV 地址", authenticationFailed: "WebDAV 认证失败，请检查用户名、密码或应用密码", pathMissing: "WebDAV 路径不存在，请检查地址和远程目录", responseFailed: "{{fallback}}：{{status}}{{detail}}", syncFailed: "同步失败", invalidManifest: "{{domain}} 同步清单不是当前应用的数据" },
        },
        protocols: {
        },
    },
    agent: {
        status: { failed: "连接失败", connected: "已连接", connecting: "连接中", disconnected: "未连接" },
        state: { ready: "就绪", connectionRequired: "请填写 Local URL 和 Connect token", invalidUrl: "Local URL 格式不正确", offline: "离线", skillReadFailed: "读取 Skill 失败", skillParseFailed: "Skill 解析失败", requestFailed: "本地 Agent 请求失败" },
        siteTools: { canvasList: "画布列表", generationStatus: "生成任务状态", imageConfig: "生图配置", imageGenerate: "生图工作台生成", videoConfig: "视频配置", videoGenerate: "视频创作台生成", promptSearch: "搜索提示词", assetList: "资产列表", assetAdd: "添加资产", unknownTool: "未知工具：{{name}}", canvasLoading: "画布还在加载中，请稍后重试", canvasHint: "用 site_navigate 跳转 /canvas/{id} 打开对应画布", assetsLoading: "资产还在加载中，请稍后重试", assetTitleRequired: "请提供资产标题 title", textContentRequired: "kind=text 时需要提供 content 文本内容", imageUrlRequired: "kind=image 时需要提供 imageUrl（图片地址或 dataURL）", imageReadFailed: "无法读取该图片地址，请改用 dataURL 或可跨域访问的图片链接", assetKindUnsupported: "assets_add 仅支持 kind=text 或 kind=image", imageGenerationStarted: "已跳转生图工作台并触发生成，可用 generation_get_status 查询任务", imageConfigApplied: "已跳转生图工作台并填入参数，未触发生成", videoGenerationStarted: "已跳转视频创作台并触发生成，可用 generation_get_status 查询任务", videoConfigApplied: "已跳转视频创作台并填入参数，未触发生成" },
        connect: { pluginTitle: "方式一：在 Codex 中使用插件", pluginText: "在 Codex app 安装 Infinite Canvas 插件后，通过插件启动画布，插件会自动启动本地 Agent 并带上连接信息。", directTitle: "方式二：直接运行 Agent", directText: "不使用 Codex 插件时，在终端运行下面命令，再回到网页里连接或手动填入 Local URL 和 Connect token。", commandCopied: "命令已复制", pluginReminder: "Codex 插件提醒", pluginReminderText: "只有安装 Codex 插件或手动添加 MCP 后，工具列表才会进入 Codex 上下文并增加 token 消耗；仅运行 npx -y @basketikun/canvas-agent 启动本地 Agent 不会安装 MCP。", removePlugin: "移除插件", removeMcp: "移除手动 MCP", copyCommand: "复制命令", title: "连接本地 Agent", description: "按使用场景选择一种连接方式。", webConnection: "网页连接", autoDiscover: "默认自动读取 Local URL 和 Connect token，失败时再手动填写。", disconnect: "断开", connect: "连接", localAddress: "本地地址", urlPlaceholder: "例如 http://127.0.0.1:17371", token: "连接 Token", tokenPlaceholder: "自动发现，或手动填入 Connect token" },
        history: { workspace: "工作空间", defaultWorkspace: "默认画布目录", selected: "已选 {{count}} 条", count: "{{count}} 条历史", empty: "暂无历史", deleteCount: "删除 {{count}} 条", refresh: "刷新", newThread: "新对话", selectThread: "选择{{name}}", untitled: "未命名对话", current: "当前", noWorkspaceThreads: "当前工作空间还没有对话记录", connectHint: "连接本地 Agent 后显示历史记录" },
        skills: { selectLocal: "选择本地 Skill", search: "搜索 Skill", loading: "正在读取 Skill…", noMatch: "没有匹配的已启用 Skill", none: "还没有可用的 Skill", select: "选择 Skill", connectHint: "连接 Agent 后使用 Skill" },
        skillManager: {
            codexBusy: "Codex 正在运行，请完成当前任务后再提炼 Skill", noConversation: "当前对话还没有可提炼的已完成内容", noCanvas: "当前页面没有可提炼的画布", connecting: "当前页面仍在连接 Agent，请稍后再试", syncFailed: "同步当前画布失败，请检查 Agent 连接后重试", noDraft: "未生成 Skill 草稿", draftCreated: "草稿已生成，可在技能页确认后创建", draftFailed: "生成 Skill 草稿失败", contentMissing: "未读取到 Skill 内容", readFailed: "读取 Skill 失败", defaultPromptMention: "默认提示词需要包含 ${{name}}", created: "Skill 已创建", updated: "Skill 已更新", saveFailed: "保存 Skill 失败", deleteTitle: "删除 {{name}}", deleteDescription: "删除后本地文件无法恢复，确定继续吗？", delete: "删除", deleted: "Skill 已删除", deleteFailed: "删除 Skill 失败", statusFailed: "更新 Skill 状态失败",
            fromConversation: "从当前对话生成草稿", availableAfterRun: "Codex 运行结束后可用", conversationDescription: "整理当前对话中的可复用流程", noCompletedContent: "当前对话还没有已完成内容", startConversation: "请先开始一段对话", fromCanvas: "从当前画布生成草稿", canvasDescription: "整理当前页面的节点与生成流程", canvasUnavailable: "当前页面没有可用画布", blankCreate: "空白创建", blankDescription: "从空白表单开始编写", localSkills: "本地 Skill", localDescription: "安装在本机，由 Codex 直接执行", reload: "重新读取", reloadSkill: "重新读取 Skill", createSkill: "创建 Skill", filterBySource: "按来源筛选 Skill", scopes: { all: "全部来源", repo: "项目", user: "个人", system: "系统", admin: "管理员" }, loadErrors: "{{count}} 个 Skill 未能加载", externalReadonly: "外部 Skill 只能使用或启停", noDescription: "暂无说明", enabled: "已启用", disabled: "已停用", selected: "已选择", use: "使用", editNamed: "编辑 {{name}}", deleteNamed: "删除 {{name}}", connectToView: "连接 Agent 后查看 Skill", noMatch: "没有匹配的 Skill", none: "还没有本地 Skill", connectDescription: "连接成功后会读取本机已安装的 Skill", tryAnotherFilter: "换个关键词或来源试试", createOrInstall: "创建一个，或在本机安装后刷新", saveChanges: "保存更改", saveLocation: "保存到本地 Agent 工作区", basicInfo: "基本信息",
            identifier: "Skill 标识", identifierExtra: "用于文件夹名和 $skill-name 调用。", identifierRequired: "请输入 Skill 标识", identifierMax: "Skill 标识不能超过 64 个字符", identifierPattern: "仅支持小写字母、数字和连字符，连字符不能连续或位于首尾", identifierPlaceholder: "例如 product-grid", displayName: "显示名称", displayNameMax: "显示名称不能超过 64 个字符", displayNamePlaceholder: "例如 产品九宫格生成", whenToUse: "何时使用", whenToUseExtra: "说明这个 Skill 的能力和适用场景，Codex 会据此判断是否调用。", whenToUseRequired: "请输入使用场景", whenToUseMax: "使用场景不能超过 1024 个字符", noAngleBrackets: "使用场景不能包含尖括号", whenToUsePlaceholder: "例如：当用户需要基于商品信息规划并生成一组产品图时使用", instructions: "执行说明", instructionsExtra: "按实际执行顺序写清步骤、约束和输出要求。", instructionsRequired: "请输入执行说明", instructionsPlaceholder: "写清楚执行步骤、必要检查和最终输出", advanced: "高级设置", shortDescription: "卡片短说明", shortDescriptionExtra: "填写时控制在 25–64 个字符，便于快速浏览。", shortDescriptionMin: "卡片短说明不能少于 25 个字符", shortDescriptionMax: "卡片短说明不能超过 64 个字符", shortDescriptionPlaceholder: "可选，用于列表展示", defaultPrompt: "默认提示词", defaultPromptExtra: "填写时必须准确包含 $skill-name，例如 $product-grid。", defaultPromptMax: "默认提示词不能超过 1024 个字符", defaultPromptPlaceholder: "可选，选择 Skill 时预填到输入框",
        },
        composer: { removeImage: "移除图片", removeSkill: "移除 Skill", uploadImage: "上传图片", stop: "停止", send: "发送", model: "模型：{{model}}", selectModel: "选择 Codex 模型，当前为 {{model}}", reasoning: "思考程度：{{effort}}", selectReasoning: "选择思考程度，当前为 {{effort}}", permissionLabel: "权限：{{mode}}", selectPermission: "选择 Codex 权限模式，当前为 {{mode}}", effort: { minimal: "最低", low: "轻度", medium: "中", high: "高", xhigh: "极高", max: "最高", ultra: "Ultra" }, permission: { request: "请求批准", requestDescription: "编辑工作区外文件或联网时始终询问", automatic: "自动审查", automaticDescription: "由 Codex 审查风险操作，必要时再询问", full: "完全访问权限", fullShort: "完全访问", fullDescription: "不受限制地访问网络和本机文件" }, tools: { label: "工具确认：{{mode}}", manual: "手动确认", manualDescription: "Agent 执行画布写入前会请求确认", automatic: "自动确认", automaticDescription: "Agent 会自动执行画布写入操作", select: "选择工具确认模式，当前为 {{mode}}" }, mentions: { selectSkill: "选择 Skill", selectResource: "引用画布素材", loadingSkills: "正在读取 Skill…", noSkills: "没有匹配的已启用 Skill", noResources: "当前画布没有匹配的可引用素材", previewUnavailable: "当前无法预览该素材", referenceLabel: "引用{{kind}}：{{title}}", resourceMissing: "画布素材“{{title}}”已不存在", imageReadFailed: "无法读取画布图片“{{title}}”", kind: { image: "图片", video: "视频", audio: "音频", text: "文本" } } },
        panel: { connectionSettings: "连接设置 · {{status}}", connectionSettingsLabel: "连接设置，当前{{status}}", chat: "对话", history: "历史", skills: "技能", logs: "日志", collapse: "收起对话", collapseLabel: "收起 Agent 面板", resize: "调整右侧面板宽度", content: "Agent 内容", mcpInitializing: "MCP 初始化中，完成后即可发送", initFailed: "Codex 对话初始化失败，请新建或恢复对话", placeholder: "询问 Codex，输入 / 使用技能，@ 引用画布素材" },
        chat: { latestMessages: "查看最新消息", latestCall: "最新调用", input: "输入", cached: "缓存", output: "输出" },
        logs: { copied: "日志已复制", selectedManual: "已选中日志，请手动复制", copyFailed: "复制失败，请切换到原始 JSON 后手动复制", title: "运行日志", diagnostics: "排查日志", rawJson: "原始 JSON", messages: "{{count}} 条消息", tool: "工具：{{tool}}", noPendingTool: "无待处理工具", all: "全部 {{count}}", errors: "错误 {{count}}", warnings: "警告 {{count}}", info: "信息 {{count}}", list: "排查日志列表", noFiltered: "当前筛选下没有日志", empty: "暂无事件日志", new: "{{count}} 条新日志", newLabel: "{{count}} 条新日志，查看最新日志", latest: "查看最新日志", fullData: "完整诊断数据 · {{count}} 条", copyAll: "复制全部日志", copyLastError: "复制最近错误", lastErrorCopied: "最近错误已复制", clear: "清空日志", repeated: "重复 {{count}} 次", details: "详细信息", skillLoading: "技能加载", plugin: "插件", terminal: "终端", conversationStorage: "会话存储" },
        message: { close: "关闭", copied: "已复制", copyCode: "复制代码", copyLink: "复制链接", externalWarning: "即将打开以下外部链接，请确认链接可信。", openExternal: "打开外部链接？", continueOpen: "继续打开", revealed: "已在文件管理器中定位", openLocalFailed: "无法打开本地文件", openLocal: "打开本地文件？", localDescription: "将在本机文件管理器中定位该路径，不会通过浏览器打开。", externalDescription: "即将打开以下外部链接，请确认链接可信。", pathCopied: "路径已复制", linkCopied: "链接已复制", copyPath: "复制路径", showInFolder: "在文件管理器中显示", toolCall: "工具调用", awaitingConfirmation: "等待确认", reject: "拒绝执行", approve: "批准执行", networkApproval: "请求网络访问", fileApproval: "请求编辑文件", permissionApproval: "请求扩展权限", commandApproval: "请求执行命令", decline: "拒绝", allowOnce: "允许一次", allowSession: "本会话允许", thinking: "正在思考", commandsRunning: "正在执行 {{count}} 条命令", commandRunning: "正在执行命令", commandsCompleted: "已执行 {{count}} 条命令{{failed}}", commandsFailed: " · {{count}} 条失败", failed: "执行失败", running: "进行中", completed: "已完成", command: "命令", slowResponse: "响应时间较长，但任务仍在运行。可以继续等待，或点击输入框右侧的停止按钮结束本轮。", waitingSeconds: "已等待 {{seconds}} 秒", waitingMinutes: "已等待 {{minutes}} 分 {{seconds}} 秒", files: "涉及文件", errorInfo: "错误信息", output: "运行输出", viewLarge: "点击查看大图", attachmentPreview: "图片附件预览", noEffect: "未生效", canceled: "已取消", recorded: "已记录", stopped: "已停止", finished: "已结束", pending: "待处理" },
        events: { analyzing: "正在分析任务…", reasoning: "思考摘要", plan: "执行计划", commandFailed: "命令执行失败", commandCompleted: "命令已完成", executeCommand: "执行命令", editFiles: "修改文件", searchWeb: "搜索资料", viewImage: "查看图片", imageViewed: "已查看图片", viewingImage: "正在查看图片", imageGeneration: "内置生图", imageFailed: "图片生成失败", imageCompleted: "图片生成完成", generatingImage: "正在生成图片…", compactContext: "整理上下文", contextCompacted: "已整理当前对话，继续处理任务", compactingContext: "正在整理当前对话…", collaboration: "协作处理", collaborationFailed: "协作任务失败", collaborationCompleted: "已完成协作任务", collaborating: "正在协作处理任务…", progress: "任务进度", progressCount: "已完成 {{completed}}/{{total}} 项", planning: "正在整理执行步骤…", executingCommand: "正在执行命令…", workingDirectory: "工作目录", exitStatus: "退出状态", duration: "耗时", seconds: "{{value}} 秒", filesCompleted: "已完成文件修改", preparingFiles: "正在准备文件修改…", fileCompleted: "已{{action}} {{path}}", editingFile: "正在{{action}} {{path}}", filesEdited: "已修改 {{count}} 个文件：{{names}}{{more}}", editingFiles: "正在修改 {{count}} 个文件：{{names}}{{more}}", andMore: " 等", openPage: "打开网页：{{url}}", findInPage: "在网页中查找“{{pattern}}”", content: "内容", search: "搜索：{{query}}", relatedInfo: "相关资料", keyword: "关键词", webpage: "网页", add: "新增", delete: "删除", edit: "修改", diagnostics: "Infinite Canvas Agent 诊断", address: "地址：{{endpoint}}", connection: "连接：{{connection}} · 状态：{{status}}", online: "在线", connecting: "连接中", disabled: "未启用", messageTool: "消息：{{messages}} · 工具：{{tool}}", none: "无", noLogs: "暂无事件日志", threadCreated: "创建会话", turnStarted: "开始处理", progressUpdated: "更新任务进度", turnFailed: "处理失败", turnStopped: "处理已停止", turnCompleted: "处理完成", toolCalled: "调用工具", toolFailed: "工具失败", toolCompleted: "工具完成", replyReceived: "收到回复", completed: "完成", modelBusy: "模型暂时繁忙", modelBusyDescription: "当前选择的模型请求量过大，暂时无法处理。请稍后重试，或切换其他模型后再试。", taskFailed: "任务失败", taskFailedDescription: "Codex 未能完成本次任务，请稍后重试。" },
        eventExtra: { toolNamed: "调用工具：{{name}}", toolOperation: "工具操作", targetPage: "目标页面", searchContent: "搜索内容", textContent: "文本内容", operationContent: "操作内容", imageCount: "图片数量", tools: { generateImage: "生成图片", viewImage: "查看图片", executeCommand: "执行命令", editFiles: "修改文件", searchWeb: "搜索资料", canvasOps: "画布操作", readCanvas: "读取画布", readSelection: "读取选区", exportSnapshot: "导出快照", createNode: "创建节点", addAttachments: "添加附件图片", createText: "创建文本", createTexts: "批量创建文本", createConfig: "创建生成配置", createImageFlow: "创建生图流程", createGenerationFlow: "创建生成流程", generateText: "生成文本", generateVideo: "生成视频", generateAudio: "生成音频", updateNode: "更新节点", updateText: "更新文本", moveNodes: "移动节点", resizeNode: "调整节点尺寸", deleteNodes: "删除节点", connectNodes: "连接节点", selectNodes: "选择节点", setViewport: "调整视口", runGeneration: "触发生成", openPage: "打开页面" } },
        eventMore: { toolRunning: "{{action}}中…", openedRoute: "已打开{{route}}", canvasCount: "共 {{count}} 个画布", promptCount: "找到 {{count}} 条提示词", assetCount: "共 {{count}} 个资产", assetAdded: "已加入我的素材", generationStatus: "共 {{total}} 个任务，排队 {{queued}}，运行中 {{running}}，成功 {{succeeded}}，失败 {{failed}}", workbenchExecuted: "已在工作台执行", workbenchConfigRead: "已读取工作台配置", canvasRead: "已读取当前画布内容", selectionRead: "已读取当前选中内容", textNodes: "{{count}} 个文本", imageNodes: "{{count}} 张图片", configNodes: "{{count}} 个配置", videoNodes: "{{count}} 个视频", audioNodes: "{{count}} 个音频", groupNodes: "{{count}} 个分组", otherNodes: "{{count}} 个其他节点", connections: "{{count}} 条连线", emptyCanvas: "当前画布为空", executeTool: "执行{{tool}}", thinking: "正在思考...", operationRunning: "{{operation}}正在进行...", organizingCanvas: "画布已读取，Codex 正在整理结果...", operationCompleted: "{{operation}}已完成，Codex 正在继续处理...", attachmentPrompt: "请处理上传的图片附件。", routes: { home: "首页", canvas: "画布页面", canvasProject: "指定画布", image: "生图工作台", video: "视频工作台", prompts: "提示词中心", assets: "我的素材", config: "配置页面" } },
        runtime: {
            mcpStarting: "正在启动 MCP：{{name}}", mcpConnecting: "正在建立工具连接并读取可用工具列表", mcpReadyNamed: "MCP 已就绪：{{name}}", toolsReady: "工具列表加载完成，可以开始对话", mcpFailedNamed: "MCP 启动失败：{{name}}", mcpCanceledNamed: "MCP 启动已取消：{{name}}", toolInitFailed: "工具服务未能完成初始化", mcpServicesStarting: "正在启动 MCP 服务", toolServicesPending: "还有 {{count}} 个工具服务正在初始化", checkingToolServices: "正在确认工具服务状态", conversationInitializing: "正在初始化 Codex 对话", conversationCreating: "正在创建会话并启动画布工具服务", someMcpFailed: "部分 MCP 服务初始化失败", remainingToolsReady: "其余工具已就绪，可以开始对话", conversationInitFailed: "Codex 对话初始化失败", conversationCreateFailed: "无法创建 Codex 会话", mcpServicesReady: "{{count}} 个 MCP 服务已完成初始化", toolInitCanceled: "工具服务初始化已取消", mcpStatusComplete: "MCP 状态确认完成", mcpListRead: "已读取 Codex 返回的完整工具服务清单",
            historyReadFailed: "读取历史失败", conversationSyncFailed: "同步会话失败", agentOutdated: "本地 Agent 版本过旧，请重启 Canvas Agent 后重新连接", restartRequired: "需要重启 Agent", versionMismatch: "Agent 版本不匹配", awaitingApproval: "等待权限确认", codexRunning: "Codex 正在运行", connected: "已连接", localAgentConnected: "本地 Agent 已连接", processingFailed: "处理失败", completed: "完成", approvalGranted: "已批准权限", approvalCanceled: "已取消权限", log: "日志", connectionLostDescription: "本地 Agent 连接失败或已断开", connectionFailedDescription: "连接失败，请检查地址和 token", connectionLost: "连接断开", connectionFailed: "连接失败", modelListFailed: "读取模型列表失败",
            imageTooLarge: "图片过大", imagePayloadTooLarge: "图片附件超过 30MB，请删减后再发送。", imagesSent: "发送了 {{count}} 张图片", canvasReferencesSent: "引用了 {{count}} 个画布素材", someCanvasReferencesMissing: "部分引用的画布素材已不存在", canvasReferencesMissing: "引用的画布素材已不存在，请重新选择", readingCanvasImages: "正在读取画布图片", canvasImageReadFailed: "画布图片读取失败", tooManyImages: "图片数量过多", imageCountLimit: "上传图片和引用的画布图片合计最多 {{count}} 张。", sending: "发送中", defaultModel: "默认模型", defaultEffort: "默认强度", sendTask: "发送任务", attachmentCount: "附件 {{count}}", canvasReferenceCount: "画布素材 {{count}}", attachmentsOnly: "仅附件", canvasReferencesOnly: "画布素材", startConversationFailed: "启动对话失败", attachmentHistoryFailed: "保存附件历史失败", sendFailed: "发送失败", conversationSynced: "会话已同步", taskStillRunning: "任务仍在运行", stopping: "停止中", stopTask: "停止任务", taskStopped: "任务已停止", stopFailed: "停止失败", imageLimit: "图片附件最多约 30MB。", imageReadFailed: "图片读取失败", pendingCanvasTool: "仍有待确认的画布工具调用", awaitingConfirmation: "等待确认", toolCompleted: "{{tool}}完成", toolExecutionFailed: "工具执行失败", openCanvasFirst: "当前不在画布页，请先用 site_navigate 打开画布", canvasOperationFailed: "画布操作失败", canvasToolCanceled: "用户取消了画布工具调用",
            submittingApproval: "正在提交权限决定", waitingCodexApproval: "等待 Codex 确认权限", approvalFailed: "权限审批失败", enableFullAccess: "启用完全访问权限", fullAccessDescription: "Codex 将不受沙箱限制，可访问互联网及本机任意文件。请仅在信任当前任务时使用。", enableFullAccessAction: "启用完全访问", offline: "离线", addressRequired: "请填写本地 Agent 地址", agentNotFound: "没有发现本地 Agent，请先在 Codex 使用插件或手动启动 Canvas Agent", invalidAddress: "本地 Agent 地址格式不正确", connecting: "连接中", creatingConversation: "正在新建对话", newConversation: "新对话", newConversationFailed: "新建对话失败", conversationResumed: "已恢复会话", resumeConversationFailed: "恢复对话失败", recordsDeleted: "已删除 {{count}} 条记录", deleteConversationFailed: "删除对话失败", deleteConversations: "删除 {{count}} 条对话记录", deleteConversationsDescription: "删除后无法恢复，确定继续吗？", importGeneratedImages: "导入生成图片", addedToSourceCanvas: "已添加到发起任务的画布", imageGenerated: "图片已生成", noImageAttachments: "没有可添加的图片附件", invalidAttachmentNode: "图片附件节点参数无效", attachmentReadFailed: "读取图片附件失败", referenceImage: "参考图", generatedImageReadFailed: "读取 Codex 生成图片失败", generatedImageName: "生成图片 {{index}}",
        },
    },
    locale: {
        zhCN: "简体中文",
        enUS: "English",
    },
};
