settings.json 48 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924
  1. {
  2. "clientVersions": {
  3. "description": "Manage client version requirements to ensure users use latest stable version. VSCode plugin and CLI are managed separately.",
  4. "empty": {
  5. "description": "No active users using recognizable clients in past 7 days",
  6. "title": "No client data available"
  7. },
  8. "features": {
  9. "activeWindow": "Active Window: ",
  10. "activeWindowDesc": "Only counts users with requests in the past 7 days",
  11. "autoDetect": "System automatically detects the latest stable version (GA version) for each client type",
  12. "blockOldVersion": "Users with old versions will receive HTTP 400 error and cannot continue using the service",
  13. "errorMessage": "Error message includes current version and required upgrade version",
  14. "gaRule": "GA Rule: ",
  15. "gaRuleDesc": "A version is considered GA when used by more than 1 user",
  16. "recommendation": "Recommendation: ",
  17. "recommendationDesc": "Monitor the version distribution below and confirm new version stability before enabling.",
  18. "title": "Feature Description",
  19. "whatHappens": "What happens when enabled:"
  20. },
  21. "section": {
  22. "distribution": {
  23. "description": "Shows client version info for active users in past 7 days. Each client type independently tracks GA versions.",
  24. "title": "Client Version Distribution"
  25. },
  26. "settings": {
  27. "description": "When enabled, system automatically detects client version and blocks old version users.",
  28. "title": "Update Reminder Settings"
  29. }
  30. },
  31. "table": {
  32. "currentGA": "Current GA Version: ",
  33. "internalType": "Internal Type: ",
  34. "lastActive": "Last Active",
  35. "latest": "Latest",
  36. "needsUpgrade": "Needs Upgrade",
  37. "noUsers": "No user data available",
  38. "status": "Status",
  39. "unknown": "Unknown",
  40. "user": "User",
  41. "usersCount": "{count} users",
  42. "version": "Current Version"
  43. },
  44. "title": "Client Update Reminder",
  45. "toggle": {
  46. "description": "When enabled, system will block requests from old version clients",
  47. "disableSuccess": "Client version check disabled",
  48. "enable": "Enable Update Reminder",
  49. "enableSuccess": "Client version check enabled",
  50. "toggleFailed": "Update failed"
  51. }
  52. },
  53. "common": {
  54. "cancel": "Cancel",
  55. "completed": "Completed",
  56. "confirm": "Confirm",
  57. "copied": "Key copied to clipboard",
  58. "copy": "Copy",
  59. "copyFailed": "Copy failed",
  60. "create": "Create",
  61. "creating": "Creating...",
  62. "delete": "Delete",
  63. "disabled": "Disabled",
  64. "edit": "Edit",
  65. "empty": "No matching results found",
  66. "enabled": "Enabled",
  67. "error": "Unknown error",
  68. "failed": "Failed",
  69. "loading": "Loading...",
  70. "none": "None (No users using this version)",
  71. "refresh": "Refresh",
  72. "reset": "Reset",
  73. "save": "Save",
  74. "saving": "Saving...",
  75. "submit": "Submit",
  76. "success": "Success",
  77. "test": "Test",
  78. "testing": "Testing...",
  79. "unlimited": "Unlimited",
  80. "unlimited_desc": "Unlimited",
  81. "update": "Update",
  82. "updating": "Updating..."
  83. },
  84. "config": {
  85. "autoCleanup": "Auto Log Cleanup",
  86. "autoCleanupDesc": "Automatically clean up historical log data on schedule to free up database storage space.",
  87. "description": "Manage system basic parameters that affect site display and statistics behavior.",
  88. "form": {
  89. "allowGlobalView": "Allow Global Usage View",
  90. "allowGlobalViewDesc": "When disabled, regular users can only view their own key usage statistics in the dashboard.",
  91. "cleanupSchedule": "Cleanup Schedule",
  92. "cleanupScheduleDesc": "Select the execution schedule for automatic cleanup",
  93. "configUpdated": "System settings updated. The page will refresh to apply currency display changes.",
  94. "currencyDisplay": "Currency Display Unit",
  95. "currencyDisplayPlaceholder": "Select currency unit",
  96. "currencyDisplayDesc": "After modification, all pages and API interfaces will use the corresponding currency symbol (symbol only, no exchange rate conversion).",
  97. "keepDays": "Retention Days",
  98. "keepDaysDesc": "Clean up logs older than this number of days",
  99. "saveFailed": "Save failed",
  100. "saveSuccess": "Saved successfully",
  101. "saveError": "Save failed",
  102. "saveSettings": "Save Settings",
  103. "siteTitle": "Site Title",
  104. "siteTitlePlaceholder": "e.g. Claude Code Hub",
  105. "siteTitleRequired": "Site title cannot be empty",
  106. "siteTitleDesc": "Used to set browser tab title and system default display name.",
  107. "enableAutoCleanup": "Enable Auto Cleanup",
  108. "enableAutoCleanupDesc": "Automatically clean up historical log data on schedule",
  109. "cleanupRetentionDays": "Retention Days",
  110. "cleanupRetentionDaysRequired": "Retention Days *",
  111. "cleanupRetentionDaysPlaceholder": "30",
  112. "cleanupRetentionDaysDesc": "Logs older than this number of days will be automatically cleaned (range: 1-365 days)",
  113. "cleanupScheduleLabel": "Execution Time (Cron)",
  114. "cleanupScheduleRequired": "Execution Time (Cron) *",
  115. "cleanupSchedulePlaceholder": "0 2 * * *",
  116. "cleanupScheduleCronDesc": "Cron expression, default: 0 2 * * * (2 AM daily)",
  117. "cleanupScheduleCronExample": "Example: 0 3 * * 0 (3 AM every Sunday)",
  118. "cleanupBatchSize": "Batch Size",
  119. "cleanupBatchSizeRequired": "Batch Size *",
  120. "cleanupBatchSizePlaceholder": "10000",
  121. "cleanupBatchSizeDesc": "Number of records to delete per batch (range: 1000-100000, recommended 10000)",
  122. "saveConfig": "Save Configuration",
  123. "autoCleanupSaved": "Auto cleanup configuration saved",
  124. "currencies": {
  125. "USD": "$ US Dollar (USD)",
  126. "CNY": "¥ Chinese Yuan (CNY)",
  127. "EUR": "€ Euro (EUR)",
  128. "JPY": "¥ Japanese Yen (JPY)",
  129. "GBP": "£ British Pound (GBP)",
  130. "HKD": "HK$ Hong Kong Dollar (HKD)",
  131. "TWD": "NT$ New Taiwan Dollar (TWD)",
  132. "KRW": "₩ South Korean Won (KRW)",
  133. "SGD": "S$ Singapore Dollar (SGD)"
  134. }
  135. },
  136. "siteSettings": "Site Parameters",
  137. "siteSettingsDesc": "Configure site title, currency display unit, and dashboard statistics display policy.",
  138. "title": "Basic Configuration"
  139. },
  140. "data": {
  141. "cleanup": {
  142. "descriptionWarning": "Clean up historical log data to free up database storage. Note: Statistics data will be retained, but log details will be permanently deleted.",
  143. "rangeLabel": "Cleanup Range",
  144. "range": {
  145. "7days": "Logs older than 1 week (7 days)",
  146. "30days": "Logs older than 1 month (30 days)",
  147. "90days": "Logs older than 3 months (90 days)",
  148. "180days": "Logs older than 6 months (180 days)"
  149. },
  150. "rangeDescription": {
  151. "7days": "1 week ago",
  152. "30days": "1 month ago",
  153. "90days": "3 months ago",
  154. "180days": "6 months ago",
  155. "default": "{days} days ago"
  156. },
  157. "willClean": "Will clean all log records from {range}",
  158. "button": "Clean Logs",
  159. "confirmTitle": "Confirm Log Cleanup",
  160. "confirmWarning": "This operation will permanently delete all log records from {range} and cannot be recovered.",
  161. "previewLoading": "Counting...",
  162. "previewCount": "Will delete {count} log records",
  163. "previewError": "Unable to get preview",
  164. "statisticsRetained": "✓ Statistics data will be retained (for trend analysis)",
  165. "logsDeleted": "✗ Log details will be deleted (request/response content, error info, etc.)",
  166. "backupRecommendation": "Recommendation: Export database backup before cleanup in case recovery is needed.",
  167. "cancel": "Cancel",
  168. "confirm": "Confirm Cleanup",
  169. "cleaning": "Cleaning...",
  170. "successMessage": "Successfully cleaned {count} log records ({batches} batches, took {duration}s)",
  171. "failed": "Cleanup failed",
  172. "error": "Failed to clean logs"
  173. },
  174. "description": "Manage database backup and recovery with full data import/export and log cleanup.",
  175. "export": {
  176. "descriptionFull": "Export complete database backup file (.dump format) for data migration or recovery. Backup uses PostgreSQL custom format, auto-compressed and compatible with different database versions.",
  177. "button": "Export Database",
  178. "exporting": "Exporting...",
  179. "successMessage": "Database exported successfully!",
  180. "failed": "Export failed",
  181. "error": "Failed to export database"
  182. },
  183. "guide": {
  184. "backup": "Security Recommendation: Before importing, recommend exporting current database as backup to avoid data loss.",
  185. "cleanup": "Log Cleanup: Physically delete historical log data (irreversible). Statistics table will be retained. Recommend exporting database backup before cleanup.",
  186. "docker": "Environment Requirements: This feature requires Docker Compose deployment. Local development may not support it.",
  187. "format": "Backup Format: Uses PostgreSQL custom format (.dump), auto-compressed and compatible with different database versions.",
  188. "merge": "Merge Mode: Retains existing data and attempts to insert backup data. Primary key conflicts may cause import failure.",
  189. "overwrite": "Overwrite Mode: Deletes all existing data before importing, ensuring database matches backup exactly. Best for complete recovery.",
  190. "title": "Usage Instructions and Precautions"
  191. },
  192. "import": {
  193. "descriptionFull": "Restore database from backup file. Supports PostgreSQL custom format (.dump) backup files.",
  194. "selectFileLabel": "Select Backup File",
  195. "fileSelected": "Selected: {name} ({size} MB)",
  196. "fileError": "Please select .dump format backup file",
  197. "noFileSelected": "Please select backup file first",
  198. "cleanFirstLabel": "Clear existing data (overwrite mode)",
  199. "cleanFirstDescription": "Delete all existing data before importing to ensure database matches backup exactly. If unchecked, will attempt to merge data but may fail due to primary key conflicts.",
  200. "button": "Import Database",
  201. "importing": "Importing...",
  202. "progressTitle": "Import Progress",
  203. "confirmTitle": "Confirm Database Import",
  204. "confirmOverwrite": "You selected 'Overwrite Mode', which will delete all existing data before importing backup.",
  205. "confirmMerge": "You selected 'Merge Mode', which will attempt to import backup while keeping existing data.",
  206. "warningOverwrite": "⚠️ Warning: This action is irreversible, all current data will be permanently deleted!",
  207. "warningMerge": "⚠️ Note: Import may fail if primary key conflicts exist.",
  208. "backupFile": "Backup file:",
  209. "backupRecommendation": "Recommend exporting current database as backup before proceeding.",
  210. "cancel": "Cancel",
  211. "confirm": "Confirm Import",
  212. "successMessage": "Data import completed!",
  213. "failedMessage": "Data import failed, check detailed logs",
  214. "error": "Failed to import database",
  215. "streamError": "Cannot read response stream",
  216. "errorUnknown": "Unknown error"
  217. },
  218. "status": {
  219. "loading": "Loading...",
  220. "error": "Failed to get database status",
  221. "retry": "Retry",
  222. "connected": "Database connected",
  223. "unavailable": "Database unavailable",
  224. "tables": "{count} tables"
  225. },
  226. "title": "Data Management",
  227. "section": {
  228. "status": {
  229. "title": "Database Status",
  230. "description": "View current database connection status and basic information."
  231. },
  232. "cleanup": {
  233. "title": "Log Cleanup",
  234. "description": "Clean up historical log data to free up database storage. Note: Statistics data will be retained, but log details will be permanently deleted."
  235. },
  236. "export": {
  237. "title": "Data Export",
  238. "description": "Export complete database backup file (.dump format) for data migration or recovery."
  239. },
  240. "import": {
  241. "title": "Data Import",
  242. "description": "Restore database from backup file. Supports PostgreSQL custom format (.dump) backup files."
  243. }
  244. }
  245. },
  246. "errors": {
  247. "addFailed": "Failed to add provider",
  248. "addSuccess": "Added successfully",
  249. "deleteFailed": "Failed to delete provider",
  250. "deleteSuccess": "Deleted successfully",
  251. "editFailed": "Failed to update provider",
  252. "editSuccess": "Updated successfully",
  253. "loadFailed": "Failed to load notification settings",
  254. "saveFailed": "Save failed",
  255. "saveFailed_error": "Failed to save settings",
  256. "saveSuccess": "Saved successfully",
  257. "syncFailed": "Sync failed",
  258. "syncSuccess": "Sync successful",
  259. "testFailed": "Test failed",
  260. "testFailedRetry": "Test failed. Please retry.",
  261. "unknownError": "An error occurred during operation"
  262. },
  263. "logs": {
  264. "description": "Dynamically adjust system log level to control logging verbosity in real-time.",
  265. "subtitle": "Log Level Control",
  266. "subtitleDesc": "Changes take effect immediately without restart. Useful for troubleshooting in production.",
  267. "section": {
  268. "title": "Log Level Control",
  269. "description": "Changes take effect immediately without service restart."
  270. },
  271. "levels": {
  272. "fatal": {
  273. "label": "Fatal",
  274. "description": "Fatal errors only"
  275. },
  276. "error": {
  277. "label": "Error",
  278. "description": "Error messages"
  279. },
  280. "warn": {
  281. "label": "Warn",
  282. "description": "Warnings + Errors"
  283. },
  284. "info": {
  285. "label": "Info",
  286. "description": "Key business events + Warnings + Errors (Recommended for Production)"
  287. },
  288. "debug": {
  289. "label": "Debug",
  290. "description": "Debug info + All levels (Recommended for Development)"
  291. },
  292. "trace": {
  293. "label": "Trace",
  294. "description": "Extremely detailed tracing + All levels"
  295. }
  296. },
  297. "form": {
  298. "currentLevel": "Current Log Level",
  299. "selectLevel": "Select Log Level",
  300. "save": "Save Settings",
  301. "saving": "Saving...",
  302. "success": "Log level set to: {level}",
  303. "failed": "Failed to set",
  304. "failedError": "Failed to set log level",
  305. "fetchFailed": "Failed to fetch log level",
  306. "effectiveImmediately": "Log level changes take effect immediately without service restart.",
  307. "levelGuideTitle": "Log Level Guide",
  308. "levelGuideFatal": "Fatal/Error: Only errors shown, minimal logging, suitable for high-load production",
  309. "levelGuideWarn": "Warn: Includes warnings (rate limiting, circuit breaker opening, etc.) + Errors",
  310. "levelGuideInfo": "Info (Recommended for Production): Shows key business events (provider selection, Session reuse, price sync) + Warnings + Errors",
  311. "levelGuideDebug": "Debug (Recommended for Development): Includes detailed debug info, suitable for troubleshooting",
  312. "levelGuideTrace": "Trace: Extremely detailed trace information, includes all details",
  313. "changeNotice": "Current level is {current}, will switch to {selected} after saving"
  314. },
  315. "title": "Log Management"
  316. },
  317. "nav": {
  318. "apiDocs": "API Documentation",
  319. "clientVersions": "Client Update Reminder",
  320. "config": "Configuration",
  321. "data": "Data Management",
  322. "logs": "Logs",
  323. "notifications": "Notifications",
  324. "prices": "Pricing",
  325. "providers": "Providers",
  326. "sensitiveWords": "Sensitive Words"
  327. },
  328. "notifications": {
  329. "circuitBreaker": {
  330. "description": "Immediately push alert when provider is completely circuit-broken",
  331. "enable": "Enable Circuit Breaker Alert",
  332. "test": "Test Connection",
  333. "title": "Circuit Breaker Alert",
  334. "webhook": "Webhook URL",
  335. "webhookPlaceholder": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=..."
  336. },
  337. "costAlert": {
  338. "description": "Trigger alert when user/provider spending exceeds quota threshold",
  339. "enable": "Enable Cost Alert",
  340. "interval": "Check Interval (minutes)",
  341. "test": "Test Connection",
  342. "threshold": "Alert Threshold",
  343. "thresholdHelp": "Trigger alert when spending reaches {percent}% of quota",
  344. "thresholdLabel": "Alert threshold: {percent}%",
  345. "title": "Cost Alert",
  346. "webhook": "Webhook URL",
  347. "webhookPlaceholder": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=..."
  348. },
  349. "dailyLeaderboard": {
  350. "description": "Send top N user spending leaderboard daily on schedule",
  351. "enable": "Enable Daily Leaderboard",
  352. "test": "Test Connection",
  353. "time": "Send Time",
  354. "timeError": "Time format error, should be HH:mm",
  355. "timePlaceholder": "09:00",
  356. "title": "Daily User Spending Leaderboard",
  357. "topN": "Show Top N",
  358. "webhook": "Webhook URL",
  359. "webhookPlaceholder": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=..."
  360. },
  361. "description": "Configure WeChat Work robot push notifications",
  362. "form": {
  363. "loadError": "Failed to load notification settings",
  364. "loading": "Loading...",
  365. "save": "Save Settings",
  366. "saveError": "Failed to save settings",
  367. "saveFailed": "Save failed",
  368. "saving": "Saving...",
  369. "success": "Notification settings saved and tasks rescheduled",
  370. "testError": "Connection test failed",
  371. "testFailed": "Test failed",
  372. "testFailedRetry": "Test failed. Please retry.",
  373. "testNoResult": "Test succeeded but no result returned",
  374. "testSuccess": "Test message sent. Check WeChat Work.",
  375. "webhookRequired": "Please fill in Webhook URL first"
  376. },
  377. "global": {
  378. "description": "Enable or disable all push notification features",
  379. "enable": "Enable Push Notifications",
  380. "title": "Notification Master Switch"
  381. },
  382. "title": "Push Notifications"
  383. },
  384. "prices": {
  385. "description": "Manage platform basic configuration and model pricing",
  386. "dialog": {
  387. "description": "Upload JSON file to update model pricing configuration",
  388. "fileSizeLimit": "File size cannot exceed 10MB",
  389. "fileSizeLimitSmall": "File size not exceeding 10MB",
  390. "getError": "Failed to get key",
  391. "readError": "Failed to get key",
  392. "selectFile": "Click to select JSON file or drag and drop here",
  393. "title": "Update Model Price Table",
  394. "upload": "Upload",
  395. "uploading": "Uploading..."
  396. },
  397. "noData": "System has built-in price table. Use buttons above to sync or update.",
  398. "noModels": "No model prices found",
  399. "search": "Search model name...",
  400. "subtitle": "Model Pricing",
  401. "subtitleDesc": "Manage AI model pricing configuration",
  402. "sync": "Sync LiteLLM Prices",
  403. "syncFailed": "Sync failed",
  404. "syncFailedError": "Sync failed:",
  405. "syncNoResult": "Price table updated but no result returned",
  406. "syncSuccess": "Price table updated successfully",
  407. "syncing": "Syncing...",
  408. "table": {
  409. "cachePrice": "Cache Price",
  410. "inputPrice": "Input Price ($/M)",
  411. "model": "Model",
  412. "outputPrice": "Output Price ($/M)",
  413. "updatedAt": "Updated At"
  414. },
  415. "title": "Pricing",
  416. "upload": "Update Model Price Table",
  417. "uploadFailed": "Failed to get pricing data:",
  418. "uploadSuccess": "Price table updated successfully"
  419. },
  420. "providers": {
  421. "add": "Add Provider",
  422. "addFailed": "Failed to add provider",
  423. "addProvider": "Add Provider",
  424. "addSuccess": "Provider added successfully",
  425. "circuitBroken": "Circuit Broken",
  426. "clone": "Clone Provider",
  427. "cloneFailed": "Copy failed",
  428. "confirmDelete": "Are you sure you want to delete this provider?",
  429. "confirmDeleteDesc": "Are you sure you want to delete provider \"{name}\"? This action cannot be undone.",
  430. "confirmDeleteProvider": "Confirm Delete Provider?",
  431. "confirmDeleteProviderDesc": "Are you sure you want to delete provider \"{name}\"? This action is irreversible.",
  432. "createProvider": "Add Provider",
  433. "delete": "Delete Provider",
  434. "deleteFailed": "Failed to delete provider",
  435. "deleteSuccess": "Deleted successfully",
  436. "description": "Configure API service providers and maintain availability status.",
  437. "disabledStatus": "disabled",
  438. "displayCount": "Showing {filtered} / {total} providers",
  439. "edit": "Edit Provider",
  440. "editFailed": "Failed to update provider",
  441. "editProvider": "Edit Provider",
  442. "enabledStatus": "enabled",
  443. "form": {
  444. "addRedirect": "Add Redirect",
  445. "allowAllModels": "✓ Allow All Models (Recommended)",
  446. "apiAddress": "API Address",
  447. "apiAddressPlaceholder": "e.g. https://open.bigmodel.cn/api/anthropic",
  448. "apiAddressRequired": "API Address *",
  449. "apiKey": "API Key",
  450. "apiKeyCurrent": "Current key:",
  451. "apiKeyLeaveEmpty": "(Leave empty to keep unchanged)",
  452. "apiKeyLeaveEmptyDesc": "Leave empty to keep existing key",
  453. "apiKeyOptional": "Leave empty to keep existing key",
  454. "apiKeyPlaceholder": "Enter API key",
  455. "apiKeyRequired": "API Key *",
  456. "baseUrl": "Base URL",
  457. "baseUrlPlaceholder": "e.g. https://open.bigmodel.cn/api/anthropic",
  458. "baseUrlRequired": "Please fill in provider URL first",
  459. "circuitBreakerConfig": "Circuit Breaker Configuration",
  460. "circuitBreakerConfigSummary": "{failureThreshold} failures / {openDuration} min circuit break / {successThreshold} successes to recover",
  461. "circuitBreakerDesc": "Auto circuit break on consecutive failures to avoid overall service quality impact",
  462. "clearSearch": "Clear search",
  463. "codexInstructions": "Codex Instructions Policy",
  464. "codexInstructionsAuto": "Auto (Recommended)",
  465. "codexInstructionsDesc": "(determines scheduling policy)",
  466. "codexInstructionsForce": "Force Official",
  467. "codexInstructionsKeep": "Keep Original",
  468. "codexStrategyAutoDesc": "Pass through client instructions, auto retry with official prompt on 400 error",
  469. "codexStrategyAutoLabel": "Auto (Recommended)",
  470. "codexStrategyConfig": "Codex Instructions Strategy",
  471. "codexStrategyConfigAuto": "Auto (Recommended)",
  472. "codexStrategyConfigForce": "Force Official",
  473. "codexStrategyConfigKeep": "Keep Original",
  474. "codexStrategyDesc": "Control how to handle Codex request instructions field, affects upstream gateway compatibility",
  475. "codexStrategyForceDesc": "Always use official Codex CLI instructions (~4000+ chars)",
  476. "codexStrategyForceLabel": "Force Official",
  477. "codexStrategyHint": "Hint: Some strict Codex gateways (e.g. 88code, foxcode) require official instructions. Choose \"Auto\" or \"Force Official\" strategy",
  478. "codexStrategyKeepDesc": "Always pass through client instructions, no auto retry (for lenient gateways)",
  479. "codexStrategyKeepLabel": "Keep Original",
  480. "codexStrategySelect": "Strategy Selection",
  481. "collapseAll": "Collapse All Advanced Configuration",
  482. "confirmAdd": "Confirm Add",
  483. "confirmAddPending": "Adding...",
  484. "confirmUpdate": "Confirm Update",
  485. "confirmUpdatePending": "Updating...",
  486. "costMultiplier": "Cost Multiplier",
  487. "costMultiplierDesc": "Cost calculation multiplier. Official=1.0, 20% cheaper=0.8, 20% more expensive=1.2 (up to 4 decimal places)",
  488. "costMultiplierLabel": "Cost Multiplier",
  489. "costMultiplierPlaceholder": "1.0",
  490. "deleteButton": "Delete",
  491. "enabled": "Enabled",
  492. "expandAll": "Expand All Advanced Configuration",
  493. "failureThreshold": "Failure Threshold (times)",
  494. "failureThresholdDesc": "How many consecutive failures trigger circuit break",
  495. "failureThresholdPlaceholder": "5",
  496. "filterAllProviders": "All Providers",
  497. "filterByType": "Filter by Provider Type",
  498. "filterProvider": "Filter by Provider Type",
  499. "group": "Group",
  500. "groupPlaceholder": "e.g. premium, economy",
  501. "joinClaudePool": "Join Claude Scheduling Pool",
  502. "joinClaudePoolDesc": "When enabled, this provider will participate in load balancing with Claude type providers",
  503. "joinClaudePoolHelp": "Only available when model redirect config contains mappings to claude-* models. When enabled, this provider will also participate in scheduling when users request claude-* models.",
  504. "leaveEmpty": "Leave empty for unlimited",
  505. "limit0Means": "0 means unlimited",
  506. "limit5hLabel": "5-Hour Spending Limit (USD)",
  507. "limitAmount5h": "5-Hour Spending Limit (USD)",
  508. "limitAmount5hDesc": "e.g. Provider B has $10 limit, $9.8 consumed",
  509. "limitAmountMonthly": "Monthly Spending Limit (USD)",
  510. "limitAmountWeekly": "Weekly Spending Limit (USD)",
  511. "limitConcurrent": "Concurrent Session Limit",
  512. "limitConcurrentDesc": "e.g. Provider C has limit of 2, currently 2 active sessions",
  513. "limitConcurrentLabel": "Concurrent Session Limit",
  514. "limitMonthlyLabel": "Monthly Spending Limit (USD)",
  515. "limitPlaceholder0": "0 means unlimited",
  516. "limitPlaceholderUnlimited": "Leave empty for unlimited",
  517. "limitWeeklyLabel": "Weekly Spending Limit (USD)",
  518. "modelRedirects": "Model Redirects",
  519. "modelRedirectsAddNew": "Add New Rule",
  520. "modelRedirectsCurrentRules": "Current Rules ({count})",
  521. "modelRedirectsDesc": "Redirect Claude Code client model requests (e.g. claude-sonnet-4.5) to upstream provider supported models (e.g. glm-4.6, gemini-pro). For cost optimization or third-party AI integration.",
  522. "modelRedirectsEmpty": "No redirect rules yet. System will auto-rewrite model names after adding rules.",
  523. "modelRedirectsExists": "Model \"{model}\" already has a redirect rule",
  524. "modelRedirectsLabel": "Model Redirects Configuration",
  525. "modelRedirectsOptional": "(Optional)",
  526. "modelRedirectsSourceModel": "User Requested Model",
  527. "modelRedirectsSourcePlaceholder": "e.g. claude-sonnet-4-5-20250929",
  528. "modelRedirectsSourceRequired": "Source model name cannot be empty",
  529. "modelRedirectsTargetModel": "Actual Forwarded Model",
  530. "modelRedirectsTargetPlaceholder": "e.g. glm-4.6",
  531. "modelRedirectsTargetRequired": "Target model name cannot be empty",
  532. "modelWhitelist": "Model Whitelist",
  533. "modelWhitelistAllowAll": "Allow all {type} models",
  534. "modelWhitelistAllowAllClause": "Allow all Claude models",
  535. "modelWhitelistAllowAllOpenAI": "Allow all OpenAI models",
  536. "modelWhitelistClear": "Clear",
  537. "modelWhitelistDesc": "Limit models this provider can handle. By default, provider can handle all models of its type.",
  538. "modelWhitelistLabel": "Allowed Models",
  539. "modelWhitelistLoading": "Loading...",
  540. "modelWhitelistManualAdd": "Manually Add Model",
  541. "modelWhitelistManualDesc": "Support adding any model name (not limited to price table)",
  542. "modelWhitelistManualPlaceholder": "Enter model name (e.g. gpt-5-turbo)",
  543. "modelWhitelistNotFound": "Model not found",
  544. "modelWhitelistSearchPlaceholder": "Search model name...",
  545. "modelWhitelistSelectAll": "Select All ({count})",
  546. "modelWhitelistSelected": "Selected {count} models",
  547. "modelWhitelistSelectedOnly": "Only allow selected {count} models. Requests for other models won't be routed to this provider.",
  548. "name": "Name",
  549. "namePlaceholder": "Enter provider name",
  550. "openDuration": "Circuit Break Duration (minutes)",
  551. "openDurationDesc": "How long before auto entering half-open state",
  552. "openDurationPlaceholder": "30",
  553. "priority": "Priority",
  554. "priorityDesc": "Lower number = higher priority (0 is highest). System only selects from highest priority providers. Recommendation: Main=0, Backup=1, Emergency=2",
  555. "priorityLabel": "Priority",
  556. "priorityPlaceholder": "0",
  557. "providerGroupDesc": "Provider group tag. Only users with matching providerGroup can use this provider. Example: Set to \"premium\" to allow only providerGroup=\"premium\" users",
  558. "providerGroupLabel": "Provider Group",
  559. "providerGroupPlaceholder": "e.g. premium, economy",
  560. "providerName": "Provider Name",
  561. "providerNamePlaceholder": "e.g. Zhipu",
  562. "providerNameRequired": "Provider Name *",
  563. "providerType": "Provider Type",
  564. "providerTypeDesc": "Select the API format type for the provider.",
  565. "providerTypeDisabledNote": "Note: Gemini CLI and OpenAI Compatible types are under development",
  566. "proxy": "Proxy",
  567. "proxyAddressFormats": "Supported formats:",
  568. "proxyAddressLabel": "Proxy Address",
  569. "proxyAddressOptional": "(Optional)",
  570. "proxyAddressPlaceholder": "e.g. http://proxy.example.com:8080 or socks5://127.0.0.1:1080",
  571. "proxyConfig": "Proxy Configuration",
  572. "proxyConfigDesc": "Configure proxy server to improve provider connectivity (supports HTTP, HTTPS, SOCKS4, SOCKS5)",
  573. "proxyConfigNone": "Not configured",
  574. "proxyConfigSummary": "Proxy configured",
  575. "proxyConfigSummaryFallback": " (fallback enabled)",
  576. "proxyConfigured": "Proxy configured",
  577. "proxyFallback": "Proxy Fallback",
  578. "proxyFallbackDesc": "When enabled, auto try direct connection on proxy failure",
  579. "proxyFallbackLabel": "Fallback to direct on proxy failure",
  580. "proxyNotConfigured": "Not configured",
  581. "proxyTestButton": "Test Connection",
  582. "proxyTestDesc": "Test provider URL access via configured proxy (uses HEAD request, no quota consumption)",
  583. "proxyTestFailed": "Connection Failed",
  584. "proxyTestFillUrl": "Please fill in provider URL first",
  585. "proxyTestLabel": "Connection Test",
  586. "proxyTestNetworkError": "Network error: {error}",
  587. "proxyTestProxyError": "Proxy error: {error}",
  588. "proxyTestResponseTime": "Response time: {time}",
  589. "proxyTestResultConnectionMethod": "Connection method: {via}",
  590. "proxyTestResultConnectionMethodDirect": "Direct",
  591. "proxyTestResultConnectionMethodProxy": "Proxy",
  592. "proxyTestResultErrorType": "Error type: {type}",
  593. "proxyTestResultFailed": "Connection failed",
  594. "proxyTestResultMessage": "{message}",
  595. "proxyTestResultResponseTime": "Response time: {time}ms",
  596. "proxyTestResultStatusCode": "Status code: {code}",
  597. "proxyTestResultSuccess": "Connection successful {via}",
  598. "proxyTestStatusCode": "| Status code: {code}",
  599. "proxyTestSuccess": "Connection Successful",
  600. "proxyTestTesting": "Testing...",
  601. "proxyTestTimeout": "Connection timeout (5s). Please check:\n1. Is proxy server accessible\n2. Are proxy address and port correct\n3. Are proxy credentials correct",
  602. "proxyTestViaDirect": "(direct)",
  603. "proxyTestViaProxy": "(via proxy)",
  604. "proxyUrl": "Proxy Address",
  605. "proxyUrlPlaceholder": "e.g. http://proxy.example.com:8080 or socks5://127.0.0.1:1080",
  606. "rateLimitConfig": "Rate Limit Configuration",
  607. "rateLimitConfigNone": "Unlimited",
  608. "rateLimitConfigSummary": "5h: ${fiveHour}, Weekly: ${weekly}, Monthly: ${monthly}, Concurrent: {concurrent}",
  609. "remark": "Remark",
  610. "remarkPlaceholder": "Optional: Add notes...",
  611. "removeRedirect": "Remove Redirect",
  612. "routingConfig": "Routing Configuration",
  613. "routingConfigNone": "Not configured",
  614. "routingConfigSummary": "{models} model whitelist, {redirects} redirects",
  615. "scheduleParams": "Scheduling Parameters",
  616. "searchClear": "Clear search",
  617. "searchPlaceholder": "Search provider name, URL, remark...",
  618. "selectProviderType": "Select provider type",
  619. "sort": "Sort Providers",
  620. "sortByCost": "By Cost",
  621. "sortByCreated": "By Created (New-Old)",
  622. "sortByName": "By Name (A-Z)",
  623. "sortByPriority": "By Priority (High-Low)",
  624. "sortByWeight": "By Weight (High-Low)",
  625. "sourceModel": "Source Model Name",
  626. "sourceModelPlaceholder": "e.g. claude-sonnet-4-5-20250929",
  627. "sourceModelRequired": "Source model name cannot be empty",
  628. "successThreshold": "Recovery Threshold (times)",
  629. "successThresholdDesc": "How many successes in half-open state to fully recover",
  630. "successThresholdPlaceholder": "2",
  631. "targetModel": "Target Model Name",
  632. "targetModelPlaceholder": "e.g. glm-4.6",
  633. "targetModelRequired": "Target model name cannot be empty",
  634. "testProxy": "Test Connection",
  635. "testProxyFailed": "Failed to test proxy connection",
  636. "testProxyFailedError": "Connection test failed:",
  637. "testProxySuccess": "Proxy connection successful",
  638. "validUrlRequired": "Please enter a valid API address",
  639. "websiteUrl": "Provider Website URL",
  640. "websiteUrlDesc": "Provider website URL for quick access",
  641. "websiteUrlInvalid": "Please enter a valid provider website URL",
  642. "websiteUrlPlaceholder": "https://example.com",
  643. "weight": "Weight",
  644. "weightDesc": "Weighted random probability. Within same priority, higher weight = higher selection probability. E.g. weights 1:2:3 = probabilities 16%:33%:50%",
  645. "weightLabel": "Weight",
  646. "weightPlaceholder": "1"
  647. },
  648. "guide": {
  649. "after": "After:",
  650. "before": "Before:",
  651. "bestPracticesConcurrent": "• Concurrent Control: Set session concurrency by provider API limits",
  652. "bestPracticesCost": "• Cost Multiplier: Official=1.0, Self-hosted can be 0.8-1.2",
  653. "bestPracticesLimit": "• Limit Settings: Set 5h, 7d, 30d limits based on budget",
  654. "bestPracticesPriority": "• Priority Settings: Core providers=0, Backup=1-3",
  655. "bestPracticesTitle": "Best Practices",
  656. "bestPracticesWeight": "• Weight Config: Set weight by capacity (higher capacity = higher weight)",
  657. "circuitBreaker": "Circuit Breaker Check",
  658. "circuitBreakerOpen": "A filtered, remaining: B, C, D",
  659. "circuitBreakerRecovery": "A automatically recovers to half-open after 60 seconds",
  660. "circuitBreakerRecovery5h": "Auto recovery after 5-hour sliding window",
  661. "costOptimize": "2️⃣ Cost Optimization: Within same priority, lower cost multiplier has higher probability",
  662. "costSort": "Cost-based Sorting Fallback",
  663. "costSortExample": "All providers: A (default), B (premium), C (premium), D (economy)",
  664. "costSortProb": "Lower cost C has higher selection probability",
  665. "costSortResult": "After sorting: C (0.8x), A (1.0x)",
  666. "decision": "Decision:",
  667. "group": "User Group Filtering",
  668. "groupDesc": "If user has provider group specified, system prioritizes selection from that group",
  669. "groupDowngrade": "Log warning and select from global provider pool",
  670. "groupExample": "User configured providerGroup = 'premium'",
  671. "groupFallback": "If no available providers in user group, fallback to all providers",
  672. "groupFiltered": "Select only from A and C, B and D filtered",
  673. "groupUnavailable": "All providers in user group 'vip' are disabled or over limit",
  674. "health": "Health Filtering (Circuit Breaker + Rate Limit)",
  675. "healthCheck": "Check if B is enabled and healthy",
  676. "healthCheckAmountLimit": "Check if spending exceeds limits (5h, 7d, 30d)",
  677. "healthCheckAmountLimitExample": "Provider B has $10 limit (5h), $9.8 consumed",
  678. "healthCheckCircuit": "Provider A failed 5 times, circuit breaker: open",
  679. "healthCheckConcurrent": "Check if current active session count exceeds limit",
  680. "healthCheckConcurrentExample": "Provider C limit 2, currently 2 active sessions",
  681. "healthFilter": "3️⃣ Health Filtering: Auto skip circuit-broken or over-limit providers",
  682. "healthFiltered": "B filtered (near limit), remaining: C, D",
  683. "healthFiltered2": "C filtered (full), remaining: D",
  684. "history": "Check Request History",
  685. "historyDesc": "Query providers used by this API Key in last 10 seconds",
  686. "priority": "Priority Layering",
  687. "priorityExample": "4 enabled providers with different priorities",
  688. "priorityFirst": "1️⃣ Priority First: Select only from highest priority (lowest number) providers",
  689. "priorityResult": "Filtered to highest priority (0) providers: A, C",
  690. "priorityStep": "System first filters by priority, selecting only from highest priority providers",
  691. "randomResult": "Finally selected C randomly",
  692. "randomSelect": "Weighted Random",
  693. "reset": "Manual Circuit Breaker Reset",
  694. "resetSuccess": "Circuit breaker reset",
  695. "scenario1Desc": "System first filters by priority, selecting only from highest priority providers",
  696. "scenario1Step1": "Initial State",
  697. "scenario1Step1After": "Filtered to highest priority (0) providers: A, C",
  698. "scenario1Step1Before": "Provider A (priority 0), B (priority 1), C (priority 0), D (priority 2)",
  699. "scenario1Step1Decision": "Select only from A and C, B and D filtered out",
  700. "scenario1Step1Desc": "4 enabled providers with different priorities",
  701. "scenario1Step2": "Cost Sorting",
  702. "scenario1Step2After": "After sorting: C (0.8x), A (1.0x)",
  703. "scenario1Step2Before": "A (cost 1.0x), C (cost 0.8x)",
  704. "scenario1Step2Decision": "Lower cost C has higher selection probability",
  705. "scenario1Step2Desc": "Within same priority, sort by cost multiplier low to high",
  706. "scenario1Step3": "Weighted Random",
  707. "scenario1Step3After": "C has 75% probability, A has 25%",
  708. "scenario1Step3Before": "C (weight 3), A (weight 1)",
  709. "scenario1Step3Decision": "Finally randomly selected C",
  710. "scenario1Step3Desc": "Use weight for random selection, higher weight = higher probability",
  711. "scenario1Title": "Priority Layering",
  712. "scenario2Desc": "If user has provider group specified, system prioritizes selection from that group",
  713. "scenario2Step1": "Check User Group",
  714. "scenario2Step1After": "Filtered to 'premium' group: B, C",
  715. "scenario2Step1Before": "All providers: A (default), B (premium), C (premium), D (economy)",
  716. "scenario2Step1Decision": "Select only from B and C",
  717. "scenario2Step1Desc": "User configured providerGroup = 'premium'",
  718. "scenario2Step2": "Group Fallback",
  719. "scenario2Step2After": "Fallback to all enabled providers: A, B, C, D",
  720. "scenario2Step2Before": "All providers in user group 'vip' disabled or over limit",
  721. "scenario2Step2Decision": "Log warning and select from global provider pool",
  722. "scenario2Step2Desc": "If no available providers in user group, fallback to all providers",
  723. "scenario2Title": "User Group Filtering",
  724. "scenario3Desc": "System auto filters circuit-broken or over-limit providers",
  725. "scenario3Step1": "Circuit Breaker Check",
  726. "scenario3Step1After": "A filtered, remaining: B, C, D",
  727. "scenario3Step1Before": "Provider A failed 5 times, circuit breaker: open",
  728. "scenario3Step1Decision": "A auto recovers to half-open after 60s",
  729. "scenario3Step1Desc": "Circuit breaker opens after 5 consecutive failures, unavailable for 60s",
  730. "scenario3Step2": "Amount Rate Limit",
  731. "scenario3Step2After": "B filtered (near limit), remaining: C, D",
  732. "scenario3Step2Before": "Provider B 5h limit $10, consumed $9.8",
  733. "scenario3Step2Decision": "Auto recovery after 5h sliding window",
  734. "scenario3Step2Desc": "Check if spending exceeds limits (5h, 7d, 30d)",
  735. "scenario3Step3": "Concurrent Session Limit",
  736. "scenario3Step3After": "C filtered (full), remaining: D",
  737. "scenario3Step3Before": "Provider C concurrent limit 2, currently 2 active sessions",
  738. "scenario3Step3Decision": "Auto release after session expiry (5 min)",
  739. "scenario3Step3Desc": "Check if active session count exceeds configured concurrent limit",
  740. "scenario3Title": "Health Filtering (Circuit Breaker + Rate Limit)",
  741. "scenario4Desc": "Consecutive chats prioritize using same provider, leveraging Claude context cache",
  742. "scenario4Step1": "Check Request History",
  743. "scenario4Step1After": "Check if B is enabled and healthy",
  744. "scenario4Step1Before": "Last request used provider B",
  745. "scenario4Step1Decision": "B available, reuse directly, skip random selection",
  746. "scenario4Step1Desc": "Query providers used by this API Key in last 10 seconds",
  747. "scenario4Step2": "Reuse Invalidation",
  748. "scenario4Step2After": "Enter normal selection flow",
  749. "scenario4Step2Before": "Last used provider B disabled or circuit-broken",
  750. "scenario4Step2Decision": "Select from other available providers",
  751. "scenario4Step2Desc": "If last used provider unavailable, reselect",
  752. "scenario4Title": "Session Reuse Mechanism",
  753. "scenariosTitle": "Interactive Scenario Demos",
  754. "session": "Session Reuse Mechanism",
  755. "sessionDesc": "If the last used provider is unavailable, reselect",
  756. "sessionExample": "Last request used provider B",
  757. "sessionExpired": "Session automatically released after expiration (5 minutes)",
  758. "sessionFallback": "Select from other available providers",
  759. "sessionLastUsed": "B is available, reuse directly, skip random selection",
  760. "sessionReuse": "4️⃣ Session Reuse: Consecutive chats reuse same provider, saving context costs",
  761. "sessionUnavailable": "Last used provider B is disabled or circuit-broken",
  762. "step": "Step",
  763. "title": "Core Principles",
  764. "weight": "Weighted random selection based on weight",
  765. "weightCalc": "C has 75% selection probability, A has 25%",
  766. "weightExample": "C (weight 3), A (weight 1)"
  767. },
  768. "keyLoading": "Loading...",
  769. "noProviders": "No providers configured",
  770. "noProvidersDesc": "Add your first API provider",
  771. "notFound": "No matching providers found",
  772. "official": "Official",
  773. "resetCircuit": "Circuit breaker reset",
  774. "resetCircuitDesc": "Provider \"{name}\" circuit breaker status cleared",
  775. "resetCircuitFailed": "Failed to reset circuit breaker",
  776. "scheduling": "Scheduling Strategy Details",
  777. "schedulingDesc": "Understand how provider selection works with priority layering, session reuse, load balancing and failover",
  778. "searchNoResults": "No matching providers found",
  779. "searchResults": "Found {count} matching providers",
  780. "section": {
  781. "description": "Configure upstream provider rate limiting and concurrent session limits. Leave empty for unlimited.",
  782. "title": "Provider Management"
  783. },
  784. "subtitle": "Provider Management",
  785. "subtitleDesc": "Configure upstream provider rate limiting and concurrent session limits. Leave empty for unlimited.",
  786. "title": "Provider Management",
  787. "todayUsage": "Today's Usage",
  788. "todayUsageCount": "{count} times",
  789. "toggleFailed": "Toggle failed",
  790. "toggleSuccess": "Provider {status}",
  791. "toggleSuccessDesc": "Provider \"{name}\" status updated",
  792. "updateFailed": "Failed to update provider",
  793. "viewKey": "View Complete API Key",
  794. "viewKeyDesc": "Please keep it safe and don't share it with others"
  795. },
  796. "sensitiveWords": {
  797. "add": "Add Sensitive Word",
  798. "addFailed": "Failed to create sensitive word",
  799. "addSuccess": "Sensitive word created successfully",
  800. "cacheStats": "Cache stats: Contains({containsCount}) Exact({exactCount}) Regex({regexCount})",
  801. "confirmDelete": "Are you sure you want to delete the sensitive word \"{word}\"?",
  802. "delete": "Delete Sensitive Word",
  803. "deleteFailed": "Delete failed",
  804. "deleteSuccess": "Sensitive word deleted successfully",
  805. "description": "Configure sensitive word filtering rules to block requests with sensitive content.",
  806. "dialog": {
  807. "addDescription": "Configure sensitive word filtering rules. Matched requests will not be forwarded upstream.",
  808. "addTitle": "Add Sensitive Word",
  809. "creating": "Creating...",
  810. "descriptionLabel": "Description",
  811. "descriptionPlaceholder": "Optional: Add description...",
  812. "editDescription": "Modify sensitive word configuration. Changes will automatically refresh the cache.",
  813. "editTitle": "Edit Sensitive Word",
  814. "matchTypeContains": "Contains Match - Block if text contains this word",
  815. "matchTypeExact": "Exact Match - Block only if exact match",
  816. "matchTypeLabel": "Match Type *",
  817. "matchTypeRegex": "Regular Expression - Support complex pattern matching",
  818. "saving": "Saving...",
  819. "wordLabel": "Sensitive Word *",
  820. "wordPlaceholder": "Enter sensitive word...",
  821. "wordRequired": "Please enter a sensitive word"
  822. },
  823. "disable": "Sensitive word disabled",
  824. "edit": "Edit Sensitive Word",
  825. "editFailed": "Failed to update sensitive word",
  826. "editSuccess": "Sensitive word updated successfully",
  827. "emptyState": "No sensitive words yet. Click 'Add Sensitive Word' in the top right to start configuration.",
  828. "enable": "Sensitive word enabled",
  829. "refreshCache": "Refresh Cache",
  830. "refreshCacheFailed": "Failed to refresh cache",
  831. "refreshCacheSuccess": "Cache refreshed successfully, loaded {count} sensitive words",
  832. "section": {
  833. "description": "Requests blocked by sensitive words will not be forwarded upstream and will not be charged. Supports contains matching, exact matching, and regex patterns.",
  834. "title": "Sensitive Words List"
  835. },
  836. "table": {
  837. "actions": "Actions",
  838. "createdAt": "Created At",
  839. "description": "Description",
  840. "matchType": "Match Type",
  841. "matchTypeContains": "Contains Match",
  842. "matchTypeExact": "Exact Match",
  843. "matchTypeRegex": "Regular Expression",
  844. "status": "Status",
  845. "word": "Sensitive Word"
  846. },
  847. "title": "Sensitive Words Management",
  848. "toggleFailed": "Toggle failed",
  849. "toggleFailedError": "Toggle failed:"
  850. },
  851. "notifications": {
  852. "title": "Push Notifications",
  853. "description": "Configure WeChat Work robot push notifications",
  854. "global": {
  855. "title": "Notification Master Switch",
  856. "description": "Enable or disable all push notification features",
  857. "enable": "Enable Push Notifications"
  858. },
  859. "circuitBreaker": {
  860. "title": "Circuit Breaker Alert",
  861. "description": "Send alert immediately when provider is fully circuit broken",
  862. "enable": "Enable Circuit Breaker Alert",
  863. "webhook": "Webhook URL",
  864. "webhookPlaceholder": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=...",
  865. "test": "Test Connection"
  866. },
  867. "dailyLeaderboard": {
  868. "title": "Daily User Consumption Leaderboard",
  869. "description": "Send daily scheduled user consumption Top N leaderboard",
  870. "enable": "Enable Daily Leaderboard",
  871. "webhook": "Webhook URL",
  872. "webhookPlaceholder": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=...",
  873. "time": "Send Time",
  874. "timePlaceholder": "09:00",
  875. "timeError": "Time format error, should be HH:mm",
  876. "topN": "Show Top N",
  877. "test": "Test Connection"
  878. },
  879. "costAlert": {
  880. "title": "Cost Alert",
  881. "description": "Trigger alert when user/provider consumption exceeds quota threshold",
  882. "enable": "Enable Cost Alert",
  883. "webhook": "Webhook URL",
  884. "webhookPlaceholder": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=...",
  885. "threshold": "Alert Threshold",
  886. "thresholdLabel": "Alert Threshold: {percent}%",
  887. "thresholdHelp": "Alert when consumption reaches {percent}% of quota",
  888. "interval": "Check Interval (minutes)",
  889. "test": "Test Connection"
  890. },
  891. "form": {
  892. "save": "Save Settings",
  893. "saving": "Saving...",
  894. "loading": "Loading...",
  895. "success": "Notification settings saved and tasks rescheduled",
  896. "saveFailed": "Save failed",
  897. "saveError": "Failed to save settings",
  898. "loadError": "Failed to load notification settings",
  899. "webhookRequired": "Please fill in Webhook URL first",
  900. "testSuccess": "Test message sent, please check WeChat Work",
  901. "testFailed": "Test failed",
  902. "testFailedRetry": "Test failed, please retry",
  903. "testError": "Test connection failed",
  904. "testNoResult": "Test succeeded but no result returned"
  905. }
  906. },
  907. "errors": {
  908. "saveSuccess": "Save succeeded",
  909. "saveFailed": "Save failed",
  910. "saveFailed_error": "Failed to save settings",
  911. "addSuccess": "Add succeeded",
  912. "addFailed": "Failed to add provider",
  913. "editSuccess": "Update succeeded",
  914. "editFailed": "Failed to update provider",
  915. "deleteSuccess": "Delete succeeded",
  916. "deleteFailed": "Failed to delete provider",
  917. "syncSuccess": "Sync succeeded",
  918. "syncFailed": "Sync failed",
  919. "testFailed": "Test failed",
  920. "testFailedRetry": "Test failed, please retry",
  921. "loadFailed": "Failed to load notification settings",
  922. "unknownError": "An exception occurred during the operation"
  923. }
  924. }