From 4a7dbf2d4508c7c2da1f55d34ba5d4a2ebb9e885 Mon Sep 17 00:00:00 2001 From: LTbinglingfeng Date: Mon, 25 May 2026 23:14:03 +0800 Subject: [PATCH] chore(i18n): drop unused ai_providers namespace and providersPage orphans MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Remove the legacy ai_providers.* block (~268 keys per locale) — only nav.ai_providers under a different namespace is still referenced - Remove providersPage.{disconnected,error,actions.back, actions.openModelCatalog,ampcode.behaviorSection,detail.empty, status.notAvailable,modelCatalog.{loading,openAction,summaryCount, summaryError,summaryTitle}} which were never wired up after the ProvidersWorkbench rewrite --- src/i18n/locales/en.json | 293 +----------------------------------- src/i18n/locales/ru.json | 293 +----------------------------------- src/i18n/locales/zh-CN.json | 293 +----------------------------------- src/i18n/locales/zh-TW.json | 293 +----------------------------------- 4 files changed, 8 insertions(+), 1164 deletions(-) diff --git a/src/i18n/locales/en.json b/src/i18n/locales/en.json index 7bc3119..b0c1cba 100644 --- a/src/i18n/locales/en.json +++ b/src/i18n/locales/en.json @@ -192,275 +192,6 @@ "edit_modal_key_label": "API Key:", "delete_confirm": "Are you sure you want to delete this API key?" }, - "ai_providers": { - "title": "AI Providers Configuration", - "gemini_title": "Gemini API Keys", - "gemini_add_button": "Add Key", - "gemini_empty_title": "No Gemini Keys", - "gemini_empty_desc": "Click the button above to add the first key", - "gemini_item_title": "Gemini Key", - "gemini_add_modal_title": "Add Gemini API Key", - "gemini_add_modal_key_label": "API Keys:", - "gemini_add_modal_key_placeholder": "Enter Gemini API key", - "gemini_add_modal_key_hint": "Add keys one by one and optionally specify a Base URL.", - "gemini_keys_add_btn": "Add Key", - "gemini_base_url_label": "Base URL (Optional):", - "gemini_base_url_placeholder": "e.g.: https://generativelanguage.googleapis.com", - "gemini_add_modal_proxy_label": "Proxy URL (Optional):", - "gemini_add_modal_proxy_placeholder": "e.g.: socks5://proxy.example.com:1080", - "gemini_models_label": "Custom Models (Optional):", - "gemini_models_hint": "Leave empty to allow all models, or add name[, alias] entries to limit/alias them for this key.", - "gemini_models_add_btn": "Add Model", - "gemini_models_fetch_button": "Fetch via /v1beta/models", - "gemini_models_fetch_title": "Pick Models from Gemini /v1beta/models", - "gemini_models_fetch_hint": "Call GET /v1beta/models per the Gemini API. By default, it sends x-goog-api-key from the API Key field, merged with your custom headers.", - "gemini_models_fetch_url_label": "Request URL", - "gemini_models_fetch_refresh": "Refresh", - "gemini_models_fetch_loading": "Fetching models from Gemini /v1beta/models...", - "gemini_models_fetch_empty": "No models returned. Please check Base URL, API key, or headers.", - "gemini_models_fetch_error": "Failed to fetch Gemini models", - "gemini_models_fetch_apply": "Add selected models", - "model_discovery_select_visible": "Select current list", - "model_discovery_clear_selection": "Clear selection", - "model_discovery_selected_count": "{{count}} selected", - "gemini_models_search_label": "Search models", - "gemini_models_search_placeholder": "Filter by name, alias, or description", - "gemini_models_search_empty": "No models match your search. Try a different keyword.", - "gemini_models_fetch_added": "{{count}} new models added", - "gemini_models_count": "Models Count", - "gemini_edit_modal_title": "Edit Gemini API Key", - "gemini_edit_modal_key_label": "API Key:", - "gemini_delete_confirm": "Are you sure you want to delete this Gemini key?", - "excluded_models_label": "Excluded models (optional):", - "excluded_models_placeholder": "Comma or newline separated, e.g. gemini-1.5-pro, gemini-1.5-flash", - "excluded_models_hint": "Leave empty to allow all models; values are trimmed and deduplicated automatically.", - "excluded_models_count": "Excluding {{count}} models", - "prefix_label": "Prefix (Optional):", - "prefix_placeholder": "e.g.: team-a", - "prefix_hint": "When set, call models as prefix/ to target this entry.", - "priority_label": "Priority (Optional):", - "priority_hint": "Higher values are preferred. Leave empty for default (0).", - "config_toggle_label": "Enabled", - "config_disabled_badge": "Disabled", - "codex_title": "Codex API Configuration", - "codex_add_button": "Add Configuration", - "codex_empty_title": "No Codex Configuration", - "codex_empty_desc": "Click the button above to add the first configuration", - "codex_item_title": "Codex Configuration", - "codex_add_modal_title": "Add Codex API Configuration", - "codex_add_modal_key_label": "API Key:", - "codex_add_modal_key_placeholder": "Please enter Codex API key", - "codex_add_modal_url_label": "Base URL (Required):", - "codex_add_modal_url_placeholder": "e.g.: https://api.example.com", - "codex_add_modal_proxy_label": "Proxy URL (Optional):", - "codex_add_modal_proxy_placeholder": "e.g.: socks5://proxy.example.com:1080", - "codex_websockets_label": "Websockets", - "codex_websockets_hint": "Enable Responses API websocket transport for this key.", - "codex_models_label": "Custom Models (Optional):", - "codex_models_hint": "Leave empty to allow all models, or add name[, alias] entries to limit/alias them.", - "codex_models_add_btn": "Add Model", - "codex_models_fetch_button": "Fetch via /v1/models", - "codex_models_fetch_title": "Pick Models from /v1/models", - "codex_models_fetch_hint": "Call GET /v1/models using the Base URL above, sending the API key as Bearer (if provided) and merging your custom headers.", - "codex_models_fetch_url_label": "Request URL", - "codex_models_fetch_refresh": "Refresh", - "codex_models_fetch_loading": "Fetching models from /v1/models...", - "codex_models_fetch_empty": "No models returned. Please check Base URL, API key, or headers.", - "codex_models_fetch_error": "Failed to fetch models", - "codex_models_fetch_apply": "Add selected models", - "codex_models_search_label": "Search models", - "codex_models_search_placeholder": "Filter by name, alias, or description", - "codex_models_search_empty": "No models match your search. Try a different keyword.", - "codex_models_fetch_added": "{{count}} new models added", - "codex_models_count": "Models Count", - "codex_edit_modal_title": "Edit Codex API Configuration", - "codex_edit_modal_key_label": "API Key:", - "codex_edit_modal_url_label": "Base URL (Required):", - "codex_edit_modal_proxy_label": "Proxy URL (Optional):", - "codex_delete_confirm": "Are you sure you want to delete this Codex configuration?", - "claude_title": "Claude API Configuration", - "claude_add_button": "Add Configuration", - "claude_empty_title": "No Claude Configuration", - "claude_empty_desc": "Click the button above to add the first configuration", - "claude_item_title": "Claude Configuration", - "claude_add_modal_title": "Add Claude API Configuration", - "claude_add_modal_key_label": "API Key:", - "claude_add_modal_key_placeholder": "Please enter Claude API key", - "claude_add_modal_url_label": "Base URL (Optional):", - "claude_add_modal_url_placeholder": "e.g.: https://api.anthropic.com", - "claude_add_modal_proxy_label": "Proxy URL (Optional):", - "claude_add_modal_proxy_placeholder": "e.g.: socks5://proxy.example.com:1080", - "claude_edit_modal_title": "Edit Claude API Configuration", - "claude_edit_modal_key_label": "API Key:", - "claude_edit_modal_url_label": "Base URL (Optional):", - "claude_edit_modal_proxy_label": "Proxy URL (Optional):", - "claude_delete_confirm": "Are you sure you want to delete this Claude configuration?", - "claude_models_label": "Custom Models (Optional):", - "claude_models_hint": "Leave empty to allow all models, or add name[, alias] entries to limit/alias them.", - "claude_models_add_btn": "Add Model", - "claude_models_count": "Models Count", - "claude_models_fetch_button": "Fetch via /v1/models", - "claude_models_fetch_title": "Pick Models from Claude /v1/models", - "claude_models_fetch_hint": "Call GET /v1/models with Anthropic headers. By default, this sends x-api-key and anthropic-version: 2023-06-01, merged with your custom headers.", - "claude_models_fetch_url_label": "Request URL", - "claude_models_fetch_refresh": "Refresh", - "claude_models_fetch_loading": "Fetching models from Claude /v1/models...", - "claude_models_fetch_empty": "No models returned. Please check Base URL, API key, or headers.", - "claude_models_fetch_error": "Failed to fetch Claude models", - "claude_models_fetch_apply": "Add selected models", - "claude_models_search_label": "Search models", - "claude_models_search_placeholder": "Filter by name, alias, or description", - "claude_models_search_empty": "No models match your search. Try a different keyword.", - "claude_models_fetch_added": "{{count}} new models added", - "claude_test_title": "Connection Test", - "claude_test_hint": "Send a test request to /v1/messages using Anthropic headers to verify this configuration.", - "claude_test_select_placeholder": "Choose from current models", - "claude_test_select_empty": "No models configured. Add models first", - "claude_test_action": "Test", - "claude_test_running": "Sending Claude test request...", - "claude_test_timeout": "Test request timed out after {{seconds}} seconds.", - "claude_test_success": "Test succeeded. Claude model responded.", - "claude_test_failed": "Test failed", - "claude_test_key_required": "Please provide a Claude API key or set x-api-key in custom headers", - "claude_test_model_required": "Please select a model to test", - "claude_test_endpoint_invalid": "Unable to build a valid Claude /v1/messages endpoint", - "claude_cloak_title": "Request Cloaking (Optional):", - "claude_cloak_toggle_label": "Enable", - "claude_cloak_toggle_aria": "Toggle request cloaking", - "claude_cloak_hint": "Cloaking disguises requests to appear as coming from the official Claude Code CLI for non-Claude-Code clients.", - "claude_cloak_mode_label": "Mode:", - "claude_cloak_mode_hint": "auto: cloak only when client is not Claude Code; always: always cloak; never: never cloak.", - "claude_cloak_mode_auto": "Auto (non-Claude-Code only)", - "claude_cloak_mode_always": "Always", - "claude_cloak_mode_never": "Never", - "claude_cloak_strict_label": "Strict mode:", - "claude_cloak_strict_hint": "When enabled, strip user system messages and keep only the Claude Code prompt.", - "claude_cloak_sensitive_words_label": "Sensitive words (optional):", - "claude_cloak_sensitive_words_placeholder": "Comma or newline separated, e.g. internal-project", - "claude_cloak_sensitive_words_hint": "These words are obfuscated with zero-width characters.", - "claude_cloak_sensitive_words_count": "Sensitive words", - "vertex_title": "Vertex API Configuration", - "vertex_add_button": "Add Configuration", - "vertex_empty_title": "No Vertex Configuration", - "vertex_empty_desc": "Click the button above to add the first configuration", - "vertex_item_title": "Vertex Configuration", - "vertex_add_modal_title": "Add Vertex API Configuration", - "vertex_add_modal_key_label": "API Key:", - "vertex_add_modal_key_placeholder": "Please enter Vertex API key", - "vertex_add_modal_url_label": "Base URL:", - "vertex_add_modal_url_placeholder": "e.g.: https://example.com/api", - "vertex_add_modal_proxy_label": "Proxy URL (Optional):", - "vertex_add_modal_proxy_placeholder": "e.g.: socks5://proxy.example.com:1080", - "vertex_edit_modal_title": "Edit Vertex API Configuration", - "vertex_edit_modal_key_label": "API Key:", - "vertex_edit_modal_url_label": "Base URL:", - "vertex_edit_modal_proxy_label": "Proxy URL (Optional):", - "vertex_delete_confirm": "Are you sure you want to delete this Vertex configuration?", - "vertex_models_label": "Model aliases:", - "vertex_models_add_btn": "Add Mapping", - "vertex_models_count": "Alias count", - "ampcode_title": "Amp CLI Integration (ampcode)", - "ampcode_modal_title": "Configure Ampcode", - "ampcode_upstream_url_label": "Upstream URL", - "ampcode_upstream_url_placeholder": "e.g. https://ampcode.com", - "ampcode_upstream_url_hint": "Optional. Leave empty to use the default/auto-discovered control plane URL.", - "ampcode_upstream_api_key_label": "Upstream API Key (Amp Official)", - "ampcode_upstream_api_key_placeholder": "Enter sk-amp... (leave empty to keep current)", - "ampcode_upstream_api_key_hint": "Optional. Leaving it empty will not change the current Amp official key. Use the button below to clear it.", - "ampcode_upstream_api_key_current": "Current Amp official key: {{key}}", - "ampcode_clear_upstream_api_key": "Clear official key", - "ampcode_clear_upstream_api_key_confirm": "Are you sure you want to clear the Ampcode upstream API key (Amp official)?", - "ampcode_upstream_api_keys_label": "Multi-upstream API key routing", - "ampcode_upstream_api_keys_hint": "Bind different Amp upstream API keys to specific client API keys. Client keys can be separated by commas or new lines.", - "ampcode_upstream_api_keys_add_btn": "Add upstream mapping", - "ampcode_upstream_api_keys_upstream_placeholder": "Upstream API key (sk-amp-...)", - "ampcode_upstream_api_keys_clients_placeholder": "Client API keys, separated by commas or new lines", - "ampcode_upstream_api_keys_item_title": "Upstream mapping #{{index}}", - "ampcode_upstream_api_keys_count": "Upstream mappings", - "ampcode_force_model_mappings_label": "Force model mappings", - "ampcode_force_model_mappings_hint": "When enabled, mappings override local API-key availability checks.", - "ampcode_model_mappings_label": "Model mappings (from → to)", - "ampcode_model_mappings_hint": "Rewrites model names in Amp requests. Leave empty to disable mappings.", - "ampcode_model_mappings_add_btn": "Add mapping", - "ampcode_model_mappings_from_placeholder": "from model (source)", - "ampcode_model_mappings_to_placeholder": "to model (target)", - "ampcode_model_mappings_count": "Mappings Count", - "ampcode_lists_overwrite_title": "Overwrite list settings", - "ampcode_lists_overwrite_confirm": "Existing multi-upstream/model mapping lists could not be loaded. Continuing may overwrite or clear them. Continue?", - "ampcode_mappings_overwrite_confirm": "Existing mappings could not be loaded. Continuing may overwrite or clear them. Continue?", - "openai_title": "OpenAI Compatible Providers", - "openai_add_button": "Add Provider", - "openai_empty_title": "No OpenAI Compatible Providers", - "openai_empty_desc": "Click the button above to add the first provider", - "openai_filtered_empty_title": "No matching providers", - "openai_filtered_empty_desc": "No providers match the current model filter. Clear the filter and try again.", - "sort_by_name": "Sort by Name", - "sort_ascending": "Sort ascending", - "sort_asc_short": "Asc", - "sort_by_priority": "Sort by Priority", - "sort_by_recent_success": "Sort by Recent Success", - "sort_descending": "Sort descending", - "sort_desc_short": "Desc", - "openai_test_model": "Test Model", - "openai_add_modal_title": "Add OpenAI Compatible Provider", - "openai_add_modal_name_label": "Provider Name:", - "openai_add_modal_name_placeholder": "e.g.: openrouter", - "openai_add_modal_url_label": "Base URL:", - "openai_add_modal_url_placeholder": "e.g.: https://openrouter.ai/api/v1", - "openai_add_modal_keys_label": "API Keys", - "openai_edit_modal_keys_label": "API Keys", - "openai_keys_hint": "Add each key separately with an optional proxy URL to keep things organized.", - "openai_keys_add_btn": "Add Key", - "openai_key_placeholder": "sk-... key", - "openai_proxy_placeholder": "Optional proxy URL (e.g. socks5://...)", - "openai_add_modal_models_label": "Model List (name[, alias] one per line):", - "openai_models_hint": "Example: gpt-4o-mini or moonshotai/kimi-k2:free, kimi-k2", - "openai_model_name_placeholder": "Model name, e.g. moonshotai/kimi-k2:free", - "openai_model_alias_placeholder": "Model alias (optional)", - "openai_models_add_btn": "Add Model", - "openai_models_fetch_button": "Fetch via /models", - "openai_models_fetch_title": "Pick Models from /models", - "openai_models_fetch_hint": "Call the /models endpoint using the Base URL above, sending the first API key as Bearer plus custom headers.", - "openai_models_fetch_url_label": "Request URL", - "openai_models_fetch_refresh": "Refresh", - "openai_models_fetch_loading": "Fetching models from /models...", - "openai_models_fetch_empty": "No models returned. Please check the endpoint or auth.", - "openai_models_fetch_error": "Failed to fetch models", - "openai_models_fetch_back": "Back to edit", - "openai_models_fetch_apply": "Add selected models", - "openai_models_search_label": "Search models", - "openai_models_search_placeholder": "Filter by name, alias, or description", - "openai_models_search_empty": "No models match your search. Try a different keyword.", - "openai_models_fetch_invalid_url": "Please enter a valid Base URL first", - "openai_models_fetch_added": "{{count}} new models added", - "openai_edit_modal_title": "Edit OpenAI Compatible Provider", - "openai_edit_modal_name_label": "Provider Name:", - "openai_edit_modal_url_label": "Base URL:", - "openai_edit_modal_models_label": "Model List (name[, alias] one per line):", - "openai_delete_confirm": "Are you sure you want to delete this OpenAI provider?", - "openai_keys_count": "Keys Count", - "openai_models_count": "Models Count", - "openai_test_title": "Connection Test", - "openai_test_hint": "Send a /chat/completions request with the current settings to verify availability.", - "openai_test_model_placeholder": "Model to test", - "openai_test_action": "Run Test", - "openai_test_running": "Sending test request...", - "openai_test_timeout": "Test request timed out after {{seconds}} seconds.", - "openai_test_success": "Test succeeded. The model responded.", - "openai_test_failed": "Test failed", - "openai_test_select_placeholder": "Choose from current models", - "openai_test_select_empty": "No models configured. Add models first", - "openai_test_single_action": "Test", - "openai_test_all_action": "Test All Keys", - "openai_test_all_hint": "Test connection status for all keys", - "openai_test_all_success": "All {{count}} keys passed the test", - "openai_test_all_failed": "All {{count}} keys failed the test", - "openai_test_all_partial": "Test completed: {{success}} passed, {{failed}} failed", - "model_search_placeholder": "Filter by models...", - "model_search_clear": "Clear", - "model_select_all": "Select All", - "model_filter_empty": "No models to filter" - }, "auth_files": { "title": "Auth Files Management", "title_section": "Auth Files", @@ -1468,10 +1199,8 @@ "cancel": "Cancel", "save": "Save", "create": "Create", - "back": "Back", "enable": "Enable", - "disable": "Disable", - "openModelCatalog": "Open model catalog" + "disable": "Disable" }, "categories": { "title": "Providers", @@ -1513,13 +1242,11 @@ "disabled": "Disabled", "notSet": "Not set", "none": "None", - "notAvailable": "N/A", "notConfigured": "Not configured", "defaultSuffix": "(default)" }, "detail": { "title": "Details", - "empty": "Select a resource to view details", "metadataTitle": "Metadata", "fields": { "identifier": "Identifier", @@ -1585,7 +1312,6 @@ "addMapping": "Add key mapping", "modelMappingsSection": "Model mappings", "addModelMapping": "Add model mapping", - "behaviorSection": "Behavior", "forceModelMappings": "Force model mappings", "forceModelMappingsHint": "Requests that don't match a mapping are rejected" }, @@ -1652,22 +1378,7 @@ } }, "modelCatalog": { - "summaryTitle": "Model catalog", - "openAction": "Open catalog", - "notLoaded": "Not loaded", - "loading": "Loading", - "summaryCount": "{{count}} models", - "summaryError": "Failed to load" - }, - "disconnected": { - "title": "Not connected", - "description": "Connect to the proxy service from the login page before managing providers.", - "action": "Go to connection" - }, - "error": { - "title": "Failed to load", - "description": "Could not fetch provider config. Please try again.", - "retry": "Retry" + "notLoaded": "Not loaded" } } } diff --git a/src/i18n/locales/ru.json b/src/i18n/locales/ru.json index 5d40d62..a53a3b0 100644 --- a/src/i18n/locales/ru.json +++ b/src/i18n/locales/ru.json @@ -192,275 +192,6 @@ "edit_modal_key_label": "API-ключ:", "delete_confirm": "Удалить этот API-ключ?" }, - "ai_providers": { - "title": "Конфигурация AI-провайдеров", - "gemini_title": "API-ключи Gemini", - "gemini_add_button": "Добавить ключ", - "gemini_empty_title": "Ключи Gemini отсутствуют", - "gemini_empty_desc": "Нажмите кнопку выше, чтобы добавить первый ключ", - "gemini_item_title": "Ключ Gemini", - "gemini_add_modal_title": "Добавление API-ключа Gemini", - "gemini_add_modal_key_label": "API-ключи:", - "gemini_add_modal_key_placeholder": "Введите API-ключ Gemini", - "gemini_add_modal_key_hint": "Добавляйте ключи по одному и при необходимости указывайте базовый URL.", - "gemini_keys_add_btn": "Добавить ключ", - "gemini_base_url_label": "Базовый URL (необязательно):", - "gemini_base_url_placeholder": "например: https://generativelanguage.googleapis.com", - "gemini_add_modal_proxy_label": "URL прокси (необязательно):", - "gemini_add_modal_proxy_placeholder": "например: socks5://proxy.example.com:1080", - "gemini_models_label": "Пользовательские модели (необязательно):", - "gemini_models_hint": "Оставьте пустым, чтобы разрешить все модели, или добавьте записи name[, alias], чтобы ограничить/переименовать их для этого ключа.", - "gemini_models_add_btn": "Добавить модель", - "gemini_models_fetch_button": "Получить через /v1beta/models", - "gemini_models_fetch_title": "Выбор моделей из Gemini /v1beta/models", - "gemini_models_fetch_hint": "Вызывает GET /v1beta/models по спецификации Gemini API. По умолчанию отправляется x-goog-api-key из поля API-ключа, объединённый с вашими пользовательскими заголовками.", - "gemini_models_fetch_url_label": "URL запроса", - "gemini_models_fetch_refresh": "Обновить", - "gemini_models_fetch_loading": "Получение моделей из Gemini /v1beta/models...", - "gemini_models_fetch_empty": "Модели не получены. Проверьте Base URL, API-ключ или заголовки.", - "gemini_models_fetch_error": "Не удалось получить модели Gemini", - "gemini_models_fetch_apply": "Добавить выбранные модели", - "model_discovery_select_visible": "Выбрать текущий список", - "model_discovery_clear_selection": "Очистить выбор", - "model_discovery_selected_count": "Выбрано: {{count}}", - "gemini_models_search_label": "Поиск моделей", - "gemini_models_search_placeholder": "Фильтр по имени, псевдониму или описанию", - "gemini_models_search_empty": "Нет подходящих моделей. Попробуйте другой запрос.", - "gemini_models_fetch_added": "Добавлено новых моделей: {{count}}", - "gemini_models_count": "Количество моделей", - "gemini_edit_modal_title": "Редактирование API-ключа Gemini", - "gemini_edit_modal_key_label": "API-ключ:", - "gemini_delete_confirm": "Удалить этот ключ Gemini?", - "excluded_models_label": "Исключённые модели (необязательно):", - "excluded_models_placeholder": "Через запятую или с новой строки, например gemini-1.5-pro, gemini-1.5-flash", - "excluded_models_hint": "Оставьте пустым, чтобы разрешить все модели; значения автоматически обрезаются и дедуплицируются.", - "excluded_models_count": "Исключено моделей: {{count}}", - "prefix_label": "Префикс (необязательно):", - "prefix_placeholder": "например: team-a", - "prefix_hint": "Если задано, обращайтесь к моделям как prefix/, чтобы выбрать эту запись.", - "priority_label": "Приоритет (необязательно):", - "priority_hint": "Чем больше значение, тем выше приоритет. Оставьте пустым для значения по умолчанию (0).", - "config_toggle_label": "Включено", - "config_disabled_badge": "Отключено", - "codex_title": "Конфигурация Codex API", - "codex_add_button": "Добавить конфигурацию", - "codex_empty_title": "Конфигурации Codex отсутствуют", - "codex_empty_desc": "Нажмите кнопку выше, чтобы добавить первую конфигурацию", - "codex_item_title": "Конфигурация Codex", - "codex_add_modal_title": "Добавление конфигурации Codex API", - "codex_add_modal_key_label": "API-ключ:", - "codex_add_modal_key_placeholder": "Введите API-ключ Codex", - "codex_add_modal_url_label": "Базовый URL (обязательно):", - "codex_add_modal_url_placeholder": "например: https://api.example.com", - "codex_add_modal_proxy_label": "URL прокси (необязательно):", - "codex_add_modal_proxy_placeholder": "например: socks5://proxy.example.com:1080", - "codex_websockets_label": "Websockets", - "codex_websockets_hint": "Включает websocket-транспорт Responses API для этого ключа.", - "codex_models_label": "Пользовательские модели (необязательно):", - "codex_models_hint": "Оставьте пустым, чтобы разрешить все модели, или добавьте записи name[, alias], чтобы ограничить/переименовать их.", - "codex_models_add_btn": "Добавить модель", - "codex_models_fetch_button": "Получить через /v1/models", - "codex_models_fetch_title": "Выбор моделей из Codex /v1/models", - "codex_models_fetch_hint": "Вызывает GET /v1/models по спецификации OpenAI. По умолчанию отправляет API-ключ как Bearer (если указан) и объединяет его с пользовательскими заголовками.", - "codex_models_fetch_url_label": "URL запроса", - "codex_models_fetch_refresh": "Обновить", - "codex_models_fetch_loading": "Получение моделей из /v1/models...", - "codex_models_fetch_empty": "Модели не получены. Проверьте Base URL, API-ключ или заголовки.", - "codex_models_fetch_error": "Не удалось получить модели", - "codex_models_fetch_apply": "Добавить выбранные модели", - "codex_models_search_label": "Поиск моделей", - "codex_models_search_placeholder": "Фильтр по имени, псевдониму или описанию", - "codex_models_search_empty": "Модели по запросу не найдены. Попробуйте другой запрос.", - "codex_models_fetch_added": "Добавлено новых моделей: {{count}}", - "codex_models_count": "Количество моделей", - "codex_edit_modal_title": "Редактирование конфигурации Codex API", - "codex_edit_modal_key_label": "API-ключ:", - "codex_edit_modal_url_label": "Базовый URL (обязательно):", - "codex_edit_modal_proxy_label": "URL прокси (необязательно):", - "codex_delete_confirm": "Удалить эту конфигурацию Codex?", - "claude_title": "Конфигурация Claude API", - "claude_add_button": "Добавить конфигурацию", - "claude_empty_title": "Конфигурации Claude отсутствуют", - "claude_empty_desc": "Нажмите кнопку выше, чтобы добавить первую конфигурацию", - "claude_item_title": "Конфигурация Claude", - "claude_add_modal_title": "Добавление конфигурации Claude API", - "claude_add_modal_key_label": "API-ключ:", - "claude_add_modal_key_placeholder": "Введите API-ключ Claude", - "claude_add_modal_url_label": "Базовый URL (необязательно):", - "claude_add_modal_url_placeholder": "например: https://api.anthropic.com", - "claude_add_modal_proxy_label": "URL прокси (необязательно):", - "claude_add_modal_proxy_placeholder": "например: socks5://proxy.example.com:1080", - "claude_edit_modal_title": "Редактирование конфигурации Claude API", - "claude_edit_modal_key_label": "API-ключ:", - "claude_edit_modal_url_label": "Базовый URL (необязательно):", - "claude_edit_modal_proxy_label": "URL прокси (необязательно):", - "claude_delete_confirm": "Удалить эту конфигурацию Claude?", - "claude_models_label": "Пользовательские модели (необязательно):", - "claude_models_hint": "Оставьте пустым, чтобы разрешить все модели, или добавьте записи name[, alias], чтобы ограничить/переименовать их.", - "claude_models_add_btn": "Добавить модель", - "claude_models_count": "Количество моделей", - "claude_models_fetch_button": "Получить через /v1/models", - "claude_models_fetch_title": "Выбор моделей из Claude /v1/models", - "claude_models_fetch_hint": "Вызывает GET /v1/models по спецификации Anthropic. По умолчанию отправляются x-api-key и anthropic-version: 2023-06-01, объединённые с вашими пользовательскими заголовками.", - "claude_models_fetch_url_label": "URL запроса", - "claude_models_fetch_refresh": "Обновить", - "claude_models_fetch_loading": "Получение моделей из Claude /v1/models...", - "claude_models_fetch_empty": "Модели не вернулись. Проверьте Base URL, API-ключ или заголовки.", - "claude_models_fetch_error": "Не удалось получить модели Claude", - "claude_models_fetch_apply": "Добавить выбранные модели", - "claude_models_search_label": "Поиск моделей", - "claude_models_search_placeholder": "Фильтр по имени, псевдониму или описанию", - "claude_models_search_empty": "Модели по запросу не найдены. Попробуйте другой ключ.", - "claude_models_fetch_added": "Добавлено новых моделей: {{count}}", - "claude_test_title": "Тест подключения", - "claude_test_hint": "Отправляет тестовый запрос в /v1/messages по спецификации Anthropic, чтобы проверить текущую конфигурацию.", - "claude_test_select_placeholder": "Выберите из текущих моделей", - "claude_test_select_empty": "Модели не настроены. Сначала добавьте модели", - "claude_test_action": "Тест", - "claude_test_running": "Отправка тестового запроса Claude...", - "claude_test_timeout": "Тестовый запрос превысил тайм-аут {{seconds}} с", - "claude_test_success": "Тест выполнен успешно. Модель Claude ответила.", - "claude_test_failed": "Тест не выполнен", - "claude_test_key_required": "Укажите Claude API-ключ или задайте x-api-key в пользовательских заголовках", - "claude_test_model_required": "Выберите модель для теста", - "claude_test_endpoint_invalid": "Не удалось сформировать корректный endpoint Claude /v1/messages", - "claude_cloak_title": "Маскировка запросов (необязательно):", - "claude_cloak_toggle_label": "Включить", - "claude_cloak_toggle_aria": "Переключить маскировку запросов", - "claude_cloak_hint": "Маскировка делает запросы похожими на запросы официального CLI Claude Code для клиентов, которые не являются Claude Code.", - "claude_cloak_mode_label": "Режим:", - "claude_cloak_mode_hint": "auto: маскировать только если клиент не Claude Code; always: всегда; never: никогда.", - "claude_cloak_mode_auto": "Auto (только не-Claude Code)", - "claude_cloak_mode_always": "Всегда", - "claude_cloak_mode_never": "Никогда", - "claude_cloak_strict_label": "Строгий режим:", - "claude_cloak_strict_hint": "Если включено, пользовательские system-сообщения удаляются, остаётся только промпт Claude Code.", - "claude_cloak_sensitive_words_label": "Чувствительные слова (необязательно):", - "claude_cloak_sensitive_words_placeholder": "Через запятую или с новой строки, например internal-project", - "claude_cloak_sensitive_words_hint": "Эти слова будут обфусцированы с помощью символов нулевой ширины.", - "claude_cloak_sensitive_words_count": "Чувствительные слова", - "vertex_title": "Конфигурация Vertex API", - "vertex_add_button": "Добавить конфигурацию", - "vertex_empty_title": "Конфигурации Vertex отсутствуют", - "vertex_empty_desc": "Нажмите кнопку выше, чтобы добавить первую конфигурацию", - "vertex_item_title": "Конфигурация Vertex", - "vertex_add_modal_title": "Добавление конфигурации Vertex API", - "vertex_add_modal_key_label": "API-ключ:", - "vertex_add_modal_key_placeholder": "Введите API-ключ Vertex", - "vertex_add_modal_url_label": "Базовый URL:", - "vertex_add_modal_url_placeholder": "например: https://example.com/api", - "vertex_add_modal_proxy_label": "URL прокси (необязательно):", - "vertex_add_modal_proxy_placeholder": "например: socks5://proxy.example.com:1080", - "vertex_edit_modal_title": "Редактирование конфигурации Vertex API", - "vertex_edit_modal_key_label": "API-ключ:", - "vertex_edit_modal_url_label": "Базовый URL:", - "vertex_edit_modal_proxy_label": "URL прокси (необязательно):", - "vertex_delete_confirm": "Удалить эту конфигурацию Vertex?", - "vertex_models_label": "Псевдонимы моделей:", - "vertex_models_add_btn": "Добавить сопоставление", - "vertex_models_count": "Количество псевдонимов", - "ampcode_title": "Интеграция Amp CLI (ampcode)", - "ampcode_modal_title": "Настройка Ampcode", - "ampcode_upstream_url_label": "Upstream URL", - "ampcode_upstream_url_placeholder": "например: https://ampcode.com", - "ampcode_upstream_url_hint": "Необязательно. Оставьте пустым, чтобы использовать URL плоскости управления по умолчанию/обнаруженный автоматически.", - "ampcode_upstream_api_key_label": "Upstream API-ключ (официальный Amp)", - "ampcode_upstream_api_key_placeholder": "Введите sk-amp... (оставьте пустым, чтобы сохранить текущий)", - "ampcode_upstream_api_key_hint": "Необязательно. Пустое значение не изменит текущий официальный ключ Amp. Используйте кнопку ниже, чтобы очистить его.", - "ampcode_upstream_api_key_current": "Текущий официальный ключ Amp: {{key}}", - "ampcode_clear_upstream_api_key": "Очистить официальный ключ", - "ampcode_clear_upstream_api_key_confirm": "Очистить upstream API-ключ Ampcode (официальный Amp)?", - "ampcode_upstream_api_keys_label": "Маршрутизация нескольких upstream API-ключей", - "ampcode_upstream_api_keys_hint": "Привяжите разные upstream API-ключи Amp к указанным клиентским API-ключам. Клиентские ключи можно разделять запятыми или переводами строки.", - "ampcode_upstream_api_keys_add_btn": "Добавить upstream-сопоставление", - "ampcode_upstream_api_keys_upstream_placeholder": "Upstream API-ключ (sk-amp-...)", - "ampcode_upstream_api_keys_clients_placeholder": "Клиентские API-ключи, через запятую или с новой строки", - "ampcode_upstream_api_keys_item_title": "Upstream-сопоставление #{{index}}", - "ampcode_upstream_api_keys_count": "Количество upstream-сопоставлений", - "ampcode_force_model_mappings_label": "Принудительно применять сопоставления моделей", - "ampcode_force_model_mappings_hint": "При включении сопоставления переопределяют локальные проверки доступности API-ключей.", - "ampcode_model_mappings_label": "Сопоставления моделей (из → в)", - "ampcode_model_mappings_hint": "Переименовывает модели в запросах Amp. Оставьте пустым, чтобы отключить сопоставления.", - "ampcode_model_mappings_add_btn": "Добавить сопоставление", - "ampcode_model_mappings_from_placeholder": "исходная модель", - "ampcode_model_mappings_to_placeholder": "целевая модель", - "ampcode_model_mappings_count": "Количество сопоставлений", - "ampcode_lists_overwrite_title": "Перезаписать списки", - "ampcode_lists_overwrite_confirm": "Существующие списки multi-upstream/сопоставлений моделей не удалось загрузить. Продолжение может перезаписать или очистить их. Продолжить?", - "ampcode_mappings_overwrite_confirm": "Не удалось загрузить существующие сопоставления. Продолжение может перезаписать или очистить их. Продолжить?", - "openai_title": "Совместимые с OpenAI провайдеры", - "openai_add_button": "Добавить провайдера", - "openai_empty_title": "Провайдеры OpenAI отсутствуют", - "openai_empty_desc": "Нажмите кнопку выше, чтобы добавить первого провайдера", - "openai_filtered_empty_title": "Нет подходящих провайдеров", - "openai_filtered_empty_desc": "Ни один провайдер не соответствует текущему фильтру моделей. Очистите фильтр и попробуйте снова.", - "sort_by_name": "Сортировать по имени", - "sort_ascending": "Сортировать по возрастанию", - "sort_asc_short": "Возр.", - "sort_by_priority": "Сортировать по приоритету", - "sort_by_recent_success": "Сортировать по недавним успехам", - "sort_descending": "Сортировать по убыванию", - "sort_desc_short": "Убыв.", - "openai_test_model": "Тестовая модель", - "openai_add_modal_title": "Добавление совместимого с OpenAI провайдера", - "openai_add_modal_name_label": "Имя провайдера:", - "openai_add_modal_name_placeholder": "например: openrouter", - "openai_add_modal_url_label": "Базовый URL:", - "openai_add_modal_url_placeholder": "например: https://openrouter.ai/api/v1", - "openai_add_modal_keys_label": "API-ключи", - "openai_edit_modal_keys_label": "API-ключи", - "openai_keys_hint": "Добавляйте каждый ключ отдельно с необязательным URL прокси для удобства.", - "openai_keys_add_btn": "Добавить ключ", - "openai_key_placeholder": "ключ вида sk-...", - "openai_proxy_placeholder": "Необязательный URL прокси (например, socks5://...)", - "openai_add_modal_models_label": "Список моделей (name[, alias] по строкам):", - "openai_models_hint": "Пример: gpt-4o-mini или moonshotai/kimi-k2:free, kimi-k2", - "openai_model_name_placeholder": "Имя модели, например moonshotai/kimi-k2:free", - "openai_model_alias_placeholder": "Псевдоним модели (необязательно)", - "openai_models_add_btn": "Добавить модель", - "openai_models_fetch_button": "Получить через /models", - "openai_models_fetch_title": "Выбор моделей из /models", - "openai_models_fetch_hint": "Вызовите эндпоинт /models, используя указанный выше базовый URL, отправив первый API-ключ как Bearer с дополнительными заголовками.", - "openai_models_fetch_url_label": "URL запроса", - "openai_models_fetch_refresh": "Обновить", - "openai_models_fetch_loading": "Получение моделей из /models...", - "openai_models_fetch_empty": "Модели не вернулись. Проверьте эндпоинт или авторизацию.", - "openai_models_fetch_error": "Не удалось получить модели", - "openai_models_fetch_back": "Вернуться к редактированию", - "openai_models_fetch_apply": "Добавить выбранные модели", - "openai_models_search_label": "Поиск моделей", - "openai_models_search_placeholder": "Фильтр по имени, псевдониму или описанию", - "openai_models_search_empty": "Модели по запросу не найдены. Попробуйте другой ключ.", - "openai_models_fetch_invalid_url": "Сначала введите корректный базовый URL", - "openai_models_fetch_added": "Добавлено новых моделей: {{count}}", - "openai_edit_modal_title": "Редактирование совместимого с OpenAI провайдера", - "openai_edit_modal_name_label": "Имя провайдера:", - "openai_edit_modal_url_label": "Базовый URL:", - "openai_edit_modal_models_label": "Список моделей (name[, alias] по строкам):", - "openai_delete_confirm": "Удалить этого провайдера OpenAI?", - "openai_keys_count": "Количество ключей", - "openai_models_count": "Количество моделей", - "openai_test_title": "Тест подключения", - "openai_test_hint": "Отправьте запрос /chat/completions с текущими настройками, чтобы проверить доступность.", - "openai_test_model_placeholder": "Модель для теста", - "openai_test_action": "Запустить тест", - "openai_test_running": "Отправка тестового запроса...", - "openai_test_timeout": "Тестовый запрос превысил тайм-аут {{seconds}} с", - "openai_test_success": "Тест выполнен успешно. Модель ответила.", - "openai_test_failed": "Тест не выполнен", - "openai_test_select_placeholder": "Выберите из текущих моделей", - "openai_test_select_empty": "Модели не настроены. Сначала добавьте модели", - "openai_test_single_action": "Тест", - "openai_test_all_action": "Тестировать все ключи", - "openai_test_all_hint": "Проверить состояние подключения для всех ключей", - "openai_test_all_success": "Все {{count}} ключей прошли тест", - "openai_test_all_failed": "Все {{count}} ключей не прошли тест", - "openai_test_all_partial": "Тест завершен: {{success}} прошло, {{failed}} не прошло", - "model_search_placeholder": "Фильтр по моделям...", - "model_search_clear": "Очистить", - "model_select_all": "Выбрать все", - "model_filter_empty": "Нет моделей для фильтра" - }, "auth_files": { "title": "Управление файлами авторизации", "title_section": "Файлы авторизации", @@ -1465,10 +1196,8 @@ "cancel": "Отмена", "save": "Сохранить", "create": "Создать", - "back": "Назад", "enable": "Включить", - "disable": "Отключить", - "openModelCatalog": "Каталог моделей" + "disable": "Отключить" }, "categories": { "title": "Провайдеры", @@ -1510,13 +1239,11 @@ "disabled": "Отключён", "notSet": "Не задано", "none": "Нет", - "notAvailable": "N/A", "notConfigured": "Не настроено", "defaultSuffix": "(по умолчанию)" }, "detail": { "title": "Подробности", - "empty": "Выберите ресурс для просмотра", "metadataTitle": "Метаданные", "fields": { "identifier": "Идентификатор", @@ -1582,7 +1309,6 @@ "addMapping": "Добавить сопоставление", "modelMappingsSection": "Сопоставление моделей", "addModelMapping": "Добавить сопоставление", - "behaviorSection": "Поведение", "forceModelMappings": "Принудительное сопоставление", "forceModelMappingsHint": "Запросы без совпадений отклоняются" }, @@ -1649,22 +1375,7 @@ } }, "modelCatalog": { - "summaryTitle": "Каталог моделей", - "openAction": "Открыть", - "notLoaded": "Не загружено", - "loading": "Загрузка", - "summaryCount": "{{count}} моделей", - "summaryError": "Ошибка загрузки" - }, - "disconnected": { - "title": "Нет подключения", - "description": "Сначала подключитесь к прокси на странице входа.", - "action": "Подключиться" - }, - "error": { - "title": "Ошибка загрузки", - "description": "Не удалось получить настройки провайдеров. Попробуйте позже.", - "retry": "Повторить" + "notLoaded": "Не загружено" } } } diff --git a/src/i18n/locales/zh-CN.json b/src/i18n/locales/zh-CN.json index ec95ca0..ff90974 100644 --- a/src/i18n/locales/zh-CN.json +++ b/src/i18n/locales/zh-CN.json @@ -192,275 +192,6 @@ "edit_modal_key_label": "API密钥:", "delete_confirm": "确定要删除这个API密钥吗?" }, - "ai_providers": { - "title": "AI 提供商配置", - "gemini_title": "Gemini API 密钥", - "gemini_add_button": "添加密钥", - "gemini_empty_title": "暂无Gemini密钥", - "gemini_empty_desc": "点击上方按钮添加第一个密钥", - "gemini_item_title": "Gemini密钥", - "gemini_add_modal_title": "添加Gemini API密钥", - "gemini_add_modal_key_label": "API密钥", - "gemini_add_modal_key_placeholder": "输入 Gemini API 密钥", - "gemini_add_modal_key_hint": "逐条输入密钥,可同时指定可选 Base URL。", - "gemini_keys_add_btn": "添加密钥", - "gemini_base_url_label": "Base URL (可选)", - "gemini_base_url_placeholder": "例如: https://generativelanguage.googleapis.com", - "gemini_add_modal_proxy_label": "代理 URL (可选):", - "gemini_add_modal_proxy_placeholder": "例如: socks5://proxy.example.com:1080", - "gemini_models_label": "自定义模型 (可选):", - "gemini_models_hint": "为空表示使用全部模型;可填写 name[, alias] 以限制或重命名模型。", - "gemini_models_add_btn": "添加模型", - "gemini_models_fetch_button": "从 /v1beta/models 获取", - "gemini_models_fetch_title": "从 Gemini /v1beta/models 选择模型", - "gemini_models_fetch_hint": "按 Gemini API 规范请求 GET /v1beta/models;默认附带 x-goog-api-key(来自 API Key 字段)并合并你配置的自定义请求头。", - "gemini_models_fetch_url_label": "请求地址", - "gemini_models_fetch_refresh": "重新获取", - "gemini_models_fetch_loading": "正在从 Gemini /v1beta/models 获取模型列表...", - "gemini_models_fetch_empty": "未获取到模型,请检查 Base URL、API Key 或请求头。", - "gemini_models_fetch_error": "获取 Gemini 模型失败", - "gemini_models_fetch_apply": "添加所选模型", - "model_discovery_select_visible": "全选当前列表", - "model_discovery_clear_selection": "清空已选", - "model_discovery_selected_count": "已选 {{count}} 项", - "gemini_models_search_label": "搜索模型", - "gemini_models_search_placeholder": "按名称、别名或描述筛选", - "gemini_models_search_empty": "没有匹配的模型,请更换关键字试试。", - "gemini_models_fetch_added": "已添加 {{count}} 个新模型", - "gemini_models_count": "模型数量", - "gemini_edit_modal_title": "编辑Gemini API密钥", - "gemini_edit_modal_key_label": "API密钥:", - "gemini_delete_confirm": "确定要删除这个Gemini密钥吗?", - "excluded_models_label": "排除的模型 (可选):", - "excluded_models_placeholder": "用逗号或换行分隔,例如: gemini-1.5-pro, gemini-1.5-flash", - "excluded_models_hint": "留空表示不过滤;保存时会自动去重并忽略空白。", - "excluded_models_count": "排除 {{count}} 个模型", - "prefix_label": "前缀 (可选):", - "prefix_placeholder": "例如: team-a", - "prefix_hint": "设置后可用 prefix/ 选择该条目。", - "priority_label": "优先级 (可选):", - "priority_hint": "数值越大优先级越高;留空表示默认(0)。", - "config_toggle_label": "启用", - "config_disabled_badge": "已停用", - "codex_title": "Codex API 配置", - "codex_add_button": "添加配置", - "codex_empty_title": "暂无Codex配置", - "codex_empty_desc": "点击上方按钮添加第一个配置", - "codex_item_title": "Codex配置", - "codex_add_modal_title": "添加Codex API配置", - "codex_add_modal_key_label": "API密钥:", - "codex_add_modal_key_placeholder": "请输入Codex API密钥", - "codex_add_modal_url_label": "Base URL (必填):", - "codex_add_modal_url_placeholder": "例如: https://api.example.com", - "codex_add_modal_proxy_label": "代理 URL (可选):", - "codex_add_modal_proxy_placeholder": "例如: socks5://proxy.example.com:1080", - "codex_websockets_label": "Websockets", - "codex_websockets_hint": "开启 Responses API 的 websocket 传输。", - "codex_models_label": "自定义模型 (可选):", - "codex_models_hint": "为空表示使用全部模型;可填写 name[, alias] 以限制或重命名模型。", - "codex_models_add_btn": "添加模型", - "codex_models_fetch_button": "从 /v1/models 获取", - "codex_models_fetch_title": "从 /v1/models 选择模型", - "codex_models_fetch_hint": "使用上方 Base URL 调用 /v1/models 端点,附带 API Key(Bearer)与自定义请求头。", - "codex_models_fetch_url_label": "请求地址", - "codex_models_fetch_refresh": "重新获取", - "codex_models_fetch_loading": "正在从 /v1/models 获取模型列表...", - "codex_models_fetch_empty": "未获取到模型,请检查端点或鉴权信息。", - "codex_models_fetch_error": "获取模型失败", - "codex_models_fetch_apply": "添加所选模型", - "codex_models_search_label": "搜索模型", - "codex_models_search_placeholder": "按名称、别名或描述筛选", - "codex_models_search_empty": "没有匹配的模型,请更换关键字试试。", - "codex_models_fetch_added": "已添加 {{count}} 个新模型", - "codex_models_count": "模型数量", - "codex_edit_modal_title": "编辑Codex API配置", - "codex_edit_modal_key_label": "API密钥:", - "codex_edit_modal_url_label": "Base URL (必填):", - "codex_edit_modal_proxy_label": "代理 URL (可选):", - "codex_delete_confirm": "确定要删除这个Codex配置吗?", - "claude_title": "Claude API 配置", - "claude_add_button": "添加配置", - "claude_empty_title": "暂无Claude配置", - "claude_empty_desc": "点击上方按钮添加第一个配置", - "claude_item_title": "Claude配置", - "claude_add_modal_title": "添加Claude API配置", - "claude_add_modal_key_label": "API密钥:", - "claude_add_modal_key_placeholder": "请输入Claude API密钥", - "claude_add_modal_url_label": "Base URL (可选):", - "claude_add_modal_url_placeholder": "例如: https://api.anthropic.com", - "claude_add_modal_proxy_label": "代理 URL (可选):", - "claude_add_modal_proxy_placeholder": "例如: socks5://proxy.example.com:1080", - "claude_edit_modal_title": "编辑Claude API配置", - "claude_edit_modal_key_label": "API密钥:", - "claude_edit_modal_url_label": "Base URL (可选):", - "claude_edit_modal_proxy_label": "代理 URL (可选):", - "claude_delete_confirm": "确定要删除这个Claude配置吗?", - "claude_models_label": "自定义模型 (可选):", - "claude_models_hint": "为空表示使用全部模型;可填写 name[, alias] 以限制或重命名模型。", - "claude_models_add_btn": "添加模型", - "claude_models_count": "模型数量", - "claude_models_fetch_button": "从 /v1/models 获取", - "claude_models_fetch_title": "从 Claude /v1/models 选择模型", - "claude_models_fetch_hint": "按 Anthropic 规范请求 GET /v1/models,默认附带 x-api-key 与 anthropic-version: 2023-06-01;也会合并你配置的自定义请求头。", - "claude_models_fetch_url_label": "请求地址", - "claude_models_fetch_refresh": "重新获取", - "claude_models_fetch_loading": "正在从 Claude /v1/models 获取模型列表...", - "claude_models_fetch_empty": "未获取到模型,请检查 Base URL、API Key 或请求头。", - "claude_models_fetch_error": "获取 Claude 模型失败", - "claude_models_fetch_apply": "添加所选模型", - "claude_models_search_label": "搜索模型", - "claude_models_search_placeholder": "按名称、别名或描述筛选", - "claude_models_search_empty": "没有匹配的模型,请更换关键字试试。", - "claude_models_fetch_added": "已添加 {{count}} 个新模型", - "claude_test_title": "连通性测试", - "claude_test_hint": "按 Anthropic 规范向 /v1/messages 发送测试请求,验证当前配置是否可用。", - "claude_test_select_placeholder": "从当前模型列表选择", - "claude_test_select_empty": "当前未配置模型,请先添加模型", - "claude_test_action": "测试", - "claude_test_running": "正在发送 Claude 测试请求...", - "claude_test_timeout": "测试请求超时({{seconds}}秒)。", - "claude_test_success": "测试成功,Claude 模型可用。", - "claude_test_failed": "测试失败", - "claude_test_key_required": "请先填写 Claude API Key 或在自定义请求头中设置 x-api-key", - "claude_test_model_required": "请选择要测试的模型", - "claude_test_endpoint_invalid": "无法构造有效的 Claude /v1/messages 请求地址", - "claude_cloak_title": "请求伪装 (可选):", - "claude_cloak_toggle_label": "启用", - "claude_cloak_toggle_aria": "切换请求伪装", - "claude_cloak_hint": "对非 Claude Code 客户端,将请求伪装成 Claude Code CLI 的格式。", - "claude_cloak_mode_label": "模式:", - "claude_cloak_mode_hint": "auto: 仅对非 Claude Code 客户端伪装;always: 总是伪装;never: 从不伪装。", - "claude_cloak_mode_auto": "自动(仅非 Claude Code)", - "claude_cloak_mode_always": "总是", - "claude_cloak_mode_never": "从不", - "claude_cloak_strict_label": "严格模式:", - "claude_cloak_strict_hint": "启用后会移除用户 system 消息,仅保留 Claude Code 提示词。", - "claude_cloak_sensitive_words_label": "敏感词 (可选):", - "claude_cloak_sensitive_words_placeholder": "用逗号或换行分隔,例如: internal-project", - "claude_cloak_sensitive_words_hint": "这些词会被插入零宽字符进行混淆。", - "claude_cloak_sensitive_words_count": "敏感词", - "vertex_title": "Vertex API 配置", - "vertex_add_button": "添加配置", - "vertex_empty_title": "暂无Vertex配置", - "vertex_empty_desc": "点击上方按钮添加第一个配置", - "vertex_item_title": "Vertex配置", - "vertex_add_modal_title": "添加Vertex API配置", - "vertex_add_modal_key_label": "API密钥:", - "vertex_add_modal_key_placeholder": "请输入Vertex API密钥", - "vertex_add_modal_url_label": "Base URL:", - "vertex_add_modal_url_placeholder": "例如: https://example.com/api", - "vertex_add_modal_proxy_label": "代理 URL (可选):", - "vertex_add_modal_proxy_placeholder": "例如: socks5://proxy.example.com:1080", - "vertex_edit_modal_title": "编辑Vertex API配置", - "vertex_edit_modal_key_label": "API密钥:", - "vertex_edit_modal_url_label": "Base URL:", - "vertex_edit_modal_proxy_label": "代理 URL (可选):", - "vertex_delete_confirm": "确定要删除这个Vertex配置吗?", - "vertex_models_label": "模型别名:", - "vertex_models_add_btn": "添加映射", - "vertex_models_count": "别名数量", - "ampcode_title": "Amp CLI 集成 (ampcode)", - "ampcode_modal_title": "配置 Ampcode", - "ampcode_upstream_url_label": "Upstream URL", - "ampcode_upstream_url_placeholder": "例如: https://ampcode.com", - "ampcode_upstream_url_hint": "可选;留空表示使用默认/自动发现的控制平面地址。", - "ampcode_upstream_api_key_label": "Upstream API Key (Amp官方)", - "ampcode_upstream_api_key_placeholder": "输入 sk-amp...(留空不修改)", - "ampcode_upstream_api_key_hint": "可选;留空不会修改当前Amp官方密钥,需清除请点击下方按钮。", - "ampcode_upstream_api_key_current": "当前Amp官方密钥: {{key}}", - "ampcode_clear_upstream_api_key": "清除官方密钥", - "ampcode_clear_upstream_api_key_confirm": "确定要清除 Ampcode 的 upstream API key(Amp官方)吗?", - "ampcode_upstream_api_keys_label": "多上游 API Key 路由", - "ampcode_upstream_api_keys_hint": "为指定客户端 API Key 绑定不同的 Amp 上游 API Key;客户端 key 可用逗号或换行分隔。", - "ampcode_upstream_api_keys_add_btn": "添加多上游映射", - "ampcode_upstream_api_keys_upstream_placeholder": "上游 API Key(sk-amp-...)", - "ampcode_upstream_api_keys_clients_placeholder": "客户端 API Keys,用逗号或换行分隔", - "ampcode_upstream_api_keys_item_title": "上游映射 #{{index}}", - "ampcode_upstream_api_keys_count": "多上游映射", - "ampcode_force_model_mappings_label": "强制应用模型映射", - "ampcode_force_model_mappings_hint": "开启后,模型映射将覆盖本地 API Key 可用性判断。", - "ampcode_model_mappings_label": "模型映射 (from → to)", - "ampcode_model_mappings_hint": "用于重写 Amp 请求中的模型名称;留空表示不做映射。", - "ampcode_model_mappings_add_btn": "添加映射", - "ampcode_model_mappings_from_placeholder": "from 模型(原始)", - "ampcode_model_mappings_to_placeholder": "to 模型(目标)", - "ampcode_model_mappings_count": "映射数量", - "ampcode_lists_overwrite_title": "覆盖列表配置", - "ampcode_lists_overwrite_confirm": "当前未成功加载服务器已有多上游/模型映射配置,继续保存可能覆盖或清空这些列表,是否继续?", - "ampcode_mappings_overwrite_confirm": "当前未成功加载服务器已有映射,继续保存可能覆盖或清空已有映射,是否继续?", - "openai_title": "OpenAI 兼容提供商", - "openai_add_button": "添加提供商", - "openai_empty_title": "暂无OpenAI兼容提供商", - "openai_empty_desc": "点击上方按钮添加第一个提供商", - "openai_filtered_empty_title": "没有匹配的提供商", - "openai_filtered_empty_desc": "当前模型筛选下没有匹配的提供商,请清除筛选后重试。", - "sort_by_name": "按名称排序", - "sort_ascending": "升序排序", - "sort_asc_short": "升序", - "sort_by_priority": "按优先级排序", - "sort_by_recent_success": "按最近成功数排序", - "sort_descending": "降序排序", - "sort_desc_short": "降序", - "openai_test_model": "测试模型", - "openai_add_modal_title": "添加OpenAI兼容提供商", - "openai_add_modal_name_label": "提供商名称:", - "openai_add_modal_name_placeholder": "例如: openrouter", - "openai_add_modal_url_label": "Base URL:", - "openai_add_modal_url_placeholder": "例如: https://openrouter.ai/api/v1", - "openai_add_modal_keys_label": "API密钥", - "openai_edit_modal_keys_label": "API密钥", - "openai_keys_hint": "每个密钥可搭配一个可选代理地址,更便于管理。", - "openai_keys_add_btn": "添加密钥", - "openai_key_placeholder": "输入 sk- 开头的密钥", - "openai_proxy_placeholder": "可选代理 URL (如 socks5://...)", - "openai_add_modal_models_label": "模型列表 (name[, alias] 每行一个):", - "openai_models_hint": "示例:gpt-4o-mini 或 moonshotai/kimi-k2:free, kimi-k2", - "openai_model_name_placeholder": "模型名称,如 moonshotai/kimi-k2:free", - "openai_model_alias_placeholder": "模型别名 (可选)", - "openai_models_add_btn": "添加模型", - "openai_models_fetch_button": "从 /models 获取", - "openai_models_fetch_title": "从 /models 选择模型", - "openai_models_fetch_hint": "使用上方 Base URL 调用 /models 端点,附带首个 API Key(Bearer)与自定义请求头。", - "openai_models_fetch_url_label": "请求地址", - "openai_models_fetch_refresh": "重新获取", - "openai_models_fetch_loading": "正在从 /models 获取模型列表...", - "openai_models_fetch_empty": "未获取到模型,请检查端点或鉴权信息。", - "openai_models_fetch_error": "获取模型失败", - "openai_models_fetch_back": "返回编辑", - "openai_models_fetch_apply": "添加所选模型", - "openai_models_search_label": "搜索模型", - "openai_models_search_placeholder": "按名称、别名或描述筛选", - "openai_models_search_empty": "没有匹配的模型,请更换关键字试试。", - "openai_models_fetch_invalid_url": "请先填写有效的 Base URL", - "openai_models_fetch_added": "已添加 {{count}} 个新模型", - "openai_edit_modal_title": "编辑OpenAI兼容提供商", - "openai_edit_modal_name_label": "提供商名称:", - "openai_edit_modal_url_label": "Base URL:", - "openai_edit_modal_models_label": "模型列表 (name[, alias] 每行一个):", - "openai_delete_confirm": "确定要删除这个OpenAI提供商吗?", - "openai_keys_count": "密钥数量", - "openai_models_count": "模型数量", - "openai_test_title": "连通性测试", - "openai_test_hint": "使用当前配置向 /chat/completions 请求,验证是否可用。", - "openai_test_model_placeholder": "选择或输入要测试的模型", - "openai_test_action": "发送测试", - "openai_test_running": "正在发送测试请求...", - "openai_test_timeout": "测试请求超时({{seconds}}秒)。", - "openai_test_success": "测试成功,模型可用。", - "openai_test_failed": "测试失败", - "openai_test_select_placeholder": "从当前模型列表选择", - "openai_test_select_empty": "当前未配置模型,请先添加模型", - "openai_test_single_action": "测试", - "openai_test_all_action": "一键测试全部密钥", - "openai_test_all_hint": "测试所有密钥的连接状态", - "openai_test_all_success": "所有 {{count}} 个密钥测试通过", - "openai_test_all_failed": "所有 {{count}} 个密钥测试失败", - "openai_test_all_partial": "测试完成:{{success}} 个通过,{{failed}} 个失败", - "model_search_placeholder": "按模型筛选...", - "model_search_clear": "清除", - "model_select_all": "全选", - "model_filter_empty": "暂无可筛选模型" - }, "auth_files": { "title": "认证文件管理", "title_section": "认证文件", @@ -1468,10 +1199,8 @@ "cancel": "取消", "save": "保存", "create": "创建", - "back": "返回", "enable": "启用", - "disable": "停用", - "openModelCatalog": "查看模型目录" + "disable": "停用" }, "categories": { "title": "提供商", @@ -1513,13 +1242,11 @@ "disabled": "已停用", "notSet": "未设置", "none": "无", - "notAvailable": "不可用", "notConfigured": "未配置", "defaultSuffix": "(默认)" }, "detail": { "title": "详情", - "empty": "请选择一项资源查看详情", "metadataTitle": "元数据", "fields": { "identifier": "标识", @@ -1585,7 +1312,6 @@ "addMapping": "添加密钥映射", "modelMappingsSection": "模型映射", "addModelMapping": "添加模型映射", - "behaviorSection": "行为", "forceModelMappings": "强制模型映射", "forceModelMappingsHint": "启用后,所有请求必须命中模型映射规则" }, @@ -1652,22 +1378,7 @@ } }, "modelCatalog": { - "summaryTitle": "模型目录", - "openAction": "打开目录", - "notLoaded": "未加载", - "loading": "加载中", - "summaryCount": "{{count}} 个模型", - "summaryError": "加载失败" - }, - "disconnected": { - "title": "未连接管理端", - "description": "请先在登录页连接到代理服务,再管理提供商。", - "action": "去连接" - }, - "error": { - "title": "加载失败", - "description": "无法获取提供商配置,请稍后重试。", - "retry": "重试" + "notLoaded": "未加载" } } } diff --git a/src/i18n/locales/zh-TW.json b/src/i18n/locales/zh-TW.json index fd6a7a7..e17e4a6 100644 --- a/src/i18n/locales/zh-TW.json +++ b/src/i18n/locales/zh-TW.json @@ -192,275 +192,6 @@ "edit_modal_key_label": "API 金鑰:", "delete_confirm": "確定要刪除這個 API 金鑰嗎?" }, - "ai_providers": { - "title": "AI 供應商設定", - "gemini_title": "Gemini API 金鑰", - "gemini_add_button": "新增金鑰", - "gemini_empty_title": "暫無 Gemini 金鑰", - "gemini_empty_desc": "點擊上方按鈕新增第一個金鑰", - "gemini_item_title": "Gemini 金鑰", - "gemini_add_modal_title": "新增 Gemini API 金鑰", - "gemini_add_modal_key_label": "API 金鑰", - "gemini_add_modal_key_placeholder": "輸入 Gemini API 金鑰", - "gemini_add_modal_key_hint": "逐條輸入金鑰,可同時指定選填 Base URL。", - "gemini_keys_add_btn": "新增金鑰", - "gemini_base_url_label": "Base URL(選填)", - "gemini_base_url_placeholder": "例如: https://generativelanguage.googleapis.com", - "gemini_add_modal_proxy_label": "代理 URL(選填):", - "gemini_add_modal_proxy_placeholder": "例如: socks5://proxy.example.com:1080", - "gemini_models_label": "自訂模型(選填):", - "gemini_models_hint": "為空表示使用全部模型;可填寫 name[, alias] 以限制或重新命名模型。", - "gemini_models_add_btn": "新增模型", - "gemini_models_fetch_button": "從 /v1beta/models 取得", - "gemini_models_fetch_title": "從 Gemini /v1beta/models 選擇模型", - "gemini_models_fetch_hint": "按 Gemini API 規範請求 GET /v1beta/models;預設附帶 x-goog-api-key(來自 API Key 欄位)並合併你設定的自訂請求標頭。", - "gemini_models_fetch_url_label": "請求位址", - "gemini_models_fetch_refresh": "重新取得", - "gemini_models_fetch_loading": "正在從 Gemini /v1beta/models 取得模型清單...", - "gemini_models_fetch_empty": "未取得到模型,請檢查 Base URL、API Key 或請求標頭。", - "gemini_models_fetch_error": "取得 Gemini 模型失敗", - "gemini_models_fetch_apply": "新增已選模型", - "model_discovery_select_visible": "全選目前清單", - "model_discovery_clear_selection": "清空已選", - "model_discovery_selected_count": "已選 {{count}} 項", - "gemini_models_search_label": "搜尋模型", - "gemini_models_search_placeholder": "依名稱、別名或描述篩選", - "gemini_models_search_empty": "沒有符合的模型,請更換關鍵字試試。", - "gemini_models_fetch_added": "已新增 {{count}} 個新模型", - "gemini_models_count": "模型數量", - "gemini_edit_modal_title": "編輯 Gemini API 金鑰", - "gemini_edit_modal_key_label": "API 金鑰:", - "gemini_delete_confirm": "確定要刪除這個 Gemini 金鑰嗎?", - "excluded_models_label": "排除的模型(選填):", - "excluded_models_placeholder": "用逗號或換行分隔,例如: gemini-1.5-pro, gemini-1.5-flash", - "excluded_models_hint": "留空表示不篩選;儲存時會自動去重並忽略空白。", - "excluded_models_count": "排除 {{count}} 個模型", - "prefix_label": "前綴(選填):", - "prefix_placeholder": "例如: team-a", - "prefix_hint": "設定後可用 prefix/ 選擇該條目。", - "priority_label": "優先順序(選填):", - "priority_hint": "數值越大優先順序越高;留空表示預設(0)。", - "config_toggle_label": "啟用", - "config_disabled_badge": "已停用", - "codex_title": "Codex API 設定", - "codex_add_button": "新增設定", - "codex_empty_title": "暫無 Codex 設定", - "codex_empty_desc": "點擊上方按鈕新增第一個設定", - "codex_item_title": "Codex 設定", - "codex_add_modal_title": "新增 Codex API 設定", - "codex_add_modal_key_label": "API 金鑰:", - "codex_add_modal_key_placeholder": "請輸入 Codex API 金鑰", - "codex_add_modal_url_label": "Base URL(必填):", - "codex_add_modal_url_placeholder": "例如: https://api.example.com", - "codex_add_modal_proxy_label": "代理 URL(選填):", - "codex_add_modal_proxy_placeholder": "例如: socks5://proxy.example.com:1080", - "codex_websockets_label": "Websockets", - "codex_websockets_hint": "開啟 Responses API 的 websocket 傳輸。", - "codex_models_label": "自訂模型(選填):", - "codex_models_hint": "為空表示使用全部模型;可填寫 name[, alias] 以限制或重新命名模型。", - "codex_models_add_btn": "新增模型", - "codex_models_fetch_button": "從 /v1/models 取得", - "codex_models_fetch_title": "從 /v1/models 選擇模型", - "codex_models_fetch_hint": "使用上方 Base URL 呼叫 /v1/models 端點,附帶 API Key(Bearer)與自訂請求標頭。", - "codex_models_fetch_url_label": "請求位址", - "codex_models_fetch_refresh": "重新取得", - "codex_models_fetch_loading": "正在從 /v1/models 取得模型清單...", - "codex_models_fetch_empty": "未取得到模型,請檢查端點或驗證資訊。", - "codex_models_fetch_error": "取得模型失敗", - "codex_models_fetch_apply": "新增已選模型", - "codex_models_search_label": "搜尋模型", - "codex_models_search_placeholder": "依名稱、別名或描述篩選", - "codex_models_search_empty": "沒有符合的模型,請更換關鍵字試試。", - "codex_models_fetch_added": "已新增 {{count}} 個新模型", - "codex_models_count": "模型數量", - "codex_edit_modal_title": "編輯 Codex API 設定", - "codex_edit_modal_key_label": "API 金鑰:", - "codex_edit_modal_url_label": "Base URL(必填):", - "codex_edit_modal_proxy_label": "代理 URL(選填):", - "codex_delete_confirm": "確定要刪除這個 Codex 設定嗎?", - "claude_title": "Claude API 設定", - "claude_add_button": "新增設定", - "claude_empty_title": "暫無 Claude 設定", - "claude_empty_desc": "點擊上方按鈕新增第一個設定", - "claude_item_title": "Claude 設定", - "claude_add_modal_title": "新增 Claude API 設定", - "claude_add_modal_key_label": "API 金鑰:", - "claude_add_modal_key_placeholder": "請輸入 Claude API 金鑰", - "claude_add_modal_url_label": "Base URL(選填):", - "claude_add_modal_url_placeholder": "例如: https://api.anthropic.com", - "claude_add_modal_proxy_label": "代理 URL(選填):", - "claude_add_modal_proxy_placeholder": "例如: socks5://proxy.example.com:1080", - "claude_edit_modal_title": "編輯 Claude API 設定", - "claude_edit_modal_key_label": "API 金鑰:", - "claude_edit_modal_url_label": "Base URL(選填):", - "claude_edit_modal_proxy_label": "代理 URL(選填):", - "claude_delete_confirm": "確定要刪除這個 Claude 設定嗎?", - "claude_models_label": "自訂模型(選填):", - "claude_models_hint": "為空表示使用全部模型;可填寫 name[, alias] 以限制或重新命名模型。", - "claude_models_add_btn": "新增模型", - "claude_models_count": "模型數量", - "claude_models_fetch_button": "從 /v1/models 取得", - "claude_models_fetch_title": "從 Claude /v1/models 選擇模型", - "claude_models_fetch_hint": "按 Anthropic 規範請求 GET /v1/models,預設附帶 x-api-key 與 anthropic-version: 2023-06-01;也會合併你設定的自訂請求標頭。", - "claude_models_fetch_url_label": "請求位址", - "claude_models_fetch_refresh": "重新取得", - "claude_models_fetch_loading": "正在從 Claude /v1/models 取得模型清單...", - "claude_models_fetch_empty": "未取得到模型,請檢查 Base URL、API Key 或請求標頭。", - "claude_models_fetch_error": "取得 Claude 模型失敗", - "claude_models_fetch_apply": "新增已選模型", - "claude_models_search_label": "搜尋模型", - "claude_models_search_placeholder": "依名稱、別名或描述篩選", - "claude_models_search_empty": "沒有符合的模型,請更換關鍵字試試。", - "claude_models_fetch_added": "已新增 {{count}} 個新模型", - "claude_test_title": "連通性測試", - "claude_test_hint": "按 Anthropic 規範向 /v1/messages 發送測試請求,驗證目前設定是否可用。", - "claude_test_select_placeholder": "從目前模型清單選擇", - "claude_test_select_empty": "目前未設定模型,請先新增模型", - "claude_test_action": "測試", - "claude_test_running": "正在發送 Claude 測試請求...", - "claude_test_timeout": "測試請求逾時({{seconds}} 秒)。", - "claude_test_success": "測試成功,Claude 模型可用。", - "claude_test_failed": "測試失敗", - "claude_test_key_required": "請先填寫 Claude API Key 或在自訂請求標頭中設定 x-api-key", - "claude_test_model_required": "請選擇要測試的模型", - "claude_test_endpoint_invalid": "無法建構有效的 Claude /v1/messages 請求位址", - "claude_cloak_title": "請求偽裝(選填):", - "claude_cloak_toggle_label": "啟用", - "claude_cloak_toggle_aria": "切換請求偽裝", - "claude_cloak_hint": "對非 Claude Code 客戶端,將請求偽裝成 Claude Code CLI 的格式。", - "claude_cloak_mode_label": "模式:", - "claude_cloak_mode_hint": "auto: 僅對非 Claude Code 客戶端偽裝;always: 總是偽裝;never: 從不偽裝。", - "claude_cloak_mode_auto": "自動(僅非 Claude Code)", - "claude_cloak_mode_always": "總是", - "claude_cloak_mode_never": "從不", - "claude_cloak_strict_label": "嚴格模式:", - "claude_cloak_strict_hint": "啟用後會移除用戶 system 訊息,僅保留 Claude Code 提示詞。", - "claude_cloak_sensitive_words_label": "敏感詞(選填):", - "claude_cloak_sensitive_words_placeholder": "用逗號或換行分隔,例如: internal-project", - "claude_cloak_sensitive_words_hint": "這些詞會被插入零寬字元進行混淆。", - "claude_cloak_sensitive_words_count": "敏感詞", - "vertex_title": "Vertex API 設定", - "vertex_add_button": "新增設定", - "vertex_empty_title": "暫無 Vertex 設定", - "vertex_empty_desc": "點擊上方按鈕新增第一個設定", - "vertex_item_title": "Vertex 設定", - "vertex_add_modal_title": "新增 Vertex API 設定", - "vertex_add_modal_key_label": "API 金鑰:", - "vertex_add_modal_key_placeholder": "請輸入 Vertex API 金鑰", - "vertex_add_modal_url_label": "Base URL:", - "vertex_add_modal_url_placeholder": "例如: https://example.com/api", - "vertex_add_modal_proxy_label": "代理 URL(選填):", - "vertex_add_modal_proxy_placeholder": "例如: socks5://proxy.example.com:1080", - "vertex_edit_modal_title": "編輯 Vertex API 設定", - "vertex_edit_modal_key_label": "API 金鑰:", - "vertex_edit_modal_url_label": "Base URL:", - "vertex_edit_modal_proxy_label": "代理 URL(選填):", - "vertex_delete_confirm": "確定要刪除這個 Vertex 設定嗎?", - "vertex_models_label": "模型別名:", - "vertex_models_add_btn": "新增映射", - "vertex_models_count": "別名數量", - "ampcode_title": "Amp CLI 整合(ampcode)", - "ampcode_modal_title": "設定 Ampcode", - "ampcode_upstream_url_label": "Upstream URL", - "ampcode_upstream_url_placeholder": "例如: https://ampcode.com", - "ampcode_upstream_url_hint": "選填;留空表示使用預設/自動探索的控制平面位址。", - "ampcode_upstream_api_key_label": "Upstream API Key(Amp 官方)", - "ampcode_upstream_api_key_placeholder": "輸入 sk-amp...(留空不修改)", - "ampcode_upstream_api_key_hint": "選填;留空不會修改目前 Amp 官方金鑰,需清除請點擊下方按鈕。", - "ampcode_upstream_api_key_current": "目前 Amp 官方金鑰: {{key}}", - "ampcode_clear_upstream_api_key": "清除官方金鑰", - "ampcode_clear_upstream_api_key_confirm": "確定要清除 Ampcode 的 upstream API key(Amp 官方)嗎?", - "ampcode_upstream_api_keys_label": "多上游 API Key 路由", - "ampcode_upstream_api_keys_hint": "為指定客戶端 API Key 綁定不同的 Amp 上游 API Key;客戶端 key 可用逗號或換行分隔。", - "ampcode_upstream_api_keys_add_btn": "新增多上游映射", - "ampcode_upstream_api_keys_upstream_placeholder": "上游 API Key(sk-amp-...)", - "ampcode_upstream_api_keys_clients_placeholder": "客戶端 API Keys,用逗號或換行分隔", - "ampcode_upstream_api_keys_item_title": "上游映射 #{{index}}", - "ampcode_upstream_api_keys_count": "多上游映射", - "ampcode_force_model_mappings_label": "強制套用模型映射", - "ampcode_force_model_mappings_hint": "開啟後,模型映射將覆寫本地 API Key 可用性判斷。", - "ampcode_model_mappings_label": "模型映射(from → to)", - "ampcode_model_mappings_hint": "用於改寫 Amp 請求中的模型名稱;留空表示不做映射。", - "ampcode_model_mappings_add_btn": "新增映射", - "ampcode_model_mappings_from_placeholder": "from 模型(原始)", - "ampcode_model_mappings_to_placeholder": "to 模型(目標)", - "ampcode_model_mappings_count": "映射數量", - "ampcode_lists_overwrite_title": "覆寫清單設定", - "ampcode_lists_overwrite_confirm": "目前未成功載入伺服器已有多上游/模型映射設定,繼續儲存可能覆寫或清空這些清單,是否繼續?", - "ampcode_mappings_overwrite_confirm": "目前未成功載入伺服器已有映射,繼續儲存可能覆寫或清空已有映射,是否繼續?", - "openai_title": "OpenAI 相容供應商", - "openai_add_button": "新增供應商", - "openai_empty_title": "暫無 OpenAI 相容供應商", - "openai_empty_desc": "點擊上方按鈕新增第一個供應商", - "openai_filtered_empty_title": "沒有匹配的供應商", - "openai_filtered_empty_desc": "目前模型篩選下沒有匹配的供應商,請清除篩選後再試一次。", - "sort_by_name": "依名稱排序", - "sort_ascending": "升冪排序", - "sort_asc_short": "升冪", - "sort_by_priority": "依優先順序排序", - "sort_by_recent_success": "依最近成功排序", - "sort_descending": "降冪排序", - "sort_desc_short": "降冪", - "openai_test_model": "測試模型", - "openai_add_modal_title": "新增 OpenAI 相容供應商", - "openai_add_modal_name_label": "供應商名稱:", - "openai_add_modal_name_placeholder": "例如: openrouter", - "openai_add_modal_url_label": "Base URL:", - "openai_add_modal_url_placeholder": "例如: https://openrouter.ai/api/v1", - "openai_add_modal_keys_label": "API 金鑰", - "openai_edit_modal_keys_label": "API 金鑰", - "openai_keys_hint": "每個金鑰可搭配一個選填代理位址,更便於管理。", - "openai_keys_add_btn": "新增金鑰", - "openai_key_placeholder": "輸入 sk- 開頭的金鑰", - "openai_proxy_placeholder": "選填代理 URL(如 socks5://...)", - "openai_add_modal_models_label": "模型清單(name[, alias] 每行一個):", - "openai_models_hint": "範例:gpt-4o-mini 或 moonshotai/kimi-k2:free, kimi-k2", - "openai_model_name_placeholder": "模型名稱,如 moonshotai/kimi-k2:free", - "openai_model_alias_placeholder": "模型別名(選填)", - "openai_models_add_btn": "新增模型", - "openai_models_fetch_button": "從 /models 取得", - "openai_models_fetch_title": "從 /models 選擇模型", - "openai_models_fetch_hint": "使用上方 Base URL 呼叫 /models 端點,附帶第一個 API Key(Bearer)與自訂請求標頭。", - "openai_models_fetch_url_label": "請求位址", - "openai_models_fetch_refresh": "重新取得", - "openai_models_fetch_loading": "正在從 /models 取得模型清單...", - "openai_models_fetch_empty": "未取得到模型,請檢查端點或驗證資訊。", - "openai_models_fetch_error": "取得模型失敗", - "openai_models_fetch_back": "返回編輯", - "openai_models_fetch_apply": "新增已選模型", - "openai_models_search_label": "搜尋模型", - "openai_models_search_placeholder": "依名稱、別名或描述篩選", - "openai_models_search_empty": "沒有符合的模型,請更換關鍵字試試。", - "openai_models_fetch_invalid_url": "請先填寫有效的 Base URL", - "openai_models_fetch_added": "已新增 {{count}} 個新模型", - "openai_edit_modal_title": "編輯 OpenAI 相容供應商", - "openai_edit_modal_name_label": "供應商名稱:", - "openai_edit_modal_url_label": "Base URL:", - "openai_edit_modal_models_label": "模型清單(name[, alias] 每行一個):", - "openai_delete_confirm": "確定要刪除這個 OpenAI 供應商嗎?", - "openai_keys_count": "金鑰數量", - "openai_models_count": "模型數量", - "openai_test_title": "連通性測試", - "openai_test_hint": "使用目前設定向 /chat/completions 請求,驗證是否可用。", - "openai_test_model_placeholder": "選擇或輸入要測試的模型", - "openai_test_action": "發送測試", - "openai_test_running": "正在發送測試請求...", - "openai_test_timeout": "測試請求逾時({{seconds}} 秒)。", - "openai_test_success": "測試成功,模型可用。", - "openai_test_failed": "測試失敗", - "openai_test_select_placeholder": "從目前模型清單選擇", - "openai_test_select_empty": "目前未設定模型,請先新增模型", - "openai_test_single_action": "測試", - "openai_test_all_action": "一鍵測試全部金鑰", - "openai_test_all_hint": "測試所有金鑰的連線狀態", - "openai_test_all_success": "所有 {{count}} 個金鑰測試通過", - "openai_test_all_failed": "所有 {{count}} 個金鑰測試失敗", - "openai_test_all_partial": "測試完成:{{success}} 個通過,{{failed}} 個失敗", - "model_search_placeholder": "依模型篩選...", - "model_search_clear": "清除", - "model_select_all": "全選", - "model_filter_empty": "暫無可篩選模型" - }, "auth_files": { "title": "驗證檔案管理", "title_section": "驗證檔案", @@ -1494,10 +1225,8 @@ "cancel": "取消", "save": "儲存", "create": "建立", - "back": "返回", "enable": "啟用", - "disable": "停用", - "openModelCatalog": "檢視模型目錄" + "disable": "停用" }, "categories": { "title": "提供商", @@ -1539,13 +1268,11 @@ "disabled": "已停用", "notSet": "未設定", "none": "無", - "notAvailable": "不可用", "notConfigured": "未設定", "defaultSuffix": "(預設)" }, "detail": { "title": "詳情", - "empty": "請選擇一項資源檢視詳情", "metadataTitle": "元資料", "fields": { "identifier": "識別碼", @@ -1611,7 +1338,6 @@ "addMapping": "新增金鑰映射", "modelMappingsSection": "模型映射", "addModelMapping": "新增模型映射", - "behaviorSection": "行為", "forceModelMappings": "強制模型映射", "forceModelMappingsHint": "啟用後,所有請求必須命中模型映射規則" }, @@ -1678,22 +1404,7 @@ } }, "modelCatalog": { - "summaryTitle": "模型目錄", - "openAction": "開啟目錄", - "notLoaded": "未載入", - "loading": "載入中", - "summaryCount": "{{count}} 個模型", - "summaryError": "載入失敗" - }, - "disconnected": { - "title": "未連線至管理端", - "description": "請先在登入頁連線到代理服務,再管理提供商。", - "action": "去連線" - }, - "error": { - "title": "載入失敗", - "description": "無法取得提供商設定,請稍後重試。", - "retry": "重試" + "notLoaded": "未載入" } } }