|
|
@@ -85,6 +85,16 @@
|
|
|
"autoCleanup": "Auto Log Cleanup",
|
|
|
"autoCleanupDesc": "Automatically clean up historical log data on schedule to free up database storage space.",
|
|
|
"description": "Manage system basic parameters that affect site display and statistics behavior.",
|
|
|
+ "section": {
|
|
|
+ "siteParams": {
|
|
|
+ "title": "Site Parameters",
|
|
|
+ "description": "Configure site title, currency display unit, and dashboard statistics display policy."
|
|
|
+ },
|
|
|
+ "autoCleanup": {
|
|
|
+ "title": "Auto Log Cleanup",
|
|
|
+ "description": "Automatically clean up historical log data on schedule to free up database storage space."
|
|
|
+ }
|
|
|
+ },
|
|
|
"form": {
|
|
|
"allowGlobalView": "Allow Global Usage View",
|
|
|
"allowGlobalViewDesc": "When disabled, regular users can only view their own key usage statistics in the dashboard.",
|
|
|
@@ -244,21 +254,21 @@
|
|
|
}
|
|
|
},
|
|
|
"errors": {
|
|
|
- "addFailed": "Failed to add provider",
|
|
|
- "addSuccess": "Added successfully",
|
|
|
- "deleteFailed": "Failed to delete provider",
|
|
|
- "deleteSuccess": "Deleted successfully",
|
|
|
- "editFailed": "Failed to update provider",
|
|
|
- "editSuccess": "Updated successfully",
|
|
|
- "loadFailed": "Failed to load notification settings",
|
|
|
+ "saveSuccess": "Save succeeded",
|
|
|
"saveFailed": "Save failed",
|
|
|
"saveFailed_error": "Failed to save settings",
|
|
|
- "saveSuccess": "Saved successfully",
|
|
|
+ "addSuccess": "Add succeeded",
|
|
|
+ "addFailed": "Failed to add provider",
|
|
|
+ "editSuccess": "Update succeeded",
|
|
|
+ "editFailed": "Failed to update provider",
|
|
|
+ "deleteSuccess": "Delete succeeded",
|
|
|
+ "deleteFailed": "Failed to delete provider",
|
|
|
+ "syncSuccess": "Sync succeeded",
|
|
|
"syncFailed": "Sync failed",
|
|
|
- "syncSuccess": "Sync successful",
|
|
|
"testFailed": "Test failed",
|
|
|
- "testFailedRetry": "Test failed. Please retry.",
|
|
|
- "unknownError": "An error occurred during operation"
|
|
|
+ "testFailedRetry": "Test failed, please retry",
|
|
|
+ "loadFailed": "Failed to load notification settings",
|
|
|
+ "unknownError": "An exception occurred during the operation"
|
|
|
},
|
|
|
"logs": {
|
|
|
"description": "Dynamically adjust system log level to control logging verbosity in real-time.",
|
|
|
@@ -326,102 +336,206 @@
|
|
|
"sensitiveWords": "Sensitive Words"
|
|
|
},
|
|
|
"notifications": {
|
|
|
+ "title": "Push Notifications",
|
|
|
+ "description": "Configure WeChat Work robot push notifications",
|
|
|
+ "global": {
|
|
|
+ "title": "Notification Master Switch",
|
|
|
+ "description": "Enable or disable all push notification features",
|
|
|
+ "enable": "Enable Push Notifications"
|
|
|
+ },
|
|
|
"circuitBreaker": {
|
|
|
- "description": "Immediately push alert when provider is completely circuit-broken",
|
|
|
- "enable": "Enable Circuit Breaker Alert",
|
|
|
- "test": "Test Connection",
|
|
|
"title": "Circuit Breaker Alert",
|
|
|
+ "description": "Send alert immediately when provider is fully circuit broken",
|
|
|
+ "enable": "Enable Circuit Breaker Alert",
|
|
|
"webhook": "Webhook URL",
|
|
|
- "webhookPlaceholder": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=..."
|
|
|
- },
|
|
|
- "costAlert": {
|
|
|
- "description": "Trigger alert when user/provider spending exceeds quota threshold",
|
|
|
- "enable": "Enable Cost Alert",
|
|
|
- "interval": "Check Interval (minutes)",
|
|
|
- "test": "Test Connection",
|
|
|
- "threshold": "Alert Threshold",
|
|
|
- "thresholdHelp": "Trigger alert when spending reaches {percent}% of quota",
|
|
|
- "thresholdLabel": "Alert threshold: {percent}%",
|
|
|
- "title": "Cost Alert",
|
|
|
- "webhook": "Webhook URL",
|
|
|
- "webhookPlaceholder": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=..."
|
|
|
+ "webhookPlaceholder": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=...",
|
|
|
+ "test": "Test Connection"
|
|
|
},
|
|
|
"dailyLeaderboard": {
|
|
|
- "description": "Send top N user spending leaderboard daily on schedule",
|
|
|
+ "title": "Daily User Consumption Leaderboard",
|
|
|
+ "description": "Send daily scheduled user consumption Top N leaderboard",
|
|
|
"enable": "Enable Daily Leaderboard",
|
|
|
- "test": "Test Connection",
|
|
|
+ "webhook": "Webhook URL",
|
|
|
+ "webhookPlaceholder": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=...",
|
|
|
"time": "Send Time",
|
|
|
- "timeError": "Time format error, should be HH:mm",
|
|
|
"timePlaceholder": "09:00",
|
|
|
- "title": "Daily User Spending Leaderboard",
|
|
|
+ "timeError": "Time format error, should be HH:mm",
|
|
|
"topN": "Show Top N",
|
|
|
+ "test": "Test Connection"
|
|
|
+ },
|
|
|
+ "costAlert": {
|
|
|
+ "title": "Cost Alert",
|
|
|
+ "description": "Trigger alert when user/provider consumption exceeds quota threshold",
|
|
|
+ "enable": "Enable Cost Alert",
|
|
|
"webhook": "Webhook URL",
|
|
|
- "webhookPlaceholder": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=..."
|
|
|
+ "webhookPlaceholder": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=...",
|
|
|
+ "threshold": "Alert Threshold",
|
|
|
+ "thresholdLabel": "Alert Threshold: {percent}%",
|
|
|
+ "thresholdHelp": "Alert when consumption reaches {percent}% of quota",
|
|
|
+ "interval": "Check Interval (minutes)",
|
|
|
+ "test": "Test Connection"
|
|
|
},
|
|
|
- "description": "Configure WeChat Work robot push notifications",
|
|
|
"form": {
|
|
|
- "loadError": "Failed to load notification settings",
|
|
|
- "loading": "Loading...",
|
|
|
"save": "Save Settings",
|
|
|
- "saveError": "Failed to save settings",
|
|
|
- "saveFailed": "Save failed",
|
|
|
"saving": "Saving...",
|
|
|
+ "loading": "Loading...",
|
|
|
"success": "Notification settings saved and tasks rescheduled",
|
|
|
- "testError": "Connection test failed",
|
|
|
+ "saveFailed": "Save failed",
|
|
|
+ "saveError": "Failed to save settings",
|
|
|
+ "loadError": "Failed to load notification settings",
|
|
|
+ "webhookRequired": "Please fill in Webhook URL first",
|
|
|
+ "testSuccess": "Test message sent, please check WeChat Work",
|
|
|
"testFailed": "Test failed",
|
|
|
- "testFailedRetry": "Test failed. Please retry.",
|
|
|
- "testNoResult": "Test succeeded but no result returned",
|
|
|
- "testSuccess": "Test message sent. Check WeChat Work.",
|
|
|
- "webhookRequired": "Please fill in Webhook URL first"
|
|
|
- },
|
|
|
- "global": {
|
|
|
- "description": "Enable or disable all push notification features",
|
|
|
- "enable": "Enable Push Notifications",
|
|
|
- "title": "Notification Master Switch"
|
|
|
- },
|
|
|
- "title": "Push Notifications"
|
|
|
+ "testFailedRetry": "Test failed, please retry",
|
|
|
+ "testError": "Test connection failed",
|
|
|
+ "testNoResult": "Test succeeded but no result returned"
|
|
|
+ }
|
|
|
},
|
|
|
"prices": {
|
|
|
+ "title": "Pricing",
|
|
|
"description": "Manage platform basic configuration and model pricing",
|
|
|
- "dialog": {
|
|
|
- "description": "Upload JSON file to update model pricing configuration",
|
|
|
- "fileSizeLimit": "File size cannot exceed 10MB",
|
|
|
- "fileSizeLimitSmall": "File size not exceeding 10MB",
|
|
|
- "getError": "Failed to get key",
|
|
|
- "readError": "Failed to get key",
|
|
|
- "selectFile": "Click to select JSON file or drag and drop here",
|
|
|
- "title": "Update Model Price Table",
|
|
|
- "upload": "Upload",
|
|
|
- "uploading": "Uploading..."
|
|
|
- },
|
|
|
- "noData": "System has built-in price table. Use buttons above to sync or update.",
|
|
|
- "noModels": "No model prices found",
|
|
|
- "search": "Search model name...",
|
|
|
- "subtitle": "Model Pricing",
|
|
|
- "subtitleDesc": "Manage AI model pricing configuration",
|
|
|
- "sync": "Sync LiteLLM Prices",
|
|
|
- "syncFailed": "Sync failed",
|
|
|
- "syncFailedError": "Sync failed:",
|
|
|
- "syncNoResult": "Price table updated but no result returned",
|
|
|
- "syncSuccess": "Price table updated successfully",
|
|
|
- "syncing": "Syncing...",
|
|
|
+ "section": {
|
|
|
+ "title": "Model Pricing",
|
|
|
+ "description": "Manage AI model pricing configuration"
|
|
|
+ },
|
|
|
+ "searchPlaceholder": "Search model name...",
|
|
|
+ "sync": {
|
|
|
+ "button": "Sync LiteLLM Prices",
|
|
|
+ "syncing": "Syncing...",
|
|
|
+ "successWithChanges": "Price table updated successfully, {count} models updated",
|
|
|
+ "successNoChanges": "Price table is up to date, no updates needed",
|
|
|
+ "failed": "Sync failed",
|
|
|
+ "failedError": "Sync failed: {error}",
|
|
|
+ "failedNoResult": "Price table updated but no result returned",
|
|
|
+ "noModels": "No model prices found",
|
|
|
+ "partialFailure": "Partial update succeeded, but {count} models failed"
|
|
|
+ },
|
|
|
"table": {
|
|
|
- "cachePrice": "Cache Price",
|
|
|
+ "modelName": "Model Name",
|
|
|
+ "type": "Type",
|
|
|
+ "provider": "Provider",
|
|
|
"inputPrice": "Input Price ($/M)",
|
|
|
- "model": "Model",
|
|
|
"outputPrice": "Output Price ($/M)",
|
|
|
- "updatedAt": "Updated At"
|
|
|
+ "updatedAt": "Updated At",
|
|
|
+ "typeChat": "Chat",
|
|
|
+ "typeImage": "Image",
|
|
|
+ "typeCompletion": "Completion",
|
|
|
+ "typeUnknown": "Unknown",
|
|
|
+ "loading": "Loading...",
|
|
|
+ "noMatch": "No matching models found",
|
|
|
+ "noDataTitle": "No price data available",
|
|
|
+ "noDataHint": "System has built-in price table. Use buttons above to sync or update."
|
|
|
},
|
|
|
- "title": "Pricing",
|
|
|
- "upload": "Update Model Price Table",
|
|
|
- "uploadFailed": "Failed to get pricing data:",
|
|
|
- "uploadSuccess": "Price table updated successfully"
|
|
|
+ "pagination": {
|
|
|
+ "showing": "Showing {from}-{to} of {total}",
|
|
|
+ "previous": "Previous",
|
|
|
+ "next": "Next",
|
|
|
+ "perPage": "{size} per page"
|
|
|
+ },
|
|
|
+ "stats": {
|
|
|
+ "totalModels": "{count} models total",
|
|
|
+ "searchResults": "{count} search results",
|
|
|
+ "lastUpdated": "Last updated: {time}"
|
|
|
+ },
|
|
|
+ "dialog": {
|
|
|
+ "title": "Update Model Price Table",
|
|
|
+ "description": "Select and upload JSON file containing model pricing data",
|
|
|
+ "selectFile": "Click to select JSON file or drag and drop here",
|
|
|
+ "fileSizeLimit": "File size cannot exceed 10MB",
|
|
|
+ "fileSizeLimitSmall": "File size not exceeding 10MB",
|
|
|
+ "invalidFileType": "Please select a JSON format file",
|
|
|
+ "fileTooLarge": "File size exceeds 10MB limit",
|
|
|
+ "upload": "Upload and Update",
|
|
|
+ "uploading": "Uploading...",
|
|
|
+ "updatePriceTable": "Update Price Table",
|
|
|
+ "updating": "Updating...",
|
|
|
+ "selectJson": "Select JSON File",
|
|
|
+ "updateSuccess": "Price table updated successfully, {count} models updated",
|
|
|
+ "updateFailed": "Update failed",
|
|
|
+ "systemHasBuiltIn": "System has built-in price table",
|
|
|
+ "manualDownload": "You can also manually download",
|
|
|
+ "latestPriceTable": "latest price table",
|
|
|
+ "andUploadViaButton": ", and upload via button above",
|
|
|
+ "supportedModels": "Currently supports {count} models",
|
|
|
+ "results": {
|
|
|
+ "title": "Update Results",
|
|
|
+ "total": "Total: {total} models",
|
|
|
+ "success": "Success: {success}",
|
|
|
+ "failed": "Failed: {failed}",
|
|
|
+ "skipped": "Skipped: {skipped}",
|
|
|
+ "details": "Details",
|
|
|
+ "viewDetails": "View detailed logs"
|
|
|
+ }
|
|
|
+ }
|
|
|
},
|
|
|
"providers": {
|
|
|
"add": "Add Provider",
|
|
|
"addFailed": "Failed to add provider",
|
|
|
"addProvider": "Add Provider",
|
|
|
"addSuccess": "Provider added successfully",
|
|
|
+ "types": {
|
|
|
+ "claude": {
|
|
|
+ "label": "Claude",
|
|
|
+ "description": "Anthropic Official API"
|
|
|
+ },
|
|
|
+ "claudeAuth": {
|
|
|
+ "label": "Claude Auth",
|
|
|
+ "description": "Claude Relay Service"
|
|
|
+ },
|
|
|
+ "codex": {
|
|
|
+ "label": "Codex",
|
|
|
+ "description": "Codex CLI API"
|
|
|
+ },
|
|
|
+ "geminiCli": {
|
|
|
+ "label": "Gemini CLI",
|
|
|
+ "description": "Gemini CLI API"
|
|
|
+ },
|
|
|
+ "openaiCompatible": {
|
|
|
+ "label": "OpenAI Compatible",
|
|
|
+ "description": "OpenAI Compatible API"
|
|
|
+ }
|
|
|
+ },
|
|
|
+ "list": {
|
|
|
+ "priority": "Priority",
|
|
|
+ "weight": "Weight",
|
|
|
+ "costMultiplier": "Cost Multiplier",
|
|
|
+ "todayUsageLabel": "Today's Usage",
|
|
|
+ "todayUsageCount": "{count} times",
|
|
|
+ "circuitBroken": "Circuit Broken",
|
|
|
+ "officialWebsite": "Official",
|
|
|
+ "viewFullKey": "View Complete API Key",
|
|
|
+ "viewFullKeyDesc": "Please keep it safe and don't share it with others",
|
|
|
+ "keyLoading": "Loading...",
|
|
|
+ "confirmDeleteTitle": "Confirm Delete Provider?",
|
|
|
+ "confirmDeleteMessage": "Are you sure you want to delete provider \"{name}\"? This action cannot be undone.",
|
|
|
+ "deleteButton": "Delete",
|
|
|
+ "cancelButton": "Cancel",
|
|
|
+ "deleteSuccess": "Deleted successfully",
|
|
|
+ "deleteSuccessDesc": "Provider \"{name}\" has been deleted",
|
|
|
+ "deleteFailed": "Delete failed",
|
|
|
+ "deleteError": "An error occurred during operation",
|
|
|
+ "unknownError": "Unknown error",
|
|
|
+ "getKeyFailed": "Failed to get key",
|
|
|
+ "keyCopied": "Key copied to clipboard",
|
|
|
+ "copyFailed": "Copy failed",
|
|
|
+ "resetCircuitSuccess": "Circuit breaker reset",
|
|
|
+ "resetCircuitSuccessDesc": "Provider \"{name}\" circuit breaker status cleared",
|
|
|
+ "resetCircuitFailed": "Failed to reset circuit breaker",
|
|
|
+ "toggleSuccess": "Provider {status}",
|
|
|
+ "toggleSuccessDesc": "Provider \"{name}\" status updated",
|
|
|
+ "toggleFailed": "Toggle failed",
|
|
|
+ "statusEnabled": "enabled",
|
|
|
+ "statusDisabled": "disabled"
|
|
|
+ },
|
|
|
+ "schedulingDialog": {
|
|
|
+ "title": "Provider Scheduling Rules",
|
|
|
+ "description": "Understand how the system intelligently selects upstream providers for high availability and cost optimization",
|
|
|
+ "triggerButton": "Scheduling Rules",
|
|
|
+ "step": "Step",
|
|
|
+ "before": "Before:",
|
|
|
+ "after": "After:",
|
|
|
+ "decision": "Decision:"
|
|
|
+ },
|
|
|
"circuitBroken": "Circuit Broken",
|
|
|
"clone": "Clone Provider",
|
|
|
"cloneFailed": "Copy failed",
|
|
|
@@ -791,7 +905,70 @@
|
|
|
"toggleSuccessDesc": "Provider \"{name}\" status updated",
|
|
|
"updateFailed": "Failed to update provider",
|
|
|
"viewKey": "View Complete API Key",
|
|
|
- "viewKeyDesc": "Please keep it safe and don't share it with others"
|
|
|
+ "viewKeyDesc": "Please keep it safe and don't share it with others",
|
|
|
+ "types": {
|
|
|
+ "claude": {
|
|
|
+ "label": "Claude",
|
|
|
+ "description": "Anthropic Official API"
|
|
|
+ },
|
|
|
+ "claudeAuth": {
|
|
|
+ "label": "Claude Auth",
|
|
|
+ "description": "Claude Relay Service"
|
|
|
+ },
|
|
|
+ "codex": {
|
|
|
+ "label": "Codex",
|
|
|
+ "description": "Codex CLI API"
|
|
|
+ },
|
|
|
+ "geminiCli": {
|
|
|
+ "label": "Gemini CLI",
|
|
|
+ "description": "Gemini CLI API"
|
|
|
+ },
|
|
|
+ "openaiCompatible": {
|
|
|
+ "label": "OpenAI Compatible",
|
|
|
+ "description": "OpenAI Compatible API"
|
|
|
+ }
|
|
|
+ },
|
|
|
+ "list": {
|
|
|
+ "priority": "Priority",
|
|
|
+ "weight": "Weight",
|
|
|
+ "costMultiplier": "Cost Multiplier",
|
|
|
+ "todayUsageLabel": "Today's Usage",
|
|
|
+ "todayUsageCount": "{count} times",
|
|
|
+ "circuitBroken": "Circuit Broken",
|
|
|
+ "officialWebsite": "Official",
|
|
|
+ "viewFullKey": "View Complete API Key",
|
|
|
+ "viewFullKeyDesc": "Please keep it safe and don't share it with others",
|
|
|
+ "keyLoading": "Loading...",
|
|
|
+ "confirmDeleteTitle": "Confirm Delete Provider?",
|
|
|
+ "confirmDeleteMessage": "Are you sure you want to delete provider \"{name}\"? This action cannot be undone.",
|
|
|
+ "deleteButton": "Delete",
|
|
|
+ "cancelButton": "Cancel",
|
|
|
+ "deleteSuccess": "Deleted successfully",
|
|
|
+ "deleteSuccessDesc": "Provider \"{name}\" has been deleted",
|
|
|
+ "deleteFailed": "Delete failed",
|
|
|
+ "deleteError": "An error occurred during operation",
|
|
|
+ "unknownError": "Unknown error",
|
|
|
+ "getKeyFailed": "Failed to get key",
|
|
|
+ "keyCopied": "Key copied to clipboard",
|
|
|
+ "copyFailed": "Copy failed",
|
|
|
+ "resetCircuitSuccess": "Circuit breaker reset",
|
|
|
+ "resetCircuitSuccessDesc": "Provider \"{name}\" circuit breaker status cleared",
|
|
|
+ "resetCircuitFailed": "Failed to reset circuit breaker",
|
|
|
+ "toggleSuccess": "Provider {status}",
|
|
|
+ "toggleSuccessDesc": "Provider \"{name}\" status updated",
|
|
|
+ "toggleFailed": "Toggle failed",
|
|
|
+ "statusEnabled": "enabled",
|
|
|
+ "statusDisabled": "disabled"
|
|
|
+ },
|
|
|
+ "schedulingDialog": {
|
|
|
+ "title": "Provider Scheduling Rules",
|
|
|
+ "description": "Understand how the system intelligently selects upstream providers for high availability and cost optimization",
|
|
|
+ "triggerButton": "Scheduling Rules",
|
|
|
+ "step": "Step",
|
|
|
+ "before": "Before:",
|
|
|
+ "after": "After:",
|
|
|
+ "decision": "Decision:"
|
|
|
+ }
|
|
|
},
|
|
|
"sensitiveWords": {
|
|
|
"add": "Add Sensitive Word",
|
|
|
@@ -847,78 +1024,5 @@
|
|
|
"title": "Sensitive Words Management",
|
|
|
"toggleFailed": "Toggle failed",
|
|
|
"toggleFailedError": "Toggle failed:"
|
|
|
- },
|
|
|
- "notifications": {
|
|
|
- "title": "Push Notifications",
|
|
|
- "description": "Configure WeChat Work robot push notifications",
|
|
|
- "global": {
|
|
|
- "title": "Notification Master Switch",
|
|
|
- "description": "Enable or disable all push notification features",
|
|
|
- "enable": "Enable Push Notifications"
|
|
|
- },
|
|
|
- "circuitBreaker": {
|
|
|
- "title": "Circuit Breaker Alert",
|
|
|
- "description": "Send alert immediately when provider is fully circuit broken",
|
|
|
- "enable": "Enable Circuit Breaker Alert",
|
|
|
- "webhook": "Webhook URL",
|
|
|
- "webhookPlaceholder": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=...",
|
|
|
- "test": "Test Connection"
|
|
|
- },
|
|
|
- "dailyLeaderboard": {
|
|
|
- "title": "Daily User Consumption Leaderboard",
|
|
|
- "description": "Send daily scheduled user consumption Top N leaderboard",
|
|
|
- "enable": "Enable Daily Leaderboard",
|
|
|
- "webhook": "Webhook URL",
|
|
|
- "webhookPlaceholder": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=...",
|
|
|
- "time": "Send Time",
|
|
|
- "timePlaceholder": "09:00",
|
|
|
- "timeError": "Time format error, should be HH:mm",
|
|
|
- "topN": "Show Top N",
|
|
|
- "test": "Test Connection"
|
|
|
- },
|
|
|
- "costAlert": {
|
|
|
- "title": "Cost Alert",
|
|
|
- "description": "Trigger alert when user/provider consumption exceeds quota threshold",
|
|
|
- "enable": "Enable Cost Alert",
|
|
|
- "webhook": "Webhook URL",
|
|
|
- "webhookPlaceholder": "https://qyapi.weixin.qq.com/cgi-bin/webhook/send?key=...",
|
|
|
- "threshold": "Alert Threshold",
|
|
|
- "thresholdLabel": "Alert Threshold: {percent}%",
|
|
|
- "thresholdHelp": "Alert when consumption reaches {percent}% of quota",
|
|
|
- "interval": "Check Interval (minutes)",
|
|
|
- "test": "Test Connection"
|
|
|
- },
|
|
|
- "form": {
|
|
|
- "save": "Save Settings",
|
|
|
- "saving": "Saving...",
|
|
|
- "loading": "Loading...",
|
|
|
- "success": "Notification settings saved and tasks rescheduled",
|
|
|
- "saveFailed": "Save failed",
|
|
|
- "saveError": "Failed to save settings",
|
|
|
- "loadError": "Failed to load notification settings",
|
|
|
- "webhookRequired": "Please fill in Webhook URL first",
|
|
|
- "testSuccess": "Test message sent, please check WeChat Work",
|
|
|
- "testFailed": "Test failed",
|
|
|
- "testFailedRetry": "Test failed, please retry",
|
|
|
- "testError": "Test connection failed",
|
|
|
- "testNoResult": "Test succeeded but no result returned"
|
|
|
- }
|
|
|
- },
|
|
|
- "errors": {
|
|
|
- "saveSuccess": "Save succeeded",
|
|
|
- "saveFailed": "Save failed",
|
|
|
- "saveFailed_error": "Failed to save settings",
|
|
|
- "addSuccess": "Add succeeded",
|
|
|
- "addFailed": "Failed to add provider",
|
|
|
- "editSuccess": "Update succeeded",
|
|
|
- "editFailed": "Failed to update provider",
|
|
|
- "deleteSuccess": "Delete succeeded",
|
|
|
- "deleteFailed": "Failed to delete provider",
|
|
|
- "syncSuccess": "Sync succeeded",
|
|
|
- "syncFailed": "Sync failed",
|
|
|
- "testFailed": "Test failed",
|
|
|
- "testFailedRetry": "Test failed, please retry",
|
|
|
- "loadFailed": "Failed to load notification settings",
|
|
|
- "unknownError": "An exception occurred during the operation"
|
|
|
}
|
|
|
}
|