mirror of
https://github.com/DayuanJiang/next-ai-draw-io.git
synced 2026-09-01 17:10:24 +08:00
* feat: add file-based admin settings panel at /admin
Settings saved in the panel are written to data/settings.json and
overlaid onto process.env, taking precedence over environment
variables and applying immediately without restart. Enable by setting
ADMIN_PASSWORD; on serverless platforms without persistent disk the
panel degrades to read-only.
* polish: admin panel UI improvements
- Provider logos in credential rows (shared ProviderLogo component,
extracted from model-config-dialog)
- Scroll-spy active state in the sidebar nav
- Green success state in the save bar that clears after a few seconds
- Wider content column (max-w-6xl) for less wasted space on desktop
* polish: admin panel section toggles and reorder
- Move Quota & Rate Limits to the end of the settings page
- Add enable switches to Observability and Quota sections; default off
with fields grayed out, auto-on when any field is already configured
* polish: make section enable switch more visible
Wrap the switch in a labeled pill ('Enabled'/'Disabled') with border
and background so the off state is clearly visible.
* refactor: derive admin registry from PROVIDER_INFO, simplify page state
- Provider options, labels, and base-URL placeholders now come from
PROVIDER_INFO instead of hand-copied lists (fixes SiliconFlow .com/.cn
placeholder drift; panel names now match the model-config dialog)
- Replace free-text subgroup strings + SUBGROUP_PROVIDERS reverse map
with a typed provider field on SettingDef
- Precompute SETTINGS_BY_GROUP and PROVIDER_SUBGROUPS at module level
- Merge justSaved into saveMessage, drop unused mainRef, hoist
fetchSettings out of the component, dedupe savedText logic
- Serialize from SETTINGS_REGISTRY directly; json validators in a map
instead of a hardcoded key check
- Make allowPrivateUrls a function so ALLOW_PRIVATE_URLS edits in the
admin panel apply without restart
* feat: graphical model management in admin panel
Replace the provider credential fields and raw AI_MODELS_CONFIG JSON
textarea with a Models section mirroring the in-app model settings UI:
provider instance list with logos, credential fields per provider type,
model add/remove with suggestions, per-model connectivity test, and a
default-provider star.
On save the server derives everything the runtime needs into
settings.json: credential env vars (with _2 suffixes for multiple
instances of one provider), AI_MODELS_CONFIG, and AI_PROVIDER/AI_MODEL
for the default. Secrets round-trip as masked markers and are never
sent back to the browser. The general settings registry now only
covers non-provider settings (generation, access, features,
observability, quota).
* fix: allow testing unsaved providers in admin panel
The test button previously looked up credentials by providerId in the
saved settings, so testing a newly added (unsaved) provider failed with
'Unknown provider or model'. The test endpoint now accepts the client's
current provider state; newly typed secrets are used as-is and masked
markers are resolved against the stored values, so testing works both
before and after saving.
* fix: merge env AI_MODELS_CONFIG with admin panel providers
Previously, saving in the admin panel wrote a complete AI_MODELS_CONFIG
into settings.json, which (by overlay precedence) replaced any config
from .env or ai-models.json — admins lost their env-configured models.
The panel no longer writes AI_MODELS_CONFIG. Instead its providers are
merged with the env baseline at read time in loadRawServerModelsConfig,
and panel credentials go to ADMIN_-prefixed env vars wired up via
apiKeyEnv/baseUrlEnv so they never shadow standard vars. Env-based
providers now appear read-only in the panel, name clashes are rejected,
and a panel default overrides the env default. data/ is now gitignored.
* fix: block global-credential providers already managed via env
Bedrock, Vertex AI, and Ollama credentials live in fixed env vars with
no apiKeyEnv redirection, so a panel instance of one of these would
silently override the credentials that env-configured models rely on.
The API now rejects saving such a provider when the env config already
uses that type, and the Add Provider dropdown disables it with a
'managed via env' note.
* fix: address admin panel review findings
- Security: test-model no longer resolves a stored secret when the
request's baseUrl/provider differs from the stored entry, closing a
path where a tampered baseUrl could exfiltrate a saved key
- Save failures are now visible: the save bar shows the error in red
(was masked by the persistent 'Unsaved changes' text), and per-field
validation errors from the settings API are surfaced under each field
- The Observability/Quota enable switch is now real: toggling off stages
deletion of the group's saved values, and the toggle no longer snaps
back to Enabled after saving
- Env provider's default star is hidden when a panel provider is the
active default (no more double star)
- Clearing a credential field reverts to the stored value instead of
silently deleting it; an explicit X button removes a stored secret
- Form inputs are disabled during an in-flight save
* refactor(admin): split 1549-line admin page into focused modules
Extract admin-shared.ts (types + fetch helper), setting-field.tsx
(registry-driven fields), and models-section.tsx (provider/model
manager) from page.tsx. Pure mechanical move, no behavior change.
* feat(admin): share credential fields with user dialog and localize panel
Extract ProviderCredentialsFields (display name + per-provider
credential inputs) used by both the user ModelConfigDialog and the
admin Models panel; secret input passed via renderSecret (plaintext
vs masked), test button via footer slot. Add full i18n for the admin
panel across en/zh/ja/zh-Hant, reusing modelConfig.* for shared parts.
* fix(admin): address Copilot review findings
- Reflect built-in defaults for boolean settings (ALLOW_PRIVATE_URLS
defaults on) and allow clearing a saved boolean back to default,
so the SSRF toggle matches actual runtime behavior.
- Harden JSON loading: filter settings values to strings only, and
schema-validate stored ADMIN_PROVIDERS entries, dropping malformed
ones instead of letting them reach runtime code.
- Set beforeunload returnValue so the unsaved-changes prompt shows in
all browsers; reject non-finite numbers in settings validation.
- Fix README/CN/JA docs that claimed the panel auto-generates
AI_MODELS_CONFIG (providers are merged at read time, not written).
- Add unit tests for corrupted-file value filtering and provider
schema validation.
* docs: move admin panel details to dedicated docs/{en,cn,ja}/admin-panel.md
The READMEs now carry a short blurb + link, matching the existing
per-topic docs (docker.md, ai-providers.md, ...). Removes the ~22-line
inline section and the duplicated data/settings.json mentions.
* fix(admin): address follow-up Copilot findings on the prior fixes
- loadAdminProviders now validates against a stored-shape schema where
secrets are plain strings, so a hand-edited ADMIN_PROVIDERS holding an
{isSet} marker is dropped instead of later crashing maskSecret().
- loadSettings guards against array values (typeof [] === 'object'),
which would otherwise overlay numeric keys onto process.env.
- Admin SecretInput uses the bare id so the shared component's
<Label htmlFor> stays associated (only one ProviderDetail mounts).
- Add tests: marker-secret rejection, array-values guard, bedrock
multi-secret round-trip.
554 lines
25 KiB
JSON
554 lines
25 KiB
JSON
{
|
||
"common": {
|
||
"save": "儲存",
|
||
"cancel": "取消",
|
||
"close": "關閉",
|
||
"confirm": "確認",
|
||
"clear": "清除",
|
||
"edit": "編輯",
|
||
"delete": "刪除",
|
||
"loading": "載入中...",
|
||
"new": "新建"
|
||
},
|
||
"nav": {
|
||
"about": "關於",
|
||
"editor": "編輯器",
|
||
"newChat": "開始新對話",
|
||
"github": "GitHub",
|
||
"settings": "設定",
|
||
"hidePanel": "隱藏聊天面板 (Ctrl+B)",
|
||
"showPanel": "顯示聊天面板 (Ctrl+B)",
|
||
"aiChat": "AI 聊天"
|
||
},
|
||
"providers": {
|
||
"useServerDefault": "使用伺服器預設值",
|
||
"openai": "OpenAI",
|
||
"anthropic": "Anthropic",
|
||
"google": "Google",
|
||
"azure": "Azure OpenAI",
|
||
"openrouter": "OpenRouter",
|
||
"deepseek": "DeepSeek",
|
||
"siliconflow": "SiliconFlow",
|
||
"modelscope": "ModelScope",
|
||
"minimax": "MiniMax",
|
||
"glm": "GLM",
|
||
"qwen": "Qwen",
|
||
"kimi": "Kimi",
|
||
"qiniu": "Qiniu"
|
||
},
|
||
"chat": {
|
||
"placeholder": "描述您的圖表或上傳檔案...",
|
||
"send": "傳送",
|
||
"stopGeneration": "停止產生",
|
||
"sendMessage": "傳送訊息",
|
||
"clearConversation": "清除對話",
|
||
"diagramHistory": "圖表歷史",
|
||
"saveDiagram": "儲存圖表",
|
||
"uploadFile": "上傳檔案(圖片、PDF、文字)",
|
||
"minimalStyle": "簡約",
|
||
"styledMode": "精緻",
|
||
"minimalTooltip": "使用簡約模式以加快產生速度(無顏色)",
|
||
"regenerate": "重新產生回應",
|
||
"copyResponse": "複製回應",
|
||
"copied": "已複製!",
|
||
"failedToCopy": "複製失敗",
|
||
"failedToCopyDetail": "複製訊息失敗。請手動複製或檢查剪貼簿權限。",
|
||
"goodResponse": "有幫助",
|
||
"badResponse": "無幫助",
|
||
"clickToEdit": "點擊編輯",
|
||
"editMessage": "編輯訊息",
|
||
"saveAndSubmit": "儲存並提交",
|
||
"ExtractURL": "從 URL 擷取"
|
||
},
|
||
"examples": {
|
||
"title": "用 AI 建立圖表",
|
||
"subtitle": "描述您想要建立的內容或上傳圖片進行複製",
|
||
"quickExamples": "快速範例",
|
||
"paperToDiagram": "文件轉圖表",
|
||
"paperDescription": "上傳 .pdf, .txt, .md, .json, .csv, .py, .js, .ts 等檔案",
|
||
"animatedDiagram": "動畫圖表",
|
||
"animatedDescription": "繪製帶有動畫連接器的 Transformer 架構",
|
||
"awsArchitecture": "AWS 架構",
|
||
"awsDescription": "使用 AWS 圖示建立雲端架構圖",
|
||
"replicateFlowchart": "複製流程圖",
|
||
"replicateDescription": "上傳並複製現有流程圖",
|
||
"creativeDrawing": "創意繪圖",
|
||
"creativeDescription": "繪製有趣且富有創意的內容",
|
||
"cachedNote": "範例已快取,可即時回應",
|
||
"mcpServer": "MCP 伺服器",
|
||
"mcpDescription": "在 Claude Desktop、VS Code 和 Cursor 中使用"
|
||
},
|
||
"settings": {
|
||
"title": "設定",
|
||
"description": "配置您的應用程式設定。",
|
||
"apiKeysModels": "API 金鑰和模型",
|
||
"apiKeysModelsDescription": "配置 AI 提供商和 API 金鑰。",
|
||
"accessCode": "存取碼",
|
||
"accessCodePlaceholder": "輸入存取碼",
|
||
"accessCodeDescription": "使用此應用程式需要存取碼。",
|
||
"aiProvider": "AI 提供商設定",
|
||
"aiProviderDescription": "使用您自己的 API 金鑰來繞過使用限制。您的金鑰僅儲存在瀏覽器本機,不會儲存在伺服器上。",
|
||
"provider": "提供商",
|
||
"modelId": "模型 ID",
|
||
"apiKey": "API 金鑰",
|
||
"apiKeyPlaceholder": "您的 API 金鑰",
|
||
"baseUrl": "基礎 URL(可選)",
|
||
"customEndpoint": "自訂端點 URL",
|
||
"overrides": "覆寫",
|
||
"clearSettings": "清除設定",
|
||
"useServerDefault": "使用伺服器預設值",
|
||
"language": "語言",
|
||
"languageDescription": "選擇介面語言。",
|
||
"theme": "主題",
|
||
"themeDescription": "介面和 DrawIO 畫布的深色/淺色模式。",
|
||
"drawioStyle": "DrawIO 樣式",
|
||
"drawioStyleDescription": "畫布樣式",
|
||
"themeDefault": "預設",
|
||
"themeDark": "深色",
|
||
"themeMinimal": "簡約",
|
||
"themeSketch": "草圖",
|
||
"themeSimple": "簡單",
|
||
"diagramStyle": "圖表樣式",
|
||
"diagramStyleDescription": "切換簡約與精緻圖表輸出模式。",
|
||
"sendShortcut": "傳送快捷鍵",
|
||
"sendShortcutDescription": "選擇傳送訊息的方式。",
|
||
"enterToSend": "Enter 傳送",
|
||
"ctrlEnterToSend": "Cmd/Ctrl+Enter 傳送",
|
||
"diagramActions": "圖表操作",
|
||
"diagramActionsDescription": "管理圖表歷史紀錄和匯出",
|
||
"history": "歷史紀錄",
|
||
"download": "下載",
|
||
"proxy": "代理設定",
|
||
"proxyDescription": "配置 API 請求的 HTTP/HTTPS 代理(僅桌面版)",
|
||
"httpProxy": "HTTP 代理",
|
||
"httpsProxy": "HTTPS 代理",
|
||
"applyProxy": "套用",
|
||
"proxyApplied": "代理設定已套用",
|
||
"diagramValidation": "圖表驗證(實驗性)",
|
||
"diagramValidationDescription": "使用視覺語言模型驗證產生的圖表。需要支援視覺的模型,如 GPT-5.2 或 Sonnet-4.5。",
|
||
"enabled": "已啟用",
|
||
"disabled": "已停用",
|
||
"customSystemMessage": "自訂系統訊息",
|
||
"customSystemMessageDescription": "新增自訂指示,將附加到 AI 的系統提示末尾。",
|
||
"customSystemMessagePlaceholder": "例如:圖表始終使用藍色配色方案...",
|
||
"panelVisibility": "大廳面板",
|
||
"panelVisibilityDescription": "選擇在聊天大廳顯示哪些面板。",
|
||
"showRecentChats": "最近聊天",
|
||
"showMyTemplates": "我的範本",
|
||
"showQuickExamples": "快速範例"
|
||
},
|
||
"save": {
|
||
"title": "儲存圖表",
|
||
"description": "選擇格式和檔案名稱以儲存您的圖表。",
|
||
"format": "格式",
|
||
"filename": "檔案名稱",
|
||
"filenamePlaceholder": "輸入檔案名稱",
|
||
"formats": {
|
||
"drawio": "Draw.io XML",
|
||
"png": "PNG 圖片",
|
||
"svg": "SVG 圖片",
|
||
"xmlsvg": "可編輯 SVG"
|
||
},
|
||
"savedSuccessfully": "儲存成功!"
|
||
},
|
||
"history": {
|
||
"title": "圖表歷史",
|
||
"description": "在 AI 修改之前儲存的每個圖表。\n點擊圖表以還原它",
|
||
"noHistory": "尚無歷史紀錄。傳送訊息以建立圖表歷史。",
|
||
"version": "版本",
|
||
"restoreTo": "還原到版本 {version}?"
|
||
},
|
||
"dialogs": {
|
||
"clearTitle": "清除所有內容?",
|
||
"clearDescription": "這將清除目前對話並重設圖表。此操作無法復原。",
|
||
"clearEverything": "清除所有內容",
|
||
"clearSuccess": "已開始新對話"
|
||
},
|
||
"errors": {
|
||
"maxFiles": "檔案太多。最多允許 {max} 個。",
|
||
"onlyMoreAllowed": "只能再新增 {slots} 個檔案",
|
||
"fileExceeds": "「{name}」大小為 {size}(超過 {max}MB)",
|
||
"unsupportedType": "「{name}」不是支援的檔案類型",
|
||
"filesRejected": "{count} 個檔案被拒絕:",
|
||
"andMore": "...還有 {count} 個",
|
||
"invalidAccessCode": "無效或缺少存取碼。請在設定中配置。",
|
||
"networkError": "網路錯誤。請檢查您的連線。",
|
||
"retryLimit": "已達自動重試限制({max})。請手動重試。",
|
||
"continuationRetryLimit": "已達繼續重試限制({max})。圖表可能過於複雜。",
|
||
"validationFailed": "圖表驗證失敗。請嘗試重新產生。",
|
||
"malformedXml": "AI 產生的圖表 XML 無效。請嘗試重新產生。",
|
||
"failedToProcess": "無法處理圖表。請嘗試重新產生。",
|
||
"sessionCorrupted": "工作階段資料已損壞。重新開始。",
|
||
"failedToSave": "無法儲存訊息到 localStorage",
|
||
"failedToRestore": "無法從 localStorage 還原",
|
||
"failedToPersist": "卸載前無法持久化狀態",
|
||
"failedToExport": "取得圖表資料時出錯",
|
||
"failedToLoadExample": "載入範例圖片時出錯",
|
||
"failedToRecordFeedback": "記錄您的回饋失敗。請重試。",
|
||
"storageUpdateFailed": "聊天已清除,但無法更新瀏覽器儲存空間"
|
||
},
|
||
"quota": {
|
||
"dailyLimit": "已達每日配額",
|
||
"tokenLimit": "已達每日令牌限制",
|
||
"tpmLimit": "速率限制",
|
||
"tpmMessage": "請求過多。請稍等片刻。",
|
||
"tpmMessageDetailed": "達到速率限制({limit} 令牌/分鐘)。請等待 {seconds} 秒後再傳送請求。",
|
||
"messageApi": "看來您今天的體驗次數已達上限。非常高興您玩得開心,雖然本專案由字節跳動豆包慷慨贊助,但為了確保大家都能公平使用,我們不得不對使用量做一點小小的限制。",
|
||
"messageApiSelfHosted": null,
|
||
"messageToken": "看來您今天的 Token 用量已達上限。非常高興您玩得開心,雖然本專案由字節跳動豆包慷慨贊助,但為了確保大家都能公平使用,我們不得不對使用量做一點小小的限制。",
|
||
"messageTokenSelfHosted": null,
|
||
"tip": "<strong>提示:</strong>您可以使用自己的 API 金鑰(點擊設定圖示)或自行託管專案來繞過這些限制。",
|
||
"tipSelfHosted": "<strong>提示:</strong>您可以在設定中配置自己的 API 金鑰以繼續使用服務。",
|
||
"reset": "您的限制將在明天重設。感謝您的理解。",
|
||
"doubaoSponsorship": "<a href=\"{link}\" target=\"_blank\" rel=\"noopener noreferrer\" class=\"underline hover:text-foreground\">點此註冊</a>可獲得每個模型 50 萬免費 Token(包括豆包、DeepSeek 和 Kimi),然後在模型設定中配置您的 API Key。",
|
||
"configModel": "使用您的金鑰",
|
||
"selfHost": "自行託管",
|
||
"sponsor": "贊助",
|
||
"learnMore": "了解更多 →",
|
||
"usedOf": "{used}/{limit}"
|
||
},
|
||
"tools": {
|
||
"generateDiagram": "產生圖表",
|
||
"editDiagram": "編輯圖表",
|
||
"appendDiagram": "繼續圖表",
|
||
"complete": "完成",
|
||
"error": "錯誤",
|
||
"truncated": "已截斷"
|
||
},
|
||
"file": {
|
||
"reading": "讀取中...",
|
||
"chars": "字元",
|
||
"removeFile": "移除檔案"
|
||
},
|
||
"url": {
|
||
"title": "從 URL 擷取內容",
|
||
"description": "貼上 URL 以擷取和分析其內容",
|
||
"Extracting": "擷取中...",
|
||
"extract": "擷取",
|
||
"Cancel": "取消",
|
||
"enterUrl": "請輸入 URL",
|
||
"invalidFormat": "URL 格式無效"
|
||
},
|
||
"reasoning": {
|
||
"thinking": "思考中...",
|
||
"thoughtFor": "思考了 {duration} 秒",
|
||
"thoughtBrief": "思考了幾秒鐘"
|
||
},
|
||
"dev": {
|
||
"title": "開發:XML 串流模擬器",
|
||
"preset": "預設:",
|
||
"selectPreset": "選擇預設...",
|
||
"clear": "清除",
|
||
"placeholder": "在此貼上 mxCell XML 或選擇預設...",
|
||
"interval": "間隔:",
|
||
"chars": "字元:",
|
||
"streaming": "串流傳輸中...",
|
||
"simulate": "模擬",
|
||
"stop": "停止",
|
||
"testQuotaToast": "測試配額提示",
|
||
"simulatingMessage": "[開發] 模擬 XML 串流傳輸",
|
||
"successMessage": "成功顯示圖表。"
|
||
},
|
||
"about": {
|
||
"modelChange": "模型變更與用量限制",
|
||
"walletCrying": "(別名:我的錢包頂不住了)",
|
||
"seekingSponsorship": "尋求贊助(求大佬撈一把)",
|
||
"contactMe": "聯絡我",
|
||
"usageNotice": "由於使用量過高,我已將模型從 Claude 更換為 minimax-m2,並設定了一些用量限制。詳情請查看關於頁面。"
|
||
},
|
||
"sessionHistory": {
|
||
"tooltip": "聊天歷史",
|
||
"newChat": "新對話",
|
||
"empty": "暫無聊天紀錄",
|
||
"emptyHint": "開始對話吧",
|
||
"today": "今天",
|
||
"yesterday": "昨天",
|
||
"thisWeek": "本週",
|
||
"earlier": "更早",
|
||
"deleteTitle": "刪除此對話?",
|
||
"deleteDescription": "這將永久刪除此聊天工作階段及其圖表。此操作無法復原。",
|
||
"recentChats": "最近對話",
|
||
"justNow": "剛剛",
|
||
"searchPlaceholder": "搜尋對話...",
|
||
"noResults": "未找到對話"
|
||
},
|
||
"templates": {
|
||
"title": "我的範本",
|
||
"subtitle": "快速建立圖表的個人提示庫",
|
||
"emptyTitle": "尚無範本",
|
||
"emptyDescription": "建立您的第一個範本,開始構建您的個人提示庫",
|
||
"createFirst": "建立第一個範本",
|
||
"neverUsed": "未使用過",
|
||
"usedCount": "使用 {count} 次",
|
||
"myTemplates": "我的範本",
|
||
"createTitle": "建立範本",
|
||
"createDescription": "儲存常用提示以便重複使用。範本幫助您快速開始常用工作流程。",
|
||
"promptLabel": "提示",
|
||
"promptPlaceholder": "描述您想建立的圖表...",
|
||
"promptRequired": "提示為必填項",
|
||
"titleLabel": "標題",
|
||
"titlePlaceholder": "輸入標題",
|
||
"titleHint": "留空則使用提示的前 20 個字元",
|
||
"descriptionLabel": "描述",
|
||
"descriptionPlaceholder": "為此範本新增描述",
|
||
"pinnedLabel": "釘選範本",
|
||
"pinnedHint": "釘選的範本會顯示在清單頂部",
|
||
"createButton": "建立範本",
|
||
"createFailed": "建立範本失敗,請重試。",
|
||
"editTitle": "編輯範本",
|
||
"editDescription": "更新範本內容和設定。",
|
||
"updateFailed": "更新範本失敗,請重試。",
|
||
"duplicate": "複製",
|
||
"copySuffix": "(副本)",
|
||
"deleteTitle": "刪除此範本?",
|
||
"deleteDescription": "此操作將永久刪除該範本,無法復原。",
|
||
"confirmSendTitle": "取代目前輸入?",
|
||
"confirmSendDescription": "您有未傳送的內容。傳送此範本將取代它。",
|
||
"confirmSendButton": "傳送範本",
|
||
"searchPlaceholder": "搜尋範本...",
|
||
"searchNoResults": "沒有符合的範本",
|
||
"pin": "置頂",
|
||
"unpin": "取消置頂",
|
||
"saveAsTemplate": "儲存為範本",
|
||
"exportTemplates": "匯出範本",
|
||
"importTemplates": "匯入範本",
|
||
"exportEmpty": "沒有可匯出的範本",
|
||
"exportSuccess": "成功匯出 {count} 個範本",
|
||
"importNoFile": "請選擇一個 JSON 檔案",
|
||
"importFailed": "匯入失敗:{error}",
|
||
"importSuccess": "成功匯入 {imported} 個範本,跳過 {skipped} 個重複"
|
||
},
|
||
"validation": {
|
||
"title": "驗證圖表",
|
||
"capturing": "截圖中",
|
||
"validating": "驗證中",
|
||
"validatingWithAttempt": "驗證中 ({attempt}/{max})",
|
||
"valid": "通過",
|
||
"validWithWarnings": "通過(有警告)",
|
||
"issuesFound": "發現問題",
|
||
"error": "錯誤",
|
||
"skipped": "已跳過",
|
||
"capturedScreenshot": "截圖預覽:",
|
||
"issuesFoundLabel": "發現的問題:",
|
||
"suggestions": "建議:",
|
||
"passedValidation": "圖表通過視覺驗證 - 未發現問題。",
|
||
"improvementRequested": "改進請求已傳送 - 請查看下方新圖表",
|
||
"improveWithSuggestions": "根據建議改進",
|
||
"regenerateWithFeedback": "使用驗證回饋重新產生圖表"
|
||
},
|
||
"modelConfig": {
|
||
"title": "AI 模型配置",
|
||
"description": "配置多個 AI 提供商和模型",
|
||
"configure": "配置",
|
||
"addProvider": "新增提供商",
|
||
"addModel": "新增模型",
|
||
"modelId": "模型 ID",
|
||
"modelLabel": "顯示名稱",
|
||
"streaming": "啟用串流輸出",
|
||
"deleteProvider": "刪除提供商",
|
||
"deleteModel": "刪除模型",
|
||
"noModels": "尚未配置模型。新增模型以開始使用。",
|
||
"selectProvider": "選擇一個提供商或新增",
|
||
"configureMultiple": "配置多個 AI 提供商並輕鬆切換",
|
||
"apiKeyStored": "API 金鑰儲存在您的瀏覽器本機",
|
||
"test": "測試",
|
||
"validationError": "驗證失敗",
|
||
"addModelFirst": "請先新增至少一個模型以進行驗證",
|
||
"providers": "提供商",
|
||
"addProviderHint": "新增提供商即可開始使用",
|
||
"verified": "已驗證",
|
||
"configuration": "配置",
|
||
"displayName": "顯示名稱",
|
||
"awsAccessKeyId": "AWS 存取金鑰 ID",
|
||
"awsSecretAccessKey": "AWS Secret Access Key",
|
||
"awsRegion": "AWS 區域",
|
||
"selectRegion": "選擇區域",
|
||
"apiKey": "API 金鑰",
|
||
"enterApiKey": "輸入您的 API 金鑰",
|
||
"enterSecretKey": "輸入您的 Secret Key",
|
||
"baseUrl": "基礎 URL",
|
||
"optional": "(可選)",
|
||
"baseUrlWithExample": "基礎 URL(可選,例如 {example})",
|
||
"customEndpoint": "自訂端點 URL",
|
||
"minimaxBaseUrlHint": "使用 /anthropic 端點為 Anthropic 相容 API(推薦),或使用 /v1 端點為 OpenAI 相容 API",
|
||
"models": "模型",
|
||
"customModelId": "自訂模型 ID...",
|
||
"allAdded": "已全部新增",
|
||
"suggested": "推薦",
|
||
"noModelsConfigured": "尚未配置模型",
|
||
"modelIdEmpty": "模型 ID 不能為空",
|
||
"modelIdExists": "此模型 ID 已存在",
|
||
"configureProviders": "配置 AI 提供商",
|
||
"selectProviderHint": "從列表中選擇提供商或新增以配置 API 金鑰和模型",
|
||
"deleteConfirmDesc": "確定要刪除 {name} 嗎?這將移除所有配置的模型且無法復原。",
|
||
"typeToConfirm": "輸入「{name}」以確認",
|
||
"typeProviderName": "輸入提供商名稱...",
|
||
"modelsConfiguredCount": "已配置 {count} 個模型",
|
||
"validationFailedCount": "{count} 個模型驗證失敗",
|
||
"cancel": "取消",
|
||
"delete": "刪除",
|
||
"clickToChange": "(點擊變更)",
|
||
"usingServerDefault": "使用伺服器預設模型",
|
||
"selectModel": "選擇模型",
|
||
"searchModels": "搜尋模型...",
|
||
"noVerifiedModels": "沒有已驗證的模型。請先測試您的模型。",
|
||
"noModelsFound": "未找到模型。",
|
||
"default": "預設",
|
||
"serverDefault": "伺服器預設",
|
||
"serverModels": "伺服器模型",
|
||
"userModels": "使用者模型",
|
||
"configureModels": "配置模型...",
|
||
"onlyVerifiedShown": "僅顯示已驗證的模型",
|
||
"showUnvalidatedModels": "顯示未驗證的模型",
|
||
"allModelsShown": "顯示所有模型(包括未驗證的)",
|
||
"unvalidatedModelWarning": "此模型尚未驗證",
|
||
"serverDefaultModel": "伺服器預設模型",
|
||
"showValue": "顯示值",
|
||
"hideValue": "隱藏值"
|
||
},
|
||
"admin": {
|
||
"title": "管理員設定",
|
||
"loginPrompt": "輸入管理員密碼(即 ADMIN_PASSWORD 環境變數)以管理伺服器設定。",
|
||
"password": "密碼",
|
||
"signIn": "登入",
|
||
"signingIn": "正在登入…",
|
||
"loginFailed": "登入失敗",
|
||
"precedence": "檔案覆蓋環境變數 · 環境變數覆蓋預設值",
|
||
"notWritable": "此部署環境下設定檔不可寫入(無伺服器平台沒有持久化磁碟)。設定以唯讀方式顯示——請改用環境變數進行設定。",
|
||
"settingGroups": "設定分組",
|
||
"enabled": "已啟用",
|
||
"disabled": "已停用",
|
||
"enableGroup": "啟用 {group}",
|
||
"unsavedChanges": "有未儲存的變更",
|
||
"saved": "設定已儲存,變更立即生效。",
|
||
"saveFailed": "儲存失敗。請檢查網路連線後重試。",
|
||
"invalidSettings": "部分設定無效。",
|
||
"discard": "捨棄",
|
||
"saveChanges": "儲存變更",
|
||
"saving": "正在儲存…",
|
||
"sourceSaved": "已儲存",
|
||
"sourceEnv": "環境變數",
|
||
"sourceSavedTitle": "在管理員設定檔中設定",
|
||
"sourceEnvTitle": "透過環境變數設定",
|
||
"restartRequired": "需要重新啟動",
|
||
"modified": "已修改",
|
||
"notSet": "未設定",
|
||
"savedReplace": "已儲存({hint})——輸入以取代",
|
||
"showValue": "顯示值",
|
||
"hideValue": "隱藏值",
|
||
"removeValue": "移除值",
|
||
"removeValueTitle": "移除已儲存的值",
|
||
"resetToDefault": "重設為預設",
|
||
"models": "模型",
|
||
"modelsDescription": "面向所有使用者的伺服器端 provider 與模型——無需個人 API 金鑰。當使用者未選擇模型時,使用預設 provider 的第一個模型。",
|
||
"addProviderHint": "新增一個 provider,為所有使用者提供伺服器端模型。",
|
||
"selectProviderHint": "選擇或新增一個 provider 以設定其憑證和模型。",
|
||
"addProviderToOfferModels": "至少新增一個模型,才能向使用者開放此 provider。",
|
||
"managedViaEnv": "(透過環境變數管理)",
|
||
"envReadOnly": "在 AI_MODELS_CONFIG / ai-models.json 中定義——此處唯讀。請編輯環境設定以變更。",
|
||
"defaultModel": "預設模型",
|
||
"noModelsConfigured": "未設定模型",
|
||
"modelCount": "{count} 個模型",
|
||
"modelCountPlural": "{count} 個模型",
|
||
"default": "預設",
|
||
"setAsDefault": "設為預設 provider",
|
||
"defaultProvider": "預設 provider",
|
||
"modelIdPlaceholder": "模型 ID…",
|
||
"addModel": "新增模型",
|
||
"suggested": "推薦",
|
||
"test": "測試",
|
||
"testOk": "正常({ms} 毫秒)",
|
||
"testFailed": "失敗",
|
||
"removeModel": "移除 {model}",
|
||
"deleteProviderTitle": "刪除 {name}?",
|
||
"deleteProviderDesc": "儲存後,其憑證和模型將從伺服器上移除。",
|
||
"cancel": "取消",
|
||
"delete": "刪除",
|
||
"groups": {
|
||
"generation": {
|
||
"title": "生成",
|
||
"description": "套用於所有聊天請求的輸出參數。"
|
||
},
|
||
"access": {
|
||
"title": "存取控制",
|
||
"description": "限制誰可以使用此部署。"
|
||
},
|
||
"features": {
|
||
"title": "功能",
|
||
"description": "選用功能和安全開關。"
|
||
},
|
||
"observability": {
|
||
"title": "可觀測性",
|
||
"description": "對 LLM 呼叫進行 Langfuse 追蹤。"
|
||
},
|
||
"quota": {
|
||
"title": "配額與速率限制",
|
||
"description": "按 IP 的用量限制。強制執行需要 DynamoDB 表。"
|
||
}
|
||
},
|
||
"settings": {
|
||
"TEMPERATURE": {
|
||
"label": "溫度",
|
||
"description": "對於拒絕溫度參數的推理模型,請留空。"
|
||
},
|
||
"MAX_OUTPUT_TOKENS": {
|
||
"label": "最大輸出 token 數"
|
||
},
|
||
"ACCESS_CODE_LIST": {
|
||
"label": "存取碼",
|
||
"description": "以逗號分隔的清單。使用者需輸入其中之一才能聊天。留空 = 開放存取。"
|
||
},
|
||
"ENABLE_VLM_VALIDATION": {
|
||
"label": "VLM 圖表驗證",
|
||
"description": "使用視覺模型對產生的圖表進行視覺化驗證。"
|
||
},
|
||
"VALIDATION_MODEL": {
|
||
"label": "驗證模型",
|
||
"description": "留空時回退到預設 AI 模型。"
|
||
},
|
||
"VALIDATION_TIMEOUT": {
|
||
"label": "驗證逾時(毫秒)"
|
||
},
|
||
"ENABLE_HISTORY_XML_REPLACE": {
|
||
"label": "歷史 XML 壓縮",
|
||
"description": "用占位符取代歷史記錄中的舊圖表 XML。"
|
||
},
|
||
"ALLOW_PRIVATE_URLS": {
|
||
"label": "允許私有 URL",
|
||
"description": "關閉以阻擋對私有 IP 和內部主機名的請求(SSRF 防護)。"
|
||
},
|
||
"LANGFUSE_PUBLIC_KEY": {
|
||
"label": "Langfuse Public Key"
|
||
},
|
||
"LANGFUSE_SECRET_KEY": {
|
||
"label": "Langfuse Secret Key"
|
||
},
|
||
"LANGFUSE_BASEURL": {
|
||
"label": "Langfuse Base URL"
|
||
},
|
||
"DAILY_REQUEST_LIMIT": {
|
||
"label": "每日請求上限",
|
||
"description": "每個 IP 每天。"
|
||
},
|
||
"DAILY_TOKEN_LIMIT": {
|
||
"label": "每日 token 上限",
|
||
"description": "每個 IP 每天。"
|
||
},
|
||
"TPM_LIMIT": {
|
||
"label": "每分鐘 token 數"
|
||
},
|
||
"DYNAMODB_QUOTA_TABLE": {
|
||
"label": "DynamoDB 表",
|
||
"description": "留空時配額強制執行被停用。"
|
||
},
|
||
"DYNAMODB_REGION": {
|
||
"label": "DynamoDB 區域"
|
||
},
|
||
"QUOTA_TIMEZONE": {
|
||
"label": "配額時區",
|
||
"description": "每日重置邊界所用的時區。"
|
||
}
|
||
}
|
||
}
|
||
}
|