From 57ff38e16f2d9567e88c3bc7d0fc1ea81004f6c1 Mon Sep 17 00:00:00 2001 From: jingyang <72259332+zjy365@users.noreply.github.com> Date: Fri, 19 Jul 2024 16:28:07 +0800 Subject: [PATCH] feat: Optimize i18n keys and remove unused keys, supporting static files in I18nT (#2092) * feat: packages web i18n * delete file * feat:i18n add i18nT * handle keys * delete unusedKeys * fix build * update dev.md --- .vscode/i18n-ally-custom-framework.yml | 46 ++ dev.md | 59 ++ packages/web/i18n/en/app.json | 101 ++- packages/web/i18n/en/chat.json | 28 +- packages/web/i18n/en/common.json | 582 +----------------- packages/web/i18n/en/dataset.json | 33 +- packages/web/i18n/en/file.json | 37 +- packages/web/i18n/en/publish.json | 37 +- packages/web/i18n/en/user.json | 16 +- packages/web/i18n/en/workflow.json | 30 +- packages/web/i18n/utils.ts | 3 + packages/web/i18n/zh/app.json | 100 ++- packages/web/i18n/zh/chat.json | 24 +- packages/web/i18n/zh/common.json | 571 +---------------- packages/web/i18n/zh/dataset.json | 33 +- packages/web/i18n/zh/file.json | 37 +- packages/web/i18n/zh/publish.json | 35 +- packages/web/i18n/zh/user.json | 4 +- packages/web/i18n/zh/workflow.json | 30 +- packages/web/types/i18next.d.ts | 28 +- .../components/core/app/InputGuideConfig.tsx | 22 +- projects/app/src/components/core/app/Tip.tsx | 4 +- .../{CoseTooltip.tsx => CostTooltip.tsx} | 4 +- .../ChatBox/Input/InputGuideBox.tsx | 2 +- .../components/core/dataset/RawSourceBox.tsx | 2 +- .../src/components/support/apikey/Table.tsx | 4 +- .../pages/account/components/ApiKeyTable.tsx | 2 +- .../pages/account/components/Promotion.tsx | 2 +- .../app/src/pages/api/v1/chat/completions.ts | 2 +- .../app/detail/components/Logs/index.tsx | 14 +- .../detail/components/Publish/API/index.tsx | 2 +- .../Publish/FeiShu/FeiShuEditModal.tsx | 14 +- .../detail/components/Publish/Link/index.tsx | 16 +- .../components/PublishHistoriesSlider.tsx | 2 +- .../pages/app/detail/components/RouteTab.tsx | 6 +- .../detail/components/SimpleApp/AppCard.tsx | 8 +- .../detail/components/SimpleApp/ChatTest.tsx | 2 +- .../detail/components/SimpleApp/EditForm.tsx | 6 +- .../SimpleApp/components/ToolSelectModal.tsx | 4 +- .../components/WorkflowComponents/AppCard.tsx | 8 +- .../Flow/ImportSettings.tsx | 6 +- .../Flow/NodeTemplatesModal.tsx | 4 +- .../nodes/NodePluginIO/InputEditModal.tsx | 18 +- .../Flow/nodes/NodePluginIO/PluginInput.tsx | 2 +- .../Flow/nodes/NodePluginIO/PluginOutput.tsx | 2 +- .../Flow/nodes/NodePluginIO/VariableTable.tsx | 2 +- .../render/RenderInput/FieldEditModal.tsx | 6 +- .../templates/DynamicInputs/index.tsx | 4 +- .../render/RenderOutput/FieldEditModal.tsx | 6 +- .../pages/app/detail/components/context.tsx | 4 +- .../src/pages/app/list/components/List.tsx | 18 +- .../src/pages/app/list/components/context.tsx | 2 +- projects/app/src/pages/app/list/index.tsx | 4 +- .../chat/components/ChatHistorySlider.tsx | 2 +- .../dataset/detail/components/DataCard.tsx | 2 +- .../Import/commonProgress/Upload.tsx | 2 +- .../Import/components/FileSelector.tsx | 18 +- .../Import/components/RenderFiles.tsx | 4 +- .../Import/diffSource/ExternalFile.tsx | 4 +- .../pages/dataset/detail/components/Info.tsx | 10 +- .../dataset/detail/components/Slider.tsx | 2 +- .../dataset/list/component/CreateModal.tsx | 12 +- .../web/common/file/hooks/useSelectFile.tsx | 2 +- projects/app/src/web/core/app/templates.ts | 3 +- 64 files changed, 552 insertions(+), 1547 deletions(-) create mode 100644 .vscode/i18n-ally-custom-framework.yml create mode 100644 packages/web/i18n/utils.ts rename projects/app/src/components/core/app/plugin/{CoseTooltip.tsx => CostTooltip.tsx} (86%) diff --git a/.vscode/i18n-ally-custom-framework.yml b/.vscode/i18n-ally-custom-framework.yml new file mode 100644 index 000000000..8ce267e6d --- /dev/null +++ b/.vscode/i18n-ally-custom-framework.yml @@ -0,0 +1,46 @@ +# .vscode/i18n-ally-custom-framework.yml + +# An array of strings which contain Language Ids defined by VS Code +# You can check available language ids here: https://code.visualstudio.com/docs/languages/identifiers +languageIds: + - javascript + - typescript + - javascriptreact + - typescriptreact + +# An array of RegExes to find the key usage. **The key should be captured in the first match group**. +# You should unescape RegEx strings in order to fit in the YAML file +# To help with this, you can use https://www.freeformatter.com/json-escape.html +usageMatchRegex: + # The following example shows how to detect `t("your.i18n.keys")` + # the `{key}` will be placed by a proper keypath matching regex, + # you can ignore it and use your own matching rules as well + - "[^\\w\\d]t\\(['\"`]({key})['\"`]" + - "[^\\w\\d]commonT\\(['\"`]({key})['\"`]" + # 支持 appT("your.i18n.keys") + - "[^\\w\\d]appT\\(['\"`]({key})['\"`]" + # 支持 datasetT("your.i18n.keys") + - "[^\\w\\d]datasetT\\(['\"`]({key})['\"`]" + - "[^\\w\\d]fileT\\(['\"`]({key})['\"`]" + - "[^\\w\\d]publishT\\(['\"`]({key})['\"`]" + - "[^\\w\\d]workflowT\\(['\"`]({key})['\"`]" + - "[^\\w\\d]userT\\(['\"`]({key})['\"`]" + - "[^\\w\\d]chatT\\(['\"`]({key})['\"`]" + - "[^\\w\\d]i18nT\\(['\"`]({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 +# useTranslation() hook. +# You should unescape RegEx strings in order to fit in the YAML file +# To help with this, you can use https://www.freeformatter.com/json-escape.html +scopeRangeRegex: "([^:]+):" + +# An array of strings containing refactor templates. +# The "$1" will be replaced by the keypath specified. +# Optional: uncomment the following two lines to use + +# refactorTemplates: +# - i18n.get("$1") + +# If set to true, only enables this custom framework (will disable all built-in frameworks) +monopoly: false diff --git a/dev.md b/dev.md index d75427240..f6154854e 100644 --- a/dev.md +++ b/dev.md @@ -23,6 +23,65 @@ pnpm dev make dev name=app ``` +## I18N +### Install i18n-ally Plugin + +1. Open the Extensions Marketplace in VSCode, search for and install the `i18n Ally` plugin. + +### Code Optimization Examples +#### Fetch Specific Namespace Translations in `getServerSideProps` + +```typescript +// pages/yourPage.tsx +export async function getServerSideProps(context: any) { + return { + props: { + currentTab: context?.query?.currentTab || TabEnum.info, + ...(await serverSideTranslations(context.locale, ['publish', 'user'])) + } + }; +} +``` +#### Use useTranslation Hook in Page +```typescript +// pages/yourPage.tsx +import { useTranslation } from 'next-i18next'; + +const YourComponent = () => { + const { t } = useTranslation(); + + return ( + + ); +}; + +export default YourComponent; +``` +#### Handle Static File Translations +```typescript +// utils/i18n.ts +import { i18nT } from '@fastgpt/web/i18n/utils'; + +const staticContent = { + id: 'simpleChat', + avatar: 'core/workflow/template/aiChat', + name: i18nT('app:template.simple_robot'), +}; + +export default staticContent; +``` +### Standardize Translation Format +- Use the t(namespace:key) format to ensure consistent naming. +- Translation keys should use lowercase letters and underscores, e.g., common.close. + + ## Build diff --git a/packages/web/i18n/en/app.json b/packages/web/i18n/en/app.json index 880293703..5546d1f63 100644 --- a/packages/web/i18n/en/app.json +++ b/packages/web/i18n/en/app.json @@ -1,60 +1,42 @@ { - "AI Advanced Settings": "AI Advanced Settings", - "AI Settings": "AI Settings", - "Advance App TestTip": "Current app may be in advanced orchestration mode\nTo switch to【Simple Mode】please click the save button on the left", - "App Detail": "App Details", - "Apps Share": "Apps Share", - "Basic Settings": "Basic Settings", - "Chat Debug": "Chat Debug", - "Chat Logs Tips": "Logs will record online, shared and API (chatId required) conversation records for this app", - "Chat logs": "Chat Logs", - "Confirm Del App Tip": "Confirm to delete this app and all its chat records?", - "Confirm copy app tip": "The system will create an application with the same configuration for you, but the permission will not be copied, please confirm!", - "Confirm delete folder tip": "Are you sure to delete this folder? All the following applications and corresponding chat records will be deleted, please confirm!", - "Connection is invalid": "Connection is invalid", - "Connection type is different": "Connection type is different", - "Copy Module Config": "Copy Config", - "Copy one app": "Copy", - "Create bot": "App", - "Create copy success": "Create copy success", - "Create one ai app": "Create AI app", - "Current settings": "Current settings", - "Dataset Quote Template": "Knowledge Base QA Mode", - "Edit app": "Edit app", - "Edit info": "Edit info", - "Export Config Successful": "Config copied, please check for important data", - "Export Configs": "Export Configs", - "Feedback Count": "User Feedback", - "Go to chat": "To chat", - "Go to run": "Run", - "Import Configs": "Import Configs", - "Import Configs Failed": "Failed to import configs, please ensure configs are valid!", - "Input Field Settings": "Input Field Settings", - "Logs Empty": "No logs yet~", - "Logs Message Total": "Total Messages", - "Logs Source": "Source", - "Logs Time": "Time", - "Logs Title": "Title", - "Mark Count": "Marked Answer Count", - "Move app": "Move app", - "My Apps": "My Apps", - "Output Field Settings": "Output Field Settings", - "Paste Config": "Paste Config", "plugin_cost_per_times": "{{cost}}/per time", - "Plugin dispatch": "Plugins", - "Plugin dispatch tip": "It is up to the model to decide which plug-ins to add additional capabilities to. If the plug-in is selected, the knowledge base call is also treated as a special plug-in.", - "Publish channel": "Publish channel", - "Publish success": "Publish success", + "ai_settings": "AI Settings", + "app_detail": "App Details", + "chat_debug": "Chat Debug", + "chat_logs_tips": "Logs will record online, shared and API (chatId required) conversation records for this app", + "chat_logs": "Chat Logs", + "confirm_del_app_tip": "Confirm to delete this app and all its chat records?", + "confirm_copy_app_tip": "The system will create an application with the same configuration for you, but the permission will not be copied, please confirm!", + "confirm_delete_folder_tip": "Are you sure to delete this folder? All the following applications and corresponding chat records will be deleted, please confirm!", + "copy_one_app": "Copy", + "create_copy_success": "Create copy success", + "current_settings": "Current settings", + "edit_app": "Edit app", + "edit_info": "Edit info", + "export_config_successful": "Config copied, please check for important data", + "export_configs": "Export Configs", + "feedback_count": "User Feedback", + "go_to_chat": "To chat", + "go_to_run": "Run", + "import_configs": "Import Configs", + "import_configs_failed": "Failed to import configs, please ensure configs are valid!", + "logs_empty": "No logs yet~", + "logs_message_total": "Total Messages", + "logs_title": "Title", + "mark_count": "Marked Answer Count", + "move_app": "Move app", + "paste_config": "Paste Config", + "plugin_dispatch": "Plugins", + "plugin_dispatch_tip": "It is up to the model to decide which plug-ins to add additional capabilities to. If the plug-in is selected, the knowledge base call is also treated as a special plug-in.", + "publish_channel": "Publish channel", + "publish_success": "Publish success", "Run": "Run", - "Search app": "Search app", - "Setting app": "Settings", - "Setting plugin": "Setting plugin", - "To Chat": "Go to Chat", - "To Settings": "View Details", - "Transition to workflow": "Transition to workflow", - "Transition to workflow create new placeholder": "Create a new application instead of modifying the current one", - "Transition to workflow create new tip": "After converting to workflow, it will not be able to convert back to simple mode, please confirm!", - "Variable Key Repeat Tip": "Variable key is duplicate", + "search_app": "Search app", + "setting_app": "Settings", + "setting_plugin": "Setting plugin", + "transition_to_workflow": "Transition to workflow", + "transition_to_workflow_create_new_placeholder": "Create a new application instead of modifying the current one", + "transition_to_workflow_create_new_tip": "After converting to workflow, it will not be able to convert back to simple mode, please confirm!", "app": { "modules": { "click to update": "click to update", @@ -65,17 +47,16 @@ "plugin_cost_per_times": "{{cost}} points/times" }, "module": { - "Combine Modules": "Combine Modules", "Confirm Sync": "The template will be updated to the latest template configuration. Fields that do not exist in the template will be deleted (including all custom fields). You are advised to make a copy of the node and then update the original node version.", "Custom Title Tip": "This title will be displayed during the conversation", - "My Modules": "My Modules", - "No Modules": "No plugins yet~", - "System Module": "System Module", - "type": "\"{{type}}\" type\n{{description}}" + "No Modules": "No plugins yet~" }, "modules": { "Title is required": "Module name cannot be empty" }, + "template": { + "simple_robot": "Simple Robot" + }, "type": { "All": "All", "Create http plugin tip": "Create plug-ins in batches using OpenAPI schema, compatible with GPTs format.", @@ -93,4 +74,4 @@ "version": { "Revert success": "Revert success" } -} +} \ No newline at end of file diff --git a/packages/web/i18n/en/chat.json b/packages/web/i18n/en/chat.json index 6f5f39b9d..7a9d8dfbf 100644 --- a/packages/web/i18n/en/chat.json +++ b/packages/web/i18n/en/chat.json @@ -1,18 +1,12 @@ { - "Chat input guide lexicon is empty": "The lexicon has not been configured", - "Config Texts": "Config thesaurus ", - "Config input guide lexicon": "Config", - "Config input guide lexicon title": "Config lexicon", - "Config question guide": "Configuration input Prompt ", - "Csv input lexicon tip": "Only CSV can be imported in batches. Click to download the template", - "Custom input guide url": "Custom lexicon url", - "Custom question guide URL": "Custom lexicon address ", - "Input Guide": "Intelligent Recommendation ", - "Input guide": "Input guide", - "Input guide lexicon": "Lexicon", - "Input guide tip": "You can configure some preset questions. When the user enters a question, the relevant question is retrieved from these preset questions for prompt.", - "Insert input guide, Some data already exists": "Duplicate data, automatically filtered, insert: {{len}} data", - "New input guide lexicon": "New lexicon", - "Only support CSV": "Only support CSV import, click download template ", - "Question Guide Texts": "Lexicon" -} + "chat_input_guide_lexicon_is_empty": "The lexicon has not been configured", + "config_input_guide_lexicon": "Config", + "config_input_guide_lexicon_title": "Config lexicon", + "csv_input_lexicon_tip": "Only CSV can be imported in batches. Click to download the template", + "custom_input_guide_url": "Custom lexicon url", + "input_guide": "Input guide", + "input_guide_lexicon": "Lexicon", + "input_guide_tip": "You can configure some preset questions. When the user enters a question, the relevant question is retrieved from these preset questions for prompt.", + "insert_input_guide,_some_data_already_exists": "Duplicate data, automatically filtered, insert: {{len}} data", + "new_input_guide_lexicon": "New lexicon" +} \ No newline at end of file diff --git a/packages/web/i18n/en/common.json b/packages/web/i18n/en/common.json index 29d02e540..09e34e91b 100644 --- a/packages/web/i18n/en/common.json +++ b/packages/web/i18n/en/common.json @@ -23,13 +23,9 @@ "Add New": "Add New", "Add Success": "Add successfully", "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", @@ -39,7 +35,6 @@ "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", @@ -49,7 +44,6 @@ "Delete": "Delete", "Delete Failed": "Delete Failed", "Delete Success": "Delete Success", - "Delete Tip": "Delete Tip", "Delete Warning": "Delete Warning", "Delete folder": "Delete", "Detail": "Detail", @@ -59,9 +53,6 @@ "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", @@ -70,13 +61,11 @@ "Input folder description": "Folder description", "Input name": "Folder name", "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": "More", - "More settings": "More settings", "Move": "Move", "MultipleRowSelect": { "No data": "No data available" @@ -86,24 +75,18 @@ "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", "Operation": "Operation", "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", "Restart": "Restart", @@ -111,28 +94,18 @@ "Root folder": "Root folder", "Run": "Run", "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 all": "Select all", "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", "Success": "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", @@ -141,18 +114,14 @@ "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" @@ -165,7 +134,6 @@ }, "error": { "Select avatar failed": "Avatar selection failed", - "Update error": "Update failed", "unKnow": "An unexpected error occurred~" }, "folder": { @@ -187,9 +155,6 @@ "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" @@ -199,11 +164,6 @@ "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" @@ -212,11 +172,7 @@ }, "core": { "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 settings", "Ai point price": "AI point consumption", @@ -235,13 +191,9 @@ "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", @@ -252,14 +204,11 @@ "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", "Saved time": "Saved: {{time}}", "Search team tags": "Search tags", "Select TTS": "Select voice playback mode", @@ -270,35 +219,26 @@ "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": "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" + "Team": "Team" }, "Welcome Text": "Conversation opener", "Whisper": "Voice input", - "Whisper Tip": "Configure voice input related parameters", "Whisper config": "Voice input configuration", "deterministic": "Rigorous", "edit": { - "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" + "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" }, "error": { "App name can not be empty": "App name cannot be empty", @@ -311,26 +251,17 @@ "logs": { "Source And Time": "Source & Time" }, - "navbar": { - "External": "External use", - "Flow mode": "Advanced arrangement", - "Publish": "Publish", - "Publish app": "Publish app", - "Simple mode": "Simple configuration" - }, "outLink": { "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" + "Show History": "Show chat history" }, "publish": { "Fei Shu Bot Desc": "Access to Lark bot", @@ -356,34 +287,14 @@ "Not share link": "No share link created", "Role check": "Identity verification" }, - "simple": { - "mode template select": "Simple template" - }, - "template": { - "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": "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": "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", @@ -406,8 +317,6 @@ "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...", @@ -417,12 +326,10 @@ "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", @@ -438,36 +345,24 @@ "Recent use": "Recent use", "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": "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" + "Chat error": "Chat error" }, "feedback": { - "Close User Good Feedback": "", "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 call", - "online": "Online use", - "share": "External link call", - "test": "Test" - }, "markdown": { "Edit Question": "Edit question", "Quick Question": "Click to ask now", @@ -475,8 +370,7 @@ }, "quote": { "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" + "Read Quote": "View quote" }, "response": { "Complete Response": "Complete response", @@ -491,29 +385,7 @@ "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" + "module historyPreview": "Complete record" }, "retry": "Regenerate", "tts": { @@ -529,16 +401,13 @@ "All Dataset": "All datasets", "Avatar": "Dataset avatar", "Choose Dataset": "Associate dataset", - "Chunk amount": "Number of chunks", "Collection": "Dataset", "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 Tips": "No datasets yet, go create one!", - "File collection": "File dataset", "Folder placeholder": "This is a directory", "Go Dataset": "Go to dataset", "Intro Placeholder": "This dataset has no introduction~", @@ -548,16 +417,10 @@ "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}}", "collection": { "Click top config website": "Click to configure website", "Collection name": "Dataset name", @@ -567,10 +430,8 @@ "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": "Segment size", @@ -587,14 +448,7 @@ "source size": "Source size" }, "status": { - "active": "Ready", - "syncing": "Syncing" - }, - "sync": { - "result": { - "sameRaw": "Content unchanged, no update needed", - "success": "Start syncing" - } + "active": "Ready" }, "training": {} }, @@ -612,37 +466,20 @@ "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": "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": "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" + "Template does not exist": "Template does not exist" }, "file": "File", - "folder": "Directory", "import": { "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", @@ -651,64 +488,36 @@ "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", "search": { - "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", @@ -718,45 +527,14 @@ "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": "Use question optimization", - "mode": { - "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": "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" }, - "settings": { - "Search basic params": "Search parameters" - }, "status": { - "active": "Ready", "syncing": "Syncing" }, "test": { @@ -764,7 +542,6 @@ "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", @@ -776,14 +553,8 @@ }, "training": { "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": "Manual import", - "QA mode": "Question and answer split", "Vector queue": "Index queue", "Waiting": "Estimated 5 minutes", "Website Sync": "Web site sync" @@ -806,9 +577,6 @@ "Confirm Delete Node": "Confirm delete node?", "Data Type": "Data type", "Dataset quote": { - "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", @@ -817,8 +585,6 @@ "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", @@ -827,27 +593,15 @@ "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": "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." + "placeholder": "For example:\nIntroduction and usage of python.\nThe current conversation is related to the game 'GTA5'." }, "Quote prompt setting": "Quote prompt setting", - "Qupte prompt setting": "", - "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 already exists", - "Field Edit": "Field edit", "Field Name Cannot Be Empty": "Field name cannot be empty" }, "extract": { @@ -874,167 +628,69 @@ "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" + "curl import placeholder": "Please enter curl format content, the request information of the first interface will be extracted." }, "input": { "Add Branch": "Add branch", - "Add Input": "Add input", - "Input Number": "Input: {{length}}", "add": "Add condition", "description": { "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." + "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" }, "label": { "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": "Chat history", - "switch": "Trigger", - "system params": "System parameters", - "textEditor textarea": "Text editor", "user question": "User question" }, "placeholder": { "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": { - "chat history": "", - "dynamicTargetInput": "", - "input": "", - "selectApp": "", - "selectDataset": "", - "selectLLMModel": "", - "switch": "", - "target": "", - "textarea": "" - }, "laf": { "Select laf function": "Select laf function" }, "output": { - "Add Output": "Add output", - "Output Number": "Output: {{length}}", "description": { "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" + "New context": "Concatenate this response content with historical records to return as a new context" }, "label": { "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": "Module invocation ends", - "text": "Text output" + "New context": "New context" } }, "template": { "AI function": "AI function", "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." + "http body placeholder": "Same syntax as APIFox" }, "templates": { "Load plugin error": "Load plugin error" }, - "textEditor": { - "Text Edit": "Text processing" - }, "tool": { "Tool input": "Tool input" }, - "valueType": { - "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": "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", @@ -1044,36 +700,30 @@ "variable add option": "Add option" }, "plugin": { - "Custom headers": "Custom headers", - "Delete http plugin": "Confirm to delete this group of HTTP plugins? This will delete all plugins in the directory.", "Free": "The plugin requires no points~", - "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.", - "cost": "Plugin cost: " + "cost": "Plugin cost: ", + "Custom headers": "Custom headers", + "Get Plugin Module Detail Failed": "Plugin loading failed", + "Http plugin intro placeholder": "For display only, no actual effect" }, - "shareChat": { - "Init Error": "Failed to initialize chat dialog", - "Init History Error": "Failed to initialize chat history" + "template": { + "Multimodal": "Multimodal", + "Search": "Search" }, "workflow": { - "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", @@ -1082,10 +732,6 @@ "Variable": { "Variable type": "Variable type" }, - "Variable outputs": "Global variables", - "chat": { - "Quote prompt": "Quote prompt" - }, "debug": { "Done": "Debugging completed", "Hide result": "Hide result", @@ -1098,12 +744,6 @@ "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", @@ -1111,7 +751,6 @@ "selectDataset": "Knowledge base selection", "selectLLMModel": "Dialogue model selection", "switch": "Switch", - "target": "External data", "textarea": "Multi-line input box" }, "publish": { @@ -1142,45 +781,27 @@ "Edit Info": "Edit Information", "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 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": "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", @@ -1196,42 +817,18 @@ "input is empty": "Data content cannot be empty" }, "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": "No results found" } }, "error": { "Create failed": "Create failed", - "fileNotFound": "File not found~", - "inheritPermissionError": "Inherit permission Error", - "missingParams": "Insufficient parameters", - "team": { - "overSize": "Team members exceed the limit" - } - }, - "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" + "fileNotFound": "File not found~" }, "navbar": { "Account": "Account", - "Apps": "Apps", - "Apps Share": "Apps Share", "Chat": "Chat", "Datasets": "Knowledge Base", - "Module": "Module", - "Plugin": "Plugin", - "Store": "App Store", "Studio": "Studio", "Tools": "Tools" }, @@ -1251,54 +848,28 @@ "Remove InheritPermission Confirm": "This operation will cause to lose the current permission settings, whether to continue?", "Resume InheritPermission Confirm": "Whether to resume to inherit the parent folder's permission?", "Resume InheritPermission Failed": "Resume Failed", - "Resume InheritPermission Success": "Resume Success", - "Set Private": "Set as private", - "Set Public": "Set as available to the team" + "Resume InheritPermission Success": "Resume Success" }, "plugin": { "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" + "go to laf": "Go to write" }, "select_reference_variable": "Select Reference Variable", "share_link": "Share Link", @@ -1313,10 +884,8 @@ "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 (¥)" + "New api key tip": "Please keep your key safe, it will not be shown again~" }, "outlink": { "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!", @@ -1338,16 +907,12 @@ "storage": "Storage amount", "type": "Type" }, - "subscription": { - "Cancel subscription": "Cancel subscription" - }, "team": { "limit": { "No permission rerank": "No permission to use result rerank, please upgrade your plan" } }, "user": { - "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.", @@ -1385,81 +950,49 @@ "team": { "Dataset usage": "Knowledge base capacity", "Team Tags Async Success": "Synchronization complete", - "member": "Member", - "tag": { - "Have not opened": "Team chat feature not opened" - } + "member": "Member" } }, "wallet": { - "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 model", - "AI Type": "AI type", "Number": "Order number", - "Price": "Price (¥)", "Status": "Status", "Type": "Order type", "payWay": { - "Way": "Payment method", - "balance": "Balance payment", - "wx": "Wechat payment" - }, - "status": { - "closed": "Closed", - "notpay": "Not paid", - "refund": "Refunded", - "success": "Payment successful" + "Way": "Payment method" } }, "moduleName": { - "index": "Index generation", - "qa": "QA split" + "index": "Index generation" }, "noBill": "No bill records~", "subscription": { "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", @@ -1482,20 +1015,6 @@ "Period": "Subscription period", "Year": "Yearly", "Year sale": "Two months free" - }, - "standardSubLevel": { - "enterprise": "Enterprise edition", - "experience": "Experience edition", - "experience desc": "", - "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": "Balance recharge", - "extraDatasetSize": "Knowledge base expansion", - "extraPoints": "AI points package", - "standard": "Plan subscription" } }, "usage": { @@ -1503,18 +1022,9 @@ "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": "Output Tokens", - "ReRank": "Result rerank", "Source": "Source", "Text Length": "Text length", "Time": "Generation time", @@ -1522,8 +1032,7 @@ "Total": "Total amount", "Total points": "AI points consumed", "Usage Detail": "Usage details", - "Whisper": "Voice input", - "bill username": "User" + "Whisper": "Voice input" } } }, @@ -1544,40 +1053,30 @@ "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": "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": "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", @@ -1585,10 +1084,6 @@ "apikey": { "key": "API key" }, - "promotion": { - "pay": "Friend's recharge", - "register": "Friend's registration" - }, "team": { "Balance": "Team Balance", "Check Team": "Switch", @@ -1599,22 +1094,15 @@ "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", "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(Old)", "Select Team": "Select Team", "Set Name": "Name Your Team", "Switch Team Failed": "Failed to switch team", @@ -1622,7 +1110,6 @@ "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": "Confirm to join this team?", @@ -1634,17 +1121,10 @@ "reject": "Reject" }, "member": { - "Confirm Leave": "Confirm to leave this team?", - "active": "Joined", - "reject": "Reject", - "waiting": "Waiting for Acceptance" + "Confirm Leave": "Confirm to leave this team?" }, "role": { - "Admin": "Admin", - "Member": "Member", - "Owner": "Owner", - "Update to Visitor": "Change to Visitor", - "Visitor": "Visitor" + "Admin": "Admin" } } } diff --git a/packages/web/i18n/en/dataset.json b/packages/web/i18n/en/dataset.json index b7751663c..7a0a99de1 100644 --- a/packages/web/i18n/en/dataset.json +++ b/packages/web/i18n/en/dataset.json @@ -1,26 +1,25 @@ { - "Collection tags": "Tags", - "Common Dataset": "Common dataset", - "Common Dataset Desc": "Can be built by importing files, web links, or manual entry", - "Confirm to rebuild embedding tip": "Are you sure to switch the knowledge base index?\nSwitching index is a very heavy operation that requires re-indexing all the data in your knowledge base, which may take a long time. Please ensure that the remaining points in your account are sufficient.\n\nIn addition, you need to be careful to modify the applications that select this knowledge base to avoid mixing them with other index model knowledge bases.", + "collection_tags": "Tags", + "common_dataset": "Common dataset", + "common_dataset_desc": "Can be built by importing files, web links, or manual entry", + "confirm_to_rebuild_embedding_tip": "Are you sure to switch the knowledge base index?\nSwitching index is a very heavy operation that requires re-indexing all the data in your knowledge base, which may take a long time. Please ensure that the remaining points in your account are sufficient.\n\nIn addition, you need to be careful to modify the applications that select this knowledge base to avoid mixing them with other index model knowledge bases.", "Disabled": "Disabled", "Enable": "Enable", "Enabled": "Enabled", - "External file": "External file", - "External file Dataset Desc": "You can import files from an external file library to build a knowledge base. Files are not stored twice", - "External id": "File id", - "External read url": "External read url", - "External read url tip": "You can configure the reading address of your file library. This allows users to read and authenticate. You can currently use the {{fileId}} variable to refer to the external file ID.", - "External url": "File read url", - "Folder Dataset": "Folder", - "Rebuild embedding start tip": "The task of switching index models has begun", - "Rebuilding index count": "Rebuilding count: {{count}}", - "The knowledge base has indexes that are being trained or being rebuilt": "The knowledge base has indexes that are being trained or being rebuilt", - "Website Dataset": "Web site", - "Website Dataset Desc": "Web site synchronization allows you to use a web page link to build a dataset", + "external_file": "External file", + "external_file_dataset_desc": "You can import files from an external file library to build a knowledge base. Files are not stored twice", + "external_id": "File id", + "external_read_url": "External read url", + "external_read_url_tip": "You can configure the reading address of your file library. This allows users to read and authenticate. You can currently use the {{fileId}} variable to refer to the external file ID.", + "external_url": "File read url", + "rebuild_embedding_start_tip": "The task of switching index models has begun", + "rebuilding_index_count": "Rebuilding count: {{count}}", + "the_knowledge_base_has_indexes_that_are_being_trained_or_being_rebuilt": "The knowledge base has indexes that are being trained or being rebuilt", + "website_dataset": "Web site", + "website_dataset_desc": "Web site synchronization allows you to use a web page link to build a dataset", "collection": { "Create update time": "Create/Update time", "Training type": "Training type" }, "filename": "filename" -} +} \ No newline at end of file diff --git a/packages/web/i18n/en/file.json b/packages/web/i18n/en/file.json index 68b3d59ba..8740f266b 100644 --- a/packages/web/i18n/en/file.json +++ b/packages/web/i18n/en/file.json @@ -1,24 +1,15 @@ { - "Click to view raw source": "View source", - "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" -} + "click_to_view_raw_source": "View source", + "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", + "file_name": "File Name", + "file_size": "File Size", + "select_and_drag_file_tip": "Click or drag files here to upload", + "select_file_amount_limit": "You can select up to {{max}} files", + "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" +} \ No newline at end of file diff --git a/packages/web/i18n/en/publish.json b/packages/web/i18n/en/publish.json index 7b7a93311..ce951373c 100644 --- a/packages/web/i18n/en/publish.json +++ b/packages/web/i18n/en/publish.json @@ -1,22 +1,17 @@ { - "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" -} + "create_api_key": "Create new Key", + "create_link": "Create link", + "default_response": "Default Response", + "edit_api_key": "Edit Key information", + "edit_link": "Edit", + "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" +} \ No newline at end of file diff --git a/packages/web/i18n/en/user.json b/packages/web/i18n/en/user.json index dfff03d6a..b51a6e50b 100644 --- a/packages/web/i18n/en/user.json +++ b/packages/web/i18n/en/user.json @@ -1,22 +1,8 @@ { "permission": { - "Set read permission": "Read permission", - "Set write permission": "Write permission", "Write": "Write" }, "team": { "Add manager": "Add manager" - }, - "user": { - "team": { - "permission": { - "Manage": "Admin", - "Manage tip": "Team administrator with full permissions", - "Read": "Read", - "Read desc": "Members can only read related resources and cannot create new resources", - "Write": "Write", - "Write tip": "In addition to readable resources, you can create new resources" - } - } } -} +} \ No newline at end of file diff --git a/packages/web/i18n/en/workflow.json b/packages/web/i18n/en/workflow.json index b50df83fe..a388772a4 100644 --- a/packages/web/i18n/en/workflow.json +++ b/packages/web/i18n/en/workflow.json @@ -1,19 +1,19 @@ { - "Add new input": "Add input", + "add_new_input": "Add input", "Code": "Code", - "Confirm delete field tip": "Confirm to delete the field?", - "Custom input": "Custom input", - "Edit input": "Edit input", - "Field Name already exists": "Field name already exists", - "Field description": "Field description", - "Field description placeholder": "Describes the functionality of this input field, which affects the quality of model generation if the parameter is called for a tool", - "Field required": "Required", - "Field used as tool input": "As tool input", - "Input description": "Input descriotion", - "Only the Reference type is supported": "Only the Reference type is supported", - "Optional value type": "Optional value type", - "Optional value type tip": "One or more data types can be specified, and users can only select the configured type when adding fields in winter", - "Tool input": "Tool", + "confirm_delete_field_tip": "Confirm to delete the field?", + "custom_input": "Custom input", + "edit_input": "Edit input", + "field_name_already_exists": "Field name already exists", + "field_description": "Field description", + "field_description_placeholder": "Describes the functionality of this input field, which affects the quality of model generation if the parameter is called for a tool", + "field_required": "Required", + "field_used_as_tool_input": "As tool input", + "input_description": "Input descriotion", + "only_the_reference_type_is_supported": "Only the Reference type is supported", + "optional_value_type": "Optional value type", + "optional_value_type_tip": "One or more data types can be specified, and users can only select the configured type when adding fields in winter", + "tool_input": "Tool", "code": { "Reset template": "Reset template", "Reset template confirm": "Are you sure to restore the code template? All input and output to template values will be reset, please be careful to save the current code." @@ -28,4 +28,4 @@ "Custom outputs": "Custom outputs", "Error": "Error" } -} +} \ No newline at end of file diff --git a/packages/web/i18n/utils.ts b/packages/web/i18n/utils.ts new file mode 100644 index 000000000..d076b1a87 --- /dev/null +++ b/packages/web/i18n/utils.ts @@ -0,0 +1,3 @@ +import { I18nKeyFunction } from '../types/i18next'; + +export const i18nT: I18nKeyFunction = (key) => key; diff --git a/packages/web/i18n/zh/app.json b/packages/web/i18n/zh/app.json index a26c5445e..9c119a842 100644 --- a/packages/web/i18n/zh/app.json +++ b/packages/web/i18n/zh/app.json @@ -1,59 +1,42 @@ { - "AI Settings": "AI 配置", - "Advance App TestTip": "当前应用可能为高级编排模式\n如需切换为【简易模式】请点击左侧保存按键", - "App Detail": "应用详情", - "Apps Share": "应用分享", - "Basic Settings": "基本信息", - "Chat Debug": "调试预览", - "Chat Logs Tips": "日志会记录该应用的在线、分享和 API(需填写 chatId)对话记录", - "Chat logs": "对话日志", - "Confirm Del App Tip": "确认删除该应用及其所有聊天记录?", - "Confirm copy app tip": "系统将为您创建一个相同配置应用,但权限不会进行复制,请确认!", - "Confirm delete folder tip": "确认删除该文件夹?将会删除它下面所有应用及对应的聊天记录,请确认!", - "Connection is invalid": "连接无效", - "Connection type is different": "连接的类型不一致", - "Copy Module Config": "复制配置", - "Copy one app": "创建副本", - "Create bot": "应用", - "Create copy success": "创建副本成功", - "Create one ai app": "创建一个 AI 应用", - "Current settings": "当前配置", - "Dataset Quote Template": "知识库问答模式", - "Edit app": "编辑应用", - "Edit info": "编辑信息", - "Export Config Successful": "已复制配置,自动过滤部分敏感信息,请注意检查是否仍有敏感数据", - "Export Configs": "导出配置", - "Feedback Count": "用户反馈", - "Go to chat": "去对话", - "Go to run": "去运行", - "Import Configs": "导入配置", - "Import Configs Failed": "导入配置失败,请确保配置正常!", - "Input Field Settings": "输入字段编辑", - "Logs Empty": "还没有日志噢~", - "Logs Message Total": "消息总数", - "Logs Source": "来源", - "Logs Time": "时间", - "Logs Title": "标题", - "Mark Count": "标注答案数量", - "Move app": "移动应用", - "My Apps": "我的应用", - "Output Field Settings": "输出字段编辑", - "Paste Config": "粘贴配置", "plugin_cost_per_times": "{{cost}}/次", - "Plugin dispatch": "插件调用", - "Plugin dispatch tip": "给模型附加额外的能力,具体调用哪些插件,将由模型自主决定。\n若选择了插件,知识库调用将自动作为一个特殊的插件。", - "Publish channel": "发布渠道", - "Publish success": "发布成功", + "ai_settings": "AI 配置", + "app_detail": "应用详情", + "chat_debug": "调试预览", + "chat_logs_tips": "日志会记录该应用的在线、分享和 API(需填写 chatId)对话记录", + "chat_logs": "对话日志", + "confirm_del_app_tip": "确认删除该应用及其所有聊天记录?", + "confirm_copy_app_tip": "系统将为您创建一个相同配置应用,但权限不会进行复制,请确认!", + "confirm_delete_folder_tip": "确认删除该文件夹?将会删除它下面所有应用及对应的聊天记录,请确认!", + "copy_one_app": "创建副本", + "create_copy_success": "创建副本成功", + "current_settings": "当前配置", + "edit_app": "编辑应用", + "edit_info": "编辑信息", + "export_config_successful": "已复制配置,自动过滤部分敏感信息,请注意检查是否仍有敏感数据", + "export_configs": "导出配置", + "feedback_count": "用户反馈", + "go_to_chat": "去对话", + "go_to_run": "去运行", + "import_configs": "导入配置", + "import_configs_failed": "导入配置失败,请确保配置正常!", + "logs_empty": "还没有日志噢~", + "logs_message_total": "消息总数", + "logs_title": "标题", + "mark_count": "标注答案数量", + "move_app": "移动应用", + "paste_config": "粘贴配置", + "plugin_dispatch": "插件调用", + "plugin_dispatch_tip": "给模型附加额外的能力,具体调用哪些插件,将由模型自主决定。\n若选择了插件,知识库调用将自动作为一个特殊的插件。", + "publish_channel": "发布渠道", + "publish_success": "发布成功", "Run": "运行", - "Search app": "搜索应用", - "Setting app": "应用配置", - "Setting plugin": "插件配置", - "To Chat": "前去对话", - "To Settings": "查看详情", - "Transition to workflow": "转成工作流", - "Transition to workflow create new placeholder": "创建一个新的应用,而不是修改当前应用", - "Transition to workflow create new tip": "转化成工作流后,将无法转化回简易模式,请确认!", - "Variable Key Repeat Tip": "变量 key 重复", + "search_app": "搜索应用", + "setting_app": "应用配置", + "setting_plugin": "插件配置", + "transition_to_workflow": "转成工作流", + "transition_to_workflow_create_new_placeholder": "创建一个新的应用,而不是修改当前应用", + "transition_to_workflow_create_new_tip": "转化成工作流后,将无法转化回简易模式,请确认!", "app": { "modules": { "click to update": "点击更新", @@ -64,17 +47,16 @@ "plugin_cost_per_times": "{{cost}}积分/次" }, "module": { - "Combine Modules": "组合模块", "Confirm Sync": "将会更新至最新的模板配置,不存在模板中的字段将会被删除(包括所有自定义字段),建议您先复制一份节点,再更新原来节点的版本。", "Custom Title Tip": "该标题名字会展示在对话过程中", - "My Modules": "", - "No Modules": "没找到插件", - "System Module": "系统模块", - "type": "\"{{type}}\"类型\n{{description}}" + "No Modules": "没找到插件" }, "modules": { "Title is required": "模块名不能为空" }, + "template": { + "simple_robot": "简易机器人" + }, "type": { "All": "全部", "Create http plugin tip": "通过 OpenAPI Schema 批量创建插件,兼容 GPTs 格式。", @@ -92,4 +74,4 @@ "version": { "Revert success": "回滚成功" } -} +} \ No newline at end of file diff --git a/packages/web/i18n/zh/chat.json b/packages/web/i18n/zh/chat.json index 128929b85..761042c80 100644 --- a/packages/web/i18n/zh/chat.json +++ b/packages/web/i18n/zh/chat.json @@ -1,13 +1,13 @@ { - "Chat input guide lexicon is empty": "还没有配置词库", - "Config input guide": "配置输入引导", - "Config input guide lexicon": "配置词库", - "Config input guide lexicon title": "配置词库", - "Csv input lexicon tip": "仅支持 CSV 批量导入,点击下载模板", - "Custom input guide url": "自定义词库地址", - "Input guide": "输入引导", - "Input guide lexicon": "词库", - "Input guide tip": "可以配置一些预设的问题。在用户输入问题时,会从这些预设问题中获取相关问题进行提示。", - "Insert input guide, Some data already exists": "有重复数据,已自动过滤,共插入 {{len}} 条数据", - "New input guide lexicon": "新词库" -} + "chat_input_guide_lexicon_is_empty": "还没有配置词库", + "config_input_guide": "配置输入引导", + "config_input_guide_lexicon": "配置词库", + "config_input_guide_lexicon_title": "配置词库", + "csv_input_lexicon_tip": "仅支持 CSV 批量导入,点击下载模板", + "custom_input_guide_url": "自定义词库地址", + "input_guide": "输入引导", + "input_guide_lexicon": "词库", + "input_guide_tip": "可以配置一些预设的问题。在用户输入问题时,会从这些预设问题中获取相关问题进行提示。", + "insert_input_guide,_some_data_already_exists": "有重复数据,已自动过滤,共插入 {{len}} 条数据", + "new_input_guide_lexicon": "新词库" +} \ No newline at end of file diff --git a/packages/web/i18n/zh/common.json b/packages/web/i18n/zh/common.json index 7e0cf82a8..203dbcfe2 100644 --- a/packages/web/i18n/zh/common.json +++ b/packages/web/i18n/zh/common.json @@ -23,13 +23,9 @@ "Add New": "新增", "Add Success": "添加成功", "All": "全部", - "Back": "返回", - "Beta": "实验版", - "Business edition features": "这是商业版功能~", "Cancel": "取消", "Choose": "选择", "Close": "关闭", - "Collect": "收藏", "Config": "配置", "Confirm": "确认", "Confirm Create": "确认创建", @@ -39,7 +35,6 @@ "Confirm to leave the page": "确认离开该页面?", "Copy": "复制", "Copy Successful": "复制成功", - "Course": "", "Create Failed": "创建异常", "Create New": "新建", "Create Success": "创建成功", @@ -49,7 +44,6 @@ "Delete": "删除", "Delete Failed": "删除失败", "Delete Success": "删除成功", - "Delete Tip": "删除提示", "Delete Warning": "删除警告", "Delete folder": "删除文件夹", "Detail": "详情", @@ -59,9 +53,6 @@ "Exit": "退出", "Expired Time": "过期时间", "Field": "字段", - "File": "文件", - "Filed is repeat": "", - "Filed is repeated": "字段重复了", "Finish": "完成", "Import": "导入", "Import failed": "导入失败", @@ -70,13 +61,11 @@ "Input folder description": "文件夹描述", "Input name": "取个名字", "Intro": "介绍", - "Invalid Json": "无效的 JSON 格式,请注意检查。", "Last Step": "上一步", "Last use time": "最后使用时间", "Load Failed": "加载失败", "Loading": "加载中...", "More": "更多", - "More settings": "更多设置", "Move": "移动", "MultipleRowSelect": { "No data": "没有可选值" @@ -86,10 +75,8 @@ "Next Step": "下一步", "No more data": "没有更多了~", "Not open": "未开启", - "Number of words": "{{amount}} 字", "OK": "好的", "Open": "打开", - "Opened": "已开启", "Operation": "操作", "Other": "其他", "Output": "输出", @@ -97,14 +84,10 @@ "Password inconsistency": "两次密码不一致", "Permission": "权限", "Please Input Name": "请输入名称", - "Price used": "金额消耗", "Read document": "查看文档", "Read intro": "查看说明", - "Readed": "已读", "Remove": "移除", "Rename": "重命名", - "Rename Failed": "重命名失败", - "Rename Success": "重命名成功", "Request Error": "请求异常", "Require Input": "必填", "Restart": "重新开始", @@ -112,28 +95,18 @@ "Root folder": "根目录", "Run": "运行", "Save": "保存", - "Save Failed": "保存失败", - "Save Success": "保存成功", "Search": "搜索", "Select File Failed": "选择文件异常", - "Select One Folder": "选择一个目录", - "Select all": "全选", "Select template": "选择模板", "Set Avatar": "点击设置头像", "Set Name": "取个名字", - "Set Team Tags": "团队标签", "Setting": "设置", "Status": "状态", "Submit failed": "提交失败", - "Submit success": "提交成功", "Success": "成功", "Sync success": "同步成功", - "System Output": "系统输出", - "System version": "系统版本", "Team": "团队", "Team Tags Set": "标签", - "Test": "测试", - "Time": "时间", "Un used": "未使用", "UnKnow": "未知", "UnKnow Source": "未知来源", @@ -142,18 +115,14 @@ "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": "操作确认" @@ -166,7 +135,6 @@ }, "error": { "Select avatar failed": "头像选择异常", - "Update error": "更新失败", "unKnow": "出现了点意外~" }, "folder": { @@ -188,9 +156,6 @@ "UnValid": "无效的链接" }, "month": "月", - "price": { - "Amount": "{{amount}}{{unit}}" - }, "speech": { "error tip": "语音转文字失败", "not support": "您的浏览器不支持语音输入" @@ -200,11 +165,6 @@ "Help Chatbot": "机器人助手", "Use Helper": "使用帮助" }, - "time": { - "Just now": "刚刚", - "The day before yesterday": "前天", - "Yesterday": "昨天" - }, "ui": { "textarea": { "Magnifying": "放大" @@ -213,11 +173,7 @@ }, "core": { "Chat": "对话", - "Chat test": "测试", "Max Token": "单条数据上限", - "Start chat": "立即对话", - "Total chars": "总字数:{{total}}", - "Total tokens": "总 tokens:{{total}}", "ai": { "AI settings": "AI 配置", "Ai point price": "AI 积分消耗", @@ -236,13 +192,9 @@ "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": "可定时执行应用", @@ -253,15 +205,12 @@ "Onclick to save": "点击保存", "Publish": "发布", "Publish Confirm": "确认发布应用?会立即更新所有发布渠道的应用状态。", - "Publish Failed": "发布失败", - "Publish Success": "发布成功", "Publish app tip": "发布应用后,所有发布渠道将会立即使用该版本", "Question Guide": "猜你想问", "Question Guide Tip": "对话结束后,会为生成 3 个引导性问题。", "Quote prompt": "引用模板提示词", "Quote templates": "引用内容模板", "Random": "发散", - "Save and preview": "保存并预览", "Saved time": "已保存:{{time}}", "Search team tags": "搜索标签", "Select TTS": "选择语音播放模式", @@ -272,35 +221,26 @@ "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 模型,效果更好。", "ToolCall": { "No plugin": "没有可用的插件", "Parameter setting": "输入参数", - "Setting tool": "配置工具", "System": "系统", - "Team": "团队", - "This plugin cannot be called as a tool": "该工具无法在简易模式中使用" + "Team": "团队" }, "Welcome Text": "对话开场白", "Whisper": "语音输入", - "Whisper Tip": "配置语音输入相关参数", "Whisper config": "语音输入配置", "deterministic": "严谨", "edit": { - "Confirm Save App Tip": "该应用可能为高级编排模式,保存后将会覆盖高级编排配置,请确认!", - "Out Ad Edit": "您即将退出高级编排页面,请确认", "Prompt Editor": "提示词编辑", "Query extension background prompt": "对话背景描述", - "Query extension background tip": "描述当前对话的范围,便于 AI 为当前问题进行补全和扩展。填写的内容,通常为该助手", - "Save and out": "保存并退出", - "UnSave": "不保存" + "Query extension background tip": "描述当前对话的范围,便于 AI 为当前问题进行补全和扩展。填写的内容,通常为该助手" }, "error": { "App name can not be empty": "应用名不能为空", @@ -313,26 +253,17 @@ "logs": { "Source And Time": "来源 & 时间" }, - "navbar": { - "External": "外部使用", - "Flow mode": "高级编排", - "Publish": "发布", - "Publish app": "发布应用", - "Simple mode": "简易配置" - }, "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": "网络链接" + "Show History": "展示历史对话" }, "publish": { "Fei Shu Bot Desc": "接入到飞书机器人中", @@ -358,34 +289,14 @@ "Not share link": "没有创建分享链接", "Role check": "身份校验" }, - "simple": { - "mode template select": "简易模板" - }, - "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已内置参数细节" - }, "tip": { "Add a intro to app": "快来给应用一个介绍~", "chatNodeSystemPromptTip": "模型固定的引导词,通过调整该内容,可以引导模型聊天方向。该内容会被固定在上下文的开头。可使用变量,例如 {{language}}\n如果关联了知识库,你还可以通过适当的描述,来引导模型何时去调用知识库搜索。例如:\n你是电影《星际穿越》的助手,当用户询问与《星际穿越》相关的内容时,请搜索知识库并结合搜索结果进行回答。", - "userGuideTip": "可以在对话前设置引导语,设置全局变量,设置下一步指引", "variableTip": "可以在对话开始前,要求用户填写一些内容作为本轮对话的特定变量。该模块位于开场引导之后。\n变量可以通过 {{变量key}} 的形式注入到其他模块 string 类型的输入中,例如:提示词、限定词等", "welcomeTextTip": "每次对话开始前,发送一个初始内容。支持标准 Markdown 语法,可使用的额外标记:\n[快捷按键]:用户点击后可以直接发送该问题" }, "tts": { "Close": "不使用", - "Model alloy": "女声 - Alloy", - "Model echo": "男声 - Echo", "Speech model": "语音模型", "Speech speed": "语速", "Test Listen": "试听", @@ -408,8 +319,6 @@ "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": "正在转换为文本...", @@ -419,12 +328,10 @@ "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}} 条记录", @@ -440,36 +347,24 @@ "Recent use": "最近使用", "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": "你没有可用的应用", "error": { - "Chat error": "对话出现异常", - "Messages empty": "接口内容为空,可能文本超长了~", - "Select dataset empty": "你没有选择知识库", - "User input empty": "传入的用户问题为空" + "Chat error": "对话出现异常" }, "feedback": { - "Close User Good Feedback": "", "Close User Like": "用户表示赞同\n点击关闭该标记", "Feedback Close": "关闭反馈", "No Content": "用户没有填写具体反馈内容", "Read User dislike": "用户表示反对\n点击查看内容" }, - "logs": { - "api": "API 调用", - "online": "在线使用", - "share": "外部链接调用", - "test": "测试" - }, "markdown": { "Edit Question": "编辑问题", "Quick Question": "点我立即提问", @@ -477,8 +372,7 @@ }, "quote": { "Quote Tip": "此处仅显示实际引用内容,若数据有更新,此处不会实时更新", - "Read Quote": "查看引用", - "Read Source": "查看来源" + "Read Quote": "查看引用" }, "response": { "Complete Response": "完整响应", @@ -494,21 +388,14 @@ "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": "运行时长", @@ -531,17 +418,14 @@ "All Dataset": "全部知识库", "Avatar": "知识库头像", "Choose Dataset": "关联知识库", - "Chunk amount": "分段数", "Collection": "数据集", "Create dataset": "创建一个知识库", "Dataset": "知识库", "Dataset ID": "知识库 ID", "Dataset Type": "知识库类型", "Delete Confirm": "确认删除该知识库?删除后数据无法恢复,请确认!", - "Delete Website Tips": "确认删除该站点?", "Empty Dataset": "", "Empty Dataset Tips": "还没有知识库,快去创建一个吧!", - "File collection": "文件数据集", "Folder placeholder": "这是一个目录", "Go Dataset": "前往知识库", "Intro Placeholder": "这个知识库还没有介绍~", @@ -551,16 +435,10 @@ "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}}", "collection": { "Click top config website": "点击配置网站", "Collection name": "数据集名称", @@ -570,10 +448,8 @@ "Start Sync Tip": "确认开始同步数据?将会删除旧数据后重新获取,请确认!", "Sync": "同步数据", "Sync Collection": "数据同步", - "Website Create Success": "创建成功,正在同步数据", "Website Empty Tip": "还没有关联网站", "Website Link": "Web 站点地址", - "Website Sync": "Web 站点同步", "id": "集合 ID", "metadata": { "Chunk Size": "分割大小", @@ -590,14 +466,7 @@ "source size": "来源大小" }, "status": { - "active": "已就绪", - "syncing": "同步中" - }, - "sync": { - "result": { - "sameRaw": "内容未变动,无需更新", - "success": "开始同步" - } + "active": "已就绪" }, "training": {} }, @@ -615,38 +484,20 @@ "Search data placeholder": "搜索相关数据", "Too Long": "总长度超长了", "Total Amount": "{{total}} 组", - "data is deleted": "该数据已被删除", - "get data error": "获取数据异常", - "id": "数据 ID", "unit": "条" }, "embedding model tip": "索引模型可以将自然语言转成向量,用于进行语义检索。\n注意,不同索引模型无法一起使用,选择完索引模型后将无法修改。", "error": { "Data not found": "数据不存在或已被删除", "Start Sync Failed": "开始同步失败", - "Template does not exist": "模板不存在", - "unAuthDataset": "无权操作该知识库", - "unAuthDatasetCollection": "无权操作该数据集", - "unAuthDatasetData": "无权操作该数据", - "unAuthDatasetFile": "无权操作该文件", - "unCreateCollection": "无权操作该数据", - "unLinkCollection": "不是网络链接集合" + "Template does not exist": "模板不存在" }, - "externalFile": "外部文件库", "file": "文件", - "folder": "目录", "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": "自定义提示词", @@ -655,117 +506,53 @@ "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 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": "读取静态网页内容作为数据集" }, - "link": "链接", "search": { - "Basic params": "基础参数", "Dataset Search Params": "知识库搜索配置", - "Embedding score": "语意检索得分", "Empty result response": "空搜索回复", - "Empty result response Tips": "若填写该内容,没有搜索到合适内容时,将直接回复填写的内容。", "Filter": "搜索过滤", - "Limit": "", "Max Tokens": "引用上限", "Max Tokens Tips": "单次搜索最大的 token 数量,中文约 1 字=1.7 tokens,英文约 1 字=1 token", "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": "单次搜索上限", - "Using cfr": "", "Using query extension": "使用问题优化", - "mode": { - "embedding": "语义检索", - "embedding desc": "使用向量进行文本相关性查询", - "fullTextRecall": "全文检索", - "fullTextRecall desc": "使用传统的全文检索,适合查找一些关键词和主谓语特殊的数据", - "mixedRecall": "混合检索", - "mixedRecall desc": "使用向量检索与全文检索的综合结果返回,使用 RRF 算法进行排序。" - }, - "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": "通过倒排计算的方式,合并多个检索结果。" - }, "search mode": "搜索模式" }, - "settings": { - "Search basic params": "检索参数" - }, "status": { - "active": "已就绪", "syncing": "同步中" }, "test": { @@ -773,7 +560,6 @@ "Batch test Placeholder": "选择一个 CSV 文件", "Search Test": "搜索测试", "Test": "测试", - "Test File": "批量测试", "Test Result": "测试结果", "Test Text": "单个文本测试", "Test Text Placeholder": "输入需要测试的文本", @@ -785,14 +571,8 @@ }, "training": { "Agent queue": "QA 训练排队", - "Auto mode": "增强处理(实验)", - "Auto mode Tip": "通过子索引以及调用模型生成相关问题与摘要,来增加数据块的语义丰富度,更利于检索。需要消耗更多的存储空间和增加 AI 调用次数。", - "Chunk mode": "直接分段", "Full": "预计 5 分钟以上", "Leisure": "空闲", - "Manual": "", - "Manual mode": "手动导入", - "QA mode": "问答拆分", "Vector queue": "索引排队", "Waiting": "预计 5 分钟", "Website Sync": "Web 站点同步" @@ -815,9 +595,6 @@ "Confirm Delete Node": "确认删除该节点?", "Data Type": "数据类型", "Dataset quote": { - "Add quote": "添加引用", - "Concat result": "合并结果", - "Input description": "可接收知识库搜索的结果。", "label": "知识库引用" }, "Default Value": "默认值", @@ -826,8 +603,6 @@ "Edit intro": "编辑描述", "Field Description": "字段描述", "Field Name": "字段名", - "Field Type": "字段类型", - "Field key": "字段 key", "Http request props": "请求参数", "Http request settings": "请求配置", "Input Type": "输入类型", @@ -836,27 +611,15 @@ "Max Length placeholder": "输入文本的最大长度", "Max Value": "最大值", "Min Value": "最小值", - "Model List": "模型列表", - "No Config Tips": "无可配置项", - "Output Type": "输出类型", - "Plugin output must connect": "自定义输出必须全部连接", - "Plugin tool Description": "工具参数需要描述", "QueryExtension": { - "placeholder": "例如:\n关于 Python 的介绍和使用等问题。\n当前对话与游戏《GTA5》有关。", - "tip": "描述当前对话的范围,便于 AI 补全首次问题或模糊的问题,从而增强知识库连续对话的能力。建议开启该功能后,都简单的描述在对话的背景,否则容易造成补全对象不准确。" + "placeholder": "例如:\n关于 Python 的介绍和使用等问题。\n当前对话与游戏《GTA5》有关。" }, "Quote prompt setting": "引用提示词配置", - "Qupte prompt setting": "", - "Select Data List": "数据列表", "Select app": "选择应用", "Setting quote prompt": "配置引用提示词", - "Unlink tip": "【{{name}}】存在未填或未连接参数", "Variable": "全局变量", "Variable Setting": "变量设置", - "Variable import": "外部参数输入", "edit": { - "Field Already Exist": "key 重复", - "Field Edit": "字段编辑", "Field Name Cannot Be Empty": "字段名不能为空" }, "extract": { @@ -883,167 +646,69 @@ "Props value": "参数值", "ResponseChatItemId": "AI 回复的 ID", "Url and params have been split": "路径参数已被自动加入 Params 中", - "Variables": "全局变量", "curl import": "cURL 导入", - "curl import placeholder": "请输入 cURL 格式内容,将会提取第一个接口的请求信息。", - "params": "Params" + "curl import placeholder": "请输入 cURL 格式内容,将会提取第一个接口的请求信息。" }, "input": { "Add Branch": "添加分支", - "Add Input": "添加入参", - "Input Number": "入参:{{length}}", "add": "添加条件", "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}} 的方式引用传入的变量。变量仅支持字符串或数字。" + "Response content": "可以使用 \\n 来实现连续换行。\n可以通过外部模块输入实现回复,外部模块输入时会覆盖当前填写的内容。\n如传入非字符串类型数据将会自动转成字符串" }, "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 模型", - "anyInput": "", "chat history": "聊天记录", - "switch": "触发器", - "system params": "系统参数", - "textEditor textarea": "文本编辑", "user question": "用户问题" }, "placeholder": { "Classify background": "例如:\n1. AIGC(人工智能生成内容)是指使用人工智能技术自动或半自动地生成数字内容,如文本、图像、音乐、视频等。\n2. AIGC 技术包括但不限于自然语言处理、计算机视觉、机器学习和深度学习。这些技术可以创建新内容或修改现有内容,以满足特定的创意、教育、娱乐或信息需求。" } }, - "inputType": { - "chat history": "", - "dynamicTargetInput": "", - "input": "", - "selectApp": "", - "selectDataset": "", - "selectLLMModel": "", - "switch": "", - "target": "", - "textarea": "" - }, "laf": { "Select laf function": "选择 laf 函数" }, "output": { - "Add Output": "添加出参", - "Output Number": "出参:{{length}}", "description": { "Ai response content": "将在 stream 回复完毕后触发", - "New context": "将本次回复内容拼接上历史记录,作为新的上下文返回", - "Quote": "始终返回数组,如果希望搜索结果为空时执行额外操作,需要用到上面的两个输入以及目标模块的触发器", - "query extension result": "以字符串数组的形式输出,可将该结果直接连接到“知识库搜索”的“用户问题”中,建议不要连接到“AI 对话”的“用户问题”中", - "running done": "模块调用结束时触发" + "New context": "将本次回复内容拼接上历史记录,作为新的上下文返回" }, "label": { "Ai response content": "AI 回复内容", - "New context": "新的上下文", - "Quote": "引用内容", - "Search result empty": "搜索结果为空", - "Search result not empty": "搜索结果不为空", - "query extension result": "优化结果", - "result false": "False", - "result true": "True", - "running done": "模块调用结束", - "text": "文本输出" + "New context": "新的上下文" } }, "template": { "AI function": "AI能力", "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": "可对固定或传入的文本进行加工后输出,非字符串类型数据最终会转成字符串类型。" + "http body placeholder": "与 Apifox 相同的语法" }, "templates": { "Load plugin error": "加载插件失败" }, - "textEditor": { - "Text Edit": "文本加工" - }, "tool": { "Tool input": "工具输入" }, - "valueType": { - "any": "任意", - "arrayBoolean": "布尔数组", - "arrayNumber": "数字数组", - "arrayObject": "对象数组", - "arrayString": "字符串数组", - "boolean": "布尔", - "chatHistory": "历史记录", - "datasetQuote": "知识库类型", - "dynamicTargetInput": "动态字段输入", - "number": "数字", - "object": "对象", - "selectApp": "应用选择", - "selectDataset": "知识库选择", - "string": "字符串", - "tools": "工具调用" - }, "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": "选项不能全空", @@ -1053,36 +718,30 @@ "variable add option": "添加选项" }, "plugin": { - "Custom headers": "自定义请求头", - "Delete http plugin": "确认删除该组 HTTP 插件?会删除该目录下所有插件。", "Free": "该插件无需积分消耗~", - "Get Plugin Module Detail Failed": "加载插件异常", - "Http plugin intro placeholder": "仅做展示,无实际效果", "Intro placeholder": "如果该插件作为工具被调用,则会使用该介绍作为提示词。", - "cost": "积分消耗:" + "cost": "积分消耗:", + "Custom headers": "自定义请求头", + "Get Plugin Module Detail Failed": "加载插件异常", + "Http plugin intro placeholder": "仅做展示,无实际效果" }, - "shareChat": { - "Init Error": "初始化对话框失败", - "Init History Error": "初始化聊天记录失败" + "template": { + "Multimodal": "多模态", + "Search": "搜索" }, "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": "停止调试", @@ -1091,10 +750,6 @@ "Variable": { "Variable type": "变量类型" }, - "Variable outputs": "全局变量", - "chat": { - "Quote prompt": "引用提示词" - }, "debug": { "Done": "完成调试", "Hide result": "隐藏结果", @@ -1107,12 +762,6 @@ "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": "数字输入框", @@ -1120,7 +769,6 @@ "selectDataset": "知识库选择", "selectLLMModel": "对话模型选择", "switch": "开关", - "target": "外部数据", "textarea": "多行输入框" }, "publish": { @@ -1151,45 +799,27 @@ "Edit Info": "编辑信息", "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": "上传时间", "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": "选择一个文件进行存储" }, "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": "导入新数据", @@ -1205,42 +835,18 @@ "input is empty": "数据内容不能为空 " }, "deleteFolderTips": "确认删除该文件夹及其包含的所有知识库?删除后数据无法恢复,请确认!", - "import csv tip": "请确保 CSV 为 UTF-8 格式,否则会乱码", "test": { "noResult": "搜索结果为空" } }, "error": { "Create failed": "创建失败", - "fileNotFound": "文件找不到了~", - "inheritPermissionError": "权限继承错误", - "missingParams": "参数缺失", - "team": { - "overSize": "团队成员超出上限" - } - }, - "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": "更新模块信息" + "fileNotFound": "文件找不到了~" }, "navbar": { "Account": "账号", - "Apps": "应用", - "Apps Share": "应用分享", "Chat": "聊天", "Datasets": "知识库", - "Module": "模块", - "Plugin": "插件", - "Store": "应用市场", "Studio": "工作台", "Tools": "工具" }, @@ -1260,54 +866,28 @@ "Remove InheritPermission Confirm": "此操作会导致权限继承失效,是否进行?", "Resume InheritPermission Confirm": "是否恢复为继承父级文件夹的权限?", "Resume InheritPermission Failed": "恢复失败", - "Resume InheritPermission Success": "恢复成功", - "Set Private": "设为私有", - "Set Public": "设为团队可用" + "Resume InheritPermission Success": "恢复成功" }, "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": "更新参数" + "go to laf": "去编写" }, "select_reference_variable": "选择引用变量", "share_link": "分享链接", @@ -1322,10 +902,8 @@ "Api baseurl": "API 根地址", "Api manager": "API 秘钥管理", "Copy success": "已复制 API 地址", - "Max usage": "最大额度(¥)", "New api key": "新的 API 秘钥", - "New api key tip": "请保管好你的秘钥,秘钥不会再次展示~", - "Usage": "已用额度(¥)" + "New api key tip": "请保管好你的秘钥,秘钥不会再次展示~" }, "outlink": { "Delete link tip": "确认删除该免登录链接?删除后,该链接将会立即失效,对话日志仍会保留,请确认!", @@ -1347,16 +925,12 @@ "storage": "存储量", "type": "类型" }, - "subscription": { - "Cancel subscription": "取消订阅" - }, "team": { "limit": { "No permission rerank": "无权使用结果重排,请升级您的套餐" } }, "user": { - "AI point standard": "AI 积分标准", "Avatar": "头像", "Go laf env": "点击前往 {{env}} 获取 PAT 凭证。", "Laf account course": "查看绑定 laf 账号教程。", @@ -1394,81 +968,49 @@ "team": { "Dataset usage": "知识库容量", "Team Tags Async Success": "同步完成", - "member": "成员", - "tag": { - "Have not opened": "未开通团队聊天功能" - } + "member": "成员" } }, "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": "查看套餐", "bill": { - "AI Model": "AI 模型", - "AI Type": "AI 类型", "Number": "订单号", - "Price": "价格(¥)", "Status": "状态", "Type": "订单类型", "payWay": { - "Way": "支付方式", - "balance": "余额支付", - "wx": "微信支付" - }, - "status": { - "closed": "已关闭", - "notpay": "未支付", - "refund": "已退款", - "success": "支付成功" + "Way": "支付方式" } }, "moduleName": { - "index": "索引生成", - "qa": "QA 拆分" + "index": "索引生成" }, "noBill": "无账单记录~", "subscription": { "AI points": "AI 积分", "AI points click to read tip": "每次调用 AI 模型时,都会消耗一定的 AI 积分(类似于 token)。点击可查看详细计算规则。", - "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": "订阅套餐", @@ -1491,20 +1033,6 @@ "Period": "订阅周期", "Year": "按年", "Year sale": "赠送两个月" - }, - "standardSubLevel": { - "enterprise": "企业版", - "experience": "体验版", - "experience desc": "", - "free": "免费版", - "free desc": "每月均可免费使用基础功能,30 天无使用记录时,将会清除知识库", - "team": "团队版" - }, - "type": { - "balance": "余额充值", - "extraDatasetSize": "知识库扩容", - "extraPoints": "AI 积分套餐", - "standard": "套餐订阅" } }, "usage": { @@ -1512,18 +1040,9 @@ "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": "模块名", - "Number": "", - "Output Token Length": "输出 tokens", - "ReRank": "结果重排", "Source": "来源", "Text Length": "文本长度", "Time": "生成时间", @@ -1531,8 +1050,7 @@ "Total": "总金额", "Total points": "AI 积分消耗", "Usage Detail": "使用详情", - "Whisper": "语音输入", - "bill username": "用户" + "Whisper": "语音输入" } } }, @@ -1553,40 +1071,30 @@ "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": "个人信息", "Promotion": "", "Promotion Rate": "返现比例", "Promotion Record": "推广记录", "Promotion rate tip": "好友充值时你将获得一定比例的余额奖励", - "Recharge Record": "支付记录", "Replace": "更换", - "Set Laf Account Failed": "设置 laf 账号异常", "Set OpenAI Account Failed": "设置 OpenAI 账号异常", "Sign Out": "登出", - "Source": "来源", - "Standard Detail": "", "Team": "团队", "Time": "时间", "Timezone": "时区", - "Total Amount": "总金额", "Update Password": "修改密码", "Update password failed": "修改密码异常", "Update password successful": "修改密码成功", @@ -1594,10 +1102,6 @@ "apikey": { "key": "API 秘钥" }, - "promotion": { - "pay": "好友充值", - "register": "好友注册" - }, "team": { "Balance": "团队余额", "Check Team": "切换", @@ -1608,22 +1112,15 @@ "Invite Member Result Tip": "邀请结果提示", "Invite Member Success Tip": "邀请成员完成\n成功:{{success}} 人\n用户名无效:{{inValid}}\n已在团队中:{{inTeam}}", "Invite Member Tips": "对方可查阅或使用团队内的其他资源", - "Invite Role Admin Alias": "邀请管理员加入", "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": "切换团队异常", @@ -1631,7 +1128,6 @@ "Team Name": "团队名", "Team Tags Async": "标签同步", "Team Tags Async Success": "链接报错成功,标签信息更新", - "Team Tags Async Tip": "填写标签同步连接,获取最新", "Update Team": "更新团队信息", "invite": { "Accept Confirm": "确认加入该团队?", @@ -1643,17 +1139,10 @@ "reject": "拒绝" }, "member": { - "Confirm Leave": "确认离开该团队?", - "active": "已加入", - "reject": "拒绝", - "waiting": "待接受" + "Confirm Leave": "确认离开该团队?" }, "role": { - "Admin": "管理员", - "Member": "成员", - "Owner": "创建者", - "Update to Visitor": "修改成访客", - "Visitor": "访客" + "Admin": "管理员" } } } diff --git a/packages/web/i18n/zh/dataset.json b/packages/web/i18n/zh/dataset.json index cd57e6d91..15610ed55 100644 --- a/packages/web/i18n/zh/dataset.json +++ b/packages/web/i18n/zh/dataset.json @@ -1,26 +1,25 @@ { - "Collection tags": "集合标签", - "Common Dataset": "通用知识库", - "Common Dataset Desc": "可通过导入文件、网页链接或手动录入形式构建知识库", - "Confirm to rebuild embedding tip": "确认为知识库切换索引?\n切换索引是一个非常重量的操作,需要对您知识库内所有数据进行重新索引,时间可能较长,请确保账号内剩余积分充足。\n\n此外,你还需要注意修改选择该知识库的应用,避免它们与其他索引模型知识库混用。", + "collection_tags": "集合标签", + "common_dataset": "通用知识库", + "common_dataset_desc": "可通过导入文件、网页链接或手动录入形式构建知识库", + "confirm_to_rebuild_embedding_tip": "确认为知识库切换索引?\n切换索引是一个非常重量的操作,需要对您知识库内所有数据进行重新索引,时间可能较长,请确保账号内剩余积分充足。\n\n此外,你还需要注意修改选择该知识库的应用,避免它们与其他索引模型知识库混用。", "Disabled": "已禁用", "Enable": "启用", "Enabled": "已启用", - "External File": "外部文件库", - "External file Dataset Desc": "可以从外部文件库导入文件构建知识库,文件不会进行二次存储", - "External id": "文件阅读 ID", - "External read url": "外部预览地址", - "External read url tip": "可以配置你文件库的阅读地址。便于对用户进行阅读鉴权操作。目前可以使用 {{fileId}} 变量来指代外部文件 ID。", - "External url": "文件访问 URL", - "Folder Dataset": "文件夹", - "Rebuild embedding start tip": "切换索引模型任务已开始", - "Rebuilding index count": "重建中索引数量:{{count}}", - "The knowledge base has indexes that are being trained or being rebuilt": "知识库有训练中或正在重建的索引", - "Website Dataset": "Web 站点同步", - "Website Dataset Desc": "Web 站点同步允许你直接使用一个网页链接构建知识库", + "external_file": "外部文件库", + "external_file_dataset_desc": "可以从外部文件库导入文件构建知识库,文件不会进行二次存储", + "external_id": "文件阅读 ID", + "external_read_url": "外部预览地址", + "external_read_url_tip": "可以配置你文件库的阅读地址。便于对用户进行阅读鉴权操作。目前可以使用 {{fileId}} 变量来指代外部文件 ID。", + "external_url": "文件访问 URL", + "rebuild_embedding_start_tip": "切换索引模型任务已开始", + "rebuilding_index_count": "重建中索引数量:{{count}}", + "the_knowledge_base_has_indexes_that_are_being_trained_or_being_rebuilt": "知识库有训练中或正在重建的索引", + "website_dataset": "Web 站点同步", + "website_dataset_desc": "Web 站点同步允许你直接使用一个网页链接构建知识库", "collection": { "Create update time": "创建/更新时间", "Training type": "训练模式" }, "filename": "文件名" -} +} \ No newline at end of file diff --git a/packages/web/i18n/zh/file.json b/packages/web/i18n/zh/file.json index f9e599ef2..f30615db5 100644 --- a/packages/web/i18n/zh/file.json +++ b/packages/web/i18n/zh/file.json @@ -1,24 +1,15 @@ { - "Click to view raw source": "点击查看来源", - "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": "上传异常" -} + "click_to_view_raw_source": "点击查看来源", + "release_the_mouse_to_upload_the_file": "松开鼠标上传文件", + "upload_error_description": "单次只支持上传多个文件或者一个文件夹", + "file_name": "文件名", + "file_size": "文件大小", + "select_and_drag_file_tip": "点击或拖动文件到此处上传", + "select_file_amount_limit": "最多选择 {{max}} 个文件", + "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": "上传异常" +} \ No newline at end of file diff --git a/packages/web/i18n/zh/publish.json b/packages/web/i18n/zh/publish.json index 15c8cd978..99bcae425 100644 --- a/packages/web/i18n/zh/publish.json +++ b/packages/web/i18n/zh/publish.json @@ -1,20 +1,17 @@ { - "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": "查看身份验证使用说明" -} + "create_api_key": "创建新 key", + "create_link": "创建链接", + "default_response": "默认回复", + "edit_api_key": "编辑 key 信息", + "edit_link": "编辑", + "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": "查看身份验证使用说明" +} \ No newline at end of file diff --git a/packages/web/i18n/zh/user.json b/packages/web/i18n/zh/user.json index 8e1051fa9..e2423372a 100644 --- a/packages/web/i18n/zh/user.json +++ b/packages/web/i18n/zh/user.json @@ -4,12 +4,10 @@ "Manage tip": "团队管理员,拥有全部权限", "Read": "仅读", "Read desc": "成员仅可阅读相关资源,无法新建资源", - "Set read permission": "设为仅读", - "Set write permission": "设为可写", "Write": "可写", "Write tip": "除了可读资源外,还可以新建新的资源" }, "team": { "Add manager": "添加管理员" } -} +} \ No newline at end of file diff --git a/packages/web/i18n/zh/workflow.json b/packages/web/i18n/zh/workflow.json index 97e682229..abfd6ca05 100644 --- a/packages/web/i18n/zh/workflow.json +++ b/packages/web/i18n/zh/workflow.json @@ -1,19 +1,19 @@ { - "Add new input": "新增输入", + "add_new_input": "新增输入", "Code": "代码", - "Confirm delete field tip": "确认删除该字段?", - "Custom input": "自定义输入", - "Edit input": "编辑输入", - "Field Name already exists": "字段名已经存在", - "Field description": "字段描述", - "Field description placeholder": "描述该输入字段的功能,如果为工具调用参数,则该描述会影响模型生成的质量", - "Field required": "必填", - "Field used as tool input": "作为工具调用参数", - "Input description": "字段描述", - "Only the Reference type is supported": "仅支持引用类型", - "Optional value type": "可选的数据类型", - "Optional value type tip": "可以指定 1 个或多个数据类型,用户在冬天添加字段时,仅可选择配置的类型", - "Tool input": "工具参数", + "confirm_delete_field_tip": "确认删除该字段?", + "custom_input": "自定义输入", + "edit_input": "编辑输入", + "field_name_already_exists": "字段名已经存在", + "field_description": "字段描述", + "field_description_placeholder": "描述该输入字段的功能,如果为工具调用参数,则该描述会影响模型生成的质量", + "field_required": "必填", + "field_used_as_tool_input": "作为工具调用参数", + "input_description": "字段描述", + "only_the_reference_type_is_supported": "仅支持引用类型", + "optional_value_type": "可选的数据类型", + "optional_value_type_tip": "可以指定 1 个或多个数据类型,用户在冬天添加字段时,仅可选择配置的类型", + "tool_input": "工具参数", "code": { "Reset template": "还原模板", "Reset template confirm": "确认还原代码模板?将会重置所有输入和输出至模板值,请注意保存当前代码。" @@ -28,4 +28,4 @@ "Custom outputs": "自定义输出", "Error": "错误信息" } -} +} \ No newline at end of file diff --git a/packages/web/types/i18next.d.ts b/packages/web/types/i18next.d.ts index a217c7f87..3d2b7b68e 100644 --- a/packages/web/types/i18next.d.ts +++ b/packages/web/types/i18next.d.ts @@ -21,13 +21,27 @@ export interface I18nNamespaces { export type I18nNsType = (keyof I18nNamespaces)[]; -export type I18nCommonKey = keyof I18nNamespaces['common']; -export type I18nDataSetKey = keyof I18nNamespaces['dataset']; -export type I18nAppKey = keyof I18nNamespaces['app']; -export type I18nPublishKey = keyof I18nNamespaces['publish']; -export type I18nWorkflowKey = keyof I18nNamespaces['workflow']; -export type I18nUserKey = keyof I18nNamespaces['user']; -export type I18nChatKey = keyof I18nNamespaces['chat']; +export type I18nCommonKey = NestedKeyOf; +export type I18nDataSetKey = NestedKeyOf; +export type I18nAppKey = NestedKeyOf; +export type I18nPublishKey = NestedKeyOf; +export type I18nWorkflowKey = NestedKeyOf; +export type I18nUserKey = NestedKeyOf; +export type I18nChatKey = NestedKeyOf; + +export type NestedKeyOf = { + [Key in keyof ObjectType & (string | number)]: ObjectType[Key] extends object + ? `${Key}` | `${Key}.${NestedKeyOf}` + : `${Key}`; +}[keyof ObjectType & (string | number)]; + +export type ParseKeys = { + [K in Ns]: `${K}:${NestedKeyOf}`; +}[Ns]; + +export type I18nKeyFunction = { + (key: Key): Key; +}; declare module 'i18next' { interface CustomTypeOptions { diff --git a/projects/app/src/components/core/app/InputGuideConfig.tsx b/projects/app/src/components/core/app/InputGuideConfig.tsx index 317efddc2..c06c26fb1 100644 --- a/projects/app/src/components/core/app/InputGuideConfig.tsx +++ b/projects/app/src/components/core/app/InputGuideConfig.tsx @@ -86,11 +86,11 @@ const InputGuideConfig = ({ - {chatT('Input guide')} + {chatT('input_guide')} - + <> - {chatT('Custom input guide url')} + {chatT('custom_input_guide_url')} window.open(getDocPath('/docs/course/chat_input_guide'))} color={'primary.700'} @@ -226,7 +226,7 @@ const LexiconConfigModal = ({ appId, onClose }: { appId: string; onClose: () => if (res.insertLength < textList.length) { toast({ status: 'warning', - title: chatT('Insert input guide, Some data already exists', { len: res.insertLength }) + title: chatT('insert_input_guide,_some_data_already_exists', { len: res.insertLength }) }); } else { toast({ @@ -289,7 +289,7 @@ const LexiconConfigModal = ({ appId, onClose }: { appId: string; onClose: () => return ( }); }} > - + @@ -364,7 +364,7 @@ const LexiconConfigModal = ({ appId, onClose }: { appId: string; onClose: () => } - placeholder={chatT('New input guide lexicon')} + placeholder={chatT('new_input_guide_lexicon')} onBlur={(e) => { createNewData([e.target.value.trim()]); }} @@ -381,7 +381,7 @@ const LexiconConfigModal = ({ appId, onClose }: { appId: string; onClose: () => px={8} flex={'1 0 0'} fontSize={'sm'} - EmptyChildren={} + EmptyChildren={} > {list.map((data, index) => { const item = data.data; diff --git a/projects/app/src/components/core/app/Tip.tsx b/projects/app/src/components/core/app/Tip.tsx index 9602edc3c..e803a81fa 100644 --- a/projects/app/src/components/core/app/Tip.tsx +++ b/projects/app/src/components/core/app/Tip.tsx @@ -19,8 +19,8 @@ const ChatFunctionTip = ({ type }: { type: `${FnTypeEnum}` }) => { const map = useRef({ [FnTypeEnum.inputGuide]: { icon: '/imgs/app/inputGuide-icon.svg', - title: chatT('Input guide'), - desc: chatT('Input guide tip'), + title: chatT('input_guide'), + desc: chatT('input_guide_tip'), imgUrl: '/imgs/app/inputGuide.svg' }, [FnTypeEnum.nextQuestion]: { diff --git a/projects/app/src/components/core/app/plugin/CoseTooltip.tsx b/projects/app/src/components/core/app/plugin/CostTooltip.tsx similarity index 86% rename from projects/app/src/components/core/app/plugin/CoseTooltip.tsx rename to projects/app/src/components/core/app/plugin/CostTooltip.tsx index 1df92193b..e0a85ad4b 100644 --- a/projects/app/src/components/core/app/plugin/CoseTooltip.tsx +++ b/projects/app/src/components/core/app/plugin/CostTooltip.tsx @@ -2,7 +2,7 @@ import { Box, Flex, Divider } from '@chakra-ui/react'; import React from 'react'; import { useTranslation } from 'next-i18next'; -const CoseTooltip = ({ cost }: { cost?: number }) => { +const CostTooltip = ({ cost }: { cost?: number }) => { const { t } = useTranslation(); return ( <> @@ -21,4 +21,4 @@ const CoseTooltip = ({ cost }: { cost?: number }) => { ); }; -export default CoseTooltip; +export default CostTooltip; diff --git a/projects/app/src/components/core/chat/ChatContainer/ChatBox/Input/InputGuideBox.tsx b/projects/app/src/components/core/chat/ChatContainer/ChatBox/Input/InputGuideBox.tsx index 35dba09f6..99569c24f 100644 --- a/projects/app/src/components/core/chat/ChatContainer/ChatBox/Input/InputGuideBox.tsx +++ b/projects/app/src/components/core/chat/ChatContainer/ChatBox/Input/InputGuideBox.tsx @@ -65,7 +65,7 @@ export default function InputGuideBox({ > - {chatT('Input guide')} + {chatT('input_guide')} {data.map((item, index) => ( {t('common:Name')} { const { publishT } = useI18n(); return ( - + ); }; diff --git a/projects/app/src/pages/account/components/Promotion.tsx b/projects/app/src/pages/account/components/Promotion.tsx index c4d3dcbc7..e2a8edcfd 100644 --- a/projects/app/src/pages/account/components/Promotion.tsx +++ b/projects/app/src/pages/account/components/Promotion.tsx @@ -116,7 +116,7 @@ const Promotion = () => { {item.createTime ? dayjs(item.createTime).format('YYYY/MM/DD HH:mm:ss') : '-'} - {t(`user.promotion.${item.type}`)} + {t(`user.promotion.${item.type}` as any)} {item.amount} ))} diff --git a/projects/app/src/pages/api/v1/chat/completions.ts b/projects/app/src/pages/api/v1/chat/completions.ts index 4afc17fd1..3e63fe688 100644 --- a/projects/app/src/pages/api/v1/chat/completions.ts +++ b/projects/app/src/pages/api/v1/chat/completions.ts @@ -538,7 +538,7 @@ const authHeaderRequest = async ({ canWrite: apiKeyCanWrite }; } else { - // token auth + // token_auth if (!appId) { return Promise.reject('appId is empty'); } diff --git a/projects/app/src/pages/app/detail/components/Logs/index.tsx b/projects/app/src/pages/app/detail/components/Logs/index.tsx index 3419fa44c..312a1d0fb 100644 --- a/projects/app/src/pages/app/detail/components/Logs/index.tsx +++ b/projects/app/src/pages/app/detail/components/Logs/index.tsx @@ -76,10 +76,10 @@ const Logs = () => { {isPc && ( <> - {appT('Chat logs')} + {appT('chat_logs')} - {appT('Chat Logs Tips')},{' '} + {appT('chat_logs_tips')},{' '} { {t('common:core.app.logs.Source And Time')} - {appT('Logs Title')} - {appT('Logs Message Total')} - {appT('Feedback Count')} + {appT('logs_title')} + {appT('logs_message_total')} + {appT('feedback_count')} {t('common:core.app.feedback.Custom feedback')} - {appT('Mark Count')} + {appT('mark_count')} @@ -183,7 +183,7 @@ const Logs = () => { ))} - {logs.length === 0 && !isLoading && } + {logs.length === 0 && !isLoading && } 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 533f03cdd..31d101ee6 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 @@ -6,7 +6,7 @@ import { useI18n } from '@/web/context/I18n'; const API = ({ appId }: { appId: string }) => { const { publishT } = useI18n(); - return ; + return ; }; export default API; 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 7ffcab152..83360b25d 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 @@ -60,13 +60,13 @@ const FeiShuEditModal = ({ {t('common:Name')} QPM - + @@ -127,7 +127,7 @@ const FeiShuEditModal = ({ {/* TODO: i18n */} {t('common:core.module.http.AppId')} {t('common:Name')} QPM - + @@ -365,11 +365,11 @@ function EditLinkModal({ - {publishT('token auth')} - + {publishT('token_auth')} + @@ -380,7 +380,7 @@ function EditLinkModal({ fontSize={'xs'} color={'myGray.500'} > - {publishT('token auth use cases')} + {publishT('token_auth_use_cases')} )} diff --git a/projects/app/src/pages/app/detail/components/PublishHistoriesSlider.tsx b/projects/app/src/pages/app/detail/components/PublishHistoriesSlider.tsx index d45a6915a..7e8043cd1 100644 --- a/projects/app/src/pages/app/detail/components/PublishHistoriesSlider.tsx +++ b/projects/app/src/pages/app/detail/components/PublishHistoriesSlider.tsx @@ -130,7 +130,7 @@ const PublishHistoriesSlider = ({ }); }} > - {appT('Current settings')} + {appT('current_settings')} {list.map((data, index) => { diff --git a/projects/app/src/pages/app/detail/components/RouteTab.tsx b/projects/app/src/pages/app/detail/components/RouteTab.tsx index 332d06ed8..183492bb3 100644 --- a/projects/app/src/pages/app/detail/components/RouteTab.tsx +++ b/projects/app/src/pages/app/detail/components/RouteTab.tsx @@ -28,16 +28,16 @@ const RouteTab = () => { const tabList = useMemo( () => [ { - label: appDetail.type === AppTypeEnum.plugin ? appT('Setting plugin') : appT('Setting app'), + label: appDetail.type === AppTypeEnum.plugin ? appT('setting_plugin') : appT('setting_app'), id: TabEnum.appEdit }, ...(appDetail.permission.hasManagePer ? [ { - label: appT('Publish channel'), + label: appT('publish_channel'), id: TabEnum.publish }, - { label: appT('Chat logs'), id: TabEnum.logs } + { label: appT('chat_logs'), id: TabEnum.logs } ] : []) ], diff --git a/projects/app/src/pages/app/detail/components/SimpleApp/AppCard.tsx b/projects/app/src/pages/app/detail/components/SimpleApp/AppCard.tsx index 06e756d93..07a3e450e 100644 --- a/projects/app/src/pages/app/detail/components/SimpleApp/AppCard.tsx +++ b/projects/app/src/pages/app/detail/components/SimpleApp/AppCard.tsx @@ -122,7 +122,7 @@ const AppCard = () => { children: [ { icon: 'core/app/type/workflow', - label: appT('Transition to workflow'), + label: appT('transition_to_workflow'), onClick: () => setTransitionCreateNew(true) }, ...(appDetail.permission.hasWritePer && feConfigs?.show_team_chat @@ -163,12 +163,12 @@ const AppCard = () => { {TeamTagsSet && setTeamTagsSet(undefined)} />} {transitionCreateNew !== undefined && ( - + - {appT('Transition to workflow create new tip')} + {appT('transition_to_workflow_create_new_tip')} setTransitionCreateNew((state) => !state)}> - {appT('Transition to workflow create new placeholder')} + {appT('transition_to_workflow_create_new_placeholder')} diff --git a/projects/app/src/pages/app/detail/components/SimpleApp/ChatTest.tsx b/projects/app/src/pages/app/detail/components/SimpleApp/ChatTest.tsx index ef304a21d..ac18ff40f 100644 --- a/projects/app/src/pages/app/detail/components/SimpleApp/ChatTest.tsx +++ b/projects/app/src/pages/app/detail/components/SimpleApp/ChatTest.tsx @@ -36,7 +36,7 @@ const ChatTest = ({ appForm }: { appForm: AppSimpleEditFormType }) => { - {appT('Chat Debug')} + {appT('chat_debug')} - {appT('AI Settings')} + {appT('ai_settings')} @@ -264,8 +264,8 @@ const EditForm = ({ - {appT('Plugin dispatch')} - + {appT('plugin_dispatch')} +