From a549c7b14b8cf8b41357bd07b28195709a5c1175 Mon Sep 17 00:00:00 2001 From: liangxu Date: Wed, 8 Jul 2026 10:55:56 +0800 Subject: [PATCH] refactor(i18n): extract inline dictionaries into locale JSON files Move the large in-code zh-CN/en-US dictionaries out of i18n.tsx and import them from locales/*.json, shrinking the module and making translations easier to edit. Co-Authored-By: Claude Opus 4.8 (1M context) --- frontend/src/i18n/i18n.tsx | 927 +-------------------------- frontend/src/i18n/locales/en-US.json | 461 +++++++++++++ frontend/src/i18n/locales/zh-CN.json | 461 +++++++++++++ 3 files changed, 927 insertions(+), 922 deletions(-) create mode 100644 frontend/src/i18n/locales/en-US.json create mode 100644 frontend/src/i18n/locales/zh-CN.json diff --git a/frontend/src/i18n/i18n.tsx b/frontend/src/i18n/i18n.tsx index 5da6c67..2d3c57c 100644 --- a/frontend/src/i18n/i18n.tsx +++ b/frontend/src/i18n/i18n.tsx @@ -2,933 +2,16 @@ import { createContext, useContext, useMemo, useState, type ReactNode } from "react"; +import zhCN from "./locales/zh-CN.json"; +import enUS from "./locales/en-US.json"; + export type Locale = "zh-CN" | "en-US"; type Dictionary = Record; const dictionaries: Record = { - "zh-CN": { - appName: "Moteva", - heroTitle: "Moteva 让设计变简单", - heroSubtitle: "懂你的设计 Agent,帮你搞定一切设计需求", - defaultPrompt: "让 Moteva 制作一张高转化的电商产品图", - promptPlaceholder: "让 Moteva 帮你构思下一个设计项目...", - continuePrompt: "继续官网设计,先从首页首屏视觉开始,或者给我特定页面模块。", - followupPrompt: "继续扩展一个新方向,保持品牌调性。", - upgrade: "Upgrade", - login: "登录", - account: "账户", - freePlan: "Free", - accountManagement: "账户管理", - accountProfileHome: "个人主页", - accountSubscription: "订阅", - accountBilling: "账单", - accountInfo: "账户信息", - changeAvatar: "更换头像", - username: "用户名", - email: "电子邮箱", - deviceManagement: "设备管理", - removeAllDevices: "移除全部设备", - removeAllDevicesDescription: "Moteva 账户仅限个人使用。为防止滥用并确保平台稳定,任务最多可同时在 2 个桌面 Web 会话和 1 个移动 Web 会话中运行。如需团队或多人使用,请购买 Team Plan。", - onlineStatus: "在线状态", - deviceInfo: "设备信息", - currentDevice: "当前设备", - system: "系统", - currentLoginAccount: "当前登录账号:{name}", - accountDeviceDesktop: "桌面端", - accountDeviceUnknownSystem: "未知系统", - accountDeviceUnknownBrowser: "未知浏览器", - avatarImageRequired: "请选择图片文件。", - avatarTooLarge: "头像图片不能超过 2MB。", - avatarUpdateFailed: "头像更新失败,请重新选择图片。", - avatarUpdated: "头像已更新。", - usernameRequired: "用户名不能为空。", - usernameUpdated: "用户名已更新。", - usernameUpdateFailed: "用户名更新失败,请稍后重试。", - currentDeviceNotice: "这是当前正在使用的设备。", - devicesRemoved: "已移除 {count} 台设备。", - removeAllDevicesConfirmTitle: "移除全部设备?", - removeAllDevicesConfirmText: "确认后将移除当前登录状态,并需要重新登录。", - guides: "使用指南", - contactUs: "联系我们", - logout: "退出登录", - credits: "{count} Credits", - attachReference: "添加参考图", - webReference: "联网参考", - modelSelection: "模型选择", - webEnabled: "联网参考已开启", - modelsTitle: "Models", - autoModel: "Auto", - modelImageTab: "Image", - modelVideoTab: "Video", - model3dTab: "3D", - modelComingSoon: "当前版本仅支持图片模型", - referenceImages: "参考图", - removeReference: "移除参考图", - promptExamples: "提示词示例", - promptDirectiveWeb: "请先进行联网参考,提炼可用趋势、竞品结构和视觉关键词。", - promptDirectiveModel: "模型选择:{model}。", - promptDirectiveReference: "参考图 {index}({name}):{url}", - promptDirectiveAnnotation: "标注 {index}:画布坐标 x={x}, y={y}", - annotationLabel: "标注 {index}", - startDesign: "开始设计", - recentProjects: "最近项目", - viewAll: "查看全部", - collapse: "收起", - newProject: "新建项目", - continueEditing: "继续编辑", - inspiration: "灵感发现", - inspirationCategories: "灵感分类", - loadMore: "查看更多", - close: "关闭", - reset: "重置", - usePrompt: "使用提示词", - createFromInspiration: "用它新建项目", - views: "浏览", - likes: "喜欢", - home: "首页", - projects: "项目", - personalProjects: "个人项目", - projectLibrarySubtitle: "最近项目只保留 3 个,这里管理全部个人画布。", - editProjects: "编辑", - doneEditing: "完成", - selectedProjectsCount: "已选择 {count} 项", - deleteSelected: "删除", - loadingProjects: "正在加载项目...", - loadMoreProjects: "加载更多项目", - projectsEmpty: "暂无项目,先新建一个画布。", - deleteProjectsTitle: "确认批量删除项目?", - deleteProjectsWarning: "删除后将移除所选项目、画布内容、历史记录和对话记录,无法恢复。", - deleteProjectsDetails: "所选项目里的图片资产会在后台异步从 OSS 删除,可能需要一点时间完成。", - deleteProjectsConfirm: "确认删除", - members: "成员", - info: "信息", - settings: "设置", - create: "新建", - loadingCanvas: "正在打开画布...", - unsaved: "未保存", - synced: "已同步", - nodes: "nodes", - promo: "限时优惠,立享5折 · Seedance 2.0 低至 $0.02/秒,Image-2 低至 $0.004/张", - upgradeNow: "立即升级", - backHome: "返回首页", - save: "保存", - share: "分享", - shareLinkCopied: "分享链接已复制", - shareUnavailable: "暂时无法分享", - download: "下载", - generate: "生成", - more: "更多", - add: "添加", - conversation: "对话", - newChat: "新对话", - conversationHistory: "历史对话", - searchConversationPlaceholder: "请输入搜索关键词", - deleteConversation: "删除对话", - noConversationHistory: "暂无历史对话", - copyProject: "复制项目", - canvasUntitled: "Untitled", - renameCanvasTitle: "重命名画布", - renameImageNode: "重命名图片", - imageTitlePlaceholder: "输入图片名称", - projectTitlePlaceholder: "输入画布名称", - select: "选择", - pan: "移动", - pin: "定位", - pen: "画笔", - penColor: "画笔颜色", - penWidth: "画笔粗细", - grid: "网格", - smartArtboard: "智能画板", - shapeTool: "形状", - shapeRectangle: "矩形", - shapeLine: "线条", - shapeArrow: "箭头", - shapeEllipse: "圆", - shapePolygon: "多边形", - shapeStar: "星形", - cornerRadius: "圆角", - shapeVertices: "边数", - shapeInnerRadius: "内径", - booleanOperation: "布尔运算", - booleanUnion: "合并", - booleanSubtract: "减去", - booleanIntersect: "相交", - booleanExclude: "排除", - booleanFlatten: "扁平化", - fill: "填充", - stroke: "描边", - textFill: "文字填充", - textStroke: "文字描边", - textAlign: "文字对齐", - textOptions: "文字设置", - searchFonts: "搜索字体", - allFonts: "全部字体", - fontFamily: "字体", - fontWeight: "字重", - fontSize: "字号", - lineHeight: "行高", - letterSpacing: "字距", - autoLineHeight: "自动行高", - solidLine: "实线", - dashedLine: "虚线", - dottedLine: "点线", - strokeWidth: "线宽", - layout: "布局", - auto: "自动", - manual: "手动", - customSize: "自定义", - webPageSize: "网页", - adaptiveSize: "适应", - widthShort: "W", - heightShort: "H", - lockAspectRatio: "锁定宽高比", - unlockAspectRatio: "取消锁定宽高比", - zoomIn: "放大", - zoomOut: "缩小", - zoomMenu: "缩放", - zoomShowAll: "显示画布所有元素", - zoomTo: "缩放至{percent}%", - lockCanvas: "锁定画布", - minimap: "小地图", - canvasBackgroundColor: "画布背景色", - canvasCursor: "画布状态", - imageNode: "图片节点", - uploadImageNode: "上传图片节点", - imageUploadSuccess: "图片上传成功", - uploadingImage: "上传中", - extractingText: "提取文字", - textNode: "文本节点", - frameNode: "画框", - generateImage: "生成图片", - addTextBox: "添加文本框", - imageGeneratorNode: "图像生成器", - newImageNode: "图片方案", - newFrameNode: "官网画板", - newPenStrokeNode: "画笔笔迹", - newTextNode: "文本便签", - newTextNodeContent: "记录一个设计判断、修改点或下一步任务。", - layers: "图层", - layerHistory: "历史记录", - layerNoHistory: "暂无历史记录", - layerNoLayers: "暂无图层", - generatedFiles: "已生成文件列表", - generatedFilesEmpty: "暂无已生成文件", - generatedFilesEnd: "到底了", - layerGroup: "编组", - layerItemsCount: "{count} 个图层", - mergedLayerTitle: "合并图层", - skillLine: "综合技能 · 视觉搜索 · 图片设计", - synthesizeSkills: "联网搜索", - searchComplete: "联网搜索完成", - searchingWeb: "正在联网搜索", - searchFailed: "联网搜索失败", - agentSearchCard: "搜索 {query},提炼可执行的设计参考...", - agentThinking: "Agent 正在思考", - selected: "当前选中", - selectedImageSummary: "图片内容已在画布中显示 · {status}", - addAsset: "添加资产", - agentDesign: "Agent 设计", - agentShort: "Agent", - agentDesignHint: "使用联网搜索和图片模型推进当前画布", - agentWebSearch: "联网研究", - agentWebSearchHint: "搜索网页信息并整理可用设计依据", - referenceLibrary: "参考库", - promptIdeas: "提示建议", - voiceInput: "语音输入", - canvasPromptPlaceholder: "今天我们要创作什么", - imageModelSpec: "图像 · 中 · 1:1 · 1 img", - unlockModels: "升级会员解锁全量模型,让创作提速!", - uploadFile: "上传文件", - chooseFromLibrary: "从素材库选择", - webSearch: "联网搜索", - agentMode: "Agent 模式", - imageMode: "图像", - referenceImage: "参考图", - imageSettings: "图片参数", - imageCountUnit: "{count} 张", - quality: "质量", - qualityAuto: "自动", - qualityHigh: "高", - qualityMedium: "中", - qualityLow: "低", - imageSizeLabel: "尺寸", - imageModeDirective: "图片生成参数:质量 {quality},尺寸 {width}x{height},比例 {ratio},数量 {count} 张。纯生图模式,请直接围绕用户输入生成图片,不展开额外聊天。", - quickEdit: "快捷编辑", - quickEditTab: "快捷编辑Tab", - quickEditPlaceholder: "输入这张图的局部或整体修改要求", - upscale: "放大", - upscalePrompt: "请将这张图通过模型放大到 {scale} 级别,保持构图和主体不变,提升细节、边缘和纹理清晰度。", - removeBackground: "去背景", - removeBackgroundPrompt: "一键移除背景,保留主体完整边缘,输出干净主体图。", - eraserTool: "橡皮工具", - erase: "擦除", - eraserBrush: "画笔", - eraserBrushColor: "笔刷颜色", - eraserDrawHint: "在图片上绘制选区,", - eraserSubtractHint: "擦除,", - eraserExitHint: "退出", - eraserPromptPlaceholder: "描述涂抹区域要如何修改", - eraserDefaultPrompt: "擦除涂抹区域并自然修补背景,保持未涂抹区域不变", - editElements: "编辑元素", - editElementsPrompt: "移除底图里的文字并自然补全背景,用 OCR 识别文字内容和原始位置后创建可编辑文字层。", - editText: "编辑文字", - editTextPrompt: "识别图片中的文字,按用户修改定向替换文字;只擦除原文字并在原位置重建新文字,保证图片其他元素完全不变。", - editTextOcrPrompt: "先识别图片中所有可见文字,返回可编辑文字列表和精确位置。", - editTextOcrFailed: "文字识别失败,请稍后重试。", - editTextEmpty: "未识别到可编辑文字。", - removeTextLayer: "删除这段文字", - applyNow: "立即使用", - multiAngle: "多角度", - multiAngleDefaultPrompt: "根据多角度面板里的主体或摄像头角度参数生成单张新视角图,保持主体身份、材质和设计细节一致。", - multiAnglePromptPlaceholder: "补充视角、姿态或构图要求", - cameraTab: "摄像头", - subjectTab: "主体", - yaw: "旋转", - pitch: "倾斜", - multiAngleRotate: "旋转", - multiAngleTilt: "倾斜", - multiAngleZoom: "缩放", - multiAngleZoomClose: "近景", - multiAngleZoomMedium: "中等", - multiAngleZoomFar: "远景", - multiAngleUseNow: "立即使用", - multiAngleTiltUp: "上移摄像头", - multiAngleTiltDown: "下移摄像头", - multiAngleRotateLeft: "左移摄像头", - multiAngleRotateRight: "右移摄像头", - moveObject: "移动对象", - movePromptPlaceholder: "描述对象要移动到哪里", - moveDefaultPrompt: "移动选中对象并自然补全原区域", - moveRecognitionLoading: "正在识别选中对象...", - moveObjectSelected: "已选中对象", - moveObjectNone: "框选要移动的对象", - moveObjectSelection: "对象和目标位置", - moveObjectReselect: "重新框选对象", - moveObjectHint: "先框选并识别对象,再拖动该框到新位置。", - mockup: "Mockup", - mockupPrompt: "将影印图案应用到选中的真实物体 mockup 上,只放在衣物、包袋、海报、屏幕等可印刷材质表面;如果是人物穿着服饰,图案必须贴在衣物布料上,不要贴到皮肤、脸、头发、手臂或背景上。保持图案清晰,并让透视、褶皱、光线和材质自然融合。", - mockupPreparing: "Mockup 生成中...", - mockupDropHint: "将图片拖放到这里", - mockupPrintTitle: "Mockup 贴图", - expandImage: "扩展", - expandPrompt: "围绕原图自然扩展画面边界,保持主体和视觉风格一致。", - adjustImage: "调整", - adjustPrompt: "根据调整参数优化图片光线、色彩、对比度和细节;如果没有指定数值,则自动优化整体观感,同时保持主体与构图不变。", - cropImage: "裁剪", - cropPrompt: "按用户选择的裁剪区域重构图片构图,只保留关键画面。", - cropPresets: "预设", - cropPresetGeneral: "通用", - cropPresetFree: "自由", - cropPresetSquare: "正方形", - cropPresetPortrait: "竖版", - cropPresetLandscape: "横版", - cropPresetPost: "帖子", - cropPresetStory: "故事", - cropPresetCover: "封面", - cropPresetVideo: "视频", - cropPresetBanner: "横幅", - cropPresetProfile: "头像", - vector: "矢量", - vectorizeImage: "矢量化", - vectorPrompt: "将图片转换为清晰的矢量风格,保留主体轮廓、色块关系和可读细节。", - flipAndRotate: "翻转与旋转", - rotationAngle: "旋转角度", - rotate90: "旋转 90°", - customizeToolbar: "自定义工具栏", - customizeToolbarDesc: "选择编辑栏中显示的工具", - resetToolbar: "恢复默认", - showToolNames: "显示工具名称", - expandScale: "缩放比例", - expandPreset: "预设", - expandPresetGeneral: "通用", - expandOriginalRatio: "原始比例", - expandCustom: "自定义", - expandSquare: "正方形", - expandPortrait: "竖版", - expandLandscape: "横版", - adjustLight: "光线", - adjustExposure: "曝光", - adjustHighlights: "高光", - adjustShadows: "阴影", - adjustWhites: "白色", - adjustBlacks: "黑色", - adjustColor: "颜色", - adjustDetail: "细节", - adjustEffects: "效果", - adjustVibrance: "自然饱和度", - adjustTemperature: "色温", - adjustTint: "色调", - adjustClarity: "清晰度", - adjustGrain: "颗粒", - adjustVignette: "晕影", - adjustGlamour: "柔光", - adjustBloom: "辉光", - adjustAuto: "自动", - brightness: "亮度", - contrast: "对比度", - saturation: "饱和度", - sharpness: "锐化", - cropPromptPlaceholder: "描述裁剪后的构图用途", - apply: "应用", - cancel: "取消", - clipboardCopied: "已复制到系统剪贴板", - clipboardCopyFailed: "无法写入系统剪贴板", - contextCopy: "复制", - contextCut: "剪切", - contextPaste: "粘贴", - contextDuplicate: "创建副本", - contextBringForward: "上移一层", - contextSendBackward: "下移一层", - contextBringToFront: "移动至顶层", - contextSendToBack: "移动至底层", - contextSendToChat: "发送至对话", - contextCreateGroup: "创建编组", - contextUngroup: "解除编组", - contextAutoLayout: "自动布局", - contextMergeLayers: "合并图层", - alignLeft: "左对齐", - alignCenter: "水平居中", - alignRight: "右对齐", - alignTop: "顶部对齐", - alignMiddle: "垂直居中", - alignBottom: "底部对齐", - distributeHorizontal: "水平分布", - distributeVertical: "垂直分布", - gridLayout: "网格布局", - contextHide: "显示/隐藏", - contextShow: "显示/隐藏", - contextLock: "锁定/解锁", - contextUnlock: "锁定/解锁", - contextFlipHorizontal: "水平翻转", - contextFlipVertical: "垂直翻转", - contextExport: "导出", - contextDelete: "删除", - deleteProjectTitle: "确认删除项目?", - deleteProjectWarning: "删除后将移除项目、画布内容、历史记录和对话记录,无法恢复。", - deleteProjectDetails: "项目里的图片资产会在后台异步从 OSS 删除,可能需要一点时间完成。", - deleteProjectCancel: "取消", - deleteProjectConfirm: "确认删除", - deletingProject: "删除中", - sendNodeToChatPrompt: "继续基于「{title}」这张图做下一步设计。", - send: "发送", - stopGeneration: "停止生成", - createError: "创建项目失败", - saveError: "保存失败", - renameProjectError: "重命名失败", - generateError: "生成失败", - generateTimeout: "生成仍在继续,请稍后刷新画布查看结果", - quickCommerce: "电商海报", - quickUi: "UI 界面", - quickRetouch: "产品精修", - quickStyle: "风格迁移", - unnamedCanvasProject: "新建一个可继续迭代的无限画布项目。", - back: "返回", - loginWelcome: "欢迎来到 Moteva", - loginSubtitle: "登录或注册以继续", - loginGoogle: "使用 Google", - loginEmailPlaceholder: "电子邮箱", - turnstileVerifying: "正在验证...", - turnstilePrivacy: "隐私", - turnstileHelp: "帮助", - turnstileRequired: "请先完成人机验证。", - turnstileLoadFailed: "人机验证加载失败,请刷新后重试。", - turnstileUnavailable: "人机验证暂未配置,请稍后重试。", - loginEmailContinue: "使用邮箱继续", - loginTerms: "继续即表示您同意使用条款和隐私政策", - loginCheckEmail: "查看您的邮箱以继续", - loginCodeSent: "我们已向您的邮箱发送了一次性验证码,请查看您的收件箱:", - loginCodeAria: "邮箱验证码", - loginResend: "重新发送", - loginResendWait: "{seconds}秒后可重新发送", - loginRequestFailed: "验证码发送失败", - loginVerifyFailed: "验证码验证失败", - loginCodeInvalid: "验证码错误。", - loginCodeExpired: "验证码已过期,请重新发送。", - googleLoginUnavailable: "Google 登录暂未配置", - "messages.common.unknown": "出了点问题,请稍后重试。", - "messages.network.unavailable": "网络连接异常,请检查网络后重试。", - "messages.http.bad_request": "请求内容有误,请检查后重试。", - "messages.http.unauthorized": "登录状态已失效,请重新登录。", - "messages.http.forbidden": "当前账号没有权限执行此操作。", - "messages.http.not_found": "内容不存在或已被删除。", - "messages.http.conflict": "内容已发生变化,请刷新后重试。", - "messages.http.payload_too_large": "文件过大,请压缩后再上传。", - "messages.http.timeout": "请求超时,请稍后重试。", - "messages.http.too_many_requests": "操作太频繁,请稍后再试。", - "messages.http.server": "服务暂时不可用,请稍后重试。", - "messages.validation.prompt_required": "请先输入你想创建的内容。", - "messages.auth.login_required": "请先登录后继续。", - "messages.auth.code_invalid": "验证码错误。", - "messages.auth.code_expired": "验证码已过期,请重新发送。", - "messages.auth.invalid_credentials": "账号或凭证不正确,请检查后重试。", - "messages.auth.invalid_region": "当前登录方式暂不可用。", - "messages.auth.provider_not_ready": "当前登录服务暂未配置,请稍后重试。", - "messages.auth.human_verification_required": "请先完成人机验证。", - "messages.auth.human_verification_failed": "人机验证失败,请重新验证后再试。", - localeLabel: "EN" - }, - "en-US": { - appName: "Moteva", - heroTitle: "Moteva makes design simple", - heroSubtitle: "A design agent that understands the brief and carries the work forward.", - defaultPrompt: "Ask Moteva to make a high-converting e-commerce product visual.", - promptPlaceholder: "Ask Moteva to explore your next design project...", - continuePrompt: "Continue the website design. Start with the homepage hero, or give me a specific module direction.", - followupPrompt: "Extend a new direction while keeping the brand tone consistent.", - upgrade: "Upgrade", - login: "Log in", - account: "Account", - freePlan: "Free", - accountManagement: "Account", - accountProfileHome: "Profile", - accountSubscription: "Subscription", - accountBilling: "Billing", - accountInfo: "Account Info", - changeAvatar: "Change Avatar", - username: "Username", - email: "Email", - deviceManagement: "Device Management", - removeAllDevices: "Remove All Devices", - removeAllDevicesDescription: "A Moteva account is for personal use only. To prevent abuse and keep the platform stable, tasks can run in up to 2 desktop web sessions and 1 mobile web session at the same time. For team or multi-person use, please purchase Team Plan.", - onlineStatus: "Online", - deviceInfo: "Device Info", - currentDevice: "Current Device", - system: "System", - currentLoginAccount: "Current account: {name}", - accountDeviceDesktop: "Desktop", - accountDeviceUnknownSystem: "Unknown system", - accountDeviceUnknownBrowser: "Unknown browser", - avatarImageRequired: "Please choose an image file.", - avatarTooLarge: "Avatar image must be under 2 MB.", - avatarUpdateFailed: "Failed to update avatar. Please choose the image again.", - avatarUpdated: "Avatar updated.", - usernameRequired: "Username cannot be empty.", - usernameUpdated: "Username updated.", - usernameUpdateFailed: "Failed to update username. Please try again later.", - currentDeviceNotice: "This is the device you are using now.", - devicesRemoved: "{count} device(s) removed.", - removeAllDevicesConfirmTitle: "Remove all devices?", - removeAllDevicesConfirmText: "After confirmation, your current session will be removed and you will need to log in again.", - guides: "Guides", - contactUs: "Contact us", - logout: "Log out", - credits: "{count} Credits", - attachReference: "Attach reference", - webReference: "Web reference", - modelSelection: "Model selection", - webEnabled: "Web reference on", - modelsTitle: "Models", - autoModel: "Auto", - modelImageTab: "Image", - modelVideoTab: "Video", - model3dTab: "3D", - modelComingSoon: "This version currently supports image models only.", - referenceImages: "Reference images", - removeReference: "Remove reference image", - promptExamples: "Prompt examples", - promptDirectiveWeb: "Start with web references and extract usable trends, competitor structures, and visual keywords.", - promptDirectiveModel: "Selected model: {model}.", - promptDirectiveReference: "Reference image {index} ({name}): {url}", - promptDirectiveAnnotation: "Annotation {index}: canvas position x={x}, y={y}", - annotationLabel: "Annotation {index}", - startDesign: "Start design", - recentProjects: "Recent Projects", - viewAll: "View all", - collapse: "Collapse", - newProject: "New Project", - continueEditing: "Continue", - inspiration: "Inspiration", - inspirationCategories: "Inspiration categories", - loadMore: "Load more", - close: "Close", - reset: "Reset", - usePrompt: "Use prompt", - createFromInspiration: "Create from this", - views: "views", - likes: "likes", - home: "Home", - projects: "Projects", - personalProjects: "Personal Projects", - projectLibrarySubtitle: "Recent projects only shows three. Manage every personal canvas here.", - editProjects: "Edit", - doneEditing: "Done", - selectedProjectsCount: "{count} selected", - deleteSelected: "Delete", - loadingProjects: "Loading projects...", - loadMoreProjects: "Load more projects", - projectsEmpty: "No projects yet. Create a canvas to start.", - deleteProjectsTitle: "Delete selected projects?", - deleteProjectsWarning: "This removes the selected projects, canvas content, history, and conversation records. This cannot be undone.", - deleteProjectsDetails: "Image assets in these projects will be deleted from OSS asynchronously in the background and may take a moment to finish.", - deleteProjectsConfirm: "Delete selected", - members: "Members", - info: "Info", - settings: "Settings", - create: "Create", - loadingCanvas: "Opening canvas...", - unsaved: "Unsaved", - synced: "Synced", - nodes: "nodes", - promo: "Limited offer, 50% off · Seedance 2.0 from $0.02/sec, Image-2 from $0.004/image", - upgradeNow: "Upgrade now", - backHome: "Back home", - save: "Save", - share: "Share", - shareLinkCopied: "Share link copied", - shareUnavailable: "Sharing is unavailable", - download: "Download", - generate: "Generate", - more: "More", - add: "Add", - conversation: "Chat", - newChat: "New chat", - conversationHistory: "History", - searchConversationPlaceholder: "Search conversations", - deleteConversation: "Delete conversation", - noConversationHistory: "No history yet", - copyProject: "Copy project", - canvasUntitled: "Untitled", - renameCanvasTitle: "Rename canvas", - renameImageNode: "Rename image", - imageTitlePlaceholder: "Image name", - projectTitlePlaceholder: "Name this canvas", - select: "Select", - pan: "Move", - pin: "Pin", - pen: "Pen", - penColor: "Pen color", - penWidth: "Pen width", - grid: "Grid", - smartArtboard: "Smart artboard", - shapeTool: "Shapes", - shapeRectangle: "Rectangle", - shapeLine: "Line", - shapeArrow: "Arrow", - shapeEllipse: "Ellipse", - shapePolygon: "Polygon", - shapeStar: "Star", - cornerRadius: "Corner radius", - shapeVertices: "Vertices", - shapeInnerRadius: "Inner radius", - booleanOperation: "Boolean operation", - booleanUnion: "Union", - booleanSubtract: "Subtract", - booleanIntersect: "Intersect", - booleanExclude: "Exclude", - booleanFlatten: "Flatten", - fill: "Fill", - stroke: "Stroke", - textFill: "Text fill", - textStroke: "Text stroke", - textAlign: "Text align", - textOptions: "Text options", - searchFonts: "Search fonts", - allFonts: "All fonts", - fontFamily: "Font", - fontWeight: "Weight", - fontSize: "Size", - lineHeight: "Line height", - letterSpacing: "Letter spacing", - autoLineHeight: "Auto line height", - solidLine: "Solid", - dashedLine: "Dashed", - dottedLine: "Dotted", - strokeWidth: "Width", - layout: "Layout", - auto: "Auto", - manual: "Manual", - customSize: "Custom", - webPageSize: "Web", - adaptiveSize: "Fit", - widthShort: "W", - heightShort: "H", - lockAspectRatio: "Lock aspect ratio", - unlockAspectRatio: "Unlock aspect ratio", - zoomIn: "Zoom in", - zoomOut: "Zoom out", - zoomMenu: "Zoom", - zoomShowAll: "Show all canvas elements", - zoomTo: "Zoom to {percent}%", - lockCanvas: "Lock canvas", - minimap: "Minimap", - canvasBackgroundColor: "Canvas background color", - canvasCursor: "Canvas status", - imageNode: "Image node", - uploadImageNode: "Upload image node", - imageUploadSuccess: "Image uploaded", - uploadingImage: "Uploading", - extractingText: "Extract text", - textNode: "Text node", - frameNode: "Frame", - generateImage: "Generate image", - addTextBox: "Add text box", - imageGeneratorNode: "Image Generator", - newImageNode: "Image direction", - newFrameNode: "Website artboard", - newPenStrokeNode: "Pen stroke", - newTextNode: "Text note", - newTextNodeContent: "Capture a design decision, revision, or next task.", - layers: "Layers", - layerHistory: "History", - layerNoHistory: "No history yet", - layerNoLayers: "No layers", - generatedFiles: "Generated files", - generatedFilesEmpty: "No generated files yet", - generatedFilesEnd: "End", - layerGroup: "Group", - layerItemsCount: "{count} layers", - mergedLayerTitle: "Merged layer", - skillLine: "Combined skills · Visual search · Image design", - synthesizeSkills: "Web searched", - searchComplete: "Web search complete", - searchingWeb: "Searching web", - searchFailed: "Web search failed", - agentSearchCard: "Searching {query} and extracting design references...", - agentThinking: "Agent thinking", - selected: "Selected", - selectedImageSummary: "Image content is visible on canvas · {status}", - addAsset: "Add asset", - agentDesign: "Agent Design", - agentShort: "Agent", - agentDesignHint: "Use web search and image models to advance this canvas.", - agentWebSearch: "Web research", - agentWebSearchHint: "Search the web and summarize usable design evidence.", - referenceLibrary: "Reference library", - promptIdeas: "Prompt ideas", - voiceInput: "Voice input", - canvasPromptPlaceholder: "What are we creating today?", - imageModelSpec: "Image · M · 1:1 · 1 img", - unlockModels: "Upgrade to unlock the full model set and speed up creation.", - uploadFile: "Upload file", - chooseFromLibrary: "Choose from library", - webSearch: "Web search", - agentMode: "Agent mode", - imageMode: "Image", - referenceImage: "Reference", - imageSettings: "Image settings", - imageCountUnit: "{count} img", - quality: "Quality", - qualityAuto: "Auto", - qualityHigh: "High", - qualityMedium: "Medium", - qualityLow: "Low", - imageSizeLabel: "Size", - imageModeDirective: "Image generation settings: quality {quality}, size {width}x{height}, ratio {ratio}, count {count}. Pure image mode: generate the image directly from the user's input without extra chat.", - quickEdit: "Quick edit", - quickEditTab: "Quick edit Tab", - quickEditPlaceholder: "Describe the edit for this image", - upscale: "Upscale", - upscalePrompt: "Upscale this image to {scale} level with the model. Preserve composition and subject while improving detail, edges, and texture clarity.", - removeBackground: "Remove background", - removeBackgroundPrompt: "Remove the background in one step, preserve the full subject edge, and output a clean subject image.", - eraserTool: "Eraser Tool", - erase: "Erase", - eraserBrush: "Brush", - eraserBrushColor: "Brush color", - eraserDrawHint: "Draw selection on the image, ", - eraserSubtractHint: "erase, ", - eraserExitHint: "exit", - eraserPromptPlaceholder: "Describe how to change the brushed area", - eraserDefaultPrompt: "Erase the brushed area and naturally repair the background while keeping unbrushed areas unchanged", - editElements: "Edit elements", - editElementsPrompt: "Remove embedded text from the base image, inpaint the background, run OCR, and rebuild editable text layers at the original positions.", - editText: "Edit text", - editTextPrompt: "Detect image text and replace only the targeted words. Remove the original text and rebuild new text at the same positions while keeping all other image elements unchanged.", - editTextOcrPrompt: "First identify every visible text item in the image and return an editable text list with precise positions.", - editTextOcrFailed: "Text recognition failed. Please try again.", - editTextEmpty: "No editable text was detected.", - removeTextLayer: "Remove this text", - applyNow: "Apply now", - multiAngle: "Multi-angle", - multiAngleDefaultPrompt: "Generate one new angle from the subject or camera controls while preserving subject identity, materials, and design details.", - multiAnglePromptPlaceholder: "Add angle, pose, or composition details", - cameraTab: "Camera", - subjectTab: "Subject", - yaw: "Rotation", - pitch: "Tilt", - multiAngleRotate: "Rotation", - multiAngleTilt: "Tilt", - multiAngleZoom: "Zoom", - multiAngleZoomClose: "Close", - multiAngleZoomMedium: "Medium", - multiAngleZoomFar: "Far", - multiAngleUseNow: "Use now", - multiAngleTiltUp: "Move camera up", - multiAngleTiltDown: "Move camera down", - multiAngleRotateLeft: "Move camera left", - multiAngleRotateRight: "Move camera right", - moveObject: "Move object", - movePromptPlaceholder: "Describe where to move the object", - moveDefaultPrompt: "Move the selected object and naturally fill the original area", - moveRecognitionLoading: "Recognizing selection...", - moveObjectSelected: "Object selected", - moveObjectNone: "Select the object to move", - moveObjectSelection: "Object and target position", - moveObjectReselect: "Select object again", - moveObjectHint: "Select and recognize the object first, then drag that box to the new position.", - mockup: "Mockup", - mockupPrompt: "Apply the print design to the selected real-object mockup, only on printable material surfaces such as clothing, bags, posters, screens, or product panels. If a person is wearing apparel, place the design on garment fabric only, never on skin, face, hair, arms, hands, or background. Keep the design clear with natural perspective, folds, light, and material blending.", - mockupPreparing: "Preparing mockup...", - mockupDropHint: "Drop an image here", - mockupPrintTitle: "Mockup print", - expandImage: "Expand", - expandPrompt: "Naturally expand the image boundaries while preserving the subject and visual style.", - adjustImage: "Adjust", - adjustPrompt: "Apply the adjustment parameters to improve light, color, contrast, and detail; if no values are set, automatically improve the overall look while preserving subject and composition.", - cropImage: "Crop", - cropPrompt: "Recompose the image using the selected crop region and keep the important frame.", - cropPresets: "Presets", - cropPresetGeneral: "General", - cropPresetFree: "Free", - cropPresetSquare: "Square", - cropPresetPortrait: "Portrait", - cropPresetLandscape: "Landscape", - cropPresetPost: "Post", - cropPresetStory: "Story", - cropPresetCover: "Cover", - cropPresetVideo: "Video", - cropPresetBanner: "Banner", - cropPresetProfile: "Profile", - vector: "Vector", - vectorizeImage: "Vectorize", - vectorPrompt: "Convert the image into a clean vector style while preserving subject silhouette, color blocks, and readable detail.", - flipAndRotate: "Flip & Rotate", - rotationAngle: "Rotation angle", - rotate90: "Rotate 90°", - customizeToolbar: "Customize Toolbar", - customizeToolbarDesc: "Choose the tools shown in the edit bar", - resetToolbar: "Reset to default", - showToolNames: "Show tool names", - expandScale: "Scale", - expandPreset: "Preset", - expandPresetGeneral: "General", - expandOriginalRatio: "Original ratio", - expandCustom: "Custom", - expandSquare: "Square", - expandPortrait: "Portrait", - expandLandscape: "Landscape", - adjustLight: "Light", - adjustExposure: "Exposure", - adjustHighlights: "Highlights", - adjustShadows: "Shadows", - adjustWhites: "Whites", - adjustBlacks: "Blacks", - adjustColor: "Color", - adjustDetail: "Detail", - adjustEffects: "Effects", - adjustVibrance: "Vibrance", - adjustTemperature: "Temperature", - adjustTint: "Tint", - adjustClarity: "Clarity", - adjustGrain: "Grain", - adjustVignette: "Vignette", - adjustGlamour: "Glamour", - adjustBloom: "Bloom", - adjustAuto: "Auto", - brightness: "Brightness", - contrast: "Contrast", - saturation: "Saturation", - sharpness: "Sharpness", - cropPromptPlaceholder: "Describe the cropped composition", - apply: "Apply", - cancel: "Cancel", - clipboardCopied: "Copied to system clipboard", - clipboardCopyFailed: "Could not write to system clipboard", - contextCopy: "Copy", - contextCut: "Cut", - contextPaste: "Paste", - contextDuplicate: "Duplicate", - contextBringForward: "Bring forward", - contextSendBackward: "Send backward", - contextBringToFront: "Bring to front", - contextSendToBack: "Send to back", - contextSendToChat: "Send to chat", - contextCreateGroup: "Create group", - contextUngroup: "Ungroup", - contextAutoLayout: "Auto layout", - contextMergeLayers: "Merge layers", - alignLeft: "Align left", - alignCenter: "Align center", - alignRight: "Align right", - alignTop: "Align top", - alignMiddle: "Align middle", - alignBottom: "Align bottom", - distributeHorizontal: "Distribute horizontal", - distributeVertical: "Distribute vertical", - gridLayout: "Grid layout", - contextHide: "Show/hide", - contextShow: "Show/hide", - contextLock: "Lock/unlock", - contextUnlock: "Lock/unlock", - contextFlipHorizontal: "Flip horizontal", - contextFlipVertical: "Flip vertical", - contextExport: "Export", - contextDelete: "Delete", - deleteProjectTitle: "Delete this project?", - deleteProjectWarning: "This removes the project, canvas content, history, and conversation records. This cannot be undone.", - deleteProjectDetails: "Image assets will be deleted from OSS asynchronously in the background and may take a moment to finish.", - deleteProjectCancel: "Cancel", - deleteProjectConfirm: "Delete project", - deletingProject: "Deleting", - sendNodeToChatPrompt: "Continue designing from the image named “{title}”.", - send: "Send", - stopGeneration: "Stop generation", - createError: "Failed to create project", - saveError: "Failed to save", - renameProjectError: "Failed to rename", - generateError: "Failed to generate", - generateTimeout: "Generation is still running. Refresh the canvas in a moment to see the result.", - quickCommerce: "Commerce Poster", - quickUi: "UI Screen", - quickRetouch: "Product Retouch", - quickStyle: "Style Transfer", - unnamedCanvasProject: "Create an iterative infinite canvas project.", - back: "Back", - loginWelcome: "Welcome to Moteva", - loginSubtitle: "Log in or sign up to continue", - loginGoogle: "Continue with Google", - loginEmailPlaceholder: "Email", - turnstileVerifying: "Verifying...", - turnstilePrivacy: "Privacy", - turnstileHelp: "Help", - turnstileRequired: "Please complete the security check first.", - turnstileLoadFailed: "Security check failed to load. Please refresh and try again.", - turnstileUnavailable: "Security check is not configured yet. Please try again later.", - loginEmailContinue: "Continue with email", - loginTerms: "By continuing, you agree to the Terms and Privacy Policy", - loginCheckEmail: "Check your email to continue", - loginCodeSent: "We sent a one-time code to your inbox:", - loginCodeAria: "Email verification code", - loginResend: "Resend", - loginResendWait: "Resend in {seconds}s", - loginRequestFailed: "Failed to send verification code", - loginVerifyFailed: "Failed to verify code", - loginCodeInvalid: "Verification code is incorrect.", - loginCodeExpired: "Verification code has expired. Please resend it.", - googleLoginUnavailable: "Google login is not configured", - "messages.common.unknown": "Something went wrong. Please try again later.", - "messages.network.unavailable": "Network connection failed. Please check your connection and try again.", - "messages.http.bad_request": "The request is invalid. Please check and try again.", - "messages.http.unauthorized": "Your session has expired. Please sign in again.", - "messages.http.forbidden": "You do not have permission to do that.", - "messages.http.not_found": "This content no longer exists or was removed.", - "messages.http.conflict": "This content changed elsewhere. Please refresh and try again.", - "messages.http.payload_too_large": "The file is too large. Please compress it and try again.", - "messages.http.timeout": "The request timed out. Please try again later.", - "messages.http.too_many_requests": "Too many attempts. Please try again later.", - "messages.http.server": "The service is temporarily unavailable. Please try again later.", - "messages.validation.prompt_required": "Enter what you want to create first.", - "messages.auth.login_required": "Please sign in to continue.", - "messages.auth.code_invalid": "Verification code is incorrect.", - "messages.auth.code_expired": "Verification code has expired. Please resend it.", - "messages.auth.invalid_credentials": "The account or credential is incorrect. Please check and try again.", - "messages.auth.invalid_region": "This sign-in method is not available right now.", - "messages.auth.provider_not_ready": "This sign-in service is not configured yet. Please try again later.", - "messages.auth.human_verification_required": "Please complete the security check first.", - "messages.auth.human_verification_failed": "Security check failed. Please verify again and retry.", - localeLabel: "中" - } + "zh-CN": zhCN, + "en-US": enUS }; type I18nContextValue = { diff --git a/frontend/src/i18n/locales/en-US.json b/frontend/src/i18n/locales/en-US.json new file mode 100644 index 0000000..c91d43d --- /dev/null +++ b/frontend/src/i18n/locales/en-US.json @@ -0,0 +1,461 @@ +{ + "appName": "Moteva", + "heroTitle": "Moteva makes design simple", + "heroSubtitle": "A design agent that understands the brief and carries the work forward.", + "defaultPrompt": "Ask Moteva to make a high-converting e-commerce product visual.", + "promptPlaceholder": "Ask Moteva to explore your next design project...", + "continuePrompt": "Continue the website design. Start with the homepage hero, or give me a specific module direction.", + "followupPrompt": "Extend a new direction while keeping the brand tone consistent.", + "upgrade": "Upgrade", + "login": "Log in", + "account": "Account", + "freePlan": "Free", + "accountManagement": "Account", + "accountProfileHome": "Profile", + "accountSubscription": "Subscription", + "accountBilling": "Billing", + "accountInfo": "Account Info", + "changeAvatar": "Change Avatar", + "username": "Username", + "email": "Email", + "deviceManagement": "Device Management", + "removeAllDevices": "Remove All Devices", + "removeAllDevicesDescription": "A Moteva account is for personal use only. To prevent abuse and keep the platform stable, tasks can run in up to 2 desktop web sessions and 1 mobile web session at the same time. For team or multi-person use, please purchase Team Plan.", + "onlineStatus": "Online", + "deviceInfo": "Device Info", + "currentDevice": "Current Device", + "system": "System", + "currentLoginAccount": "Current account: {name}", + "accountDeviceDesktop": "Desktop", + "accountDeviceUnknownSystem": "Unknown system", + "accountDeviceUnknownBrowser": "Unknown browser", + "avatarImageRequired": "Please choose an image file.", + "avatarTooLarge": "Avatar image must be under 2 MB.", + "avatarUpdateFailed": "Failed to update avatar. Please choose the image again.", + "avatarUpdated": "Avatar updated.", + "usernameRequired": "Username cannot be empty.", + "usernameUpdated": "Username updated.", + "usernameUpdateFailed": "Failed to update username. Please try again later.", + "currentDeviceNotice": "This is the device you are using now.", + "devicesRemoved": "{count} device(s) removed.", + "removeAllDevicesConfirmTitle": "Remove all devices?", + "removeAllDevicesConfirmText": "After confirmation, your current session will be removed and you will need to log in again.", + "guides": "Guides", + "contactUs": "Contact us", + "logout": "Log out", + "credits": "{count} Credits", + "attachReference": "Attach reference", + "webReference": "Web reference", + "modelSelection": "Model selection", + "webEnabled": "Web reference on", + "modelsTitle": "Models", + "autoModel": "Auto", + "modelImageTab": "Image", + "modelVideoTab": "Video", + "model3dTab": "3D", + "modelComingSoon": "This version currently supports image models only.", + "referenceImages": "Reference images", + "removeReference": "Remove reference image", + "promptExamples": "Prompt examples", + "promptDirectiveWeb": "Start with web references and extract usable trends, competitor structures, and visual keywords.", + "promptDirectiveModel": "Selected model: {model}.", + "promptDirectiveReference": "Reference image {index} ({name}): {url}", + "promptDirectiveAnnotation": "Annotation {index}: canvas position x={x}, y={y}", + "annotationLabel": "Annotation {index}", + "startDesign": "Start design", + "recentProjects": "Recent Projects", + "viewAll": "View all", + "collapse": "Collapse", + "newProject": "New Project", + "continueEditing": "Continue", + "inspiration": "Inspiration", + "inspirationCategories": "Inspiration categories", + "loadMore": "Load more", + "close": "Close", + "reset": "Reset", + "usePrompt": "Use prompt", + "createFromInspiration": "Create from this", + "views": "views", + "likes": "likes", + "home": "Home", + "projects": "Projects", + "personalProjects": "Personal Projects", + "projectLibrarySubtitle": "Recent projects only shows three. Manage every personal canvas here.", + "editProjects": "Edit", + "doneEditing": "Done", + "selectedProjectsCount": "{count} selected", + "deleteSelected": "Delete", + "loadingProjects": "Loading projects...", + "loadMoreProjects": "Load more projects", + "projectsEmpty": "No projects yet. Create a canvas to start.", + "deleteProjectsTitle": "Delete selected projects?", + "deleteProjectsWarning": "This removes the selected projects, canvas content, history, and conversation records. This cannot be undone.", + "deleteProjectsDetails": "Image assets in these projects will be deleted from OSS asynchronously in the background and may take a moment to finish.", + "deleteProjectsConfirm": "Delete selected", + "members": "Members", + "info": "Info", + "settings": "Settings", + "create": "Create", + "loadingCanvas": "Opening canvas...", + "unsaved": "Unsaved", + "synced": "Synced", + "nodes": "nodes", + "promo": "Limited offer, 50% off · Image-2 from $0.004/image for image generation and editing", + "upgradeNow": "Upgrade now", + "backHome": "Back home", + "save": "Save", + "share": "Share", + "shareLinkCopied": "Share link copied", + "shareUnavailable": "Sharing is unavailable", + "download": "Download", + "generate": "Generate", + "more": "More", + "add": "Add", + "conversation": "Chat", + "newChat": "New chat", + "conversationHistory": "History", + "searchConversationPlaceholder": "Search conversations", + "deleteConversation": "Delete conversation", + "noConversationHistory": "No history yet", + "copyProject": "Copy project", + "canvasUntitled": "Untitled", + "renameCanvasTitle": "Rename canvas", + "renameImageNode": "Rename image", + "imageTitlePlaceholder": "Image name", + "projectTitlePlaceholder": "Name this canvas", + "select": "Select", + "pan": "Move", + "pin": "Pin", + "pen": "Pen", + "penColor": "Pen color", + "penWidth": "Pen width", + "grid": "Grid", + "smartArtboard": "Smart artboard", + "shapeTool": "Shapes", + "shapeRectangle": "Rectangle", + "shapeLine": "Line", + "shapeArrow": "Arrow", + "shapeEllipse": "Ellipse", + "shapePolygon": "Polygon", + "shapeStar": "Star", + "cornerRadius": "Corner radius", + "shapeVertices": "Vertices", + "shapeInnerRadius": "Inner radius", + "booleanOperation": "Boolean operation", + "booleanUnion": "Union", + "booleanSubtract": "Subtract", + "booleanIntersect": "Intersect", + "booleanExclude": "Exclude", + "booleanFlatten": "Flatten", + "fill": "Fill", + "stroke": "Stroke", + "textFill": "Text fill", + "textStroke": "Text stroke", + "textAlign": "Text align", + "textOptions": "Text options", + "searchFonts": "Search fonts", + "allFonts": "All fonts", + "fontFamily": "Font", + "fontWeight": "Weight", + "fontSize": "Size", + "lineHeight": "Line height", + "letterSpacing": "Letter spacing", + "autoLineHeight": "Auto line height", + "solidLine": "Solid", + "dashedLine": "Dashed", + "dottedLine": "Dotted", + "strokeWidth": "Width", + "layout": "Layout", + "auto": "Auto", + "manual": "Manual", + "customSize": "Custom", + "webPageSize": "Web", + "adaptiveSize": "Fit", + "widthShort": "W", + "heightShort": "H", + "lockAspectRatio": "Lock aspect ratio", + "unlockAspectRatio": "Unlock aspect ratio", + "zoomIn": "Zoom in", + "zoomOut": "Zoom out", + "zoomMenu": "Zoom", + "zoomShowAll": "Show all canvas elements", + "zoomTo": "Zoom to {percent}%", + "lockCanvas": "Lock canvas", + "minimap": "Minimap", + "canvasBackgroundColor": "Canvas background color", + "canvasCursor": "Canvas status", + "imageNode": "Image node", + "uploadImageNode": "Upload image node", + "imageUploadSuccess": "Image uploaded", + "uploadingImage": "Uploading", + "extractingText": "Extract text", + "textNode": "Text node", + "frameNode": "Frame", + "generateImage": "Generate image", + "addTextBox": "Add text box", + "imageGeneratorNode": "Image Generator", + "newImageNode": "Image direction", + "newFrameNode": "Website artboard", + "newPenStrokeNode": "Pen stroke", + "newTextNode": "Text note", + "newTextNodeContent": "Capture a design decision, revision, or next task.", + "layers": "Layers", + "layerHistory": "History", + "layerNoHistory": "No history yet", + "layerNoLayers": "No layers", + "generatedFiles": "Generated files", + "generatedFilesEmpty": "No generated files yet", + "generatedFilesEnd": "End", + "layerGroup": "Group", + "layerItemsCount": "{count} layers", + "mergedLayerTitle": "Merged layer", + "skillLine": "Combined skills · Visual search · Image design", + "synthesizeSkills": "Web searched", + "searchComplete": "Web search complete", + "searchingWeb": "Searching web", + "searchFailed": "Web search failed", + "agentSearchCard": "Searching {query} and extracting design references...", + "agentThinking": "Agent thinking", + "selected": "Selected", + "selectedImageSummary": "Image content is visible on canvas · {status}", + "addAsset": "Add asset", + "agentDesign": "Agent Design", + "agentShort": "Agent", + "agentDesignHint": "Use web search and image models to advance this canvas.", + "agentWebSearch": "Web research", + "agentWebSearchHint": "Search the web and summarize usable design evidence.", + "referenceLibrary": "Reference library", + "promptIdeas": "Prompt ideas", + "voiceInput": "Voice input", + "canvasPromptPlaceholder": "What are we creating today?", + "imageModelSpec": "Image · M · 1:1 · 1 img", + "unlockModels": "Upgrade to unlock the full model set and speed up creation.", + "uploadFile": "Upload file", + "chooseFromLibrary": "Choose from library", + "webSearch": "Web search", + "agentMode": "Agent mode", + "imageMode": "Image", + "referenceImage": "Reference", + "imageSettings": "Image settings", + "imageCountUnit": "{count} img", + "quality": "Quality", + "qualityAuto": "Auto", + "qualityHigh": "High", + "qualityMedium": "Medium", + "qualityLow": "Low", + "imageSizeLabel": "Size", + "imageModeDirective": "Image generation settings: quality {quality}, size {width}x{height}, ratio {ratio}, count {count}. Pure image mode: generate the image directly from the user's input without extra chat.", + "quickEdit": "Quick edit", + "quickEditTab": "Quick edit Tab", + "quickEditPlaceholder": "Describe the edit for this image", + "upscale": "Upscale", + "upscalePrompt": "Upscale this image to {scale} level with the model. Preserve composition and subject while improving detail, edges, and texture clarity.", + "removeBackground": "Remove background", + "removeBackgroundPrompt": "Remove the background in one step, preserve the full subject edge, and output a clean subject image.", + "eraserTool": "Eraser Tool", + "erase": "Erase", + "eraserBrush": "Brush", + "eraserBrushColor": "Brush color", + "eraserDrawHint": "Draw selection on the image, ", + "eraserSubtractHint": "erase, ", + "eraserExitHint": "exit", + "eraserPromptPlaceholder": "Describe how to change the brushed area", + "eraserDefaultPrompt": "Erase the brushed area and naturally repair the background while keeping unbrushed areas unchanged", + "editElements": "Edit elements", + "editElementsPrompt": "Remove embedded text from the base image, inpaint the background, run OCR, and rebuild editable text layers at the original positions.", + "editText": "Edit text", + "editTextPrompt": "Detect image text and replace only the targeted words. Remove the original text and rebuild new text at the same positions while keeping all other image elements unchanged.", + "editTextOcrPrompt": "First identify every visible text item in the image and return an editable text list with precise positions.", + "editTextOcrFailed": "Text recognition failed. Please try again.", + "editTextEmpty": "No editable text was detected.", + "removeTextLayer": "Remove this text", + "applyNow": "Apply now", + "multiAngle": "Multi-angle", + "multiAngleDefaultPrompt": "Generate one new angle from the subject or camera controls while preserving subject identity, materials, and design details.", + "multiAnglePromptPlaceholder": "Add angle, pose, or composition details", + "cameraTab": "Camera", + "subjectTab": "Subject", + "yaw": "Rotation", + "pitch": "Tilt", + "multiAngleRotate": "Rotation", + "multiAngleTilt": "Tilt", + "multiAngleZoom": "Zoom", + "multiAngleZoomClose": "Close", + "multiAngleZoomMedium": "Medium", + "multiAngleZoomFar": "Far", + "multiAngleUseNow": "Use now", + "multiAngleTiltUp": "Move camera up", + "multiAngleTiltDown": "Move camera down", + "multiAngleRotateLeft": "Move camera left", + "multiAngleRotateRight": "Move camera right", + "moveObject": "Move object", + "movePromptPlaceholder": "Describe where to move the object", + "moveDefaultPrompt": "Move the selected object and naturally fill the original area", + "moveRecognitionLoading": "Recognizing selection...", + "moveObjectSelected": "Object selected", + "moveObjectNone": "Select the object to move", + "moveObjectSelection": "Object and target position", + "moveObjectReselect": "Select object again", + "moveObjectHint": "Select and recognize the object first, then drag that box to the new position.", + "mockup": "Mockup", + "mockupPrompt": "Apply the print design to the selected real-object mockup, only on printable material surfaces such as clothing, bags, posters, screens, or product panels. If a person is wearing apparel, place the design on garment fabric only, never on skin, face, hair, arms, hands, or background. Keep the design clear with natural perspective, folds, light, and material blending.", + "mockupPreparing": "Preparing mockup...", + "mockupDropHint": "Drop an image here", + "mockupPrintTitle": "Mockup print", + "expandImage": "Expand", + "expandPrompt": "Naturally expand the image boundaries while preserving the subject and visual style.", + "adjustImage": "Adjust", + "adjustPrompt": "Apply the adjustment parameters to improve light, color, contrast, and detail; if no values are set, automatically improve the overall look while preserving subject and composition.", + "cropImage": "Crop", + "cropPrompt": "Recompose the image using the selected crop region and keep the important frame.", + "cropPresets": "Presets", + "cropPresetGeneral": "General", + "cropPresetFree": "Free", + "cropPresetSquare": "Square", + "cropPresetPortrait": "Portrait", + "cropPresetLandscape": "Landscape", + "cropPresetPost": "Post", + "cropPresetStory": "Story", + "cropPresetCover": "Cover", + "cropPresetVideo": "Video", + "cropPresetBanner": "Banner", + "cropPresetProfile": "Profile", + "vector": "Vector", + "vectorizeImage": "Vectorize", + "vectorPrompt": "Convert the image into a clean vector style while preserving subject silhouette, color blocks, and readable detail.", + "flipAndRotate": "Flip & Rotate", + "rotationAngle": "Rotation angle", + "rotate90": "Rotate 90°", + "customizeToolbar": "Customize Toolbar", + "customizeToolbarDesc": "Choose the tools shown in the edit bar", + "resetToolbar": "Reset to default", + "showToolNames": "Show tool names", + "expandScale": "Scale", + "expandPreset": "Preset", + "expandPresetGeneral": "General", + "expandOriginalRatio": "Original ratio", + "expandCustom": "Custom", + "expandSquare": "Square", + "expandPortrait": "Portrait", + "expandLandscape": "Landscape", + "adjustLight": "Light", + "adjustExposure": "Exposure", + "adjustHighlights": "Highlights", + "adjustShadows": "Shadows", + "adjustWhites": "Whites", + "adjustBlacks": "Blacks", + "adjustColor": "Color", + "adjustDetail": "Detail", + "adjustEffects": "Effects", + "adjustVibrance": "Vibrance", + "adjustTemperature": "Temperature", + "adjustTint": "Tint", + "adjustClarity": "Clarity", + "adjustGrain": "Grain", + "adjustVignette": "Vignette", + "adjustGlamour": "Glamour", + "adjustBloom": "Bloom", + "adjustAuto": "Auto", + "brightness": "Brightness", + "contrast": "Contrast", + "saturation": "Saturation", + "sharpness": "Sharpness", + "cropPromptPlaceholder": "Describe the cropped composition", + "apply": "Apply", + "cancel": "Cancel", + "clipboardCopied": "Copied to system clipboard", + "clipboardCopyFailed": "Could not write to system clipboard", + "contextCopy": "Copy", + "contextCut": "Cut", + "contextPaste": "Paste", + "contextDuplicate": "Duplicate", + "contextBringForward": "Bring forward", + "contextSendBackward": "Send backward", + "contextBringToFront": "Bring to front", + "contextSendToBack": "Send to back", + "contextSendToChat": "Send to chat", + "contextCreateGroup": "Create group", + "contextUngroup": "Ungroup", + "contextAutoLayout": "Auto layout", + "contextMergeLayers": "Merge layers", + "alignLeft": "Align left", + "alignCenter": "Align center", + "alignRight": "Align right", + "alignTop": "Align top", + "alignMiddle": "Align middle", + "alignBottom": "Align bottom", + "distributeHorizontal": "Distribute horizontal", + "distributeVertical": "Distribute vertical", + "gridLayout": "Grid layout", + "contextHide": "Show/hide", + "contextShow": "Show/hide", + "contextLock": "Lock/unlock", + "contextUnlock": "Lock/unlock", + "contextFlipHorizontal": "Flip horizontal", + "contextFlipVertical": "Flip vertical", + "contextExport": "Export", + "contextDelete": "Delete", + "deleteProjectTitle": "Delete this project?", + "deleteProjectWarning": "This removes the project, canvas content, history, and conversation records. This cannot be undone.", + "deleteProjectDetails": "Image assets will be deleted from OSS asynchronously in the background and may take a moment to finish.", + "deleteProjectCancel": "Cancel", + "deleteProjectConfirm": "Delete project", + "deletingProject": "Deleting", + "sendNodeToChatPrompt": "Continue designing from the image named “{title}”.", + "send": "Send", + "stopGeneration": "Stop generation", + "createError": "Failed to create project", + "saveError": "Failed to save", + "renameProjectError": "Failed to rename", + "generateError": "Failed to generate", + "generateTimeout": "Generation is still running. Refresh the canvas in a moment to see the result.", + "quickCommerce": "Commerce Poster", + "quickUi": "UI Screen", + "quickRetouch": "Product Retouch", + "quickStyle": "Style Transfer", + "unnamedCanvasProject": "Create an iterative infinite canvas project.", + "back": "Back", + "loginWelcome": "Welcome to Moteva", + "loginSubtitle": "Log in or sign up to continue", + "loginGoogle": "Continue with Google", + "loginEmailPlaceholder": "Email", + "turnstileVerifying": "Verifying...", + "turnstilePrivacy": "Privacy", + "turnstileHelp": "Help", + "turnstileRequired": "Please complete the security check first.", + "turnstileLoadFailed": "Security check failed to load. Please refresh and try again.", + "turnstileUnavailable": "Security check is not configured yet. Please try again later.", + "loginEmailContinue": "Continue with email", + "loginTerms": "By continuing, you agree to the Terms and Privacy Policy", + "loginCheckEmail": "Check your email to continue", + "loginCodeSent": "We sent a one-time code to your inbox:", + "loginCodeAria": "Email verification code", + "loginResend": "Resend", + "loginResendWait": "Resend in {seconds}s", + "loginRequestFailed": "Failed to send verification code", + "loginVerifyFailed": "Failed to verify code", + "loginCodeInvalid": "Verification code is incorrect.", + "loginCodeExpired": "Verification code has expired. Please resend it.", + "googleLoginUnavailable": "Google login is not configured", + "messages.common.unknown": "Something went wrong. Please try again later.", + "messages.network.unavailable": "Network connection failed. Please check your connection and try again.", + "messages.http.bad_request": "The request is invalid. Please check and try again.", + "messages.http.unauthorized": "Your session has expired. Please sign in again.", + "messages.http.forbidden": "You do not have permission to do that.", + "messages.http.not_found": "This content no longer exists or was removed.", + "messages.http.conflict": "This content changed elsewhere. Please refresh and try again.", + "messages.http.payload_too_large": "The file is too large. Please compress it and try again.", + "messages.http.timeout": "The request timed out. Please try again later.", + "messages.http.too_many_requests": "Too many attempts. Please try again later.", + "messages.http.server": "The service is temporarily unavailable. Please try again later.", + "messages.validation.prompt_required": "Enter what you want to create first.", + "messages.auth.login_required": "Please sign in to continue.", + "messages.auth.code_invalid": "Verification code is incorrect.", + "messages.auth.code_expired": "Verification code has expired. Please resend it.", + "messages.auth.invalid_credentials": "The account or credential is incorrect. Please check and try again.", + "messages.auth.invalid_region": "This sign-in method is not available right now.", + "messages.auth.provider_not_ready": "This sign-in service is not configured yet. Please try again later.", + "messages.auth.human_verification_required": "Please complete the security check first.", + "messages.auth.human_verification_failed": "Security check failed. Please verify again and retry.", + "localeLabel": "中" +} diff --git a/frontend/src/i18n/locales/zh-CN.json b/frontend/src/i18n/locales/zh-CN.json new file mode 100644 index 0000000..17cf5cb --- /dev/null +++ b/frontend/src/i18n/locales/zh-CN.json @@ -0,0 +1,461 @@ +{ + "appName": "Moteva", + "heroTitle": "Moteva 让设计变简单", + "heroSubtitle": "懂你的设计 Agent,帮你搞定一切设计需求", + "defaultPrompt": "让 Moteva 制作一张高转化的电商产品图", + "promptPlaceholder": "让 Moteva 帮你构思下一个设计项目...", + "continuePrompt": "继续官网设计,先从首页首屏视觉开始,或者给我特定页面模块。", + "followupPrompt": "继续扩展一个新方向,保持品牌调性。", + "upgrade": "Upgrade", + "login": "登录", + "account": "账户", + "freePlan": "Free", + "accountManagement": "账户管理", + "accountProfileHome": "个人主页", + "accountSubscription": "订阅", + "accountBilling": "账单", + "accountInfo": "账户信息", + "changeAvatar": "更换头像", + "username": "用户名", + "email": "电子邮箱", + "deviceManagement": "设备管理", + "removeAllDevices": "移除全部设备", + "removeAllDevicesDescription": "Moteva 账户仅限个人使用。为防止滥用并确保平台稳定,任务最多可同时在 2 个桌面 Web 会话和 1 个移动 Web 会话中运行。如需团队或多人使用,请购买 Team Plan。", + "onlineStatus": "在线状态", + "deviceInfo": "设备信息", + "currentDevice": "当前设备", + "system": "系统", + "currentLoginAccount": "当前登录账号:{name}", + "accountDeviceDesktop": "桌面端", + "accountDeviceUnknownSystem": "未知系统", + "accountDeviceUnknownBrowser": "未知浏览器", + "avatarImageRequired": "请选择图片文件。", + "avatarTooLarge": "头像图片不能超过 2MB。", + "avatarUpdateFailed": "头像更新失败,请重新选择图片。", + "avatarUpdated": "头像已更新。", + "usernameRequired": "用户名不能为空。", + "usernameUpdated": "用户名已更新。", + "usernameUpdateFailed": "用户名更新失败,请稍后重试。", + "currentDeviceNotice": "这是当前正在使用的设备。", + "devicesRemoved": "已移除 {count} 台设备。", + "removeAllDevicesConfirmTitle": "移除全部设备?", + "removeAllDevicesConfirmText": "确认后将移除当前登录状态,并需要重新登录。", + "guides": "使用指南", + "contactUs": "联系我们", + "logout": "退出登录", + "credits": "{count} Credits", + "attachReference": "添加参考图", + "webReference": "联网参考", + "modelSelection": "模型选择", + "webEnabled": "联网参考已开启", + "modelsTitle": "Models", + "autoModel": "Auto", + "modelImageTab": "Image", + "modelVideoTab": "Video", + "model3dTab": "3D", + "modelComingSoon": "当前版本仅支持图片模型", + "referenceImages": "参考图", + "removeReference": "移除参考图", + "promptExamples": "提示词示例", + "promptDirectiveWeb": "请先进行联网参考,提炼可用趋势、竞品结构和视觉关键词。", + "promptDirectiveModel": "模型选择:{model}。", + "promptDirectiveReference": "参考图 {index}({name}):{url}", + "promptDirectiveAnnotation": "标注 {index}:画布坐标 x={x}, y={y}", + "annotationLabel": "标注 {index}", + "startDesign": "开始设计", + "recentProjects": "最近项目", + "viewAll": "查看全部", + "collapse": "收起", + "newProject": "新建项目", + "continueEditing": "继续编辑", + "inspiration": "灵感发现", + "inspirationCategories": "灵感分类", + "loadMore": "查看更多", + "close": "关闭", + "reset": "重置", + "usePrompt": "使用提示词", + "createFromInspiration": "用它新建项目", + "views": "浏览", + "likes": "喜欢", + "home": "首页", + "projects": "项目", + "personalProjects": "个人项目", + "projectLibrarySubtitle": "最近项目只保留 3 个,这里管理全部个人画布。", + "editProjects": "编辑", + "doneEditing": "完成", + "selectedProjectsCount": "已选择 {count} 项", + "deleteSelected": "删除", + "loadingProjects": "正在加载项目...", + "loadMoreProjects": "加载更多项目", + "projectsEmpty": "暂无项目,先新建一个画布。", + "deleteProjectsTitle": "确认批量删除项目?", + "deleteProjectsWarning": "删除后将移除所选项目、画布内容、历史记录和对话记录,无法恢复。", + "deleteProjectsDetails": "所选项目里的图片资产会在后台异步从 OSS 删除,可能需要一点时间完成。", + "deleteProjectsConfirm": "确认删除", + "members": "成员", + "info": "信息", + "settings": "设置", + "create": "新建", + "loadingCanvas": "正在打开画布...", + "unsaved": "未保存", + "synced": "已同步", + "nodes": "nodes", + "promo": "限时优惠,立享5折 · Image-2 低至 $0.004/张,专注图片生成与编辑", + "upgradeNow": "立即升级", + "backHome": "返回首页", + "save": "保存", + "share": "分享", + "shareLinkCopied": "分享链接已复制", + "shareUnavailable": "暂时无法分享", + "download": "下载", + "generate": "生成", + "more": "更多", + "add": "添加", + "conversation": "对话", + "newChat": "新对话", + "conversationHistory": "历史对话", + "searchConversationPlaceholder": "请输入搜索关键词", + "deleteConversation": "删除对话", + "noConversationHistory": "暂无历史对话", + "copyProject": "复制项目", + "canvasUntitled": "Untitled", + "renameCanvasTitle": "重命名画布", + "renameImageNode": "重命名图片", + "imageTitlePlaceholder": "输入图片名称", + "projectTitlePlaceholder": "输入画布名称", + "select": "选择", + "pan": "移动", + "pin": "定位", + "pen": "画笔", + "penColor": "画笔颜色", + "penWidth": "画笔粗细", + "grid": "网格", + "smartArtboard": "智能画板", + "shapeTool": "形状", + "shapeRectangle": "矩形", + "shapeLine": "线条", + "shapeArrow": "箭头", + "shapeEllipse": "圆", + "shapePolygon": "多边形", + "shapeStar": "星形", + "cornerRadius": "圆角", + "shapeVertices": "边数", + "shapeInnerRadius": "内径", + "booleanOperation": "布尔运算", + "booleanUnion": "合并", + "booleanSubtract": "减去", + "booleanIntersect": "相交", + "booleanExclude": "排除", + "booleanFlatten": "扁平化", + "fill": "填充", + "stroke": "描边", + "textFill": "文字填充", + "textStroke": "文字描边", + "textAlign": "文字对齐", + "textOptions": "文字设置", + "searchFonts": "搜索字体", + "allFonts": "全部字体", + "fontFamily": "字体", + "fontWeight": "字重", + "fontSize": "字号", + "lineHeight": "行高", + "letterSpacing": "字距", + "autoLineHeight": "自动行高", + "solidLine": "实线", + "dashedLine": "虚线", + "dottedLine": "点线", + "strokeWidth": "线宽", + "layout": "布局", + "auto": "自动", + "manual": "手动", + "customSize": "自定义", + "webPageSize": "网页", + "adaptiveSize": "适应", + "widthShort": "W", + "heightShort": "H", + "lockAspectRatio": "锁定宽高比", + "unlockAspectRatio": "取消锁定宽高比", + "zoomIn": "放大", + "zoomOut": "缩小", + "zoomMenu": "缩放", + "zoomShowAll": "显示画布所有元素", + "zoomTo": "缩放至{percent}%", + "lockCanvas": "锁定画布", + "minimap": "小地图", + "canvasBackgroundColor": "画布背景色", + "canvasCursor": "画布状态", + "imageNode": "图片节点", + "uploadImageNode": "上传图片节点", + "imageUploadSuccess": "图片上传成功", + "uploadingImage": "上传中", + "extractingText": "提取文字", + "textNode": "文本节点", + "frameNode": "画框", + "generateImage": "生成图片", + "addTextBox": "添加文本框", + "imageGeneratorNode": "图像生成器", + "newImageNode": "图片方案", + "newFrameNode": "官网画板", + "newPenStrokeNode": "画笔笔迹", + "newTextNode": "文本便签", + "newTextNodeContent": "记录一个设计判断、修改点或下一步任务。", + "layers": "图层", + "layerHistory": "历史记录", + "layerNoHistory": "暂无历史记录", + "layerNoLayers": "暂无图层", + "generatedFiles": "已生成文件列表", + "generatedFilesEmpty": "暂无已生成文件", + "generatedFilesEnd": "到底了", + "layerGroup": "编组", + "layerItemsCount": "{count} 个图层", + "mergedLayerTitle": "合并图层", + "skillLine": "综合技能 · 视觉搜索 · 图片设计", + "synthesizeSkills": "联网搜索", + "searchComplete": "联网搜索完成", + "searchingWeb": "正在联网搜索", + "searchFailed": "联网搜索失败", + "agentSearchCard": "搜索 {query},提炼可执行的设计参考...", + "agentThinking": "Agent 正在思考", + "selected": "当前选中", + "selectedImageSummary": "图片内容已在画布中显示 · {status}", + "addAsset": "添加资产", + "agentDesign": "Agent 设计", + "agentShort": "Agent", + "agentDesignHint": "使用联网搜索和图片模型推进当前画布", + "agentWebSearch": "联网研究", + "agentWebSearchHint": "搜索网页信息并整理可用设计依据", + "referenceLibrary": "参考库", + "promptIdeas": "提示建议", + "voiceInput": "语音输入", + "canvasPromptPlaceholder": "今天我们要创作什么", + "imageModelSpec": "图像 · 中 · 1:1 · 1 img", + "unlockModels": "升级会员解锁全量模型,让创作提速!", + "uploadFile": "上传文件", + "chooseFromLibrary": "从素材库选择", + "webSearch": "联网搜索", + "agentMode": "Agent 模式", + "imageMode": "图像", + "referenceImage": "参考图", + "imageSettings": "图片参数", + "imageCountUnit": "{count} 张", + "quality": "质量", + "qualityAuto": "自动", + "qualityHigh": "高", + "qualityMedium": "中", + "qualityLow": "低", + "imageSizeLabel": "尺寸", + "imageModeDirective": "图片生成参数:质量 {quality},尺寸 {width}x{height},比例 {ratio},数量 {count} 张。纯生图模式,请直接围绕用户输入生成图片,不展开额外聊天。", + "quickEdit": "快捷编辑", + "quickEditTab": "快捷编辑Tab", + "quickEditPlaceholder": "输入这张图的局部或整体修改要求", + "upscale": "放大", + "upscalePrompt": "请将这张图通过模型放大到 {scale} 级别,保持构图和主体不变,提升细节、边缘和纹理清晰度。", + "removeBackground": "去背景", + "removeBackgroundPrompt": "一键移除背景,保留主体完整边缘,输出干净主体图。", + "eraserTool": "橡皮工具", + "erase": "擦除", + "eraserBrush": "画笔", + "eraserBrushColor": "笔刷颜色", + "eraserDrawHint": "在图片上绘制选区,", + "eraserSubtractHint": "擦除,", + "eraserExitHint": "退出", + "eraserPromptPlaceholder": "描述涂抹区域要如何修改", + "eraserDefaultPrompt": "擦除涂抹区域并自然修补背景,保持未涂抹区域不变", + "editElements": "编辑元素", + "editElementsPrompt": "移除底图里的文字并自然补全背景,用 OCR 识别文字内容和原始位置后创建可编辑文字层。", + "editText": "编辑文字", + "editTextPrompt": "识别图片中的文字,按用户修改定向替换文字;只擦除原文字并在原位置重建新文字,保证图片其他元素完全不变。", + "editTextOcrPrompt": "先识别图片中所有可见文字,返回可编辑文字列表和精确位置。", + "editTextOcrFailed": "文字识别失败,请稍后重试。", + "editTextEmpty": "未识别到可编辑文字。", + "removeTextLayer": "删除这段文字", + "applyNow": "立即使用", + "multiAngle": "多角度", + "multiAngleDefaultPrompt": "根据多角度面板里的主体或摄像头角度参数生成单张新视角图,保持主体身份、材质和设计细节一致。", + "multiAnglePromptPlaceholder": "补充视角、姿态或构图要求", + "cameraTab": "摄像头", + "subjectTab": "主体", + "yaw": "旋转", + "pitch": "倾斜", + "multiAngleRotate": "旋转", + "multiAngleTilt": "倾斜", + "multiAngleZoom": "缩放", + "multiAngleZoomClose": "近景", + "multiAngleZoomMedium": "中等", + "multiAngleZoomFar": "远景", + "multiAngleUseNow": "立即使用", + "multiAngleTiltUp": "上移摄像头", + "multiAngleTiltDown": "下移摄像头", + "multiAngleRotateLeft": "左移摄像头", + "multiAngleRotateRight": "右移摄像头", + "moveObject": "移动对象", + "movePromptPlaceholder": "描述对象要移动到哪里", + "moveDefaultPrompt": "移动选中对象并自然补全原区域", + "moveRecognitionLoading": "正在识别选中对象...", + "moveObjectSelected": "已选中对象", + "moveObjectNone": "框选要移动的对象", + "moveObjectSelection": "对象和目标位置", + "moveObjectReselect": "重新框选对象", + "moveObjectHint": "先框选并识别对象,再拖动该框到新位置。", + "mockup": "Mockup", + "mockupPrompt": "将影印图案应用到选中的真实物体 mockup 上,只放在衣物、包袋、海报、屏幕等可印刷材质表面;如果是人物穿着服饰,图案必须贴在衣物布料上,不要贴到皮肤、脸、头发、手臂或背景上。保持图案清晰,并让透视、褶皱、光线和材质自然融合。", + "mockupPreparing": "Mockup 生成中...", + "mockupDropHint": "将图片拖放到这里", + "mockupPrintTitle": "Mockup 贴图", + "expandImage": "扩展", + "expandPrompt": "围绕原图自然扩展画面边界,保持主体和视觉风格一致。", + "adjustImage": "调整", + "adjustPrompt": "根据调整参数优化图片光线、色彩、对比度和细节;如果没有指定数值,则自动优化整体观感,同时保持主体与构图不变。", + "cropImage": "裁剪", + "cropPrompt": "按用户选择的裁剪区域重构图片构图,只保留关键画面。", + "cropPresets": "预设", + "cropPresetGeneral": "通用", + "cropPresetFree": "自由", + "cropPresetSquare": "正方形", + "cropPresetPortrait": "竖版", + "cropPresetLandscape": "横版", + "cropPresetPost": "帖子", + "cropPresetStory": "故事", + "cropPresetCover": "封面", + "cropPresetVideo": "视频", + "cropPresetBanner": "横幅", + "cropPresetProfile": "头像", + "vector": "矢量", + "vectorizeImage": "矢量化", + "vectorPrompt": "将图片转换为清晰的矢量风格,保留主体轮廓、色块关系和可读细节。", + "flipAndRotate": "翻转与旋转", + "rotationAngle": "旋转角度", + "rotate90": "旋转 90°", + "customizeToolbar": "自定义工具栏", + "customizeToolbarDesc": "选择编辑栏中显示的工具", + "resetToolbar": "恢复默认", + "showToolNames": "显示工具名称", + "expandScale": "缩放比例", + "expandPreset": "预设", + "expandPresetGeneral": "通用", + "expandOriginalRatio": "原始比例", + "expandCustom": "自定义", + "expandSquare": "正方形", + "expandPortrait": "竖版", + "expandLandscape": "横版", + "adjustLight": "光线", + "adjustExposure": "曝光", + "adjustHighlights": "高光", + "adjustShadows": "阴影", + "adjustWhites": "白色", + "adjustBlacks": "黑色", + "adjustColor": "颜色", + "adjustDetail": "细节", + "adjustEffects": "效果", + "adjustVibrance": "自然饱和度", + "adjustTemperature": "色温", + "adjustTint": "色调", + "adjustClarity": "清晰度", + "adjustGrain": "颗粒", + "adjustVignette": "晕影", + "adjustGlamour": "柔光", + "adjustBloom": "辉光", + "adjustAuto": "自动", + "brightness": "亮度", + "contrast": "对比度", + "saturation": "饱和度", + "sharpness": "锐化", + "cropPromptPlaceholder": "描述裁剪后的构图用途", + "apply": "应用", + "cancel": "取消", + "clipboardCopied": "已复制到系统剪贴板", + "clipboardCopyFailed": "无法写入系统剪贴板", + "contextCopy": "复制", + "contextCut": "剪切", + "contextPaste": "粘贴", + "contextDuplicate": "创建副本", + "contextBringForward": "上移一层", + "contextSendBackward": "下移一层", + "contextBringToFront": "移动至顶层", + "contextSendToBack": "移动至底层", + "contextSendToChat": "发送至对话", + "contextCreateGroup": "创建编组", + "contextUngroup": "解除编组", + "contextAutoLayout": "自动布局", + "contextMergeLayers": "合并图层", + "alignLeft": "左对齐", + "alignCenter": "水平居中", + "alignRight": "右对齐", + "alignTop": "顶部对齐", + "alignMiddle": "垂直居中", + "alignBottom": "底部对齐", + "distributeHorizontal": "水平分布", + "distributeVertical": "垂直分布", + "gridLayout": "网格布局", + "contextHide": "显示/隐藏", + "contextShow": "显示/隐藏", + "contextLock": "锁定/解锁", + "contextUnlock": "锁定/解锁", + "contextFlipHorizontal": "水平翻转", + "contextFlipVertical": "垂直翻转", + "contextExport": "导出", + "contextDelete": "删除", + "deleteProjectTitle": "确认删除项目?", + "deleteProjectWarning": "删除后将移除项目、画布内容、历史记录和对话记录,无法恢复。", + "deleteProjectDetails": "项目里的图片资产会在后台异步从 OSS 删除,可能需要一点时间完成。", + "deleteProjectCancel": "取消", + "deleteProjectConfirm": "确认删除", + "deletingProject": "删除中", + "sendNodeToChatPrompt": "继续基于「{title}」这张图做下一步设计。", + "send": "发送", + "stopGeneration": "停止生成", + "createError": "创建项目失败", + "saveError": "保存失败", + "renameProjectError": "重命名失败", + "generateError": "生成失败", + "generateTimeout": "生成仍在继续,请稍后刷新画布查看结果", + "quickCommerce": "电商海报", + "quickUi": "UI 界面", + "quickRetouch": "产品精修", + "quickStyle": "风格迁移", + "unnamedCanvasProject": "新建一个可继续迭代的无限画布项目。", + "back": "返回", + "loginWelcome": "欢迎来到 Moteva", + "loginSubtitle": "登录或注册以继续", + "loginGoogle": "使用 Google", + "loginEmailPlaceholder": "电子邮箱", + "turnstileVerifying": "正在验证...", + "turnstilePrivacy": "隐私", + "turnstileHelp": "帮助", + "turnstileRequired": "请先完成人机验证。", + "turnstileLoadFailed": "人机验证加载失败,请刷新后重试。", + "turnstileUnavailable": "人机验证暂未配置,请稍后重试。", + "loginEmailContinue": "使用邮箱继续", + "loginTerms": "继续即表示您同意使用条款和隐私政策", + "loginCheckEmail": "查看您的邮箱以继续", + "loginCodeSent": "我们已向您的邮箱发送了一次性验证码,请查看您的收件箱:", + "loginCodeAria": "邮箱验证码", + "loginResend": "重新发送", + "loginResendWait": "{seconds}秒后可重新发送", + "loginRequestFailed": "验证码发送失败", + "loginVerifyFailed": "验证码验证失败", + "loginCodeInvalid": "验证码错误。", + "loginCodeExpired": "验证码已过期,请重新发送。", + "googleLoginUnavailable": "Google 登录暂未配置", + "messages.common.unknown": "出了点问题,请稍后重试。", + "messages.network.unavailable": "网络连接异常,请检查网络后重试。", + "messages.http.bad_request": "请求内容有误,请检查后重试。", + "messages.http.unauthorized": "登录状态已失效,请重新登录。", + "messages.http.forbidden": "当前账号没有权限执行此操作。", + "messages.http.not_found": "内容不存在或已被删除。", + "messages.http.conflict": "内容已发生变化,请刷新后重试。", + "messages.http.payload_too_large": "文件过大,请压缩后再上传。", + "messages.http.timeout": "请求超时,请稍后重试。", + "messages.http.too_many_requests": "操作太频繁,请稍后再试。", + "messages.http.server": "服务暂时不可用,请稍后重试。", + "messages.validation.prompt_required": "请先输入你想创建的内容。", + "messages.auth.login_required": "请先登录后继续。", + "messages.auth.code_invalid": "验证码错误。", + "messages.auth.code_expired": "验证码已过期,请重新发送。", + "messages.auth.invalid_credentials": "账号或凭证不正确,请检查后重试。", + "messages.auth.invalid_region": "当前登录方式暂不可用。", + "messages.auth.provider_not_ready": "当前登录服务暂未配置,请稍后重试。", + "messages.auth.human_verification_required": "请先完成人机验证。", + "messages.auth.human_verification_failed": "人机验证失败,请重新验证后再试。", + "localeLabel": "EN" +}