diff --git a/.vscode/i18n-ally-custom-framework.yml b/.vscode/i18n-ally-custom-framework.yml index b1e27b4957d..5582ce8dc19 100644 --- a/.vscode/i18n-ally-custom-framework.yml +++ b/.vscode/i18n-ally-custom-framework.yml @@ -21,6 +21,8 @@ usageMatchRegex: - "[^\\w\\d]appT\\(['\"`]({key})['\"`]" # 支持 datasetT("your.i18n.keys") - "[^\\w\\d]datasetT\\(['\"`]({key})['\"`]" + - "[^\\w\\d]fileT\\(['\"`]({key})['\"`]" + - "[^\\w\\d]publishT\\(['\"`]({key})['\"`]" # A RegEx to set a custom scope range. This scope will be used as a prefix when detecting keys # and works like how the i18next framework identifies the namespace scope from the diff --git a/packages/global/common/file/constants.ts b/packages/global/common/file/constants.ts index 74e0549a059..d65d14fd842 100644 --- a/packages/global/common/file/constants.ts +++ b/packages/global/common/file/constants.ts @@ -4,7 +4,7 @@ export enum BucketNameEnum { } export const bucketNameMap = { [BucketNameEnum.dataset]: { - label: 'common.file.bucket.dataset' + label: 'file.bucket.dataset' } }; diff --git a/packages/global/common/file/image/constants.ts b/packages/global/common/file/image/constants.ts index 5e9ea12a27b..b19562eeaf2 100644 --- a/packages/global/common/file/image/constants.ts +++ b/packages/global/common/file/image/constants.ts @@ -13,36 +13,36 @@ export enum MongoImageTypeEnum { } export const mongoImageTypeMap = { [MongoImageTypeEnum.systemAvatar]: { - label: 'common.file.type.appAvatar', + label: 'appAvatar', unique: true }, [MongoImageTypeEnum.appAvatar]: { - label: 'common.file.type.appAvatar', + label: 'appAvatar', unique: true }, [MongoImageTypeEnum.pluginAvatar]: { - label: 'common.file.type.pluginAvatar', + label: 'pluginAvatar', unique: true }, [MongoImageTypeEnum.datasetAvatar]: { - label: 'common.file.type.datasetAvatar', + label: 'datasetAvatar', unique: true }, [MongoImageTypeEnum.userAvatar]: { - label: 'common.file.type.userAvatar', + label: 'userAvatar', unique: true }, [MongoImageTypeEnum.teamAvatar]: { - label: 'common.file.type.teamAvatar', + label: 'teamAvatar', unique: true }, [MongoImageTypeEnum.chatImage]: { - label: 'common.file.type.chatImage', + label: 'chatImage', unique: false }, [MongoImageTypeEnum.collectionImage]: { - label: 'common.file.type.collectionImage', + label: 'collectionImage', unique: false } }; diff --git a/projects/app/i18n/en/common.json b/projects/app/i18n/en/common.json index 8c520095bd3..5955c51e96f 100644 --- a/projects/app/i18n/en/common.json +++ b/projects/app/i18n/en/common.json @@ -1,944 +1,906 @@ { - "App": "应用", - "Export": "导出", - "Folder": "文件夹", - "Move": "移动", - "Running": "运行中", - "Action": "操作", - "Add": "添加", - "Add New": "新增", - "All": "全部", - "Back": "返回", - "Beta": "实验版", - "Business edition features": "这是商业版功能~", - "Cancel": "取消", - "Choose": "选择", - "Close": "关闭", - "Collect": "收藏", - "Config": "配置", - "Confirm": "确认", - "Confirm Create": "确认创建", - "Confirm Import": "确认导入", - "Confirm Move": "移动到这", - "Confirm Update": "确认更新", - "Confirm to leave the page": "确认离开该页面?", - "Copy": "复制", - "Copy Successful": "复制成功", - "Course": "", - "Create Failed": "创建异常", - "Create New": "新建", - "Create Success": "创建成功", - "Create Time": "创建时间", - "Creating": "创建中", - "Custom Title": "自定义标题", - "Delete": "删除", - "Delete Failed": "删除失败", - "Delete Success": "删除成功", - "Delete Tip": "删除提示", - "Delete Warning": "删除警告", - "Detail": "详情", - "Done": "完成", - "Edit": "编辑", - "Exit": "退出", - "Expired Time": "过期时间", - "Field": "字段", - "File": "文件", - "Filed is repeat": "", - "Filed is repeated": "字段重复了", - "Finish": "完成", - "Import": "导入", - "Import failed": "导入失败", - "Import success": "导入成功", - "Input": "输入", - "Intro": "介绍", - "Invalid Json": "无效的JSON格式,请注意检查。", - "Last Step": "上一步", - "Last use time": "最后使用时间", - "Load Failed": "加载失败", - "Loading": "加载中...", - "More settings": "更多设置", - "MultipleRowSelect": { - "No data": "没有可选值" - }, - "Name": "名称", - "Name Can": "名称不能为空", - "Name is empty": "名称不能为空", - "New Create": "新建", - "Next Step": "下一步", - "No more data": "没有更多了~", - "Not open": "未开启", - "Number of words": "{{amount}}字", - "OK": "好的", - "Open": "打开", - "Opened": "已开启", - "Other": "其他", - "Output": "输出", - "Params": "参数", - "Password inconsistency": "两次密码不一致", - "Please Input Name": "请输入名称", - "Price used": "金额消耗", - "Read document": "查看文档", - "Read intro": "查看说明", - "Readed": "已读", - "Remove": "移除", - "Rename": "重命名", - "Rename Failed": "重命名失败", - "Rename Success": "重命名成功", - "Request Error": "请求异常", - "Require Input": "必填", - "Root folder": "根目录", - "Save": "保存", - "Save Failed": "保存失败", - "Save Success": "保存成功", - "Search": "搜索", - "Select File Failed": "选择文件异常", - "Select One Folder": "选择一个目录", - "Select template": "选择模板", - "Set Avatar": "点击设置头像", - "Set Name": "取个名字", - "Set Team Tags": "团队标签", - "Setting": "设置", - "Status": "状态", - "Submit failed": "提交失败", - "Submit success": "提交成功", - "Sync success": "同步成功", - "System Output": "系统输出", - "System version": "系统版本", - "Team": "团队", - "Team Tags Set": "标签", - "Test": "测试", - "Time": "时间", - "Un used": "未使用", - "UnKnow": "未知", - "UnKnow Source": "未知来源", - "Unlimited": "无限制", - "Update": "更新", - "Update Failed": "更新异常", - "Update Success": "更新成功", - "Update Successful": "更新成功", - "Update Time": "更新时间", - "Update success": "更新成功", - "Upload File Failed": "上传文件失败", - "Username": "用户名", - "Waiting": "等待中", - "Warning": "警告", - "Website": "网站", - "avatar": { - "Select Avatar": "点击选择头像", - "Select Failed": "选择头像异常" - }, - "change": "变更", - "choosable": "可选", - "confirm": { - "Common Tip": "操作确认" - }, - "course": { - "Read Course": "查看教程" - }, - "empty": { - "Common Tip": "没有什么数据噢~" - }, - "error": { - "Select avatar failed": "头像选择异常", - "Update error": "更新失败", - "unKnow": "出现了点意外~", - "fileNotFound": "文件找不到了~", - "team": { - "overSize": "团队成员超出上限" - } - }, - "file": { - "Empty file tip": "文件内容为空,可能该文件无法读取或为纯图片文件内容。", - "File Content": "文件内容", - "File Name": "文件名", - "File Size": "文件大小", - "File content can not be empty": "文件内容不能为空", - "Filename Can not Be Empty": "文件名不能为空", - "Read File Error": "解析文件失败", - "Select and drag file tip": "点击或拖动文件到此处上传", - "Select failed": "选择文件异常", - "Select file amount limit": "最多选择 {{max}} 个文件", - "Select file amount limit 100": "每次最多选择100个文件", - "Some file count exceeds limit": "超出{{maxCount}}个文件,已自动截取", - "Some file size exceeds limit": "部分文件超出: {{maxSize}},已被过滤", - "Support file type": "支持 {{fileType}} 类型文件", - "Support max count": "最多支持 {{maxCount}} 个文件。", - "Support max size": "单个文件最大 {{maxSize}}。", - "Upload failed": "上传异常", - "Click to download file template": "点击下载模板:{{name}}", - "Click to view file": "点击查看原始文件", - "Create File": "创建新文件", - "Create file": "创建文件", - "Drag and drop": "拖拽文件至此", - "Fetch Url": "链接读取", - "If the imported file is garbled, please convert CSV to UTF-8 encoding format": "如果导入文件乱码,请将 CSV 转成 UTF-8 编码格式", - "Parse": "{{name}} 解析中...", - "Release the mouse to upload the file": "松开鼠标上传文件", - "Select a maximum of 10 files": "最多选择10个文件", - "Uploading": "正在上传 {{name}},进度: {{percent}}%", - "max 10": "最多选择 10 个文件", - "select a document": "选择文件", - "support": "支持 {{fileExtension}} 文件", - "upload error description": "单次只支持上传多个文件或者一个文件夹" - }, - "folder": { - "Drag Tip": "点我可拖动", - "Move Success": "移动成功", - "No Folder": "没有子目录了,就放这里吧", - "Root Path": "根目录", - "empty": "这个目录已经没东西可选了~" - }, - "input": { - "Repeat Value": "有重复的值" - }, - "jsonEditor": { - "Parse error": "Json可能有误,请仔细检查" - }, - "link": { - "UnValid": "无效的链接" - }, - "month": "月", - "price": { - "Amount": "{{amount}}{{unit}}" - }, - "speech": { - "error tip": "语音转文字失败", - "not support": "您的浏览器不支持语音输入" - }, - "system": { - "Commercial version function": "商业版特有功能", - "Help Chatbot": "机器人助手", - "Use Helper": "使用帮助", - "Help Document": "帮助文档" - }, - "time": { - "Just now": "刚刚", - "The day before yesterday": "前天", - "Yesterday": "昨天" - }, - "ui": { - "textarea": { - "Magnifying": "放大" + "App": "App", + "Export": "Export", + "Folder": "Folder", + "Move": "Move", + "Name": "Name", + "Rename": "Rename", + "Running": "Running", + "UnKnow": "Unknown", + "Warning": "Warning", + "New Create": "Create New", + + "common": { + "Action": "Action", + "Add": "Add", + "Add New": "Add New", + "All": "All", + "Back": "Back", + "Beta": "Beta", + "Business edition features": "This is a business edition feature~", + "Cancel": "Cancel", + "Choose": "Choose", + "Close": "Close", + "Collect": "Collect", + "Config": "Config", + "Confirm": "Confirm", + "Confirm Create": "Confirm Create", + "Confirm Import": "Confirm Import", + "Confirm Move": "Move Here", + "Confirm Update": "Confirm Update", + "Confirm to leave the page": "Confirm to leave the page?", + "Copy": "Copy", + "Copy Successful": "Copy Successful", + "Course": "", + "Create Failed": "Create Failed", + "Create New": "Create New", + "Create Success": "Create Success", + "Create Time": "Create Time", + "Creating": "Creating", + "Custom Title": "Custom Title", + "Delete": "Delete", + "Delete Failed": "Delete Failed", + "Delete Success": "Delete Success", + "Delete Tip": "Delete Tip", + "Delete Warning": "Delete Warning", + "Detail": "Detail", + "Done": "Done", + "Edit": "Edit", + "Exit": "Exit", + "Expired Time": "Expired Time", + "Field": "Field", + "File": "File", + "Filed is repeat": "", + "Filed is repeated": "Field is repeated", + "Finish": "Finish", + "Import": "Import", + "Import failed": "Import failed", + "Import success": "Import success", + "Input": "Input", + "Intro": "Intro", + "Invalid Json": "Invalid JSON format, please check.", + "Last Step": "Last Step", + "Last use time": "Last use time", + "Load Failed": "Load Failed", + "Loading": "Loading...", + "More settings": "More settings", + "MultipleRowSelect": { + "No data": "No data available" + }, + "Name": "Name", + "Name Can": "Name cannot be empty", + "Name is empty": "Name cannot be empty", + "Next Step": "Next Step", + "No more data": "No more data~", + "Not open": "Not open", + "Number of words": "{{amount}} words", + "OK": "OK", + "Open": "Open", + "Opened": "Opened", + "Other": "Other", + "Output": "Output", + "Params": "Params", + "Password inconsistency": "Passwords do not match", + "Please Input Name": "Please enter a name", + "Price used": "Price used", + "Read document": "Read document", + "Read intro": "Read intro", + "Readed": "Read", + "Remove": "Remove", + "Rename": "Rename", + "Rename Failed": "Rename Failed", + "Rename Success": "Rename Success", + "Request Error": "Request Error", + "Require Input": "Required Input", + "Root folder": "Root folder", + "Save": "Save", + "Save Failed": "Save Failed", + "Save Success": "Save Success", + "Search": "Search", + "Select File Failed": "Select File Failed", + "Select One Folder": "Select a folder", + "Select template": "Select template", + "Set Avatar": "Click to set avatar", + "Set Name": "Set a name", + "Set Team Tags": "Set team tags", + "Setting": "Setting", + "Status": "Status", + "Submit failed": "Submit failed", + "Submit success": "Submit success", + "Sync success": "Sync success", + "System Output": "System Output", + "System version": "System version", + "Team": "Team", + "Team Tags Set": "Tags", + "Test": "Test", + "Time": "Time", + "Un used": "Unused", + "UnKnow": "Unknown", + "UnKnow Source": "Unknown Source", + "Unlimited": "Unlimited", + "Update": "Update", + "Update Failed": "Update Failed", + "Update Success": "Update Success", + "Update Successful": "Update Successful", + "Update Time": "Update Time", + "Update success": "Update success", + "Upload File Failed": "Upload File Failed", + "Username": "Username", + "Waiting": "Waiting", + "Warning": "Warning", + "Website": "Website", + "avatar": { + "Select Avatar": "Click to select avatar", + "Select Failed": "Select avatar failed" + }, + "change": "Change", + "choosable": "Choosable", + "confirm": { + "Common Tip": "Operation confirmation" + }, + "course": { + "Read Course": "Read course" + }, + "empty": { + "Common Tip": "No data~" + }, + "error": { + "Select avatar failed": "Avatar selection failed", + "Update error": "Update failed", + "unKnow": "An unexpected error occurred~" + }, + "folder": { + "Drag Tip": "Drag me", + "Move Success": "Move successful", + "No Folder": "No subdirectories, place here", + "Root Path": "Root directory", + "empty": "This directory has nothing selectable~" + }, + "input": { + "Repeat Value": "Duplicate value" + }, + "jsonEditor": { + "Parse error": "JSON may be incorrect, please check carefully" + }, + "link": { + "UnValid": "Invalid link" + }, + "month": "Month", + "price": { + "Amount": "{{amount}}{{unit}}" + }, + "speech": { + "error tip": "Speech to text failed", + "not support": "Your browser does not support speech input" + }, + "system": { + "Commercial version function": "Commercial version feature", + "Help Chatbot": "Chatbot assistant", + "Use Helper": "Use helper" + }, + "time": { + "Just now": "Just now", + "The day before yesterday": "The day before yesterday", + "Yesterday": "Yesterday" + }, + "ui": { + "textarea": { + "Magnifying": "Magnify" + } } }, "core": { - "Chat": "对话", - "Chat test": "测试", - "Max Token": "单条数据上限", - "Start chat": "立即对话", - "Total chars": "总字数: {{total}}", - "Total tokens": "总 Tokens: {{total}}", + "Chat": "Chat", + "Chat test": "Test", + "Max Token": "Max token per data", + "Start chat": "Start chat", + "Total chars": "Total characters: {{total}}", + "Total tokens": "Total tokens: {{total}}", "ai": { - "AI settings": "AI 配置", - "Ai point price": "AI积分消耗", - "Max context": "最大上下文", - "Model": "AI 模型", - "Not deploy rerank model": "未部署重排模型", - "Prompt": "提示词", - "Support tool": "函数调用", + "AI settings": "AI settings", + "Ai point price": "AI point consumption", + "Max context": "Max context", + "Model": "AI model", + "Not deploy rerank model": "Rerank model not deployed", + "Prompt": "Prompt", + "Support tool": "Function call", "model": { - "Dataset Agent Model": "文件处理模型", - "Vector Model": "索引模型" + "Dataset Agent Model": "File processing model", + "Vector Model": "Index model" } }, "app": { - "Ai response": "返回AI内容", - "Api request": "API 访问", - "Api request desc": "通过 API 接入到已有系统中,或企微、飞书等", - "App intro": "应用介绍", - "App params config": "应用配置", - "Auto Save time": "自动保存: {{time}}", - "Change to simple mode": "切换简易模式", - "Chat Variable": "对话框变量", - "Config schedule plan": "配置定时执行", - "Config whisper": "配置语音输入", - "External using": "外部使用途径", - "Interval timer config": "定时执行配置", - "Interval timer run": "定时执行", - "Interval timer tip": "可定时执行应用", - "Make a brief introduction of your app": "给你的 AI 应用一个介绍", - "Max histories": "聊天记录数量", - "Max tokens": "回复上限", - "Name and avatar": "头像 & 名称", - "Onclick to save": "点击保存", - "Publish": "发布", - "Publish Confirm": "确认发布应用?会立即更新所有发布渠道的应用状态。", - "Publish Failed": "发布失败", - "Publish Success": "发布成功", - "Question Guide": "猜你想问", - "Question Guide Tip": "对话结束后,会为生成 3 个引导性问题。", - "Quote prompt": "引用模板提示词", - "Quote templates": "引用内容模板", - "Random": "发散", - "Save and preview": "保存并预览", - "Search team tags": "搜索标签", - "Select TTS": "选择语音播放模式", - "Select app from template": "从模板中选择", - "Select quote template": "选择引用提示模板", - "Set a name for your app": "给应用设置一个名称", - "Setting ai property": "点击配置AI模型相关属性", - "Share link": "免登录窗口", - "Share link desc": "分享链接给其他用户,无需登录即可直接进行使用", - "Share link desc detail": "可以直接分享该模型给其他用户去进行对话,对方无需登录即可直接进行对话。注意,这个功能会消耗你账号的余额,请保管好链接!", - "Simple Config Tip": "仅包含基础功能,复杂 agent 功能请使用高级编排。", - "TTS": "语音播放", - "TTS Tip": "开启后,每次对话后可使用语音播放功能。使用该功能可能产生额外费用。", - "TTS start": "朗读内容", - "Team tags": "团队标签", - "Temperature": "温度", - "Tool call": "工具调用", - "Tool call tip": "通过AI模型自动选择一个或多个工具进行使用。如果启动该功能,知识库调用也会被当做一个工具调用。请尽量选择支持“函数调用”的AI模型,效果更好。", + "Ai response": "Return AI content", + "Api request": "API access", + "Api request desc": "Access existing systems via API, or enterprise WeChat, Lark, etc.", + "App intro": "App introduction", + "App params config": "App configuration", + "Auto Save time": "Auto save: {{time}}", + "Change to simple mode": "Switch to simple mode", + "Chat Variable": "Chat box variable", + "Config schedule plan": "Configure scheduled execution", + "Config whisper": "Configure voice input", + "External using": "External usage", + "Interval timer config": "Scheduled execution configuration", + "Interval timer run": "Scheduled execution", + "Interval timer tip": "Can be scheduled to execute applications", + "Make a brief introduction of your app": "Give your AI app an introduction", + "Max histories": "Chat history count", + "Max tokens": "Reply limit", + "Name and avatar": "Avatar & name", + "Onclick to save": "Click to save", + "Publish": "Publish", + "Publish Confirm": "Confirm to publish the app? It will immediately update the app status across all published channels.", + "Publish Failed": "Publish failed", + "Publish Success": "Publish successful", + "Question Guide": "Guess you want to ask", + "Question Guide Tip": "After the conversation ends, it will generate 3 guiding questions.", + "Quote prompt": "Quote template prompt", + "Quote templates": "Quote content templates", + "Random": "Diverge", + "Save and preview": "Save and preview", + "Search team tags": "Search tags", + "Select TTS": "Select voice playback mode", + "Select app from template": "Select from template", + "Select quote template": "Select quote prompt template", + "Set a name for your app": "Set a name for your app", + "Setting ai property": "Click to configure AI model related properties", + "Share link": "Login-free window", + "Share link desc": "Share the link with other users, who can use it directly without logging in", + "Share link desc detail": "You can directly share this model with other users for conversation, and the other party can directly start the conversation without logging in. Note, this feature will consume your account balance, please keep the link safe!", + "Simple Config Tip": "Only includes basic functions, complex agent functions please use advanced arrangement.", + "TTS": "Voice playback", + "TTS Tip": "After enabling, each conversation can use the voice playback function. Using this function may incur additional costs.", + "TTS start": "Read content", + "Team tags": "Team tags", + "Temperature": "Temperature", + "Tool call": "Tool call", + "Tool call tip": "Automatically select one or more tools to use through the AI model. If you enable this feature, knowledge base calls will also be treated as a tool call. Please try to select AI models that support 'function calls' for better results.", "ToolCall": { - "No plugin": "没有可用的插件", - "Parameter setting": "输入参数", - "Setting tool": "配置工具", - "System": "系统", - "Team": "团队", - "This plugin cannot be called as a tool": "该工具无法在简易模式中使用" + "No plugin": "No available plugins", + "Parameter setting": "Input parameters", + "Setting tool": "Configure tools", + "System": "System", + "Team": "Team", + "This plugin cannot be called as a tool": "This tool cannot be used in simple mode" }, - "Welcome Text": "对话开场白", - "Whisper": "语音输入", - "Whisper Tip": "配置语音输入相关参数", - "Whisper config": "语音输入配置", - "create app": "创建属于你的 AI 应用", - "deterministic": "严谨", + "Welcome Text": "Conversation opener", + "Whisper": "Voice input", + "Whisper Tip": "Configure voice input related parameters", + "Whisper config": "Voice input configuration", + "create app": "Create your own AI app", + "deterministic": "Rigorous", "edit": { - "Confirm Save App Tip": "该应用可能为高级编排模式,保存后将会覆盖高级编排配置,请确认!", - "Out Ad Edit": "您即将退出高级编排页面,请确认", - "Prompt Editor": "提示词编辑", - "Query extension background prompt": "对话背景描述", - "Query extension background tip": "描述当前对话的范围,便于AI为当前问题进行补全和扩展。填写的内容,通常为该助手", - "Save and out": "保存并退出", - "UnSave": "不保存" + "Confirm Save App Tip": "This app may be in advanced arrangement mode, saving will overwrite the advanced arrangement configuration, please confirm!", + "Out Ad Edit": "You are about to exit the advanced arrangement page, please confirm", + "Prompt Editor": "Prompt editor", + "Query extension background prompt": "Conversation background description", + "Query extension background tip": "Describe the scope of the current conversation to help the AI complete and expand the current question. The content filled in is usually for the assistant", + "Save and out": "Save and exit", + "UnSave": "Do not save" }, "error": { - "App name can not be empty": "应用名不能为空", - "Get app failed": "获取应用异常" + "App name can not be empty": "App name cannot be empty", + "Get app failed": "Failed to get app" }, "feedback": { - "Custom feedback": "自定义反馈", - "close custom feedback": "关闭反馈" + "Custom feedback": "Custom feedback", + "close custom feedback": "Close feedback" }, "logs": { - "Source And Time": "来源 & 时间" + "Source And Time": "Source & Time" }, "navbar": { - "External": "外部使用", - "Flow mode": "高级编排", - "Publish": "发布", - "Publish app": "发布应用", - "Simple mode": "简易配置" + "External": "External use", + "Flow mode": "Advanced arrangement", + "Publish": "Publish", + "Publish app": "Publish app", + "Simple mode": "Simple configuration" }, "outLink": { - "Can Drag": "图标可拖拽", - "Default open": "默认打开", - "Iframe block title": "复制下面 Iframe 加入到你的网站中", - "Link block title": "将下面链接复制到浏览器打开", - "Script Close Icon": "关闭图标", - "Script Icon": "图标", - "Script Open Icon": "打开图标", - "Script block title": "将下面代码加入到你的网站中", - "Select Mode": "开始使用", - "Select Using Way": "选择使用方式", - "Show History": "展示历史对话", - "Web Link": "网络链接" + "Can Drag": "Icon draggable", + "Default open": "Open by default", + "Iframe block title": "Copy the Iframe below and add it to your website", + "Link block title": "Copy the link below and open it in a browser", + "Script Close Icon": "Close icon", + "Script Icon": "Icon", + "Script Open Icon": "Open icon", + "Script block title": "Add the code below to your website", + "Select Mode": "Start using", + "Select Using Way": "Select usage method", + "Show History": "Show chat history", + "Web Link": "Web link" }, "publish": { - "Fei Shu Bot Desc": "接入到飞书机器人中", - "Fei shu bot": "飞书", - "Fei shu bot publish": "发布到飞书机器人" + "Fei Shu Bot Desc": "Access to Lark bot", + "Fei shu bot": "Lark", + "Fei shu bot publish": "Publish to Lark bot" }, "schedule": { - "Default prompt": "默认问题", - "Default prompt placeholder": "执行应用时的默认问题", - "Every day": "每天{{hour}}:00", - "Every month": "每月{{day}}号{{hour}}:00", - "Every week": "每周{{day}} {{hour}}:00", - "Interval": "每{{interval}}小时", - "Open schedule": "定时执行" + "Default prompt": "Default question", + "Default prompt placeholder": "Default question when executing the app", + "Every day": "Every day at {{hour}}:00", + "Every month": "Every month on the {{day}} at {{hour}}:00", + "Every week": "Every week on {{day}} at {{hour}}:00", + "Interval": "Every {{interval}} hours", + "Open schedule": "Scheduled execution" }, - "setting": "应用信息设置", + "setting": "App information settings", "share": { - "Amount limit tip": "最多创建10组", - "Create link": "创建新链接", - "Create link tip": "创建成功。已复制分享地址,可直接分享使用", - "Ip limit title": "IP限流(人/分钟)", - "Is response quote": "返回引用", - "Not share link": "没有创建分享链接", - "Role check": "身份校验" + "Amount limit tip": "A maximum of 10 groups can be created", + "Create link": "Create new link", + "Create link tip": "Link created successfully. The share address has been copied, you can share it directly", + "Ip limit title": "IP rate limit (people/minute)", + "Is response quote": "Return quote", + "Not share link": "No share link created", + "Role check": "Identity verification" }, "simple": { - "mode template select": "简易模板" + "mode template select": "Simple template" }, "template": { - "Classify and dataset": "问题分类 + 知识库", - "Classify and dataset desc": "先对用户的问题进行分类,再根据不同类型问题,执行不同的操作", - "Common template": "通用模板", - "Common template tip": "通用模板\n可完全自行配置AI属性和知识库", - "Dataset and guide": "知识库 + 对话引导", - "Dataset and guide desc": "每次提问时进行一次知识库搜索,将搜索结果注入 LLM 模型进行参考回答", - "Guide and variables": "对话引导 + 变量", - "Guide and variables desc": "可以在对话开始发送一段提示,或者让用户填写一些内容,作为本次对话的变量", - "Simple chat": "简单的对话", - "Simple chat desc": "一个极其简单的 AI 对话应用", - "Simple template": "简易模板", - "Simple template tip": "极简模板\n已内置参数细节" + "Classify and dataset": "Question classification + knowledge base", + "Classify and dataset desc": "First classify the user's question, then perform different operations according to different types of questions", + "Common template": "General template", + "Common template tip": "General template\nFully configurable AI properties and knowledge base", + "Dataset and guide": "Knowledge base + dialogue guide", + "Dataset and guide desc": "Each time a question is asked, a knowledge base search is performed, and the search results are injected into the LLM model for reference answers", + "Guide and variables": "Dialogue guide + variables", + "Guide and variables desc": "You can send a prompt at the start of the conversation, or let the user fill in some content as variables for this conversation", + "Simple chat": "Simple chat", + "Simple chat desc": "A very simple AI chat application", + "Simple template": "Simple template", + "Simple template tip": "Minimal template\nBuilt-in parameter details" }, "tip": { - "Add a intro to app": "快来给应用一个介绍~", - "chatNodeSystemPromptTip": "模型固定的引导词,通过调整该内容,可以引导模型聊天方向。该内容会被固定在上下文的开头。可使用变量,例如 {{language}}\n如果关联了知识库,你还可以通过适当的描述,来引导模型何时去调用知识库搜索。例如:\n你是电影《星际穿越》的助手,当用户询问与《星际穿越》相关的内容时,请搜索知识库并结合搜索结果进行回答。", - "userGuideTip": "可以在对话前设置引导语,设置全局变量,设置下一步指引", - "variableTip": "可以在对话开始前,要求用户填写一些内容作为本轮对话的特定变量。该模块位于开场引导之后。\n变量可以通过 {{变量key}} 的形式注入到其他模块 string 类型的输入中,例如:提示词、限定词等", - "welcomeTextTip": "每次对话开始前,发送一个初始内容。支持标准 Markdown 语法,可使用的额外标记:\n[快捷按键]: 用户点击后可以直接发送该问题" + "Add a intro to app": "Come and give the app an introduction~", + "chatNodeSystemPromptTip": "Model fixed guide words, by adjusting this content, you can guide the model's chat direction. This content will be fixed at the beginning of the context. Variables can be used, for example, {{language}}\nIf a knowledge base is associated, you can also guide the model when to call the knowledge base search by appropriately describing it. For example:\nYou are the assistant for the movie 'Interstellar', when the user asks about content related to 'Interstellar', please search the knowledge base and combine the search results for answers.", + "userGuideTip": "You can set a guide language before the conversation, set global variables, and set the next step guide", + "variableTip": "You can ask the user to fill in some content as specific variables for this round of conversation before the conversation starts. This module is located after the opening guide.\nVariables can be injected into other module string type inputs through the form of {{variable key}}, such as: prompt words, limiting words, etc.", + "welcomeTextTip": "Send an initial content before each conversation starts. Supports standard Markdown syntax, additional tags available:\n[Shortcut key]: User can click to send the question directly" }, "tts": { - "Close": "不使用", - "Model alloy": "女声 - Alloy", - "Model echo": "男声 - Echo", - "Speech model": "语音模型", - "Speech speed": "语速", - "Test Listen": "试听", - "Test Listen Text": "你好,这是语音测试,如果你能听到这句话,说明语音播放功能正常", - "Web": "浏览器自带(免费)" + "Close": "Do not use", + "Model alloy": "Female voice - Alloy", + "Model echo": "Male voice - Echo", + "Speech model": "Voice model", + "Speech speed": "Speech speed", + "Test Listen": "Test listen", + "Test Listen Text": "Hello, this is a voice test, if you can hear this sentence, it means the voice playback function is normal", + "Web": "Browser built-in (free)" }, "whisper": { - "Auto send": "自动发送", - "Auto send tip": "语音输入完毕后直接发送,不需要再手动点击发送按键", - "Auto tts response": "自动语音回复", - "Auto tts response tip": "通过语音输入发送的问题,会直接以语音的形式响应,请确保打开了语音播报功能。", - "Close": "关闭", - "Not tts tip": "你没有开启语音播放,该功能无法使用", - "Open": "开启", - "Switch": "开启语音输入" + "Auto send": "Auto send", + "Auto send tip": "Automatically send after voice input is complete, no need to manually click the send button", + "Auto tts response": "Auto voice response", + "Auto tts response tip": "Questions sent via voice input will be responded to directly in voice form, please make sure the voice playback function is turned on.", + "Close": "Close", + "Not tts tip": "You have not turned on voice playback, this function cannot be used", + "Open": "Open", + "Switch": "Turn on voice input" } }, "chat": { - "Admin Mark Content": "纠正后的回复", - "Audio Not Support": "设备不支持语音播放", - "Audio Speech Error": "语音播报异常", - "Cancel Speak": "取消语音输入", - "Canceled Speak": "语音输入已取消", - "Chat API is error or undefined": "对话接口报错或返回为空", - "Confirm to clear history": "确认清空该应用的在线聊天记录?分享和 API 调用的记录不会被清空。", - "Confirm to clear share chat history": "确认删除所有聊天记录?", - "Converting to text": "正在转换为文本...", - "Custom History Title": "自定义历史记录标题", - "Custom History Title Description": "如果设置为空,会自动跟随聊天记录。", - "Debug test": "调试预览", - "Exit Chat": "退出聊天", - "Failed to initialize chat": "初始化聊天失败", - "Feedback Failed": "提交反馈异常", - "Feedback Mark": "标注", - "Feedback Modal": "结果反馈", - "Feedback Modal Tip": "输入你觉得回答不满意的地方", - "Feedback Submit": "提交反馈", - "Feedback Success": "反馈成功!", - "Feedback Update Failed": "更新反馈状态失败", - "Finish Speak": "语音输入完成", - "History": "记录", - "History Amount": "{{amount}}条记录", - "Mark": "标注预期回答", - "Mark Description": "当前标注功能为测试版。\n\n点击添加标注后,需要选择一个知识库,以便存储标注数据。你可以通过该功能快速的标注问题和预期回答,以便引导模型下次的回答。\n\n目前,标注功能同知识库其他数据一样,受模型的影响,不代表标注后 100% 符合预期。\n\n标注数据仅单向与知识库同步,如果知识库修改了该标注数据,日志展示的标注数据无法同步", - "Mark Description Title": "标注功能介绍", - "New Chat": "新对话", - "Pin": "置顶", - "Question Guide": "猜你想问", - "Quote": "引用", - "Quote Amount": "知识库引用({{amount}}条)", - "Read Mark Description": "查看标注功能介绍", - "Record": "语音输入", - "Restart": "重开对话", - "Select File": "选择文件", - "Select Image": "选择图片", - "Select dataset": "选择知识库", - "Select dataset Desc": "选择一个知识库存储预期答案", - "Send Message": "发送", - "Speaking": "我在听,请说...", - "Start Chat": "开始对话", - "Stop Speak": "停止录音", - "Type a message": "输入问题,发送 [Enter]/换行 [Ctrl(Alt/Shift) + Enter]", - "Unpin": "取消置顶", - "You need to a chat app": "你没有可用的应用", + "Admin Mark Content": "Corrected Reply", + "Audio Not Support": "Device does not support audio playback", + "Audio Speech Error": "Audio speech error", + "Cancel Speak": "Cancel voice input", + "Canceled Speak": "Voice input canceled", + "Chat API is error or undefined": "Chat API error or undefined", + "Confirm to clear history": "Confirm to clear the online chat history of this app? Records of sharing and API calls will not be cleared.", + "Confirm to clear share chat history": "Confirm to delete all chat history?", + "Converting to text": "Converting to text...", + "Custom History Title": "Custom History Title", + "Custom History Title Description": "If set to empty, it will automatically follow the chat history.", + "Debug test": "Debug preview", + "Exit Chat": "Exit chat", + "Failed to initialize chat": "Failed to initialize chat", + "Feedback Failed": "Feedback submission error", + "Feedback Mark": "Mark", + "Feedback Modal": "Feedback Result", + "Feedback Modal Tip": "Enter what you find unsatisfactory about the answer", + "Feedback Submit": "Submit feedback", + "Feedback Success": "Feedback successful!", + "Feedback Update Failed": "Failed to update feedback status", + "Finish Speak": "Voice input complete", + "History": "History", + "History Amount": "{{amount}} records", + "Mark": "Mark expected answer", + "Mark Description": "The current marking function is in beta.\n\nAfter adding a mark, you need to select a dataset to store the marking data. You can quickly mark questions and expected answers through this function to guide the model's response next time.\n\nCurrently, like other data in the dataset, the marking function is influenced by the model and does not guarantee 100% compliance with expectations after marking.\n\nMarking data is only synchronized one-way with the dataset. If the dataset modifies the marking data, the log display of marking data cannot be synchronized", + "Mark Description Title": "Introduction to marking function", + "New Chat": "New conversation", + "Pin": "Pin", + "Question Guide": "Guess what you want to ask", + "Quote": "Quote", + "Quote Amount": "Dataset quotes ({{amount}} items)", + "Read Mark Description": "View introduction to marking function", + "Record": "Voice input", + "Restart": "Restart conversation", + "Select File": "Select file", + "Select Image": "Select image", + "Select dataset": "Select dataset", + "Select dataset Desc": "Select a dataset to store the expected answer", + "Send Message": "Send", + "Speaking": "I'm listening, please speak...", + "Start Chat": "Start conversation", + "Stop Speak": "Stop recording", + "Type a message": "Type a question, send [Enter]/newline [Ctrl(Alt/Shift) + Enter]", + "Unpin": "Unpin", + "You need to a chat app": "You do not have a usable app", "error": { - "Chat error": "对话出现异常", - "Messages empty": "接口内容为空,可能文本超长了~", - "Select dataset empty": "你没有选择知识库", - "User input empty": "传入的用户问题为空" + "Chat error": "Chat error", + "Messages empty": "API content is empty, text may be too long~", + "Select dataset empty": "You did not select a dataset", + "User input empty": "User question input is empty" }, "feedback": { "Close User Good Feedback": "", - "Close User Like": "用户表示赞同\n点击关闭该标记", - "Feedback Close": "关闭反馈", - "No Content": "用户没有填写具体反馈内容", - "Read User dislike": "用户表示反对\n点击查看内容" + "Close User Like": "User expressed approval\nClick to close this mark", + "Feedback Close": "Close feedback", + "No Content": "User did not provide specific feedback content", + "Read User dislike": "User expressed disapproval\nClick to view content" }, "logs": { - "api": "API 调用", - "online": "在线使用", - "share": "外部链接调用", - "test": "测试" + "api": "API call", + "online": "Online use", + "share": "External link call", + "test": "Test" }, "markdown": { - "Edit Question": "编辑问题", - "Quick Question": "点我立即提问", - "Send Question": "发送问题" + "Edit Question": "Edit question", + "Quick Question": "Click to ask now", + "Send Question": "Send question" }, "quote": { - "Quote Tip": "此处仅显示实际引用内容,若数据有更新,此处不会实时更新", - "Read Quote": "查看引用", - "Read Source": "查看来源" + "Quote Tip": "Only the actual quote content is displayed here. If the data is updated, it will not be updated in real-time here", + "Read Quote": "View quote", + "Read Source": "View source" }, "response": { - "Complete Response": "完整响应", - "Extension model": "问题优化模型", - "Plugin response detail": "插件详情", - "Read complete response": "查看详情", - "Read complete response tips": "点击查看详细流程", - "Tool call response detail": "工具运行详情", - "Tool call tokens": "工具调用Tokens消耗", - "context total length": "上下文总长度", - "module cq": "问题分类列表", - "module cq result": "分类结果", - "module extract description": "提取要求描述", - "module extract result": "提取结果", - "module historyPreview": "完整记录", - "module http body": "请求体", - "module http result": "响应体", - "module http url": "请求地址", - "module if else Result": "判断器结果", - "module limit": "单次搜索上限", - "module maxToken": "最大响应 Tokens", - "module model": "模型", - "module name": "模型名", - "module price": "计费", - "module query": "问题/检索词", - "module question": "问题", - "module quoteList": "引用内容", - "module runningTime": "运行时长", - "module search query": "检索词", - "module search response": "搜索结果", - "module similarity": "相似度", - "module temperature": "温度", - "module time": "运行时长", - "module tokens": "总Tokens", - "plugin output": "插件输出值", - "search using reRank": "结果重排", - "text output": "文本输出" + "Complete Response": "Complete response", + "Extension model": "Question optimization model", + "Plugin response detail": "Plugin details", + "Read complete response": "View details", + "Read complete response tips": "Click to view detailed process", + "Tool call response detail": "Tool operation details", + "Tool call tokens": "Tool call Tokens consumption", + "context total length": "Total context length", + "module cq": "Question classification list", + "module cq result": "Classification result", + "module extract description": "Extract requirement description", + "module extract result": "Extraction result", + "module historyPreview": "Complete record", + "module http body": "Request body", + "module_http_result": "Response body", + "module_http_url": "Request URL", + "module_if_else_Result": "Judger result", + "module_limit": "Single search limit", + "module_maxToken": "Maximum response Tokens", + "module_model": "Model", + "module_name": "Model name", + "module_price": "Billing", + "module_query": "Question/search term", + "module_question": "Question", + "module_quoteList": "Quoted content", + "module_runningTime": "Running time", + "module_search_query": "Search term", + "module_search_response": "Search result", + "module_similarity": "Similarity", + "module_temperature": "Temperature", + "module_time": "Running time", + "module_tokens": "Total Tokens", + "plugin_output": "Plugin output value", + "search_using_reRank": "Result re-ranking", + "text_output": "Text output" }, - "retry": "重新生成", + "retry": "Regenerate", "tts": { - "Stop Speech": "停止" + "Stop Speech": "Stop" } }, "common": { "tip": { - "leave page": "内容已修改,确认离开页面吗?" + "leave page": "Content has been modified, confirm to leave the page?" } }, "dataset": { - "All Dataset": "全部知识库", - "Avatar": "知识库头像", - "Choose Dataset": "关联知识库", - "Chunk amount": "分段数", - "Collection": "数据集", - "Common Dataset": "通用知识库", - "Common Dataset Desc": "可通过导入文件、网页链接或手动录入形式构建知识库", - "Create dataset": "创建一个知识库", - "Dataset": "知识库", - "Dataset ID": "知识库 ID", - "Dataset Type": "知识库类型", - "Delete Confirm": "确认删除该知识库?删除后数据无法恢复,请确认!", - "Delete Website Tips": "确认删除该站点?", + "All Dataset": "All datasets", + "Avatar": "Dataset avatar", + "Choose Dataset": "Associate dataset", + "Chunk amount": "Number of chunks", + "Collection": "Dataset", + "Common Dataset": "Common dataset", + "Common Dataset Desc": "Can be built by importing files, web links, or manual entry", + "Create dataset": "Create a dataset", + "Dataset": "Dataset", + "Dataset ID": "Dataset ID", + "Dataset Type": "Dataset type", + "Delete Confirm": "Confirm to delete this dataset? Data cannot be recovered after deletion, please confirm!", + "Delete Website Tips": "Confirm to delete this site?", "Empty Dataset": "", - "Empty Dataset Tips": "还没有知识库,快去创建一个吧!", - "File collection": "文件数据集", - "Folder Dataset": "文件夹", - "Folder placeholder": "这是一个目录", - "Go Dataset": "前往知识库", - "Intro Placeholder": "这个知识库还没有介绍~", - "Manual collection": "手动数据集", - "My Dataset": "我的知识库", - "Name": "知识库名称", - "Query extension intro": "开启问题优化功能,可以提高提高连续对话时,知识库搜索的精度。开启该功能后,在进行知识库搜索时,会根据对话记录,利用 AI 补全问题缺失的信息。", - "Quote Length": "引用内容长度", - "Read Dataset": "查看知识库详情", - "Search score tip": "{{scoreText}}下面是详细排名和得分情况:\n----\n{{detailScore}}", - "Select dataset": "选择知识库", - "Set Empty Result Tip": ",未搜索到内容时回复指定内容", - "Set Website Config": "开始配置网站信息", - "Similarity": "相关度", - "Start export": "已开始导出", - "Sync Time": "最后更新时间", - "Table collection": "表格数据集", - "Text collection": "文本数据集", - "Total chunks": "总分段: {{total}}", - "Website Dataset": "Web 站点同步", - "Website Dataset Desc": "Web 站点同步允许你直接使用一个网页链接构建知识库", + "Empty Dataset Tips": "No datasets yet, go create one!", + "File collection": "File dataset", + "Folder Dataset": "Folder", + "Folder placeholder": "This is a directory", + "Go Dataset": "Go to dataset", + "Intro Placeholder": "This dataset has no introduction~", + "Manual collection": "Manual dataset", + "My Dataset": "My dataset", + "Name": "Dataset name", + "Query extension intro": "Enabling the question optimization feature can improve the accuracy of dataset searches during continuous dialogue. After enabling this feature, AI will complete missing information based on conversation records when searching the dataset.", + "Quote Length": "Quote content length", + "Read Dataset": "View dataset details", + "Search score tip": "{{scoreText}}Below are the detailed rankings and scores:\n----\n{{detailScore}}", + "Select dataset": "Select dataset", + "Set Empty Result Tip": ", reply with specified content when no content is found", + "Set Website Config": "Start configuring website information", + "Similarity": "Relevance", + "Start export": "Export started", + "Sync Time": "Last update time", + "Table collection": "Table dataset", + "Text collection": "Text dataset", + "Total chunks": "Total chunks: {{total}}", + "Website Dataset": "Web site synchronization", + "Website Dataset Desc": "Web site synchronization allows you to use a web page link to build a dataset", "collection": { - "Click top config website": "点击配置网站", - "Collection name": "数据集名称", - "Collection raw text": "数据集内容", - "Empty Tip": "数据集空空如也", - "QA Prompt": "QA 拆分引导词", - "Start Sync Tip": "确认开始同步数据?将会删除旧数据后重新获取,请确认!", - "Sync": "同步数据", - "Sync Collection": "数据同步", - "Website Create Success": "创建成功,正在同步数据", - "Website Empty Tip": "还没有关联网站", - "Website Link": "Web 站点地址", - "Website Sync": "Web 站点同步", - "id": "集合ID", + "Click top config website": "Click to configure website", + "Collection name": "Dataset name", + "Collection raw text": "Dataset content", + "Empty Tip": "The dataset is empty", + "QA Prompt": "QA split guide words", + "Start Sync Tip": "Confirm to start syncing data? Old data will be deleted and re-acquired, please confirm!", + "Sync": "Sync data", + "Sync Collection": "Data synchronization", + "Website Create Success": "Created successfully, syncing data", + "Website Empty Tip": "No associated websites yet", + "Website Link": "Web site address", + "Website Sync": "Web site synchronization", + "id": "Collection ID", "metadata": { - "Chunk Size": "分割大小", - "Createtime": "创建时间", - "Raw text length": "原文长度", - "Read Metadata": "查看元数据", - "Training Type": "训练模式", - "Updatetime": "更新时间", - "Web page selector": "网站选择器", - "metadata": "元数据", - "read source": "查看原始内容", - "source": "数据来源", - "source name": "来源名", - "source size": "来源大小" + "Chunk Size": "Segment size", + "Createtime": "Creation time", + "Raw text length": "Raw text length", + "Read Metadata": "View metadata", + "Training Type": "Training mode", + "Updatetime": "Update time", + "Web page selector": "Website selector", + "metadata": "Metadata", + "read source": "View original content", + "source": "Data source", + "source name": "Source name", + "source size": "Source size" }, "status": { - "active": "已就绪", - "syncing": "同步中" + "active": "Ready", + "syncing": "Syncing" }, "sync": { "result": { - "sameRaw": "内容未变动,无需更新", - "success": "开始同步" + "sameRaw": "Content unchanged, no update needed", + "success": "Start syncing" } }, "training": {} }, "data": { - "Auxiliary Data": "辅助数据", - "Auxiliary Data Placeholder": "该部分为可选填项, 通常是为了与前面的【数据内容】配合,构建结构化提示词,用于特殊场景,最多 {{maxToken}} 字。", - "Auxiliary Data Tip": "该部分为可选填项\n该内容通常是为了与前面的数据内容配合,构建结构化提示词,用于特殊场景", - "Data Content": "相关数据内容", - "Data Content Placeholder": "该输入框是必填项,该内容通常是对于知识点的描述,也可以是用户的问题,最多 {{maxToken}} 字。", - "Data Content Tip": "该输入框是必填项\n该内容通常是对于知识点的描述,也可以是用户的问题。", - "Default Index Tip": "无法编辑,默认索引会使用【相关数据内容】与【辅助数据】的文本直接生成索引。", - "Edit": "编辑数据", - "Empty Tip": "这个集合还没有数据~", - "Main Content": "主要内容", - "Search data placeholder": "搜索相关数据", - "Too Long": "总长度超长了", - "Total Amount": "{{total}} 组", - "data is deleted": "该数据已被删除", - "get data error": "获取数据异常", - "id": "数据ID", - "unit": "条" + "Auxiliary Data": "Auxiliary data", + "Auxiliary Data Placeholder": "This part is optional, usually to complement the data content above to build structured prompt words for special scenarios, up to {{maxToken}} characters.", + "Auxiliary Data Tip": "This part is optional\nThis content is usually to complement the data content above to build structured prompt words for special scenarios", + "Data Content": "Related data content", + "Data Content Placeholder": "This input box is mandatory, the content is usually a description of the knowledge point or a user's question, up to {{maxToken}} characters.", + "Data Content Tip": "This input box is mandatory\nThe content is usually a description of the knowledge point or a user's question.", + "Default Index Tip": "Cannot be edited, the default index will use the text of the related data content and auxiliary data to generate the index directly.", + "Edit": "Edit data", + "Empty Tip": "This collection has no data yet~", + "Main Content": "Main content", + "Search data placeholder": "Search related data", + "Too Long": "Total length too long", + "Total Amount": "{{total}} sets", + "data is deleted": "This data has been deleted", + "get data error": "Data retrieval error", + "id": "Data ID", + "unit": "items" }, - "embedding model tip": "索引模型可以将自然语言转成向量,用于进行语义检索。\n注意,不同索引模型无法一起使用,选择完索引模型后将无法修改。", + "embedding model tip": "The index model can convert natural language into vectors for semantic retrieval.\nNote, different index models cannot be used together, once you select an index model, it cannot be changed.", "error": { - "Data not found": "数据不存在或已被删除", - "Start Sync Failed": "开始同步失败", - "Template does not exist": "模板不存在", - "unAuthDataset": "无权操作该知识库", - "unAuthDatasetCollection": "无权操作该数据集", - "unAuthDatasetData": "无权操作该数据", - "unAuthDatasetFile": "无权操作该文件", - "unCreateCollection": "无权操作该数据", - "unLinkCollection": "不是网络链接集合" + "Data not found": "Data does not exist or has been deleted", + "Start Sync Failed": "Failed to start syncing", + "Template does not exist": "Template does not exist", + "unAuthDataset": "Unauthorized to operate this dataset", + "unAuthDatasetCollection": "Unauthorized to operate this collection", + "unAuthDatasetData": "Unauthorized to operate this data", + "unAuthDatasetFile": "Unauthorized to operate this file", + "unCreateCollection": "Unauthorized to operate this data", + "unLinkCollection": "Not a network link collection" }, - "file": "文件", - "folder": "目录", + "file": "File", + "folder": "Directory", "import": { - "Auto mode Estimated Price Tips": "需调用文件处理模型,需要消耗较多Tokens: {{price}}积分/1k Tokens", - "Auto process": "自动", - "Auto process desc": "自动设置分割和预处理规则", - "CSV Import": "CSV 导入", - "CSV Import Tip": "通过批量导入问答对,要求提前整理好数据", - "Chunk Range": "范围: {{min}}~{{max}}", - "Chunk Split": "直接分段", - "Chunk Split Tip": "将文本按一定的规则进行分段处理后,转成可进行语义搜索的格式,适合绝大多数场景。不需要调用模型额外处理,成本低。", - "Chunk length": "分块总量", - "Csv format error": "csv 文件格式有误,请确保 index 和 content 两列", - "Custom file": "自定义文本", - "Custom process": "自定义规则", - "Custom process desc": "自定义设置分制和预处理规则", - "Custom prompt": "自定义提示词", - "Custom split char": "自定义分隔符", - "Custom split char Tips": "允许你根据自定义的分隔符进行分块。通常用于已处理好的数据,使用特定的分隔符来精确分块。", - "Custom text": "自定义文本", - "Custom text desc": "手动输入一段文本作为数据集", - "Data Preprocessing": "数据处理", - "Data file progress": "数据上传进度", - "Data process params": "数据处理参数", - "Down load csv template": "点击下载 CSV 模板", - "Embedding Estimated Price Tips": "仅使用索引模型,消耗少量AI积分: {{price}}积分/1k Tokens", - "Estimated Price": "预估价格: {{amount}}{{unit}}", - "Estimated Price Tips": "QA计费为\n输入: {{charsPointsPrice}}积分/1k Tokens", - "Estimated points": "预估消耗 {{points}} 积分", - "Fetch Error": "获取链接失败", - "Fetch Url": "网络链接", - "Fetch url placeholder": "最多10个链接,每行一个。", - "Fetch url tip": "仅支持读取静态链接,请注意检查结果", - "File chunk amount": "分段: {{amount}}", - "File list": "文件列表", - "Ideal chunk length": "理想分块长度", - "Ideal chunk length Tips": "按结束符号进行分段。我们建议您的文档应合理的使用标点符号,以确保每个完整的句子长度不要超过该值\n中文文档建议400~1000\n英文文档建议600~1200", - "Import Failed": "导入文件失败", - "Import Success Tip": "共成功导入 {{num}} 组数据,请耐心等待训练.", - "Import Tip": "该任务无法终止,需要一定时间生成索引,请确认导入。如果余额不足,未完成的任务会被暂停,充值后可继续进行。", - "Import success": "导入成功,请等待训练", - "Link name": "网络链接", - "Link name placeholder": "仅支持静态链接,如果上传后数据为空,可能该链接无法被读取\n每行一个,每次最多 10 个链接", - "Local file": "本地文件", - "Local file desc": "上传 PDF, TXT, DOCX 等格式的文件", - "Only Show First 50 Chunk": "仅展示部分", - "Predicted chunk": "预估分段", - "Predicted chunk amount": "预估分段:{{amount}}", - "Predicted total chars": "预估字数: {{total}}", - "Preview chunks": "预览分段(最多5段)", - "Preview raw text": "预览源文本(最多3000字)", - "Process way": "处理方式", - "QA Estimated Price Tips": "需调用文件处理模型,需要消耗较多AI积分: {{price}}积分/1k Tokens", - "QA Import": "QA拆分", - "QA Import Tip": "根据一定规则,将文本拆成一段较大的段落,调用 AI 为该段落生成问答对。有非常高的检索精度,但是会丢失很多内容细节。", - "Re Preview": "重新生成预览", - "Select file": "选择文件", - "Select source": "选择来源", - "Set Chunk Error": "文本分段异常", - "Source name": "来源名", - "Sources list": "来源列表", - "Start upload": "开始上传", - "Total Chunk Preview": "分段预览({{totalChunks}}组)", - "Total files": "共 {{total}} 个文件", - "Total tokens": "总Tokens", - "Training mode": "训练模式", - "Upload data": "上传数据", - "Upload file progress": "文件上传进度", - "Upload status": "状态", - "Upload success": "上传成功", - "Web link": "网页链接", - "Web link desc": "读取静态网页内容作为数据集" + "Auto mode Estimated Price Tips": "Requires calling the file processing model, consuming more Tokens: {{price}} points/1k Tokens", + "Auto process": "Automatic", + "Auto process desc": "Automatically set segmentation and preprocessing rules", + "CSV Import": "CSV Import", + "CSV Import Tip": "Import Q&A pairs in bulk, requires pre-organized data", + "Chunk Range": "Range: {{min}}~{{max}}", + "Chunk Split": "Direct segmentation", + "Chunk Split Tip": "Segment the text according to certain rules and convert it into a format that can be semantically searched, suitable for most scenarios. Does not require calling additional models for processing, low cost.", + "Chunk length": "Total chunks", + "Csv format error": "CSV file format error, please ensure index and content columns", + "Custom file": "Custom text", + "Custom process": "Custom rules", + "Custom process desc": "Customize segmentation and preprocessing rules", + "Custom prompt": "Custom prompt words", + "Custom split char": "Custom delimiter", + "Custom split char Tips": "Allows you to segment based on a custom delimiter. Usually used for pre-processed data, using a specific delimiter for precise segmentation.", + "Custom text": "Custom text", + "Custom text desc": "Manually enter a text as a dataset", + "Data Preprocessing": "Data processing", + "Data file progress": "Data upload progress", + "Data process params": "Data processing parameters", + "Down load csv template": "Click to download CSV template", + "Embedding Estimated Price Tips": "Only using the index model, consumes a small amount of AI points: {{price}} points/1k Tokens", + "Estimated Price": "Estimated price: {{amount}}{{unit}}", + "Estimated Price Tips": "QA billing is\nInput: {{charsPointsPrice}} points/1k Tokens", + "Estimated points": "Estimated consumption {{points}} points", + "Fetch Error": "Failed to fetch link", + "Fetch Url": "Network link", + "Fetch url placeholder": "Up to 10 links, one per line.", + "Fetch url tip": "Only supports reading static links, please check the results", + "File chunk amount": "Segments: {{amount}}", + "File list": "File list", + "Ideal chunk length": "Ideal chunk length", + "Ideal chunk length Tips": "Segment by end symbols. We recommend that your document should reasonably use punctuation to ensure that each complete sentence does not exceed this value\nChinese documents recommend 400~1000\nEnglish documents recommend 600~1200", + "Import Failed": "Failed to import file", + "Import Success Tip": "A total of {{num}} sets of data successfully imported, please wait for training.", + "Import Tip": "This task cannot be terminated, it takes time to generate the index, please confirm the import. If the balance is insufficient, unfinished tasks will be paused, and can continue after recharge.", + "Import success": "Import successful, please wait for training", + "Link name": "Network link", + "Link name placeholder": "Only supports static links, if the data is empty after upload, the link may not be readable\nOne per line, up to 10 links at a time", + "Local file": "Local file", + "Local file desc": "Upload PDF, TXT, DOCX, etc. files", + "Only Show First 50 Chunk": "Only show part", + "Predicted chunk": "Predicted segmentation", + "Predicted chunk amount": "Predicted segments:{{amount}}", + "Predicted total chars": "Predicted characters: {{total}}", + "Preview chunks": "Preview segments (up to 5)", + "Preview raw text": "Preview raw text (up to 3000 characters)", + "Process way": "Processing method", + "QA Estimated Price Tips": "Requires calling the file processing model, consuming more AI points: {{price}} points/1k Tokens", + "QA Import": "QA Split", + "QA Import Tip": "According to certain rules, split the text into a larger paragraph, call AI to generate Q&A pairs for that paragraph. Has very high search accuracy, but loses a lot of content details.", + "Re Preview": "Regenerate preview", + "Select file": "Select file", + "Select source": "Select source", + "Set Chunk Error": "Text segmentation error", + "Source name": "Source name", + "Sources list": "Source list", + "Start upload": "Start upload", + "Total Chunk Preview": "Segment preview ({{totalChunks}} sets)", + "Total files": "A total of {{total}} files", + "Total tokens": "Total Tokens", + "Training mode": "Training mode", + "Upload data": "Upload data", + "Upload file progress": "File upload progress", + "Upload status": "Status", + "Upload success": "Upload successful", + "Web link": "Web link", + "Web link desc": "Read static web page content as a dataset" }, - "link": "链接", + "link": "Link", "search": { - "Basic params": "基础参数", - "Dataset Search Params": "知识库搜索配置", - "Embedding score": "语意检索得分", - "Empty result response": "空搜索回复", - "Empty result response Tips": "若填写该内容,没有搜索到合适内容时,将直接回复填写的内容。", - "Filter": "搜索过滤", - "Limit": "", - "Max Tokens": "引用上限", - "Max Tokens Tips": "单次搜索最大的 Tokens 数量,中文约1字=1.7Tokens,英文约1字=1Tokens", - "Min Similarity": "最低相关度", - "Min Similarity Tips": "不同索引模型的相关度有区别,请通过搜索测试来选择合适的数值,使用 ReRank 时,相关度可能会很低。", - "No support similarity": "仅使用结果重排或语义检索时,支持相关度过滤", - "Nonsupport": "不支持", - "Not similarity": "", - "Params Setting": "搜索参数设置", - "Quote index": "第几个引用", - "Rank": "排名", - "Rank Tip": "在所有数据中的排名", - "ReRank": "结果重排", - "ReRank desc": "使用重排模型来进行二次排序,可增强综合排名。", - "Read score": "查看得分", - "Rerank score": "结果重排得分", - "Score": "得分", - "Search type": "类型", - "Source id": "来源ID", - "Source name": "引用来源名", - "Tool description": "调用时机", - "Top K": "单次搜索上限", + "Basic params": "Basic parameters", + "Dataset Search Params": "Knowledge base search configuration", + "Embedding score": "Semantic retrieval score", + "Empty result response": "Empty search reply", + "Empty result response Tips": "If this content is filled in, a direct reply will be given when no suitable content is found.", + "Filter": "Search filter", + "Max Tokens": "Maximum tokens", + "Max Tokens Tips": "Maximum number of Tokens per search, approximately 1 Chinese character = 1.7 Tokens, 1 English character = 1 Token", + "Min Similarity": "Minimum similarity", + "Min Similarity Tips": "Different index models have different similarities, please choose the appropriate value through search testing. When using ReRank, the similarity may be very low.", + "No support similarity": "Supports similarity filtering only when using result reranking or semantic retrieval", + "Nonsupport": "Not supported", + "Params Setting": "Search parameter settings", + "Quote index": "Which quote", + "Rank": "Rank", + "Rank Tip": "Ranking among all data", + "ReRank": "Result reranking", + "ReRank desc": "Use the reranking model for secondary sorting to enhance the overall ranking.", + "Read score": "View score", + "Rerank score": "Result reranking score", + "Score": "Score", + "Search type": "Type", + "Source id": "Source ID", + "Source name": "Source name", + "Tool description": "Invocation timing", + "Top K": "Single search limit", "Using cfr": "", - "Using query extension": "使用问题优化", + "Using query extension": "Use question optimization", "mode": { - "embedding": "语义检索", - "embedding desc": "使用向量进行文本相关性查询", - "fullTextRecall": "全文检索", - "fullTextRecall desc": "使用传统的全文检索,适合查找一些关键词和主谓语特殊的数据", - "mixedRecall": "混合检索", - "mixedRecall desc": "使用向量检索与全文检索的综合结果返回,使用RRF算法进行排序。" + "embedding": "Semantic retrieval", + "embedding desc": "Use vectors for text relevance queries", + "fullTextRecall": "Full-text retrieval", + "fullTextRecall desc": "Use traditional full-text retrieval, suitable for finding some keywords and special subject-predicate data", + "mixedRecall": "Mixed retrieval", + "mixedRecall desc": "Return the combined results of vector retrieval and full-text retrieval, sorted using the RRF algorithm." }, "score": { - "embedding": "语义检索", - "embedding desc": "通过计算向量之间的距离获取得分,范围为 0~1。", - "fullText": "全文检索", - "fullText desc": "计算相同关键词的得分,范围为 0~无穷。", - "fullTextRecall": "", - "fullTextRecall desc": "", - "mixedRecall": "", - "mixedRecall desc": "", - "reRank": "结果重排", - "reRank desc": "通过 ReRank 模型计算句子之间的关联度,范围为 0~1。", - "rrf": "综合排名", - "rrf desc": "通过倒排计算的方式,合并多个检索结果。" + "embedding": "Semantic retrieval", + "embedding desc": "Obtain scores by calculating the distance between vectors, ranging from 0 to 1.", + "fullText": "Full-text retrieval", + "fullText desc": "Calculate the score of the same keywords, ranging from 0 to infinity.", + "reRank": "Result reranking", + "reRank desc": "Calculate the relevance between sentences using the ReRank model, ranging from 0 to 1.", + "rrf": "Comprehensive ranking", + "rrf desc": "Merge multiple search results by inverted calculation." }, - "search mode": "搜索模式" + "search mode": "Search mode" }, "settings": { - "Search basic params": "检索参数" + "Search basic params": "Search parameters" }, "status": { - "active": "已就绪", - "syncing": "同步中" + "active": "Ready", + "syncing": "Syncing" }, "test": { - "Batch test": "批量测试", - "Batch test Placeholder": "选择一个 Csv 文件", - "Search Test": "搜索测试", - "Test": "测试", - "Test File": "批量测试", - "Test Result": "测试结果", - "Test Text": "单个文本测试", - "Test Text Placeholder": "输入需要测试的文本", - "Test params": "测试参数", - "delete test history": "删除该测试结果", - "test history": "测试历史", - "test result placeholder": "测试结果将在这里展示", - "test result tip": "根据知识库内容与测试文本的相似度进行排序,你可以根据测试结果调整对应的文本。\n注意:测试记录中的数据可能已经被修改过,点击某条测试数据后将展示最新的数据。" + "Batch test": "Batch test", + "Batch test Placeholder": "Select a Csv file", + "Search Test": "Search test", + "Test": "Test", + "Test File": "Batch test", + "Test Result": "Test result", + "Test Text": "Single text test", + "Test Text Placeholder": "Enter the text to be tested", + "Test params": "Test parameters", + "delete test history": "Delete this test result", + "test history": "Test history", + "test result placeholder": "Test results will be displayed here", + "test result tip": "Sort based on the similarity between the knowledge base content and the test text. You can adjust the corresponding text according to the test results.\nNote: The data in the test record may have been modified, clicking on a test data will display the latest data." }, "training": { - "Agent queue": "QA训练排队", - "Auto mode": "增强处理(实验)", - "Auto mode Tip": "通过子索引以及调用模型生成相关问题与摘要,来增加数据块的语义丰富度,更利于检索。需要消耗更多的存储空间和增加AI调用次数。", - "Chunk mode": "直接分段", - "Full": "预计5分钟以上", - "Leisure": "空闲", + "Agent queue": "QA training queue", + "Auto mode": "Enhanced processing (experimental)", + "Auto mode Tip": "Increase the semantic richness of data blocks by generating related questions and summaries through sub-indexes and model calls, which is more conducive to retrieval. Requires more storage space and increases AI call frequency.", + "Chunk mode": "Direct segmentation", + "Full": "Estimated more than 5 minutes", + "Leisure": "Idle", "Manual": "", - "Manual mode": "手动导入", - "QA mode": "问答拆分", - "Vector queue": "索引排队", - "Waiting": "预计5分钟", - "Website Sync": "Web 站点同步" + "Manual mode": "Manual import", + "QA mode": "Question and answer split", + "Vector queue": "Index queue", + "Waiting": "Estimated 5 minutes", + "Website Sync": "Web site sync" }, "website": { - "Base Url": "根地址", - "Config": "Web站点配置", - "Config Description": "Web 站点同步功能允许你填写一个网站的根地址,系统会自动深度抓取相关的网页进行知识库训练。仅会抓取静态的网站,以项目文档、博客为主。", - "Confirm Create Tips": "确认同步该站点,同步任务将随后开启,请确认!", - "Confirm Update Tips": "确认更新站点配置?会立即按新的配置开始同步,请确认!", - "Selector": "选择器", - "Selector Course": "使用教程", - "Start Sync": "开始同步", - "UnValid Website Tip": "您的站点可能非静态站点,无法同步" + "Base Url": "Base URL", + "Config": "Web site configuration", + "Config Description": "The Web site sync feature allows you to fill in a website's base URL, and the system will automatically crawl related web pages for knowledge base training. Only static sites will be crawled, mainly project documentation and blogs.", + "Confirm Create Tips": "Confirm to sync this site, the sync task will start subsequently, please confirm!", + "Confirm Update Tips": "Confirm to update the site configuration? It will start syncing immediately according to the new configuration, please confirm!", + "Selector": "Selector", + "Selector Course": "Selector tutorial", + "Start Sync": "Start sync", + "UnValid Website Tip": "Your site may be a non-static site and cannot be synced" } }, "module": { - "Add question type": "添加问题类型", - "Can not connect self": "不能连接自身", - "Confirm Delete Node": "确认删除该节点?", - "Data Type": "数据类型", + "Add question type": "Add question type", + "Can not connect self": "Cannot connect to self", + "Confirm Delete Node": "Confirm delete node?", + "Data Type": "Data type", "Dataset quote": { - "Add quote": "添加引用", - "Concat result": "合并结果", - "Input description": "可接收知识库搜索的结果。", - "label": "知识库引用" + "Add quote": "Add quote", + "Concat result": "Concatenate result", + "Input description": "Can accept results from knowledge base searches.", + "label": "Knowledge base quote" }, - "Default Value": "默认值", - "Default value": "默认值", - "Default value placeholder": "不填则默认返回空字符", - "Edit intro": "编辑描述", - "Field Description": "字段描述", - "Field Name": "字段名", - "Field Type": "字段类型", - "Field key": "字段Key", - "Http request props": "请求参数", - "Http request settings": "请求配置", - "Input Type": "输入类型", - "Laf sync params": "同步参数", - "Max Length": "最大长度", - "Max Length placeholder": "输入文本的最大长度", - "Max Value": "最大值", - "Min Value": "最小值", - "Model List": "模型列表", - "No Config Tips": "无可配置项", - "Output Type": "输出类型", - "Plugin output must connect": "自定义输出必须全部连接", - "Plugin tool Description": "工具参数需要描述", + "Default Value": "Default value", + "Default value": "Default value", + "Default value placeholder": "If not filled, the default return is an empty string", + "Edit intro": "Edit description", + "Field Description": "Field description", + "Field Name": "Field name", + "Field Type": "Field type", + "Field key": "Field key", + "Http request props": "Request parameters", + "Http request settings": "Request settings", + "Input Type": "Input type", + "Laf sync params": "Synchronize parameters", + "Max Length": "Maximum length", + "Max Length placeholder": "Maximum length of input text", + "Max Value": "Maximum value", + "Min Value": "Minimum value", + "Model List": "Model list", + "No Config Tips": "No configurable items", + "Output Type": "Output type", + "Plugin output must connect": "Custom output must be fully connected", + "Plugin tool Description": "Tool parameters need description", "QueryExtension": { - "placeholder": "例如:\n关于 python 的介绍和使用等问题。\n当前对话与游戏《GTA5》有关。", - "tip": "描述当前对话的范围,便于AI补全首次问题或模糊的问题,从而增强知识库连续对话的能力。建议开启该功能后,都简单的描述在对话的背景,否则容易造成补全对象不准确。" + "placeholder": "For example:\nIntroduction and usage of python.\nThe current conversation is related to the game 'GTA5'.", + "tip": "Describe the scope of the current conversation to facilitate AI to complete the first question or vague questions, thereby enhancing the ability of continuous dialogue in the knowledge base. It is recommended to briefly describe the background of the conversation after enabling this function, otherwise it may lead to inaccurate completion targets." }, - "Quote prompt setting": "引用提示词配置", + "Quote prompt setting": "Quote prompt setting", "Qupte prompt setting": "", - "Select Data List": "数据列表", - "Select app": "选择应用", - "Setting quote prompt": "配置引用提示词", - "Unlink tip": "【{{name}}】存在未填或未连接参数", - "Variable": "全局变量", - "Variable Setting": "变量设置", - "Variable import": "外部参数输入", + "Select Data List": "Select data list", + "Select app": "Select app", + "Setting quote prompt": "Configure quote prompt", + "Unlink tip": "【{{name}}】has unfilled or unconnected parameters", + "Variable": "Global variable", + "Variable Setting": "Variable setting", + "Variable import": "External parameter input", "edit": { - "Field Already Exist": "key 重复", - "Field Edit": "字段编辑", - "Field Name Cannot Be Empty": "字段名不能为空" + "Field Already Exist": "Key already exists", + "Field Edit": "Field edit", + "Field Name Cannot Be Empty": "Field name cannot be empty" }, "extract": { - "Add field": "新增字段", - "Enum Description": "列举出该字段可能的值,每行一个", - "Enum Value": "枚举值", - "Field Description Placeholder": "姓名/年龄/sql语句……", - "Field Setting Title": "提取字段配置", - "Required": "必须返回", - "Required Description": "即使无法提取该字段,也会使用默认值进行返回", - "Target field": "目标字段" + "Add field": "Add field", + "Enum Description": "List possible values for the field, one per line", + "Enum Value": "Enumeration value", + "Field Description Placeholder": "Name/age/SQL statement...", + "Field Setting Title": "Extract field configuration", + "Required": "Must return", + "Required Description": "Even if the field cannot be extracted, the default value will be returned", + "Target field": "Target field" }, "http": { - "Add props": "添加参数", - "AppId": "应用的ID", - "ChatId": "当前对话ID", - "Current time": "当前时间", - "Histories": "最近10条聊天记录", - "Key already exists": "Key 已经存在", - "Key cannot be empty": "参数名不能为空", - "Props name": "参数名", - "Props tip": "可以设置 Http 请求的相关参数\n可通过 {{key}} 来调用全局变量或外部参数输入,当前可使用变量:\n{{variable}}", - "Props value": "参数值", - "ResponseChatItemId": "AI回复的ID", - "Url and params have been split": "路径参数已被自动加入 Params 中", - "Variables": "全局变量", - "curl import": "curl 导入", - "curl import placeholder": "请输入 curl 格式内容,将会提取第一个接口的请求信息。", + "Add props": "Add parameters", + "AppId": "Application ID", + "ChatId": "Current chat ID", + "Current time": "Current time", + "Histories": "Last 10 chat records", + "Key already exists": "Key already exists", + "Key cannot be empty": "Parameter name cannot be empty", + "Props name": "Parameter name", + "Props tip": "Can set HTTP request related parameters\nCan use {{key}} to call global variables or external parameter input, currently available variables:\n{{variable}}", + "Props value": "Parameter value", + "ResponseChatItemId": "AI response ID", + "Url and params have been split": "Path parameters have been automatically added to Params", + "Variables": "Global variables", + "curl import": "curl import", + "curl import placeholder": "Please enter curl format content, the request information of the first interface will be extracted.", "params": "Params" }, "input": { - "Add Input": "添加入参", - "Input Number": "入参: {{length}}", - "add": "添加条件", - "Add Branch": "添加分支", + "Add Input": "Add input", + "Input Number": "Input: {{length}}", + "add": "Add condition", + "Add Branch": "Add branch", "description": { - "Background": "你可以添加一些特定内容的介绍,从而更好的识别用户的问题类型。这个内容通常是给模型介绍一个它不知道的内容。", - "HTTP Dynamic Input": "接收前方节点的输出值作为变量,这些变量可以被HTTP请求参数使用。", - "Http Request Header": "自定义请求头,请严格填入JSON字符串。\n1. 确保最后一个属性没有逗号\n2. 确保 key 包含双引号\n例如: {\"Authorization\":\"Bearer xxx\"}", - "Http Request Url": "新的HTTP请求地址。如果出现两个“请求地址”,可以删除该模块重新加入,会拉取最新的模块配置。", - "Quote": "对象数组格式,结构:\n [{q:'问题',a:'回答'}]", - "Response content": "可以使用 \\n 来实现连续换行。\n可以通过外部模块输入实现回复,外部模块输入时会覆盖当前填写的内容。\n如传入非字符串类型数据将会自动转成字符串", - "TFSwitch textarea": "允许定义一些字符串来实现 false 匹配,每行一个,支持正则表达式。", - "Trigger": "大部分时候,你不需要连接该属性。\n当你需要延迟执行,或精确控制执行时机时,可以连接该属性。", - "dynamic input": "接收用户动态添加的参数,会在运行时将这些参数平铺传入", - "textEditor textarea": "可以通过 {{key}} 的方式引用传入的变量。变量仅支持字符串或数字。" + "Background": "You can add some specific content introductions to better identify the user's question type. This content is usually to introduce something unknown to the model.", + "HTTP Dynamic Input": "Receives the output value of the previous node as a variable, which can be used by HTTP request parameters.", + "Http Request Header": "Custom request headers, please strictly fill in JSON strings.\n1. Ensure there is no comma after the last property\n2. Ensure key includes double quotes\nFor example: {\"Authorization\":\"Bearer xxx\"}", + "Http Request Url": "New HTTP request URL. If there are two 'request URLs', you can delete this module and re-add it to pull the latest module configuration.", + "Quote": "Object array format, structure:\n [{q:'question',a:'answer'}]", + "Response content": "Can use \\n to achieve continuous line breaks.\nCan be overridden by external module input. If non-string type data is passed in, it will be automatically converted to string", + "TFSwitch textarea": "Allows defining some strings to achieve false matching, one per line, supports regular expressions.", + "Trigger": "Most of the time, you do not need to connect this property.\nWhen you need to delay execution, or precisely control the timing of execution, you can connect this property.", + "dynamic input": "Receives dynamically added parameters by the user, which will be spread into the runtime", + "textEditor textarea": "Can refer to passed variables using {{key}}. Variables only support strings or numbers." }, "label": { - "Background": "背景知识", - "Classify model": "分类模型", - "Http Request Header": "请求头", - "Http Request Method": "请求方式", - "Http Request Url": "请求地址", - "LLM": "AI 模型", - "Quote": "引用内容", - "Response content": "回复的内容", - "Select dataset": "选择知识库", - "TFSwitch input tip": "任意内容输入", - "TFSwitch textarea": "自定义 False 匹配规则", - "aiModel": "AI 模型", + "Background": "Background knowledge", + "Classify model": "Classification model", + "Http Request Header": "Request header", + "Http Request Method": "Request method", + "Http Request Url": "Request URL", + "LLM": "AI model", + "Quote": "Quote content", + "Response content": "Response content", + "Select dataset": "Select knowledge base", + "TFSwitch input tip": "Any content input", + "TFSwitch textarea": "Custom False matching rules", + "aiModel": "AI model", "anyInput": "", - "chat history": "聊天记录", - "switch": "触发器", - "system params": "系统参数", - "textEditor textarea": "文本编辑", - "user question": "用户问题" + "chat history": "Chat history", + "switch": "Trigger", + "system params": "System parameters", + "textEditor textarea": "Text editor", + "user question": "User question" }, "placeholder": { - "Classify background": "例如: \n1. AIGC(人工智能生成内容)是指使用人工智能技术自动或半自动地生成数字内容,如文本、图像、音乐、视频等。\n2. AIGC技术包括但不限于自然语言处理、计算机视觉、机器学习和深度学习。这些技术可以创建新内容或修改现有内容,以满足特定的创意、教育、娱乐或信息需求。" + "Classify background": "For example: \n1. AIGC (Artificial Intelligence Generated Content) refers to the use of artificial intelligence technology to automatically or semi-automatically generate digital content, such as text, images, music, videos, etc.\n2. AIGC technology includes but is not limited to natural language processing, computer vision, machine learning, and deep learning. These technologies can create new content or modify existing content to meet specific creative, educational, entertainment, or informational needs." } }, "inputType": { @@ -953,754 +915,689 @@ "textarea": "" }, "laf": { - "Select laf function": "选择laf函数" + "Select laf function": "Select laf function" }, "output": { - "Add Output": "添加出参", - "Output Number": "出参: {{length}}", + "Add Output": "Add output", + "Output Number": "Output: {{length}}", "description": { - "Ai response content": "将在 stream 回复完毕后触发", - "New context": "将本次回复内容拼接上历史记录,作为新的上下文返回", - "Quote": "始终返回数组,如果希望搜索结果为空时执行额外操作,需要用到上面的两个输入以及目标模块的触发器", - "query extension result": "以字符串数组的形式输出,可将该结果直接连接到“知识库搜索”的“用户问题”中,建议不要连接到“AI对话”的“用户问题”中", - "running done": "模块调用结束时触发" + "Ai response content": "Triggered after the stream response is complete", + "New context": "Concatenate this response content with historical records to return as a new context", + "Quote": "Always returns an array, if you wish to perform additional operations when the search result is empty, you need to use the above two inputs and the target module's trigger", + "query extension result": "Outputs as an array of strings, can directly connect this result to 'Knowledge base search' 'User question', it is recommended not to connect to 'AI dialogue' 'User question'", + "running done": "Triggered when module invocation ends" }, "label": { - "Ai response content": "AI回复内容", - "New context": "新的上下文", - "Quote": "引用内容", - "Search result empty": "搜索结果为空", - "Search result not empty": "搜索结果不为空", - "query extension result": "优化结果", + "Ai response content": "AI response content", + "New context": "New context", + "Quote": "Quote content", + "Search result empty": "Search result empty", + "Search result not empty": "Search result not empty", + "query extension result": "Optimized result", "result false": "False", "result true": "True", - "running done": "模块调用结束", - "text": "文本输出" + "running done": "Module invocation ends", + "text": "Text output" } }, "template": { - "AI response switch tip": "如果你希望当前节点不输出内容,可以关闭该开关。AI输出的内容不会展示给用户,你可以手动的使用“AI回复内容”进行特殊处理。", - "AI support tool tip": "支持函数调用的模型,可以更好的使用工具调用。", - "Ai chat": "AI 对话", - "Ai chat intro": "AI 大模型对话", - "App system setting": "系统配置", - "Assigned reply": "指定回复", - "Assigned reply intro": "该模块可以直接回复一段指定的内容。常用于引导、提示。非字符串内容传入时,会转成字符串进行输出。", - "Basic Node": "基础功能", - "Chat entrance": "对话入口", - "Chat entrance intro": "当用户发送一个内容后,流程将会从这个模块开始执行。", - "Classify question": "问题分类", - "Classify question intro": "根据用户的历史记录和当前问题判断该次提问的类型。可以添加多组问题类型,下面是一个模板例子:\n类型1: 打招呼\n类型2: 关于商品“使用”问题\n类型3: 关于商品“购买”问题\n类型4: 其他问题", - "Dataset search": "知识库搜索", - "Dataset search intro": "调用知识库搜索能力,查找有可能与问题相关的内容", - "Dataset search result concat intro": "可以将多个知识库搜索结果进行合并输出。使用 RRF 的合并方式进行最终排序输出。", - "External module": "外部调用", - "Extract field": "文本内容提取", - "Extract field intro": "可从文本中提取指定的数据,例如:sql语句、搜索关键词、代码等", - "Function module": "功能调用", - "Guide module": "引导模块", - "Http request": "HTTP 请求", - "Http request intro": "可以发出一个 HTTP 请求,实现更为复杂的操作(联网搜索、数据库查询等)", - "My plugin module": "个人插件", - "Query extension": "问题优化", - "Query extension intro": "使用问题优化功能,可以提高知识库连续对话时搜索的精度。使用该功能后,会先利用 AI 根据上下文构建一个或多个新的检索词,这些检索词更利于进行知识库搜索。该模块已内置在知识库搜索模块中,如果您仅进行一次知识库搜索,可直接使用知识库内置的补全功能。", - "Response module": "文本输出", - "Running app": "应用调用", - "Running app intro": "可以选择一个其他应用进行调用", - "System Plugin": "系统插件", - "System input module": "系统输入", - "TFSwitch": "判断器", - "TFSwitch intro": "根据传入的内容进行 True False 输出。默认情况下,当传入的内容为 false, undefined, null, 0, none 时,会输出 false。你也可以增加一些自定义的字符串来补充输出 false 的内容。非字符、非数字、非布尔类型,直接输出 True。", - "Team Plugin": "团队插件", - "Tool module": "工具", - "UnKnow Module": "未知模块", - "User guide": "用户引导", - "http body placeholder": "与APIFox相同的语法", - "textEditor": "文本加工", - "textEditor intro": "可对固定或传入的文本进行加工后输出,非字符串类型数据最终会转成字符串类型。" + "AI response switch tip": "If you wish the current node not to output content, you can turn off this switch. AI output content will not be displayed to the user, you can manually use 'AI response content' for special processing.", + "AI support tool tip": "Supports function calls model, can better use tool invocation.", + "Ai chat": "AI chat", + "Ai chat intro": "AI large model dialogue", + "App system setting": "System configuration", + "Assigned reply": "Assigned reply", + "Assigned reply intro": "This module can directly reply with a specified content. Commonly used for guidance, prompts. Non-string content passed in will be converted to string for output.", + "Basic Node": "Basic function", + "Chat entrance": "Chat entrance", + "Chat entrance intro": "When a user sends a content, the process will start executing from this module.", + "Classify question": "Question classification", + "Classify question intro": "Based on the user's history and current question to judge the type of this question. Multiple question types can be added, below is a template example:\nType 1: Greeting\nType 2: About product 'use' questions\nType 3: About product 'purchase' questions\nType 4: Other questions", + "Dataset search": "Knowledge base search", + "Dataset search intro": "Calls the knowledge base search capability to find content that may be related to the question", + "Dataset search result concat intro": "Can concatenate multiple knowledge base search results for output. Uses RRF's merge method for final sorting output.", + "External module": "External call", + "Extract field": "Text content extraction", + "Extract field intro": "Can extract specified data from text, such as: SQL statements, search keywords, code, etc", + "Function module": "Function call", + "Guide module": "Guide module", + "Http request": "HTTP request", + "Http request intro": "Can send an HTTP request to perform more complex operations (online search, database query, etc)", + "My plugin module": "Personal plugin", + "Query extension": "Question optimization", + "Query extension intro": "Using the question optimization function can improve the accuracy of continuous dialogue search in the knowledge base. After using this function, AI will first use the context to construct one or more new search terms, which are more conducive to knowledge base search. This module is already built into the knowledge base search module, if you only perform one knowledge base search, you can directly use the built-in completion function of the knowledge base.", + "Response module": "Text output", + "Running app": "Application call", + "Running app intro": "Can choose another application for invocation", + "System Plugin": "System plugin", + "System input module": "System input", + "TFSwitch": "Judger", + "TFSwitch intro": "Outputs True or False based on the input content. By default, when the input content is false, undefined, null, 0, none, it will output false. You can also add some custom strings to supplement the output of false content. Non-character, non-number, non-boolean types, directly output True.", + "Team Plugin": "Team plugin", + "Tool module": "Tool", + "UnKnow Module": "Unknown module", + "User guide": "User guide", + "http body placeholder": "Same syntax as APIFox", + "textEditor": "Text processing", + "textEditor intro": "Can process fixed or passed text for output, non-string type data will ultimately be converted to string type." }, "templates": { - "Load plugin error": "加载插件失败" + "Load plugin error": "Load plugin error" }, "textEditor": { - "Text Edit": "文本加工" + "Text Edit": "Text processing" }, "tool": { - "Tool input": "工具输入" + "Tool input": "Tool input" }, "valueType": { - "any": "任意", - "arrayBoolean": "布尔数组", - "arrayNumber": "数字数组", - "arrayObject": "对象数组", - "arrayString": "字符串数组", - "boolean": "布尔", - "chatHistory": "历史记录", - "datasetQuote": "知识库类型", - "dynamicTargetInput": "动态字段输入", - "number": "数字", - "object": "对象", - "selectApp": "应用选择", - "selectDataset": "知识库选择", - "string": "字符串", - "tools": "工具调用" + "any": "Any", + "arrayBoolean": "Boolean array", + "arrayNumber": "Number array", + "arrayObject": "Object array", + "arrayString": "String array", + "boolean": "Boolean", + "chatHistory": "Chat history", + "datasetQuote": "Knowledge base type", + "dynamicTargetInput": "Dynamic field input", + "number": "Number", + "object": "Object", + "selectApp": "Select app", + "selectDataset": "Select knowledge base", + "string": "String", + "tools": "Tool invocation" }, "variable": { - "Custom type": "自定义变量", - "add option": "添加选项", - "input type": "文本", - "key": "变量 key", - "key is required": "变量key是必须的", - "select type": "下拉单选", - "text max length": "最大长度", - "textarea type": "段落", - "variable key is required": "变量 key 不能为空", - "variable name": "变量名", - "variable name is required": "变量名不能为空", - "variable option is required": "选项不能全空", - "variable option is value is required": "选项内容不能为空", - "variable options": "选项" + "Custom type": "Custom variable", + "add option": "Add option", + "input type": "Text", + "key": "Variable key", + "key is required": "Variable key is required", + "select type": "Dropdown single select", + "text max length": "Maximum length", + "textarea type": "Paragraph", + "variable key is required": "Variable key cannot be empty", + "variable name": "Variable name", + "variable name is required": "Variable name cannot be empty", + "variable option is required": "Options cannot be all empty", + "variable option is value is required": "Option content cannot be empty", + "variable options": "Options" }, - "variable add option": "添加选项" + "variable add option": "Add option" }, "plugin": { - "Custom headers": "自定义请求头", - "Delete http plugin": "确认删除该组HTTP插件?会删除该目录下所有插件。", - "Get Plugin Module Detail Failed": "加载插件异常", - "Http plugin intro placeholder": "仅做展示,无实际效果", - "Intro placeholder": "如果该插件作为工具被调用,则会使用该介绍作为提示词。" + "Custom headers": "Custom headers", + "Delete http plugin": "Confirm to delete this group of HTTP plugins? This will delete all plugins in the directory.", + "Get Plugin Module Detail Failed": "Plugin loading failed", + "Http plugin intro placeholder": "For display only, no actual effect", + "Intro placeholder": "If this plugin is used as a tool, this introduction will be used as a prompt." }, "shareChat": { - "Init Error": "初始化对话框失败", - "Init History Error": "初始化聊天记录失败" + "Init Error": "Failed to initialize chat dialog", + "Init History Error": "Failed to initialize chat history" }, "workflow": { - "Add variable": "新增变量", - "Can not delete node": "该节点不允许删除", - "Change input type tip": "修改输入类型会清空已填写的值,请确认!", - "Check Failed": "工作流校验失败,请检查节点是否正确填值,以及连线是否正常", - "Confirm stop debug": "确认终止调试?调试信息将会不保留。", - "Copy node": "已复制节点", - "Current workflow": "当前工作流", - "Custom inputs": "自定义输入", - "Custom outputs": "自定义输出", - "Custom variable": "自定义变量", - "Dataset quote": "知识库引用", - "Debug": "调试", - "Debug Node": "Debug模式", - "Failed": "运行失败", - "Not intro": "这个节点没有介绍~\\", - "Run from here": "从这里开始运行", - "Run result": "", - "Running": "运行中", - "Skipped": "跳过运行", - "Stop debug": "停止调试", - "Success": "运行成功", - "Value type": "数据类型", + "Add variable": "Add variable", + "Can not delete node": "This node cannot be deleted", + "Change input type tip": "Changing the input type will clear the filled values, please confirm!", + "Check Failed": "Workflow validation failed, please check if the nodes are correctly filled and the connections are normal", + "Confirm stop debug": "Confirm to stop debugging? Debugging information will not be preserved.", + "Copy node": "Node copied", + "Current workflow": "Current workflow", + "Custom inputs": "Custom inputs", + "Custom outputs": "Custom outputs", + "Custom variable": "Custom variable", + "Dataset quote": "Knowledge base quote", + "Debug": "Debug", + "Debug Node": "Debug mode", + "Failed": "Execution failed", + "Not intro": "This node has no introduction~\\", + "Run from here": "Run from here", + "Run result": "Run result", + "Running": "Running", + "Skipped": "Skipped execution", + "Stop debug": "Stop debugging", + "Success": "Execution successful", + "Value type": "Data type", "Variable": { - "Variable type": "变量类型" + "Variable type": "Variable type" }, - "Variable outputs": "全局变量", + "Variable outputs": "Global variables", "chat": { - "Quote prompt": "引用提示词" + "Quote prompt": "Quote prompt" }, "debug": { - "Done": "完成调试", - "Hide result": "隐藏结果", - "Not result": "无运行结果", - "Run result": "运行结果", - "Show result": "展示结果" + "Done": "Debugging completed", + "Hide result": "Hide result", + "Not result": "No run result", + "Run result": "Run result", + "Show result": "Show result" }, "inputType": { - "JSON Editor": "JSON 输入框", - "Manual input": "手动输入", - "Manual select": "手动选择", - "Reference": "变量引用", - "Required": "必填", - "Select edit field": "可编辑内容", - "Select input default value": "默认值", - "Select input type": "可配置的输入类型", - "Select input type placeholder": "请选择可配置的输入类型", - "chat history": "历史记录", - "dynamicTargetInput": "动态外部数据", - "input": "单行输入框", - "number input": "数字输入框", - "selectApp": "应用选择", - "selectDataset": "知识库选择", - "selectLLMModel": "对话模型选择", - "switch": "开关", - "target": "外部数据", - "textarea": "多行输入框" + "JSON Editor": "JSON Editor", + "Manual input": "Manual input", + "Manual select": "Manual select", + "Reference": "Variable reference", + "Required": "Required", + "Select edit field": "Editable content", + "Select input default value": "Default value", + "Select input type": "Configurable input type", + "Select input type placeholder": "Please select a configurable input type", + "chat history": "Chat history", + "dynamicTargetInput": "Dynamic external data", + "input": "Single line input box", + "number input": "Number input box", + "selectApp": "App selection", + "selectDataset": "Knowledge base selection", + "selectLLMModel": "Dialogue model selection", + "switch": "Switch", + "target": "External data", + "textarea": "Multi-line input box" }, "publish": { - "OnRevert version": "点击回退到该版本", - "OnRevert version confirm": "确认回退至该版本?会为您保存编辑中版本的配置,并为回退版本创建一个新的发布版本。", - "histories": "发布记录" + "OnRevert version": "Click to revert to this version", + "OnRevert version confirm": "Confirm to revert to this version? It will save the configuration of the version being edited and create a new published version for the reverted version.", + "histories": "Publishing records" }, "tool": { - "Handle": "工具连接器", - "Select Tool": "选择工具" + "Handle": "Tool connector", + "Select Tool": "Select tool" }, - "value": "值", - "variable": "变量" + "value": "Value", + "variable": "Variable" } }, "dataset": { - "Confirm move the folder": "确认移动到该目录", - "Confirm to delete the data": "确认删除该数据?", - "Confirm to delete the file": "确认删除该文件及其所有数据?", - "Create Folder": "创建文件夹", - "Create manual collection": "创建手动数据集", - "Delete Dataset Error": "删除知识库异常", - "Edit Folder": "编辑文件夹", - "Export": "导出", - "Export Dataset Limit Error": "导出数据失败", - "File Input": "文件导入", - "File Size": "文件大小", - "Filename": "文件名", - "Files": "文件: {{total}}个", - "Folder Name": "输入文件夹名称", - "Insert Data": "插入", - "Manual Data": "手动录入", - "Manual Input": "手动录入", - "Manual Mark": "手动标注", - "Manual collection Tip": "手动数据集允许创建一个空的容器装入数据", - "Mark Data": "标注数据", - "Move Failed": "移动出现错误~", - "Queue Desc": "该数据是指整个系统当前待训练的数量。{{title}} 采用排队训练的方式,如果待训练的数据过多,可能需要等待一段时间", - "Select Dataset": "选择该知识库", - "Select Dataset Tips": "仅能选择同一个索引模型的知识库", - "Select Folder": "进入文件夹", - "Training Name": "数据训练", - "Upload Time": "上传时间", + "Confirm move the folder": "Confirm moving to the folder", + "Confirm to delete the data": "Confirm to delete the data?", + "Confirm to delete the file": "Confirm to delete the file and all its data?", + "Create Folder": "Create Folder", + "Create manual collection": "Create manual collection", + "Delete Dataset Error": "Delete Dataset Error", + "Edit Folder": "Edit Folder", + "Export": "Export", + "Export Dataset Limit Error": "Export Dataset Error", + "File Input": "File Input", + "File Size": "File Size", + "Filename": "Filename", + "Files": "Files: {{total}}", + "Folder Name": "Enter folder name", + "Insert Data": "Insert Data", + "Manual Data": "Manual Data", + "Manual Input": "Manual Input", + "Manual Mark": "Manual Mark", + "Manual collection Tip": "Manual collections allow you to create an empty container to store data", + "Mark Data": "Mark Data", + "Move Failed": "Move Failed~", + "Queue Desc": "This data refers to the total number of training items currently in the system. {{title}} uses a queued training method, and if there are too many items waiting for training, it may take some time.", + "Select Dataset": "Select this dataset", + "Select Dataset Tips": "Only datasets from the same index model can be selected", + "Select Folder": "Enter folder", + "Training Name": "Data Training", + "Upload Time": "Upload Time", "collections": { - "Click to view file": "点击查看文件详情", - "Click to view folder": "进入目录", - "Collection Embedding": "{{total}}组索引中", - "Confirm to delete the folder": "确认删除该文件夹及里面所有内容?", - "Create And Import": "新建/导入", - "Create Training Data": "文件训练-{{filename}}", - "Create manual collection Success": "创建手动数据集成功", - "Data Amount": "数据总量", - "Select Collection": "选择文件", - "Select One Collection To Store": "选择一个文件进行存储" + "Click to view file": "Click to view file details", + "Click to view folder": "Enter folder", + "Collection Embedding": "{{total}} groups indexing", + "Confirm to delete the folder": "Confirm to delete the folder and all its contents?", + "Create And Import": "Create/Import", + "Create Training Data": "File Training-{{filename}}", + "Create manual collection Success": "Manual collection created successfully", + "Data Amount": "Total data", + "Select Collection": "Select file", + "Select One Collection To Store": "Select a file to store" }, "data": { - "Add Index": "新增自定义索引", - "Can not delete tip": "无修改权限", - "Can not edit": "无编辑权限", - "Custom Index Number": "自定义索引{{number}}", - "Default Index": "默认索引", - "Delete Success Tip": "删除成功", - "Delete Tip": "确认删除该条数据?", - "File import": "文件导入", - "Index Edit": "数据索引", - "Index Placeholder": "输入索引文本内容", - "Input Data": "导入新数据", - "Input Success Tip": "导入数据成功", - "Update Data": "更新数据", - "Update Success Tip": "更新数据成功", + "Add Index": "Add custom index", + "Can not delete tip": "No permission to modify", + "Can not edit": "No editing permission", + "Custom Index Number": "Custom Index {{number}}", + "Default Index": "Default Index", + "Delete Success Tip": "Deleted successfully", + "Delete Tip": "Confirm to delete this data?", + "File import": "File import", + "Index Edit": "Data Index", + "Index Placeholder": "Enter index text content", + "Input Data": "Import new data", + "Input Success Tip": "Data imported successfully", + "Update Data": "Update Data", + "Update Success Tip": "Data updated successfully", "edit": { - "Content": "数据内容", - "Course": "说明文档", - "Delete": "删除数据", - "Index": "数据索引({{amount}})" + "Content": "Data content", + "Course": "Documentation", + "Delete": "Delete data", + "Index": "Data Index ({{amount}})" }, - "input is empty": "数据内容不能为空 " + "input is empty": "Data content cannot be empty" }, - "deleteFolderTips": "确认删除该文件夹及其包含的所有知识库?删除后数据无法恢复,请确认!", - "import csv tip": "请确保CSV为UTF-8格式,否则会乱码", + "deleteFolderTips": "Confirm to delete this folder and all the datasets it contains? Once deleted, data cannot be recovered. Please confirm!", + "import csv tip": "Please ensure the CSV is in UTF-8 format to avoid encoding issues", "test": { - "noResult": "搜索结果为空" + "noResult": "No results found" } }, - "home": { - "AI Assistant": "AI 客服", - "AI Assistant Desc": "无论对内还是对外,AI 将 24 小时为您的用户提供服务", - "Advanced Settings": "高级编排", - "Advanced Settings Desc": "基于 Flow 的流程编排模式,让你的 AI 轻松实现数据库查询、IO 操作、联网通信等扩展能力", - "Choice Debug": "调试便捷", - "Choice Debug Desc": "拥有搜索测试、引用修改、完整对话预览等多种调试途径", - "Choice Desc": "", - "Choice Extension": "无限扩展", - "Choice Extension Desc": "基于 HTTP 实现扩展,轻松实现定制功能", - "Choice Fast": "开箱即用", - "Choice Fast Desc": "{{title}} 提供开箱即用的可视化操作,点点点即可构建 AI 应用", - "Choice Models": "支持多种模型", - "Choice Models Desc": "支持 GPT、Claude、Spark、ChatGLM等多模型", - "Choice Open": "更开放", - "Choice Open Desc": "{{title}} 遵循 Apache License 2.0 开源协议", - "Choice QA": "独特的 QA 结构", - "Choice QA Desc": "采用 QA 对的结构构建索引,适应问答、阅读等多种场景", - "Choice Visual": "可视化工作流", - "Choice Visual Desc": "可视化模块操作,轻松实现复杂工作流,让你的 AI 不再单一", - "Commercial": "商务咨询", - "Community": "社区", - "Dateset": "自动数据预处理", - "Dateset Desc": "提供手动输入、直接分段、LLM 自动处理和 CSV 等多种数据导入途径", - "Docs": "文档", - "FastGPT Ability": "{{title}} 能力", - "FastGPT Desc": "{{title}} 是一个基于 LLM 大语言模型的知识库问答系统,提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排,从而实现复杂的问答场景!", - "Features": "特点", - "Footer Developer": "开发者", - "Footer Docs": "文档", - "Footer FastGPT Cloud": "{{title}} 线上服务", - "Footer Feedback": "反馈", - "Footer Git": "源码", - "Footer Product": "产品", - "Footer Support": "支持", - "Login": "登录", - "Open": "", - "OpenAPI": "OpenAPI", - "OpenAPI Desc": "与 GPT API 一致的对外接口,助你轻松接入已有应用", - "Quickly build AI question and answer library": "快速搭建 AI 问答系统", - "Start Now": "立即开始", - "Visual AI orchestration": "可视化 AI 编排", - "Why FastGPT": "为什么选择 {{title}}", - "desc": "基于 LLM 大模型的 AI 知识库问答平台", - "navbar": { - "Use guidance": "使用引导", - "chatbot": "问答机器人" - }, - "slogan": "让 AI 更懂你的知识" + "error": { + "fileNotFound": "File not found~", + "team": { + "overSize": "Team members exceed the limit" + } }, "module": { - "Confirm Delete Module": "确认删除该自定义模块?", - "Confirm Sync Plugin": "确认同步插件最新信息?插件的连线和输入的内容将会被清空,请确认!", - "Create Your Module": "创建自定义模块", - "Intro": "模块介绍", - "Load Module Failed": "加载模块失败", - "Plugin input is not value": "自定义输入的参数不能为空", - "Plugin input is required": "插件编排必须包含一个输入模块", - "Plugin input must connect": "自定义输入模块必须全部连接", - "Preview Plugin": "预览插件", - "Save Config": "保存配置", - "Update Your Module": "更新模块信息" + "Confirm Delete Module": "Confirm to delete this custom module?", + "Confirm Sync Plugin": "Confirm to sync the latest information of the plugin? The connections and input content of the plugin will be cleared, please confirm!", + "Create Your Module": "Create your custom module", + "Intro": "Module introduction", + "Load Module Failed": "Failed to load module", + "Plugin input is not value": "The parameter of custom input cannot be empty", + "Plugin input is required": "Plugin arrangement must include an input module", + "Plugin input must connect": "All custom input modules must be connected", + "Preview Plugin": "Preview plugin", + "Save Config": "Save configuration", + "Update Your Module": "Update module information" }, "navbar": { - "Account": "账号", - "Apps": "应用", - "Apps Share": "应用分享", - "Chat": "聊天", - "Datasets": "知识库", - "Module": "模块", - "Plugin": "插件", - "Store": "应用市场", - "Tools": "工具" - }, - "openapi": { - "app key tips": "这些 key 已有当前应用标识,具体使用可参考文档", - "key alias": "key 的别名,仅用于展示", - "key tips": "你可以使用 API 秘钥访问一些特定的接口(无法访问应用,访问应用需使用应用内的API Key)" - }, - "outlink": { - "Copy IFrame": "嵌入网页", - "Copy Link": "复制", - "Create API Key": "创建新 Key", - "Create Link": "创建链接", - "Delete Link": "删除链接", - "Edit API Key": "编辑 Key 信息", - "Edit IFrame Link": "更新嵌入链接", - "Edit Link": "编辑", - "Edit Share Window": "更新分享窗口", - "Link Name": "分享链接的名字", - "Link is empty": "", - "QPM": "", - "QPM Tips": "每个 IP 每分钟最多提问多少次", - "QPM is empty": "QPM 不能为空", - "token auth": "身份验证", - "token auth Tips": "身份校验服务器地址,如填写该值,每次对话前都会向指定服务器发送一个请求,进行身份校验", - "token auth use cases": "查看身份验证使用说明" + "Account": "Account", + "Apps": "Apps", + "Apps Share": "Apps Share", + "Chat": "Chat", + "Datasets": "Knowledge Base", + "Module": "Module", + "Plugin": "Plugin", + "Store": "App Store", + "Tools": "Tools" }, "permission": { - "Private": "私有", - "Private Tip": "仅自己可用", - "Public": "团队", - "Public Tip": "团队所有成员可使用", - "Set Private": "设为私有", - "Set Public": "设为团队可用" + "Private": "Private", + "Private Tip": "Only available to oneself", + "Public": "Team", + "Public Tip": "Available to all team members", + "Set Private": "Set as private", + "Set Public": "Set as available to the team" }, "plugin": { - "App": "选择应用", - "Auth Header Prefix": "鉴权头部前缀", - "Auth Method": "鉴权方法", - "Auth Type": "鉴权类型", - "Confirm Delete": "确认删除该插件?", - "Create Your Plugin": "创建你的插件", - "Currentapp": "当前应用", - "Custom Plugin": "自定义插件", - "Description": "描述", - "Edit Http Plugin": "编辑 HTTP 插件", - "Enter Env": "输入 laf 环境", - "Enter PAT": "请输入访问凭证(PAT)", - "Func": "选择函数", - "Get Plugin Module Detail Failed": "获取插件信息异常", - "HTTP Plugin": "HTTP 插件", - "Import Plugin": "导入 HTTP 插件", - "Import from URL": "从URL导入。https://xxxx", - "Intro": "插件介绍", - "Invalid Appid": "appid 无效", - "Invalid Env": "laf 环境错误", - "Invalid Schema": "Schema 无效", - "Invalid URL": "URL 无效", - "Key": "键", - "Load Plugin Failed": "加载插件异常", - "Method": "方法", - "My Plugins": "我的插件", - "No Intro": "这个插件没有介绍~", - "None": "无", - "Path": "路径", - "Please bind laf accout first": "请先绑定 laf 账号", - "Plugin List": "插件列表", - "Plugin Module": "插件模块", - "Privacy Agreement": "隐私协议", - "Search plugin": "搜索插件", - "Set Name": "给插件取个名字", - "Synchronous app": "同步应用", - "Synchronous version": "同步版本", - "To Edit Plugin": "去编辑", - "Update Your Plugin": "更新插件", - "Value": "值", - "go to laf": "去编写", - "path": "", - "update params": "更新参数" + "App": "Select app", + "Auth Header Prefix": "Authorization header prefix", + "Auth Method": "Authorization method", + "Auth Type": "Authorization type", + "Confirm Delete": "Confirm to delete this plugin?", + "Create Your Plugin": "Create your plugin", + "Currentapp": "Current app", + "Custom Plugin": "Custom plugin", + "Description": "Description", + "Edit Http Plugin": "Edit HTTP plugin", + "Enter Env": "Enter laf environment", + "Enter PAT": "Please enter the access token (PAT)", + "Func": "Select function", + "Get Plugin Module Detail Failed": "Failed to get plugin information", + "HTTP Plugin": "HTTP plugin", + "Import Plugin": "Import HTTP plugin", + "Import from URL": "Import from URL. https://xxxx", + "Intro": "Plugin introduction", + "Invalid Appid": "Invalid appid", + "Invalid Env": "Invalid laf environment", + "Invalid Schema": "Invalid schema", + "Invalid URL": "Invalid URL", + "Key": "Key", + "Load Plugin Failed": "Failed to load plugin", + "Method": "Method", + "My Plugins": "My plugins", + "No Intro": "This plugin has no introduction~", + "None": "None", + "Path": "Path", + "Please bind laf accout first": "Please bind laf account first", + "Plugin List": "Plugin list", + "Plugin Module": "Plugin module", + "Privacy Agreement": "Privacy agreement", + "Search plugin": "Search plugin", + "Set Name": "Name the plugin", + "Synchronous app": "Synchronize app", + "Synchronous version": "Synchronize version", + "To Edit Plugin": "Go to edit", + "Update Your Plugin": "Update plugin", + "Value": "Value", + "go to laf": "Go to write", + "path": "Path", + "update params": "Update parameters" }, "support": { "account": { - "Individuation": "个性化" + "Individuation": "Personalization" }, "inform": { - "Read": "已读" + "Read": "Read" }, "openapi": { - "Api baseurl": "API根地址", - "Api manager": "API 秘钥管理", - "Copy success": "已复制 API 地址", - "Max usage": "最大额度(¥)", - "New api key": "新的 API 秘钥", - "New api key tip": "请保管好你的秘钥,秘钥不会再次展示~", - "Usage": "已用额度(¥)" + "Api baseurl": "API base URL", + "Api manager": "API key management", + "Copy success": "API address copied", + "Max usage": "Maximum quota (¥)", + "New api key": "New API key", + "New api key tip": "Please keep your key safe, it will not be shown again~", + "Usage": "Used quota (¥)" }, "outlink": { - "Delete link tip": "确认删除该免登录链接?删除后,该链接将会立即失效,对话日志仍会保留,请确认!", - "Max usage points": "积分上限", - "Max usage points tip": "该链接最多允许使用多少积分,超出后将无法使用。-1 代表无限制。", - "Usage points": "积分消耗", + "Delete link tip": "Confirm to delete this no-login link? After deletion, the link will immediately become invalid, but the conversation logs will still be retained, please confirm!", + "Max usage points": "Points limit", + "Max usage points tip": "The maximum points this link can use. Exceeding this limit will make the link unusable. -1 means unlimited.", + "Usage points": "Points used", "share": { - "Response Quote": "返回引用", - "Response Quote tips": "在分享链接中返回引用内容,但不会允许用户下载原文档" + "Response Quote": "Return quote", + "Response Quote tips": "Return quote content in the share link, but will not allow users to download the original document" } }, "standard": { - "AI Bonus Points": "AI 积分", - "Expired Time": "结束时间", - "Start Time": "开始时间", - "storage": "存储量", - "type": "类型" + "AI Bonus Points": "AI points", + "Expired Time": "End time", + "Start Time": "Start time", + "storage": "Storage amount", + "type": "Type" }, "subscription": { - "Cancel subscription": "取消订阅" + "Cancel subscription": "Cancel subscription" }, "team": { "limit": { - "No permission rerank": "无权使用结果重排,请升级您的套餐" + "No permission rerank": "No permission to use result rerank, please upgrade your plan" } }, "user": { - "AI point standard": "AI积分标准", - "Avatar": "头像", - "Go laf env": "点击前往 {{env}} 获取 PAT 凭证。", - "Laf account course": "查看绑定 laf 账号教程。", - "Laf account intro": "绑定你的laf账号后,你将可以在工作流中使用 laf 模块,实现在线编写代码。", - "Need to login": "请先登录", - "Price": "计费标准", - "User self info": "个人信息", + "AI point standard": "AI points standard", + "Avatar": "Avatar", + "Go laf env": "Click to go to {{env}} to get the PAT credential.", + "Laf account course": "View the tutorial for binding laf account.", + "Laf account intro": "After binding your laf account, you will be able to use laf modules in the workflow to write code online.", + "Need to login": "Please login first", + "Price": "Pricing standard", + "User self info": "Personal information", "auth": { - "Sending Code": "正在发送" + "Sending Code": "Sending" }, "inform": { - "System message": "系统消息" + "System message": "System message" }, "login": { - "And": "和", - "Email": "邮箱", - "Forget Password": "忘记密码?", - "Github": "Github 登录", - "Google": "Google 登录", - "Password": "密码", - "Password login": "密码登录", - "Phone": "手机号登录", - "Phone number": "手机号", - "Policy tip": "使用即代表你同意我们的", - "Privacy": "隐私政策", - "Provider error": "登录异常,请重试", - "Register": "注册账号", - "Root login": "使用root用户登录", - "Root password placeholder": "root密码为你设置的环境变量", - "Terms": "服务协议", - "Username": "用户名", - "Wechat": "微信登录", - "Wx qr login": "微信扫码登录" + "And": "and", + "Email": "Email", + "Forget Password": "Forgot password?", + "Github": "Login with Github", + "Google": "Login with Google", + "Password": "Password", + "Password login": "Password login", + "Phone": "Login with phone number", + "Phone number": "Phone number", + "Policy tip": "Using represents your agreement to our", + "Privacy": "Privacy policy", + "Provider error": "Login error, please retry", + "Register": "Register account", + "Root login": "Login with root user", + "Root password placeholder": "Root password is the environment variable you set", + "Terms": "Terms of service", + "Username": "Username", + "Wechat": "Login with Wechat", + "Wx qr login": "Wechat QR code login" }, "team": { - "Dataset usage": "知识库容量", - "Team Tags Async Success": "同步完成", - "member": "成员", + "Dataset usage": "Knowledge base capacity", + "Team Tags Async Success": "Synchronization complete", + "member": "Member", "tag": { - "Have not opened": "未开通团队聊天功能" + "Have not opened": "Team chat feature not opened" } } }, "wallet": { - "Ai point every thoundsand tokens": "{{points}}积分/1K tokens", - "Ai point every thounsand tokens": "{{points}}积分/1K tokens", - "Ai point every thousand tokens": "{{points}}积分/1K tokens", - "Amount": "金额", - "Balance not enough tip": "余额不足,请先到账号页充值", - "Bills": "账单", - "Buy": "购买", - "Buy more": "扩容", - "Confirm pay": "支付确认", - "Not sufficient": "您的 AI 积分不足,请先升级套餐或购买额外 AI 积分后继续使用。", - "Pay error": "支付失败", - "Pay success": "支付成功", - "Plan expired time": "套餐到期时间", - "Plan reset time": "套餐重置时间", - "Standard Plan Detail": "套餐详情", - "To read plan": "查看套餐", + "Ai point every thoundsand tokens": "{{points}} points/1K tokens", + "Ai point every thounsand tokens": "{{points}} points/1K tokens", + "Ai point every thousand tokens": "{{points}} points/1K tokens", + "Amount": "Amount", + "Balance not enough tip": "Insufficient balance, please recharge on the account page first", + "Bills": "Bills", + "Buy": "Buy", + "Buy more": "Expand", + "Confirm pay": "Confirm payment", + "Not sufficient": "Your AI points are insufficient, please upgrade your plan or buy additional AI points before continuing.", + "Pay error": "Payment failed", + "Pay success": "Payment successful", + "Plan expired time": "Plan expiration time", + "Plan reset time": "Plan reset time", + "Standard Plan Detail": "Plan details", + "To read plan": "View plan", "bill": { - "AI Model": "AI 模型", - "AI Type": "AI 类型", - "Number": "订单号", - "Price": "价格(¥)", - "Status": "状态", - "Type": "订单类型", + "AI Model": "AI model", + "AI Type": "AI type", + "Number": "Order number", + "Price": "Price (¥)", + "Status": "Status", + "Type": "Order type", "payWay": { - "Way": "支付方式", - "balance": "余额支付", - "wx": "微信支付" + "Way": "Payment method", + "balance": "Balance payment", + "wx": "Wechat payment" }, "status": { - "closed": "已关闭", - "notpay": "未支付", - "refund": "已退款", - "success": "支付成功" + "closed": "Closed", + "notpay": "Not paid", + "refund": "Refunded", + "success": "Payment successful" } }, "moduleName": { - "index": "索引生成", - "qa": "QA 拆分" + "index": "Index generation", + "qa": "QA split" }, - "noBill": "无账单记录~", + "noBill": "No bill records~", "subscription": { - "AI points": "AI积分", - "AI points click to read tip": "每次调用AI模型时,都会消耗一定的AI积分(类似于 Tokens)。点击可查看详细计算规则。", - "AI points tip": "每次调用AI模型时,都会消耗一定的AI积分。具体的计算标准可参考下方的“计费标准”", - "AI points usage": "AI积分使用量", - "AI points usage tip": "每次调用AI模型时,都会消耗一定的AI积分。具体的计算标准可参考上方的“计费标准”", - "Ai points": "AI 积分计算标准", - "Buy now": "切换套餐", - "Change will take effect after the current subscription expires": "更新成功。将会再下个订阅周期生效。", - "Current dataset store": "当前额外容量", - "Current extra ai points": "当前额外积分", - "Current plan": "当前套餐", - "Dataset store": "知识库容量", - "Dataset store price tip": "每月1号从账号余额里扣除", - "Expand size": "扩大容量", - "Extra ai points": "额外AI积分", - "Extra dataset size": "额外知识库容量", - "Extra plan": "额外资源包", - "Extra plan tip": "标准套餐不够时,您可以购买额外资源包继续使用", - "FAQ": "常见问题", - "Month amount": "月数", - "Next extra ai points": "下次额外积分", - "Next plan": "未来套餐", - "Next sub dataset size": "下次订阅额外容量", - "Nonsupport": "无法切换", - "Refund plan and pay confirm": "切换该套餐您无需支付额外费用,并将退换 {{amount}} 元至余额中。", - "Stand plan level": "订阅套餐", - "Standard plan pay confirm": "切换该套餐,您本次需要补充支付 {{payPrice}} 元。", - "Standard update fail": "修改订阅套餐异常", - "Standard update success": "变更订阅套餐成功!", - "Sub plan": "订阅套餐", - "Sub plan tip": "免费使用 {{title}} 或升级更高的套餐", - "Team plan and usage": "套餐与用量", - "Training weight": "训练优先级: {{weight}}", - "Update extra ai points": "额外AI积分", - "Update extra dataset size": "额外存储量", - "Upgrade plan": "升级套餐", + "AI points": "AI points", + "AI points click to read tip": "Each call to the AI model will consume a certain amount of AI points (similar to Tokens). Click to view detailed calculation rules.", + "AI points tip": "Each call to the AI model will consume a certain amount of AI points. The specific calculation standard can be referred to the 'Pricing standard' below", + "AI points usage": "AI points usage", + "AI points usage tip": "Each call to the AI model will consume a certain amount of AI points. The specific calculation standard can be referred to the 'Pricing standard' above", + "Ai points": "AI points calculation standard", + "Buy now": "Switch plan", + "Change will take effect after the current subscription expires": "Update successful. It will take effect in the next subscription period.", + "Current dataset store": "Current extra capacity", + "Current extra ai points": "Current extra points", + "Current plan": "Current plan", + "Dataset store": "Knowledge base capacity", + "Dataset store price tip": "Deducted from the account balance on the 1st of each month", + "Expand size": "Expand capacity", + "Extra ai points": "Extra AI points", + "Extra dataset size": "Extra knowledge base capacity", + "Extra plan": "Extra resource pack", + "Extra plan tip": "When the standard plan is not enough, you can buy extra resource packs to continue using", + "FAQ": "Frequently asked questions", + "Month amount": "Months", + "Next extra ai points": "Next extra points", + "Next plan": "Future plan", + "Next sub dataset size": "Next subscription extra capacity", + "Nonsupport": "Unable to switch", + "Refund plan and pay confirm": "Switching to this plan does not require additional payment, and {{amount}} yuan will be refunded to your balance.", + "Stand plan level": "Subscription plan", + "Standard plan pay confirm": "Switching to this plan, you need to pay an additional {{payPrice}} yuan this time.", + "Standard update fail": "Failed to modify subscription plan", + "Standard update success": "Subscription plan change successful!", + "Sub plan": "Subscription plan", + "Sub plan tip": "Free use of {{title}} or upgrade to a higher plan", + "Team plan and usage": "Plan and usage", + "Training weight": "Training priority: {{weight}}", + "Update extra ai points": "Extra AI points", + "Update extra dataset size": "Extra storage", + "Upgrade plan": "Upgrade plan", "function": { - "History store": "{{amount}} 天对话记录保留", - "Max app": "{{amount}} 个应用", - "Max dataset": "{{amount}} 个知识库", - "Max dataset size": "{{amount}} 组知识库索引", - "Max members": "{{amount}} 个团队成员", - "Points": "{{amount}} AI积分" + "History store": "{{amount}} days of conversation history retention", + "Max app": "{{amount}} apps", + "Max dataset": "{{amount}} knowledge bases", + "Max dataset size": "{{amount}} sets of knowledge base indexes", + "Max members": "{{amount}} team members", + "Points": "{{amount}} AI points" }, "mode": { - "Month": "按月", - "Period": "订阅周期", - "Year": "按年", - "Year sale": "赠送两个月" + "Month": "Monthly", + "Period": "Subscription period", + "Year": "Yearly", + "Year sale": "Two months free" }, "standardSubLevel": { - "enterprise": "企业版", - "experience": "体验版", + "enterprise": "Enterprise edition", + "experience": "Experience edition", "experience desc": "", - "free": "免费版", - "free desc": "每月均可免费使用基础功能,30天无使用记录时,将会清除知识库", - "team": "团队版" + "free": "Free edition", + "free desc": "Basic functions can be used for free every month, and the knowledge base will be cleared if there is no usage record for 30 days", + "team": "Team edition" }, "type": { - "balance": "余额充值", - "extraDatasetSize": "知识库扩容", - "extraPoints": "AI积分套餐", - "standard": "套餐订阅" + "balance": "Balance recharge", + "extraDatasetSize": "Knowledge base expansion", + "extraPoints": "AI points package", + "standard": "Plan subscription" } }, "usage": { - "Ai model": "AI模型", - "App name": "应用名", - "Audio Speech": "语音播放", - "Bill Module": "扣费模块", - "Chars length": "文本长度", - "Data Length": "数据长度", - "Dataset store": "知识库存储", - "Duration": "时长(秒)", - "Extension Input Token Length": "问题优化输入Tokens", - "Extension Output Token Length": "问题优化输出Tokens", - "Extension result": "问题优化结果", - "Input Token Length": "输入 Tokens", - "Module name": "模块名", + "Ai model": "AI model", + "App name": "App name", + "Audio Speech": "Audio playback", + "Bill Module": "Billing module", + "Chars length": "Text length", + "Data Length": "Data length", + "Dataset store": "Knowledge base storage", + "Duration": "Duration (seconds)", + "Extension Input Token Length": "Question optimization input Tokens", + "Extension Output Token Length": "Question optimization output Tokens", + "Extension result": "Question optimization result", + "Input Token Length": "Input Tokens", + "Module name": "Module name", "Number": "", - "Output Token Length": "输出 Tokens", - "ReRank": "结果重排", - "Source": "来源", - "Text Length": "文本长度", - "Time": "生成时间", - "Token Length": "Token长度", - "Total": "总金额", - "Total points": "AI积分消耗", - "Usage Detail": "使用详情", - "Whisper": "语音输入", - "bill username": "用户" + "Output Token Length": "Output Tokens", + "ReRank": "Result rerank", + "Source": "Source", + "Text Length": "Text length", + "Time": "Generation time", + "Token Length": "Token length", + "Total": "Total amount", + "Total points": "AI points consumed", + "Usage Detail": "Usage details", + "Whisper": "Voice input", + "bill username": "User" } } }, + "system": { + "Help Document": "Help document" + }, "template": { - "Quote Content Tip": "可以自定义引用内容的结构,以更好的适配不同场景。可以使用一些变量来进行模板配置:\n{{q}} - 检索内容, {{a}} - 预期内容, {{source}} - 来源,{{sourceId}} - 来源文件名,{{index}} - 第n个引用,他们都是可选的,下面是默认值:\n{{default}}", - "Quote Prompt Tip": "可以用 {{quote}} 来插入引用内容模板,使用 {{question}} 来插入问题。下面是默认值:\n{{default}}" + "Quote Content Tip": "You can customize the structure of the quote content to better adapt to different scenarios. You can use some variables for template configuration:\n{{q}} - search content, {{a}} - expected content, {{source}} - source, {{sourceId}} - source file name, {{index}} - the nth quote, they are all optional, here are the default values:\n{{default}}", + "Quote Prompt Tip": "You can use {{quote}} to insert the quote content template, and use {{question}} to insert the question. Here are the default values:\n{{default}}" }, "user": { - "Account": "账号", - "Amount of earnings": "收益(¥)", - "Amount of inviter": "累计邀请人数", - "Application Name": "项目名", - "Avatar": "头像", - "Balance": "余额", - "Bill Detail": "账单详情", - "Change": "变更", - "Copy invite url": "复制邀请链接", - "Current laf Env": "当前 laf 环境", - "Edit name": "点击修改昵称", - "Invite Url": "邀请链接", - "Invite url tip": "通过该链接注册的好友将永久与你绑定,其充值时你会获得一定余额奖励。\n此外,好友使用手机号注册时,你将立即获得 5 元奖励。\n奖励会发送到您的默认团队中。", - "Laf Account Setting": "laf 账号配置", - "Language": "语言", - "Learn More": "查看文档", - "Member Name": "昵称", - "Notice": "通知", - "Old password is error": "旧密码错误", - "OpenAI Account Setting": "OpenAI 账号配置", - "Password": "密码", - "Pay": "充值", - "Permission": "使用权限", - "Personal Information": "个人信息", + "Account": "Account", + "Amount of earnings": "Earnings (¥)", + "Amount of inviter": "Total number of invitees", + "Application Name": "Project name", + "Avatar": "Avatar", + "Balance": "Balance", + "Bill Detail": "Bill detail", + "Change": "Change", + "Copy invite url": "Copy invite link", + "Current laf Env": "Current laf environment", + "Edit name": "Click to edit nickname", + "Invite Url": "Invite link", + "Invite url tip": "Friends registered through this link will be permanently bound to you, and you will receive a certain balance reward when they recharge.\nIn addition, you will immediately receive a 5 yuan reward when friends register with a phone number.\nThe reward will be sent to your default team.", + "Laf Account Setting": "laf account settings", + "Language": "Language", + "Learn More": "Learn more", + "Member Name": "Nickname", + "Notice": "Notice", + "Old password is error": "Old password is incorrect", + "OpenAI Account Setting": "OpenAI account settings", + "Password": "Password", + "Pay": "Recharge", + "Permission": "Usage permission", + "Personal Information": "Personal information", "Promotion": "", - "Promotion Rate": "返现比例", - "Promotion Record": "推广记录", - "Promotion rate tip": "好友充值时你将获得一定比例的余额奖励", - "Recharge Record": "支付记录", - "Replace": "更换", - "Set Laf Account Failed": "设置 laf 账号异常", - "Set OpenAI Account Failed": "设置 OpenAI 账号异常", - "Sign Out": "登出", - "Source": "来源", + "Promotion Rate": "Cashback ratio", + "Promotion Record": "Promotion record", + "Promotion rate tip": "You will receive a certain percentage of balance reward when your friend recharges", + "Recharge Record": "Payment record", + "Replace": "Replace", + "Set Laf Account Failed": "Failed to set laf account", + "Set OpenAI Account Failed": "Failed to set OpenAI account", + "Sign Out": "Sign out", + "Source": "Source", "Standard Detail": "", - "Team": "团队", - "Time": "时间", - "Timezone": "时区", - "Total Amount": "总金额", - "Update Password": "修改密码", - "Update password failed": "修改密码异常", - "Update password successful": "修改密码成功", - "Usage Record": "使用记录", + "Team": "Team", + "Time": "Time", + "Timezone": "Timezone", + "Total Amount": "Total amount", + "Update Password": "Update password", + "Update password failed": "Failed to update password", + "Update password successful": "Password updated successfully", + "Usage Record": "Usage record", "apikey": { - "key": "API 秘钥" + "key": "API key" }, "promotion": { - "pay": "好友充值", - "register": "好友注册" + "pay": "Friend's recharge", + "register": "Friend's registration" }, "team": { - "Balance": "团队余额", - "Check Team": "切换", - "Confirm Invite": "确认邀请", - "Create Team": "创建新团队", - "Invite Member": "邀请成员", - "Invite Member Failed Tip": "邀请成员出现异常", - "Invite Member Result Tip": "邀请结果提示", - "Invite Member Success Tip": "邀请成员完成\n成功: {{success}}人\n用户名无效: {{inValid}}\n已在团队中:{{inTeam}}", - "Invite Member Tips": "对方可查阅或使用团队内的其他资源", - "Invite Role Admin Alias": "邀请管理员加入", - "Invite Role Admin Tip": "管理员\n可创建、编辑和使用团队资源", - "Invite Role Visitor Alias": "邀请访客加入", - "Invite Role Visitor Tip": "访客\n仅可使用资源,无创建编辑权限", - "Leave Team": "离开团队", - "Leave Team Failed": "离开团队异常", - "Manage": "团队管理", - "Member": "成员", - "Member Name": "成员名", - "Over Max Member Tip": "团队最多{{max}}人", - "Personal Team": "个人团队", - "Processing invitations": "处理邀请", - "Processing invitations Tips": "你有{{amount}}个需要处理的团队邀请", - "Reinvite": "重新邀请", - "Remove Member Confirm Tip": "确认将 {{username}} 移出团队?其所有资源将转让到团队创建者的账户内。", - "Remove Member Failed": "移除团队成员异常", - "Remove Member Success": "移除团队成员成功", - "Remove Member Tip": "移出团队", - "Role": "身份", - "Select Team": "团队选择", - "Set Name": "给团队取个名字", - "Switch Team Failed": "切换团队异常", - "Tags Async": "保存", - "Team Name": "团队名", - "Team Tags Async": "标签同步", - "Team Tags Async Success": "链接报错成功,标签信息更新", - "Team Tags Async Tip": "填写标签同步连接,获取最新", - "Update Team": "更新团队信息", + "Balance": "Team Balance", + "Check Team": "Switch", + "Confirm Invite": "Confirm Invitation", + "Create Team": "Create New Team", + "Invite Member": "Invite Member", + "Invite Member Failed Tip": "An error occurred while inviting members", + "Invite Member Result Tip": "Invitation Result Tip", + "Invite Member Success Tip": "Invitation completed\nSuccess: {{success}}\nInvalid usernames: {{inValid}}\nAlready in team: {{inTeam}}", + "Invite Member Tips": "The invitee can access or use other resources within the team", + "Invite Role Admin Alias": "Invite Admin", + "Invite Role Admin Tip": "Admin\nCan create, edit, and use team resources", + "Invite Role Visitor Alias": "Invite Visitor", + "Invite Role Visitor Tip": "Visitor\nCan only use resources, no creation or editing rights", + "Leave Team": "Leave Team", + "Leave Team Failed": "Failed to leave team", + "Manage": "Team Management", + "Member": "Member", + "Member Name": "Member Name", + "Over Max Member Tip": "Maximum of {{max}} members in the team", + "Personal Team": "Personal Team", + "Processing invitations": "Processing Invitations", + "Processing invitations Tips": "You have {{amount}} team invitations to process", + "Reinvite": "Reinvite", + "Remove Member Confirm Tip": "Confirm to remove {{username}} from the team? All their resources will be transferred to the team creator's account.", + "Remove Member Failed": "Failed to remove team member", + "Remove Member Success": "Successfully removed team member", + "Remove Member Tip": "Remove from Team", + "Role": "Role", + "Select Team": "Select Team", + "Set Name": "Name Your Team", + "Switch Team Failed": "Failed to switch team", + "Tags Async": "Save", + "Team Name": "Team Name", + "Team Tags Async": "Tag Sync", + "Team Tags Async Success": "Link error corrected, tag information updated", + "Team Tags Async Tip": "Enter tag sync link to fetch the latest", + "Update Team": "Update Team Information", "invite": { - "Accept Confirm": "确认加入该团队?", - "Accepted": "已加入团队", - "Deal Width Footer Tip": "处理完会自动关闭噢~", - "Reject": "已拒绝邀请", - "Reject Confirm": "确认拒绝该邀请?", - "accept": "接受", - "reject": "拒绝" + "Accept Confirm": "Confirm to join this team?", + "Accepted": "Joined Team", + "Deal Width Footer Tip": "Will automatically close after processing~", + "Reject": "Invitation Rejected", + "Reject Confirm": "Confirm to reject this invitation?", + "accept": "Accept", + "reject": "Reject" }, "member": { - "Confirm Leave": "确认离开该团队?", - "active": "已加入", - "reject": "拒绝", - "waiting": "待接受" + "Confirm Leave": "Confirm to leave this team?", + "active": "Joined", + "reject": "Reject", + "waiting": "Waiting for Acceptance" }, "role": { - "Admin": "管理员", - "Member": "成员", - "Owner": "创建者", - "Update to Visitor": "修改成访客", - "Visitor": "访客" + "Admin": "Admin", + "Member": "Member", + "Owner": "Owner", + "Update to Visitor": "Change to Visitor", + "Visitor": "Visitor" } } } diff --git a/projects/app/i18n/en/file.json b/projects/app/i18n/en/file.json new file mode 100644 index 00000000000..66f1fb2db78 --- /dev/null +++ b/projects/app/i18n/en/file.json @@ -0,0 +1,23 @@ +{ + "Click to view file": "Click to view the original file", + "Release the mouse to upload the file": "Release the mouse to upload the file", + "upload error description": "Only supports uploading multiple files or one folder at a time", + + "Empty file tip": "The file content is empty, the file may not be readable or it may be a pure image file.", + "File Content": "File Content", + "File Name": "File Name", + "File Size": "File Size", + "File content can not be empty": "File content cannot be empty", + "Filename Can not Be Empty": "Filename cannot be empty", + "Read File Error": "File parsing failed", + "Select and drag file tip": "Click or drag files here to upload", + "Select failed": "File selection failed", + "Select file amount limit": "You can select up to {{max}} files", + "Select file amount limit 100": "You can select up to 100 files at a time", + "Some file count exceeds limit": "Exceeds {{maxCount}} files, automatically truncated", + "Some file size exceeds limit": "Some files exceed: {{maxSize}}, have been filtered", + "Support file type": "Supports {{fileType}} type files", + "Support max count": "Supports up to {{maxCount}} files.", + "Support max size": "Maximum size per file: {{maxSize}}.", + "Upload failed": "Upload failed" +} diff --git a/projects/app/i18n/en/publish.json b/projects/app/i18n/en/publish.json new file mode 100644 index 00000000000..7b7a9331195 --- /dev/null +++ b/projects/app/i18n/en/publish.json @@ -0,0 +1,22 @@ +{ + "Copy IFrame": "Embed webpage", + "Copy Link": "Copy", + "Create API Key": "Create new Key", + "Create Link": "Create link", + "Default Response": "Default Response", + "Delete Link": "Delete link", + "Edit API Key": "Edit Key information", + "Edit IFrame Link": "Update embed link", + "Edit Link": "Edit", + "Edit Share Window": "Update share window", + "Feishu name": "Lark", + "Link Name": "Name of the share link", + "QPM Tips": "How many times per minute can each IP ask at most", + "QPM is empty": "QPM cannot be empty", + "app key tips": "These keys have the current application identification, refer to the document for specific use ", + "key alias": "key alias, for display only ", + "key tips": "You can use the API Key to access certain interfaces (you can't access the app, you need to use the API key within the app to access the app)", + "token auth": "Token authentication", + "token auth Tips": "Identity verification server address, if this value is filled, a request will be sent to the specified server before each conversation to perform identity verification", + "token auth use cases": "View usage instructions for identity verification" +} diff --git a/projects/app/i18n/zh/common.json b/projects/app/i18n/zh/common.json index 335a8275f65..201a7de0aac 100644 --- a/projects/app/i18n/zh/common.json +++ b/projects/app/i18n/zh/common.json @@ -149,26 +149,6 @@ "Update error": "更新失败", "unKnow": "出现了点意外~" }, - "export": "", - "file": { - "Empty file tip": "文件内容为空,可能该文件无法读取或为纯图片文件内容。", - "File Content": "文件内容", - "File Name": "文件名", - "File Size": "文件大小", - "File content can not be empty": "文件内容不能为空", - "Filename Can not Be Empty": "文件名不能为空", - "Read File Error": "解析文件失败", - "Select and drag file tip": "点击或拖动文件到此处上传", - "Select failed": "选择文件异常", - "Select file amount limit": "最多选择 {{max}} 个文件", - "Select file amount limit 100": "每次最多选择100个文件", - "Some file count exceeds limit": "超出{{maxCount}}个文件,已自动截取", - "Some file size exceeds limit": "部分文件超出: {{maxSize}},已被过滤", - "Support file type": "支持 {{fileType}} 类型文件", - "Support max count": "最多支持 {{maxCount}} 个文件。", - "Support max size": "单个文件最大 {{maxSize}}。", - "Upload failed": "上传异常" - }, "folder": { "Drag Tip": "点我可拖动", "Move Success": "移动成功", @@ -663,7 +643,6 @@ "Estimated Price Tips": "QA计费为\n输入: {{charsPointsPrice}}积分/1k Tokens", "Estimated points": "预估消耗 {{points}} 积分", "Fetch Error": "获取链接失败", - "Fetch Url": "网络链接", "Fetch url placeholder": "最多10个链接,每行一个。", "Fetch url tip": "仅支持读取静态链接,请注意检查结果", "File chunk amount": "分段: {{amount}}", @@ -1208,73 +1187,6 @@ "overSize": "团队成员超出上限" } }, - "file": { - "Click to download file template": "点击下载模板:{{name}}", - "Click to view file": "点击查看原始文件", - "Create File": "创建新文件", - "Create file": "创建文件", - "Drag and drop": "拖拽文件至此", - "Fetch Url": "链接读取", - "If the imported file is garbled, please convert CSV to UTF-8 encoding format": "如果导入文件乱码,请将 CSV 转成 UTF-8 编码格式", - "Parse": "{{name}} 解析中...", - "Release the mouse to upload the file": "松开鼠标上传文件", - "Select a maximum of 10 files": "最多选择10个文件", - "Uploading": "正在上传 {{name}},进度: {{percent}}%", - "max 10": "最多选择 10 个文件", - "select a document": "选择文件", - "support": "支持 {{fileExtension}} 文件", - "upload error description": "单次只支持上传多个文件或者一个文件夹" - }, - "home": { - "AI Assistant": "AI 客服", - "AI Assistant Desc": "无论对内还是对外,AI 将 24 小时为您的用户提供服务", - "Advanced Settings": "高级编排", - "Advanced Settings Desc": "基于 Flow 的流程编排模式,让你的 AI 轻松实现数据库查询、IO 操作、联网通信等扩展能力", - "Choice Debug": "调试便捷", - "Choice Debug Desc": "拥有搜索测试、引用修改、完整对话预览等多种调试途径", - "Choice Desc": "", - "Choice Extension": "无限扩展", - "Choice Extension Desc": "基于 HTTP 实现扩展,轻松实现定制功能", - "Choice Fast": "开箱即用", - "Choice Fast Desc": "{{title}} 提供开箱即用的可视化操作,点点点即可构建 AI 应用", - "Choice Models": "支持多种模型", - "Choice Models Desc": "支持 GPT、Claude、Spark、ChatGLM等多模型", - "Choice Open": "更开放", - "Choice Open Desc": "{{title}} 遵循 Apache License 2.0 开源协议", - "Choice QA": "独特的 QA 结构", - "Choice QA Desc": "采用 QA 对的结构构建索引,适应问答、阅读等多种场景", - "Choice Visual": "可视化工作流", - "Choice Visual Desc": "可视化模块操作,轻松实现复杂工作流,让你的 AI 不再单一", - "Commercial": "商务咨询", - "Community": "社区", - "Dateset": "自动数据预处理", - "Dateset Desc": "提供手动输入、直接分段、LLM 自动处理和 CSV 等多种数据导入途径", - "Docs": "文档", - "FastGPT Ability": "{{title}} 能力", - "FastGPT Desc": "{{title}} 是一个基于 LLM 大语言模型的知识库问答系统,提供开箱即用的数据处理、模型调用等能力。同时可以通过 Flow 可视化进行工作流编排,从而实现复杂的问答场景!", - "Features": "特点", - "Footer Developer": "开发者", - "Footer Docs": "文档", - "Footer FastGPT Cloud": "{{title}} 线上服务", - "Footer Feedback": "反馈", - "Footer Git": "源码", - "Footer Product": "产品", - "Footer Support": "支持", - "Login": "登录", - "Open": "", - "OpenAPI": "OpenAPI", - "OpenAPI Desc": "与 GPT API 一致的对外接口,助你轻松接入已有应用", - "Quickly build AI question and answer library": "快速搭建 AI 问答系统", - "Start Now": "立即开始", - "Visual AI orchestration": "可视化 AI 编排", - "Why FastGPT": "为什么选择 {{title}}", - "desc": "基于 LLM 大模型的 AI 知识库问答平台", - "navbar": { - "Use guidance": "使用引导", - "chatbot": "问答机器人" - }, - "slogan": "让 AI 更懂你的知识" - }, "module": { "Confirm Delete Module": "确认删除该自定义模块?", "Confirm Sync Plugin": "确认同步插件最新信息?插件的连线和输入的内容将会被清空,请确认!", @@ -1299,30 +1211,6 @@ "Store": "应用市场", "Tools": "工具" }, - "openapi": { - "app key tips": "这些 key 已有当前应用标识,具体使用可参考文档", - "key alias": "key 的别名,仅用于展示", - "key tips": "你可以使用 API 秘钥访问一些特定的接口(无法访问应用,访问应用需使用应用内的API Key)" - }, - "outlink": { - "Copy IFrame": "嵌入网页", - "Copy Link": "复制", - "Create API Key": "创建新 Key", - "Create Link": "创建链接", - "Delete Link": "删除链接", - "Edit API Key": "编辑 Key 信息", - "Edit IFrame Link": "更新嵌入链接", - "Edit Link": "编辑", - "Edit Share Window": "更新分享窗口", - "Link Name": "分享链接的名字", - "Link is empty": "", - "QPM": "", - "QPM Tips": "每个 IP 每分钟最多提问多少次", - "QPM is empty": "QPM 不能为空", - "token auth": "身份验证", - "token auth Tips": "身份校验服务器地址,如填写该值,每次对话前都会向指定服务器发送一个请求,进行身份校验", - "token auth use cases": "查看身份验证使用说明" - }, "permission": { "Private": "私有", "Private Tip": "仅自己可用", diff --git a/projects/app/i18n/zh/file.json b/projects/app/i18n/zh/file.json new file mode 100644 index 00000000000..eb9aabcfd49 --- /dev/null +++ b/projects/app/i18n/zh/file.json @@ -0,0 +1,23 @@ +{ + "Click to view file": "点击查看原始文件", + "Release the mouse to upload the file": "松开鼠标上传文件", + "upload error description": "单次只支持上传多个文件或者一个文件夹", + + "Empty file tip": "文件内容为空,可能该文件无法读取或为纯图片文件内容。", + "File Content": "文件内容", + "File Name": "文件名", + "File Size": "文件大小", + "File content can not be empty": "文件内容不能为空", + "Filename Can not Be Empty": "文件名不能为空", + "Read File Error": "解析文件失败", + "Select and drag file tip": "点击或拖动文件到此处上传", + "Select failed": "选择文件异常", + "Select file amount limit": "最多选择 {{max}} 个文件", + "Select file amount limit 100": "每次最多选择100个文件", + "Some file count exceeds limit": "超出{{maxCount}}个文件,已自动截取", + "Some file size exceeds limit": "部分文件超出: {{maxSize}},已被过滤", + "Support file type": "支持 {{fileType}} 类型文件", + "Support max count": "最多支持 {{maxCount}} 个文件。", + "Support max size": "单个文件最大 {{maxSize}}。", + "Upload failed": "上传异常" +} diff --git a/projects/app/i18n/zh/publish.json b/projects/app/i18n/zh/publish.json new file mode 100644 index 00000000000..36b268726e6 --- /dev/null +++ b/projects/app/i18n/zh/publish.json @@ -0,0 +1,20 @@ +{ + "Create API Key": "创建新 Key", + "Create Link": "创建链接", + "Default Response": "默认回复", + "Delete Link": "删除链接", + "Edit API Key": "编辑 Key 信息", + "Edit IFrame Link": "更新嵌入链接", + "Edit Link": "编辑", + "Edit Share Window": "更新分享窗口", + "Feishu name": "飞书", + "Link Name": "分享链接的名字", + "QPM Tips": "每个 IP 每分钟最多提问多少次", + "QPM is empty": "QPM 不能为空", + "app key tips": "这些 key 已有当前应用标识,具体使用可参考文档", + "key alias": "key 的别名,仅用于展示", + "key tips": "你可以使用 API 秘钥访问一些特定的接口(无法访问应用,访问应用需使用应用内的API Key)", + "token auth": "身份验证", + "token auth Tips": "身份校验服务器地址,如填写该值,每次对话前都会向指定服务器发送一个请求,进行身份校验", + "token auth use cases": "查看身份验证使用说明" +} diff --git a/projects/app/src/components/ChatBox/ResponseTags.tsx b/projects/app/src/components/ChatBox/ResponseTags.tsx index 813383531f0..fe5f5743fca 100644 --- a/projects/app/src/components/ChatBox/ResponseTags.tsx +++ b/projects/app/src/components/ChatBox/ResponseTags.tsx @@ -1,7 +1,7 @@ import React, { useMemo, useState } from 'react'; import { type ChatHistoryItemResType } from '@fastgpt/global/core/chat/type.d'; import { DispatchNodeResponseType } from '@fastgpt/global/core/workflow/runtime/type.d'; -import { Flex, BoxProps, useDisclosure, useTheme, Box } from '@chakra-ui/react'; +import { Flex, useDisclosure, useTheme, Box } from '@chakra-ui/react'; import { useTranslation } from 'next-i18next'; import { useSystemStore } from '@/web/common/system/useSystemStore'; import type { SearchDataResponseItemType } from '@fastgpt/global/core/dataset/type'; diff --git a/projects/app/src/components/core/dataset/RawSourceBox.tsx b/projects/app/src/components/core/dataset/RawSourceBox.tsx index be9345bce19..b466baf8a66 100644 --- a/projects/app/src/components/core/dataset/RawSourceBox.tsx +++ b/projects/app/src/components/core/dataset/RawSourceBox.tsx @@ -1,5 +1,5 @@ import React, { useMemo } from 'react'; -import { Box, BoxProps, Image } from '@chakra-ui/react'; +import { Box, BoxProps } from '@chakra-ui/react'; import { useToast } from '@fastgpt/web/hooks/useToast'; import { getErrText } from '@fastgpt/global/common/error/utils'; import MyTooltip from '@/components/MyTooltip'; @@ -8,6 +8,7 @@ import { getFileAndOpen } from '@/web/core/dataset/utils'; import { useSystemStore } from '@/web/common/system/useSystemStore'; import { getSourceNameIcon } from '@fastgpt/global/core/dataset/utils'; import MyIcon from '@fastgpt/web/components/common/Icon'; +import { useI18n } from '@/web/context/I18n'; type Props = BoxProps & { sourceName?: string; @@ -17,6 +18,7 @@ type Props = BoxProps & { const RawSourceBox = ({ sourceId, sourceName = '', canView = true, ...props }: Props) => { const { t } = useTranslation(); + const { fileT } = useI18n(); const { toast } = useToast(); const { setLoading } = useSystemStore(); @@ -25,10 +27,7 @@ const RawSourceBox = ({ sourceId, sourceName = '', canView = true, ...props }: P const icon = useMemo(() => getSourceNameIcon({ sourceId, sourceName }), [sourceId, sourceName]); return ( - + void; }) { const { t } = useTranslation(); + const { publishT } = useI18n(); const isEdit = useMemo(() => !!defaultData._id, [defaultData]); const { feConfigs } = useSystemStore(); @@ -324,13 +326,13 @@ function EditKeyModal({ {t('Name')}: { - const { t } = useTranslation(); - return ; + const { publishT } = useI18n(); + return ; }; export default ApiKey; diff --git a/projects/app/src/pages/account/index.tsx b/projects/app/src/pages/account/index.tsx index 80dab7e4c07..4f4d084340b 100644 --- a/projects/app/src/pages/account/index.tsx +++ b/projects/app/src/pages/account/index.tsx @@ -190,7 +190,7 @@ export async function getServerSideProps(content: any) { return { props: { currentTab: content?.query?.currentTab || TabEnum.info, - ...(await serviceSideProps(content)) + ...(await serviceSideProps(content, ['publish'])) } }; } diff --git a/projects/app/src/pages/app/detail/components/Publish/API/index.tsx b/projects/app/src/pages/app/detail/components/Publish/API/index.tsx index ae98e5cbe21..86b693a5973 100644 --- a/projects/app/src/pages/app/detail/components/Publish/API/index.tsx +++ b/projects/app/src/pages/app/detail/components/Publish/API/index.tsx @@ -2,12 +2,13 @@ import React, { useEffect, useState } from 'react'; import ApiKeyTable from '@/components/support/apikey/Table'; import { useTranslation } from 'next-i18next'; import { Box } from '@chakra-ui/react'; +import { useI18n } from '@/web/context/I18n'; const API = ({ appId }: { appId: string }) => { - const { t } = useTranslation(); + const { publishT } = useI18n(); return ( - + ); }; diff --git a/projects/app/src/pages/app/detail/components/Publish/FeiShu/FeiShuEditModal.tsx b/projects/app/src/pages/app/detail/components/Publish/FeiShu/FeiShuEditModal.tsx index a172e0d6367..80930ad8c65 100644 --- a/projects/app/src/pages/app/detail/components/Publish/FeiShu/FeiShuEditModal.tsx +++ b/projects/app/src/pages/app/detail/components/Publish/FeiShu/FeiShuEditModal.tsx @@ -10,6 +10,7 @@ import { useForm } from 'react-hook-form'; import { useRequest } from '@/web/common/hooks/useRequest'; import dayjs from 'dayjs'; import { createShareChat, updateShareChat } from '@/web/support/outLink/api'; +import { useI18n } from '@/web/context/I18n'; const FeiShuEditModal = ({ appId, @@ -25,6 +26,7 @@ const FeiShuEditModal = ({ onEdit: () => void; }) => { const { t } = useTranslation(); + const { publishT } = useI18n(); const { register, setValue, @@ -58,13 +60,13 @@ const FeiShuEditModal = ({ {t('Name')} QPM - + @@ -84,7 +86,7 @@ const FeiShuEditModal = ({ min: 0, max: 1000, valueAsNumber: true, - required: t('outlink.QPM is empty') || '' + required: publishT('QPM is empty') || '' })} /> @@ -126,10 +128,10 @@ const FeiShuEditModal = ({ {/* TODO: i18n */} @@ -139,10 +141,10 @@ const FeiShuEditModal = ({ {/* TODO: i18n */} @@ -152,14 +154,14 @@ const FeiShuEditModal = ({ placeholder={t('core.module.http.appId') || 'Link Name'} // maxLength={20} {...register('app.appId', { - required: t('common.Name is empty') || 'Name is empty' + required: true })} /> {t('core.module.http.AppSecret')} import('./SelectUsingWayModal')); @@ -261,6 +262,7 @@ function EditLinkModal({ }) { const { feConfigs } = useSystemStore(); const { t } = useTranslation(); + const { publishT } = useI18n(); const { register, setValue, @@ -293,13 +295,13 @@ function EditLinkModal({ {t('Name')} QPM - + @@ -337,7 +339,7 @@ function EditLinkModal({ min: 0, max: 1000, valueAsNumber: true, - required: t('outlink.QPM is empty') || '' + required: publishT('QPM is empty') || '' })} /> @@ -360,13 +362,13 @@ function EditLinkModal({ - {t('outlink.token auth')} - + {publishT('token auth')} + @@ -377,7 +379,7 @@ function EditLinkModal({ fontSize={'sm'} color={'myGray.500'} > - {t('outlink.token auth use cases')} + {publishT('token auth use cases')} )} diff --git a/projects/app/src/pages/app/detail/index.tsx b/projects/app/src/pages/app/detail/index.tsx index 9c631bc629a..26c434e4c91 100644 --- a/projects/app/src/pages/app/detail/index.tsx +++ b/projects/app/src/pages/app/detail/index.tsx @@ -196,7 +196,7 @@ export async function getServerSideProps(context: any) { const currentTab = context?.query?.currentTab || TabEnum.simpleEdit; return { - props: { currentTab, ...(await serviceSideProps(context, ['app'])) } + props: { currentTab, ...(await serviceSideProps(context, ['app', 'file', 'publish'])) } }; } diff --git a/projects/app/src/pages/chat/index.tsx b/projects/app/src/pages/chat/index.tsx index 5338441a5ed..7872a127169 100644 --- a/projects/app/src/pages/chat/index.tsx +++ b/projects/app/src/pages/chat/index.tsx @@ -371,7 +371,7 @@ export async function getServerSideProps(context: any) { props: { appId: context?.query?.appId || '', chatId: context?.query?.chatId || '', - ...(await serviceSideProps(context)) + ...(await serviceSideProps(context, ['file'])) } }; } diff --git a/projects/app/src/pages/chat/share.tsx b/projects/app/src/pages/chat/share.tsx index 32933f45041..f82de422647 100644 --- a/projects/app/src/pages/chat/share.tsx +++ b/projects/app/src/pages/chat/share.tsx @@ -431,7 +431,7 @@ export async function getServerSideProps(context: any) { appName: app?.appId?.name || '', appAvatar: app?.appId?.avatar || '', appIntro: app?.appId?.intro || '', - ...(await serviceSideProps(context)) + ...(await serviceSideProps(context, ['file'])) } }; } diff --git a/projects/app/src/pages/chat/team.tsx b/projects/app/src/pages/chat/team.tsx index 463ed18a013..5ac630438aa 100644 --- a/projects/app/src/pages/chat/team.tsx +++ b/projects/app/src/pages/chat/team.tsx @@ -382,7 +382,7 @@ const OutLink = () => { export async function getServerSideProps(context: any) { return { props: { - ...(await serviceSideProps(context)) + ...(await serviceSideProps(context, ['file'])) } }; } diff --git a/projects/app/src/pages/dataset/detail/components/Import/commonProgress/Upload.tsx b/projects/app/src/pages/dataset/detail/components/Import/commonProgress/Upload.tsx index e1982b7d45c..c7b99fa5fb8 100644 --- a/projects/app/src/pages/dataset/detail/components/Import/commonProgress/Upload.tsx +++ b/projects/app/src/pages/dataset/detail/components/Import/commonProgress/Upload.tsx @@ -27,9 +27,11 @@ import { postCreateDatasetTextCollection } from '@/web/core/dataset/api'; import Tag from '@fastgpt/web/components/common/Tag/index'; +import { useI18n } from '@/web/context/I18n'; const Upload = () => { const { t } = useTranslation(); + const { fileT } = useI18n(); const { toast } = useToast(); const router = useRouter(); const { datasetDetail } = useDatasetStore(); @@ -131,7 +133,7 @@ const Upload = () => { ) ); }, - errorToast: t('common.file.Upload failed') + errorToast: fileT('Upload failed') }); return ( diff --git a/projects/app/src/pages/dataset/detail/components/Import/components/FileSelector.tsx b/projects/app/src/pages/dataset/detail/components/Import/components/FileSelector.tsx index 65050390010..06c21ac5352 100644 --- a/projects/app/src/pages/dataset/detail/components/Import/components/FileSelector.tsx +++ b/projects/app/src/pages/dataset/detail/components/Import/components/FileSelector.tsx @@ -13,6 +13,7 @@ import { useSystemStore } from '@/web/common/system/useSystemStore'; import { uploadFile2DB } from '@/web/common/file/controller'; import { BucketNameEnum } from '@fastgpt/global/common/file/constants'; import { ImportSourceItemType } from '@/web/core/dataset/type'; +import { useI18n } from '@/web/context/I18n'; export type SelectFileItemType = { fileId: string; @@ -35,6 +36,8 @@ const FileSelector = ({ onFinishSelect: () => void; } & FlexProps) => { const { t } = useTranslation(); + const { fileT } = useI18n(); + const { toast } = useToast(); const { feConfigs } = useSystemStore(); @@ -129,7 +132,7 @@ const FileSelector = ({ files = files.slice(0, maxCount - selectFiles.length); toast({ status: 'warning', - title: t('common.file.Some file count exceeds limit', { maxCount }) + title: fileT('Some file count exceeds limit', { maxCount }) }); } // size check @@ -141,7 +144,7 @@ const FileSelector = ({ if (filterFiles.length < files.length) { toast({ status: 'warning', - title: t('common.file.Some file size exceeds limit', { maxSize: formatFileSize(maxSize) }) + title: fileT('Some file size exceeds limit', { maxSize: formatFileSize(maxSize) }) }); } @@ -203,7 +206,7 @@ const FileSelector = ({ let isErr = files.some((item) => item.type === ''); if (isErr) { return toast({ - title: t('file.upload error description'), + title: fileT('upload error description'), status: 'error' }); } @@ -262,18 +265,18 @@ const FileSelector = ({ <> {isDragging - ? t('file.Release the mouse to upload the file') - : t('common.file.Select and drag file tip')} + ? fileT('Release the mouse to upload the file') + : fileT('Select and drag file tip')} {/* file type */} - {t('common.file.Support file type', { fileType })} + {fileT('Support file type', { fileType })} {/* max count */} - {maxCount && t('common.file.Support max count', { maxCount })} + {maxCount && fileT('Support max count', { maxCount })} {/* max size */} - {maxSize && t('common.file.Support max size', { maxSize: formatFileSize(maxSize) })} + {maxSize && fileT('Support max size', { maxSize: formatFileSize(maxSize) })} import('./PreviewRawText')); @@ -29,6 +30,7 @@ export const RenderUploadFiles = ({ showPreviewContent?: boolean; }) => { const { t } = useTranslation(); + const { fileT } = useI18n(); const [previewFile, setPreviewFile] = useState(); return files.length > 0 ? ( @@ -38,13 +40,13 @@ export const RenderUploadFiles = ({ - {t('common.file.File Name')} + {fileT('File Name')} {t('core.dataset.import.Upload file progress')} - {t('common.file.File Size')} + {fileT('File Size')} {t('common.Action')} diff --git a/projects/app/src/pages/dataset/detail/index.tsx b/projects/app/src/pages/dataset/detail/index.tsx index f4d8534e15b..bfd1764dad5 100644 --- a/projects/app/src/pages/dataset/detail/index.tsx +++ b/projects/app/src/pages/dataset/detail/index.tsx @@ -295,7 +295,7 @@ export async function getServerSideProps(context: any) { const datasetId = context?.query?.datasetId; return { - props: { currentTab, datasetId, ...(await serviceSideProps(context)) } + props: { currentTab, datasetId, ...(await serviceSideProps(context, ['file'])) } }; } diff --git a/projects/app/src/types/i18n.d.ts b/projects/app/src/types/i18n.d.ts index c7e2182bbbc..ed27d8ed53a 100644 --- a/projects/app/src/types/i18n.d.ts +++ b/projects/app/src/types/i18n.d.ts @@ -1,12 +1,16 @@ import 'i18next'; -import common from '../../i18n/en/common.json'; -import dataset from '../../i18n/en/dataset.json'; -import app from '../../i18n/en/app.json'; +import common from '../../i18n/zh/common.json'; +import dataset from '../../i18n/zh/dataset.json'; +import app from '../../i18n/zh/app.json'; +import file from '../../i18n/zh/file.json'; +import publish from '../../i18n/zh/publish.json'; export interface I18nNamespaces { common: typeof common; dataset: typeof dataset; app: typeof app; + file: typeof file; + publish: typeof publish; } export type I18nNsType = (keyof I18nNamespaces)[]; diff --git a/projects/app/src/web/common/file/hooks/useSelectFile.tsx b/projects/app/src/web/common/file/hooks/useSelectFile.tsx index bff90ecfb3a..6018882496e 100644 --- a/projects/app/src/web/common/file/hooks/useSelectFile.tsx +++ b/projects/app/src/web/common/file/hooks/useSelectFile.tsx @@ -2,6 +2,7 @@ import React, { useRef, useCallback } from 'react'; import { Box } from '@chakra-ui/react'; import { useToast } from '@fastgpt/web/hooks/useToast'; import { useTranslation } from 'next-i18next'; +import { useI18n } from '@/web/context/I18n'; export const useSelectFile = (props?: { fileType?: string; @@ -9,6 +10,7 @@ export const useSelectFile = (props?: { maxCount?: number; }) => { const { t } = useTranslation(); + const { fileT } = useI18n(); const { fileType = '*', multiple = false, maxCount = 10 } = props || {}; const { toast } = useToast(); const SelectFileDom = useRef(null); @@ -30,7 +32,7 @@ export const useSelectFile = (props?: { if (fileList.length > maxCount) { toast({ status: 'warning', - title: t('common.file.Select file amount limit', { max: maxCount }) + title: fileT('Select file amount limit', { max: maxCount }) }); fileList = fileList.slice(0, maxCount); } @@ -39,7 +41,7 @@ export const useSelectFile = (props?: { /> ), - [fileType, maxCount, multiple, t, toast] + [fileT, fileType, maxCount, multiple, toast] ); const onOpen = useCallback((sign?: any) => { diff --git a/projects/app/src/web/context/I18n.tsx b/projects/app/src/web/context/I18n.tsx index c9f57d3249e..50c480c33c2 100644 --- a/projects/app/src/web/context/I18n.tsx +++ b/projects/app/src/web/context/I18n.tsx @@ -6,6 +6,8 @@ type I18nContextType = { commonT: TFunction<['common'], undefined>; appT: TFunction<['app'], undefined>; datasetT: TFunction<['dataset'], undefined>; + fileT: TFunction<['file'], undefined>; + publishT: TFunction<['publish'], undefined>; }; export const I18nContext = createContext({ @@ -17,13 +19,17 @@ const I18nContextProvider = ({ children }: { children: React.ReactNode }) => { const { t: commonT } = useTranslation('common'); const { t: appT } = useTranslation('app'); const { t: datasetT } = useTranslation('dataset'); + const { t: fileT } = useTranslation('file'); + const { t: publishT } = useTranslation('publish'); return ( {children}