| { |
| "common": { |
| "loading": "Loading...", |
| "empty": "Empty", |
| "load_more": "Load More", |
| "add": "Add", |
| "copy": "Copy", |
| "action": "Action", |
| "save": "Save", |
| "saved": "Saved successfully", |
| "cancel": "Cancel", |
| "confirm": "Confirm", |
| "close": "Close", |
| "delete": "Delete", |
| "edit": "Edit", |
| "refresh": "Refresh", |
| "refreshing": "Refreshing...", |
| "export": "Export", |
| "import": "Import", |
| "success": "Success", |
| "error": "Error", |
| "unknown": "Unknown", |
| "warning": "Warning", |
| "info": "Info", |
| "details": "Details", |
| "example": "Example", |
| "clear": "Clear", |
| "clearing": "Clearing...", |
| "prev_page": "Previous", |
| "next_page": "Next", |
| "pagination_info": "Showing {{start}} to {{end}} of {{total}} entries", |
| "per_page": "Per page", |
| "items": "items", |
| "accounts": "accounts", |
| "enabled": "Enabled", |
| "disabled": "Disabled", |
| "tauri_api_not_loaded": "Tauri API not loaded, please restart the app", |
| "environment_error": "Environment error: {{error}}", |
| "submit": "Submit", |
| "update": "Update", |
| "load_failed": "Load failed", |
| "create_success": "Created successfully", |
| "update_success": "Updated successfully", |
| "delete_success": "Deleted successfully", |
| "copied": "Copied to clipboard", |
| "retry": "Retry", |
| "back": "Back", |
| "reason": "Reason", |
| "show_raw": "Show Raw", |
| "show_parsed": "Show Parsed" |
| }, |
| "nav": { |
| "dashboard": "Dashboard", |
| "accounts": "Accounts", |
| "proxy": "API Proxy", |
| "call_records": "Traffic Logs", |
| "token_stats": "Token Stats", |
| "security": "IP Management", |
| "security_logs": "IP Logs", |
| "settings": "Settings", |
| "theme_to_dark": "Switch to Dark Mode", |
| "theme_to_light": "Switch to Light Mode", |
| "switch_to_english": "Switch to English", |
| "switch_to_chinese": "Switch to Chinese", |
| "switch_to_traditional_chinese": "Switch to Traditional Chinese", |
| "switch_to_english_short": "EN", |
| "switch_to_chinese_short": "ZH", |
| "switch_to_traditional_chinese_short": "TW", |
| "switch_to_japanese": "Switch to Japanese", |
| "switch_to_japanese_short": "JA", |
| "switch_to_turkish": "Switch to Turkish", |
| "switch_to_turkish_short": "TR", |
| "switch_to_vietnamese": "Switch to Vietnamese", |
| "switch_to_vietnamese_short": "VI", |
| "switch_to_russian": "Switch to Russian", |
| "switch_to_russian_short": "RU", |
| "switch_to_portuguese": "Switch to Portuguese", |
| "switch_to_portuguese_short": "PT", |
| "switch_to_korean": "Switch to Korean", |
| "switch_to_korean_short": "KO", |
| "switch_to_spanish": "Switch to Spanish", |
| "switch_to_spanish_short": "ES", |
| "switch_to_malay": "Switch to Malay", |
| "switch_to_malay_short": "MY", |
| "user_token": "User Tokens", |
| "logout": "Logout" |
| }, |
| "dashboard": { |
| "hello": "Hello, User 👋", |
| "refresh_quota": "Refresh Quota", |
| "refreshing": "Refreshing...", |
| "total_accounts": "Total Accounts", |
| "avg_gemini": "Avg. Gemini Quota", |
| "avg_gemini_image": "Avg. Gemini Image Quota", |
| "avg_claude": "Avg. Claude Quota", |
| "low_quota_accounts": "Low Quota Accounts", |
| "quota_sufficient": "Quota Sufficient", |
| "quota_low": "Low Quota", |
| "quota_desc": "Quota < 20%", |
| "current_account": "Current Account", |
| "switch_account": "Switch Account", |
| "no_active_account": "No Active Account", |
| "best_accounts": "Best Accounts", |
| "best_account_recommendation": "Best Account", |
| "switch_best": "Switch to Best", |
| "switch_successfully": "Switch to Best", |
| "view_all_accounts": "View All Accounts", |
| "export_data": "Export Data", |
| "for_gemini": "For Gemini", |
| "for_claude": "For Claude", |
| "toast": { |
| "switch_success": "Switch successful!", |
| "switch_error": "Switch account failed", |
| "refresh_success": "Quota refresh successful", |
| "refresh_error": "Refresh failed", |
| "export_no_accounts": "No accounts to export", |
| "export_success": "Export successful! File saved to: {{path}}", |
| "export_error": "Export failed" |
| } |
| }, |
| "accounts": { |
| "account": "Account", |
| "search_placeholder": "Search email...", |
| "all": "All", |
| "available": "Available", |
| "low_quota": "Low Quota", |
| "ultra": "ULTRA", |
| "pro": "PRO", |
| "free": "FREE", |
| "edit_label": "Edit Label", |
| "custom_label_placeholder": "Enter custom label", |
| "label_updated": "Label updated", |
| "add_account": "Add Account", |
| "refresh_all": "Refresh All", |
| "refresh_selected": "Refresh ({{count}})", |
| "export_selected": "Export ({{count}})", |
| "import_json": "Import", |
| "import_success": "Successfully imported {{count}} accounts", |
| "import_partial": "Import completed: {{success}} succeeded, {{fail}} failed", |
| "import_fail": "Import failed: {{error}}", |
| "import_invalid_format": "Invalid JSON format, please ensure the file contains email and refresh_token fields", |
| "delete_selected": "Delete ({{count}})", |
| "current": "Current", |
| "current_badge": "Current", |
| "disabled": "Disabled", |
| "disabled_tooltip": "Account is disabled (e.g. refresh_token revoked/expired). Reauthorize or update token to re-enable.", |
| "proxy_disabled": "Proxy Disabled", |
| "proxy_disabled_tooltip": "This account has proxy disabled manually, it will not handle API requests but remains usable in the app.", |
| "enable_proxy": "Enable Proxy", |
| "disable_proxy": "Disable Proxy", |
| "enable_proxy_selected": "Enable ({{count}})", |
| "disable_proxy_selected": "Disable ({{count}})", |
| "proxy_disabled_reason_manual": "Disabled manually by user", |
| "proxy_disabled_reason_batch": "Disabled in batch", |
| "forbidden": "403", |
| "forbidden_badge": "403", |
| "forbidden_tooltip": "API returned 403 Forbidden, account has no permission for Gemini Code Assist", |
| "forbidden_msg": "Forbidden, skip auto-refresh", |
| "status": { |
| "forbidden": "403 Forbidden", |
| "disabled": "Account Disabled", |
| "proxy_disabled": "Proxy Disabled", |
| "validation_required": "Verification Required", |
| "risk_controlled": "Risk / Rate Limited", |
| "oauth_reauth_required": "OAuth Re-auth Required", |
| "violation_blocked": "Blocked due to Violation" |
| }, |
| "error_details": "Error Details", |
| "error_status": "Error Status", |
| "error_time": "Detection Time", |
| "view_error": "View Reason", |
| "click_to_verify": "Click to Verify", |
| "copy_validation_url": "Copy Verification Link", |
| "validation_url_copied": "Verification link copied to clipboard", |
| "fix_guide": { |
| "title": "Terminal Quick Fix (Resolves internal 403s)", |
| "step1_title": "🚀 Quickest Solution", |
| "step1_desc": "Open your Terminal and run the following command to tell Google \"it's me\", which resolves most 403 blocks:", |
| "step1_li1": "Press Enter, input <1>Y</1> when prompted to continue.", |
| "step1_li2": "Your browser will open automatically, select your account and click \"Allow\".", |
| "step1_li3": "Once you see <1>You are now authenticated</1>, you're all set!", |
| "step2_title": "🧹 If that fails (Clear Cache)", |
| "step2_li1_prefix": "Run this to clear your old credentials:", |
| "step2_li2_prefix": "Then log in again:", |
| "tips_title": "💡 Common Tips", |
| "tip1": "If you still get 403, try running <1>unset GOOGLE_APPLICATION_CREDENTIALS</1> in terminal first.", |
| "tip2": "For production environments, using a <1>Service Account</1> JSON key is highly recommended for stability and headless operation.", |
| "tip3": "If it still fails, check the Generative Language API in <1>Google Cloud Console</1> to see if permissions are frozen. If so, your account is under risk control. Please let the account cool down for 72 hours before trying again.", |
| "tip4": "You can also try <1>npm install -g @google/gemini-cli</1>. If it doesn't throw errors, simply deleting and re-authorizing the account in the app will likely fix it." |
| }, |
| "no_data": "No Data", |
| "last_used": "Last Used", |
| "reset_time": "Reset Time", |
| "switch_to": "Switch to this account", |
| "actions": "Actions", |
| "device_fingerprint": "Device Fingerprint", |
| "show_all_quotas": "Show All Quotas", |
| "device_fingerprint_dialog": { |
| "title": "Device Fingerprint", |
| "operations": "Device Fingerprint Operations", |
| "generate_and_bind": "Generate and Bind", |
| "restore_original": "Restore Original", |
| "open_storage_directory": "Open Storage Directory", |
| "current_storage": "Current Storage", |
| "effective": "Effective", |
| "current_storage_desc": "Read from storage.json (updated after applying binding when switching accounts)", |
| "account_binding": "Account Binding", |
| "pending_application": "Pending Application", |
| "account_binding_desc": "Saved as binding after generation/restoration, written to storage.json when switching accounts", |
| "historical_fingerprints": "Historical Fingerprints (optional restore/delete)", |
| "no_history": "No History", |
| "current": "Current", |
| "restore": "Restore", |
| "delete_version": "Delete this version", |
| "confirm_generate_title": "Confirm generate and bind?", |
| "confirm_generate_desc": "Will generate a new set of device fingerprints and set as current fingerprint. Confirm continue?", |
| "confirm_restore_title": "Confirm restore original fingerprint?", |
| "confirm_restore_desc": "Will restore to original fingerprint and overwrite current fingerprint. Confirm continue?", |
| "cancel": "Cancel", |
| "confirm": "Confirm", |
| "processing": "Processing...", |
| "loading": "Loading...", |
| "failed_to_load_device_info": "Failed to load device info", |
| "generation_failed": "Generation failed", |
| "binding_failed": "Binding failed", |
| "restoration_failed": "Restoration failed", |
| "deletion_failed": "Deletion failed", |
| "directory_open_failed": "Unable to open directory", |
| "generated_and_bound": "Generated and bound", |
| "restored": "Restored", |
| "deleted": "Deleted", |
| "directory_opened": "Storage directory opened", |
| "original_fingerprint_not_found": "Original fingerprint not found" |
| }, |
| "warmup_all": "One-click Warmup", |
| "warmup_selected": "Warmup ({{count}})", |
| "warmup_this": "Warmup this account", |
| "warmup_now": "Warmup Now", |
| "warmup_batch_triggered": "Warmup tasks triggered for {{count}} accounts", |
| "quota_protected": "Protected", |
| "details": { |
| "title": "Quota Details", |
| "model_quota": "Model Quota", |
| "protected_models": "Protected Models" |
| }, |
| "toast": { |
| "proxy_enabled": "Enabled proxy for {{count}} accounts", |
| "proxy_disabled": "Disabled proxy for {{count}} accounts" |
| }, |
| "add": { |
| "title": "Add Account", |
| "tabs": { |
| "oauth": "OAuth", |
| "token": "Refresh Token", |
| "import": "Import DB" |
| }, |
| "oauth": { |
| "recommend": "Recommended", |
| "desc": "Opens default browser for Google login to auto-fetch and save Token.", |
| "btn_start": "Start OAuth", |
| "btn_waiting": "Waiting for auth...", |
| "btn_finish": "I already authorized", |
| "copy_link": "Copy Auth Link", |
| "copied": "Copied", |
| "link_label": "Authorization URL", |
| "link_click_to_copy": "Click to copy", |
| "manual_hint": "Browser didn't redirect? Paste the full callback URL or raw Code here:", |
| "manual_placeholder": "Paste callback URL or code...", |
| "error_no_flow": "Please click 'Start OAuth' first", |
| "web_hint": "Google login page will open in a new window", |
| "error_no_url": "Could not obtain OAuth URL", |
| "popup_blocked": "Popup blocked", |
| "manual_submitting": "Submitting authorization code...", |
| "manual_submitted": "Authorization code submitted. Backend is processing..." |
| }, |
| "token": { |
| "label": "Refresh Token", |
| "placeholder": "Paste your Refresh Token here (Batch supported)\n\nSupported formats:\n1. Single Token (1//...)\n2. JSON Array (with refresh_token field)\n3. Any text containing tokens (Auto-extraction)", |
| "hint": "Tip: You can paste multiple tokens or a JSON array to import in batch.", |
| "error_token": "Please enter Refresh Token", |
| "batch_progress": "Importing {{current}}/{{total}} accounts...", |
| "batch_success": "Successfully imported {{count}} accounts", |
| "batch_partial": "Import finished: {{success}} success, {{fail}} failed", |
| "batch_fail": "Import failed" |
| }, |
| "import": { |
| "scheme_a": "Plan A: From IDE DB", |
| "scheme_a_desc": "Auto-read current logged-in account from local Antigravity DB.", |
| "btn_db": "Import Current Account", |
| "or": "OR", |
| "scheme_b": "Plan B: From V1 Backup", |
| "scheme_b_desc": "Scan ~/.antigravity-agent for V1 account data.", |
| "btn_v1": "Batch Import V1", |
| "btn_custom_db": "Import Custom DB" |
| }, |
| "btn_cancel": "Cancel", |
| "btn_confirm": "Confirm", |
| "oauth_error": "OAuth failed: {{error}}", |
| "status": { |
| "error_token": "Please enter Refresh Token" |
| } |
| }, |
| "table": { |
| "email": "Email", |
| "quota": "Model Quota", |
| "last_used": "Last Used", |
| "actions": "Actions" |
| }, |
| "drag_to_reorder": "Drag to reorder", |
| "empty": { |
| "title": "No Accounts", |
| "desc": "Click the \"Add Account\" button above to add your first account" |
| }, |
| "views": { |
| "list": "List View", |
| "grid": "Grid View" |
| }, |
| "dialog": { |
| "add_title": "Add Account", |
| "batch_delete_title": "Batch Delete Confirmation", |
| "delete_title": "Delete Confirmation", |
| "batch_delete_msg": "Are you sure you want to delete the selected {{count}} accounts? This action cannot be undone.", |
| "delete_msg": "Are you sure you want to delete this account? This action cannot be undone.", |
| "refresh_title": "Refresh Quota", |
| "batch_refresh_title": "Batch Refresh", |
| "refresh_msg": "Are you sure you want to refresh the quota for the current account?", |
| "batch_refresh_msg": "Are you sure you want to refresh quotas for the selected {{count}} accounts? This may take some time.", |
| "disable_proxy_title": "Disable Proxy", |
| "disable_proxy_msg": "Are you sure you want to disable proxy for this account? The account will remain usable in the app.", |
| "enable_proxy_title": "Enable Proxy", |
| "enable_proxy_msg": "Are you sure you want to re-enable proxy for this account?", |
| "warmup_all_title": "Full Manual Warmup", |
| "warmup_all_msg": "Are you sure you want to trigger warmup tasks for all eligible accounts immediately? This will send minimal traffic to Google services to reset quota cycles.", |
| "batch_warmup_title": "Batch Manual Warmup", |
| "batch_warmup_msg": "Are you sure you want to trigger warmup for the selected {{count}} accounts immediately?" |
| } |
| }, |
| "settings": { |
| "save": "Save Settings", |
| "tabs": { |
| "general": "General", |
| "account": "Account", |
| "proxy": "Proxy Settings", |
| "advanced": "Advanced", |
| "debug": "Debug", |
| "about": "About" |
| }, |
| "general": { |
| "title": "General Settings", |
| "language": "Language", |
| "theme": "Theme", |
| "theme_light": "Light", |
| "theme_dark": "Dark", |
| "theme_system": "System", |
| "auto_launch": "Launch at Startup", |
| "auto_launch_enabled": "Enabled", |
| "auto_launch_disabled": "Disabled", |
| "auto_launch_desc": "Automatically launch Antigravity Tools when system starts", |
| "auto_check_update": "Auto Check for Updates", |
| "auto_check_update_desc": "Automatically check for new versions on startup", |
| "auto_check_update_enabled": "Auto check enabled", |
| "auto_check_update_disabled": "Auto check disabled", |
| "update_check_interval": "Check Interval (hours)", |
| "update_check_interval_desc": "Set auto-check interval (1-168 hours)", |
| "update_check_interval_saved": "Check interval settings saved" |
| }, |
| "account": { |
| "title": "Account Settings", |
| "auto_refresh": "Background Auto Refresh", |
| "auto_refresh_desc": "Automatically refresh all account quotas in the background. This is required for quota protection and smart warmup.", |
| "always_on": "Always On", |
| "refresh_interval": "Refresh Interval (minutes)", |
| "auto_sync": "Auto Sync Current Account", |
| "auto_sync_desc": "Automatically sync current active account information periodically", |
| "sync_interval": "Sync Interval (minutes)" |
| }, |
| "warmup": { |
| "title": "Smart Warmup", |
| "desc": "Automatically monitors all models and triggers warmup immediately when quota reaches 100%, keeping models warm" |
| }, |
| "quota_protection": { |
| "title": "Quota Protection", |
| "enable": "Enable Quota Protection", |
| "enable_desc": "Automatically disable proxy when account quota falls below threshold, and auto-restore when quota resets", |
| "threshold_label": "Reserved Quota Percentage", |
| "monitored_models_label": "Monitored Models (Trigger Conditions)", |
| "monitored_models_desc": "Select at least one. Protection triggers if ANY selected model falls below threshold", |
| "range": "Range", |
| "example": "Example: At {{percentage}}%, an account with {{total}} quota will be disabled when remaining ≤ {{threshold}}", |
| "auto_restore_info": "Account will be automatically re-enabled when quota resets" |
| }, |
| "pinned_quota_models": { |
| "title": "Pinned Quota Models", |
| "desc": "Choose which model quotas to display in the account list. Unselected models are only shown in the detail popup." |
| }, |
| "proxy": { |
| "title": "Proxy Settings" |
| }, |
| "proxy_pool": { |
| "title": "Proxy Pool", |
| "strategy_priority": "Priority", |
| "strategy_round_robin": "Round Robin", |
| "strategy_random": "Random", |
| "strategy_least_connections": "Least Connections", |
| "test_all": "Test All", |
| "batch_import": "Import", |
| "binding_manager": "Bindings", |
| "add_proxy": "Add Proxy", |
| "edit_proxy": "Edit Proxy", |
| "name": "Name", |
| "url": "Proxy URL", |
| "username": "Username", |
| "password": "Password", |
| "max_accounts": "Max Accounts", |
| "max_accounts_hint": "0 = Unlimited", |
| "priority": "Priority", |
| "priority_hint": "Lower is better", |
| "health_check_url": "Health Check URL", |
| "tags": "Tags", |
| "add_tag_placeholder": "Add tag...", |
| "seconds": "Sec", |
| "test_completed": "Health check completed", |
| "test_failed": "Health check failed", |
| "confirm_delete": "Are you sure you want to delete this proxy?", |
| "empty": "No proxies available", |
| "column_priority": "Priority", |
| "column_status": "Status", |
| "column_details": "Proxy Details", |
| "column_bindings": "Bindings", |
| "import_title": "Batch Import Proxies", |
| "import_label": "Paste Proxy List (One per line)", |
| "import_hint": "Supported formats: protocol://user:pass@host:port, host:port:user:pass", |
| "import_preview": "Preview", |
| "import_confirm": "Import {{count}} Proxies", |
| "no_valid_proxies": "No valid proxies found", |
| "binding": { |
| "title": "Account Proxy Bindings", |
| "load_failed": "Failed to load bindings", |
| "unbind_success": "Unbound successfully", |
| "bind_success": "Bound successfully", |
| "update_failed": "Failed to update binding", |
| "assigned_proxy": "Assigned Proxy", |
| "default_strategy": "Default (Follow Strategy)" |
| }, |
| "status": { |
| "inactive": "Inactive", |
| "checking": "Checking", |
| "healthy": "Healthy", |
| "timeout": "Timeout" |
| } |
| }, |
| "advanced": { |
| "title": "Advanced Settings", |
| "export_path": "Default Export Path", |
| "export_path_placeholder": "Not set (Ask every time)", |
| "default_export_path_desc": "Files will be saved directly to this folder without asking", |
| "select_btn": "Select", |
| "open_btn": "Open", |
| "data_dir": "Data Directory", |
| "data_dir_desc": "Account data and config file location", |
| "antigravity_path": "Antigravity Path", |
| "antigravity_path_placeholder": "Not set (Will use auto-detection)", |
| "antigravity_path_desc": "If you installed Antigravity in a non-standard location, you can manually specify the executable path here (Points to .app on MacOS).", |
| "antigravity_path_select": "Select Antigravity Executable", |
| "antigravity_path_detected": "Detected path updated", |
| "detect_btn": "Detect", |
| "antigravity_args": "Antigravity Startup Arguments", |
| "antigravity_args_placeholder": "--user-data-dir=/path/to/data --some-other-flag", |
| "antigravity_args_desc": "Specify startup arguments for Antigravity, e.g. --user-data-dir to specify user data directory", |
| "detect_args_btn": "Detect", |
| "antigravity_args_detected": "Startup arguments updated", |
| "antigravity_args_detect_error": "Failed to detect startup arguments", |
| "accounts_page_size": "Accounts Page Size", |
| "page_size_auto": "Auto Calculate (Recommended)", |
| "page_size_desc": "Set the number of accounts displayed per page. Select 'Auto Calculate' to dynamically adjust based on window size.", |
| "logs_title": "Logs Maintenance", |
| "logs_desc": "Clear log cache files. Does not affect account data.", |
| "clear_logs": "Clear Logs Cache", |
| "clear_logs_title": "Clear Logs Confirmation", |
| "clear_logs_msg": "Are you sure you want to clear all log cache files?", |
| "logs_cleared": "Logs cache cleared", |
| "antigravity_cache_title": "Antigravity Cache Cleanup", |
| "antigravity_cache_desc": "Clear Antigravity cache to resolve login failures, version validation errors, and OAuth authorization issues.", |
| "antigravity_cache_warning": "Please ensure Antigravity is completely closed before clearing cache.", |
| "clear_antigravity_cache": "Clear Antigravity Cache", |
| "clear_cache_confirm_title": "Confirm Clear Antigravity Cache", |
| "clear_cache_confirm_msg": "The following cache directories will be cleared:", |
| "cache_cleared_success": "Cache cleared successfully, freed {{size}} MB", |
| "cache_not_found": "No Antigravity cache directories found", |
| "debug_logs_title": "Debug Logging", |
| "debug_logs_enable_desc": "When enabled, records the complete request and response chain. Recommended to enable only when troubleshooting issues.", |
| "debug_logs_desc": "Records the full chain: original input, transformed v1internal request, and upstream response. For troubleshooting only, may contain sensitive data.", |
| "debug_log_dir": "Debug Log Output Directory", |
| "debug_log_dir_hint": "Leave empty to use the default directory: {{path}}/debug_logs", |
| "debug_log_dir_select": "Select Debug Log Output Directory", |
| "http_api_title": "HTTP API Service", |
| "http_api_desc": "Provides local HTTP interface for external programs (e.g. VS Code plugins).", |
| "http_api_enabled": "Enable HTTP API", |
| "http_api_enabled_desc": "When enabled, external programs can manage accounts via HTTP interface", |
| "http_api_port": "Listen Port", |
| "http_api_port_desc": "Restart required after changing port. If port conflict occurs, please use another available port.", |
| "http_api_port_placeholder": "Default port 19527", |
| "http_api_port_invalid": "Invalid port number (range: 1024-65535)", |
| "http_api_settings_saved": "HTTP API settings saved, restart required to apply", |
| "http_api_restart_required": "⚠️ Restart required to apply" |
| }, |
| "debug": { |
| "title": "Debug Console", |
| "desc": "View real-time application logs for debugging", |
| "enabled": "Enabled", |
| "disabled": "Disabled", |
| "disabled_hint": "Debug Console is Off", |
| "disabled_desc": "Enable to start recording application logs", |
| "console_title": "Debug Console", |
| "console_desc": "View real-time application logs to troubleshoot issues.", |
| "enable_desc": "Enable to capture and display backend logs.", |
| "open_btn": "Open Console", |
| "debug_logging": "Debug Logging", |
| "debug_logging_desc": "When enabled, records the complete request and response chain. Recommended to enable only when troubleshooting issues." |
| }, |
| "menu": { |
| "title": "Menu Display Settings", |
| "desc": "Select the function items to display in the menu bar. Hiding infrequently used menus can save space.", |
| "selected_items_note": "Selected items will be displayed in the top menu bar.", |
| "required": "Required" |
| }, |
| "about": { |
| "title": "About", |
| "version": "App Version", |
| "tech_stack": "Tech Stack", |
| "author": "Author", |
| "wechat": "WeChat", |
| "telegram": "Telegram Channel", |
| "github": "GitHub", |
| "view_code": "View Code", |
| "copyright": "Copyright © 2025-2026 Antigravity. All rights reserved.", |
| "check_update": "Check for Updates", |
| "checking_update": "Checking...", |
| "latest_version": "You're up to date", |
| "new_version_available": "New version {{version}} available", |
| "download_update": "Download", |
| "brew_upgrade": "Update via Homebrew", |
| "brew_upgrading": "Upgrading...", |
| "brew_confirm_title": "Update via Homebrew", |
| "brew_confirm_desc": "The following command will be executed to update the app. A restart is required after the upgrade.", |
| "brew_quarantine_hint": "If you see an \"App is damaged\" error after update, run in terminal:", |
| "brew_confirm_btn": "Start Update", |
| "brew_success_title": "Upgrade Complete", |
| "brew_upgrade_success": "Homebrew upgrade succeeded. Please restart the app to load the new version.", |
| "brew_restart_btn": "Restart Now", |
| "brew_restart_failed": "Auto restart failed. Please close and reopen the app manually", |
| "brew_upgrade_failed": "Homebrew upgrade failed. Try running manually: brew upgrade --cask antigravity-tools", |
| "brew_error_brew_not_found": "Homebrew not found. Please ensure brew is installed", |
| "brew_error_brew_exec_failed": "Failed to execute brew command. Try running manually in terminal", |
| "brew_error_brew_timeout": "Homebrew upgrade timed out (3min). Try running manually: brew upgrade --cask antigravity-tools", |
| "brew_error_brew_already_latest": "Already up to date, no upgrade needed", |
| "brew_error_brew_not_supported": "Homebrew update is not supported on this platform", |
| "update_check_failed": "Update check failed", |
| "support_btn": "Support Author", |
| "support_title": "Donation & Support", |
| "support_desc": "If you find this project helpful, feel free to buy me a coffee! Your support is the biggest motivation for me to maintain this project.", |
| "support_alipay": "Alipay", |
| "support_wechat": "WeChat Pay", |
| "support_buymeacoffee": "Buy Me a Coffee" |
| }, |
| "advanced_thinking": { |
| "title": "Advanced Thinking & Global Config", |
| "description": "Manage thinking capabilities, image modes, and global instructions." |
| }, |
| "thinking_budget": { |
| "title": "Thinking Budget", |
| "description": "Controls the token budget for AI deep thinking. Some models (e.g., Flash, -thinking suffix models) are limited to 24576 by upstream API.", |
| "mode_label": "Processing Mode", |
| "mode": { |
| "auto": "Auto Limit", |
| "passthrough": "Passthrough", |
| "custom": "Custom", |
| "adaptive": "Adaptive" |
| }, |
| "effort_label": "Thinking Effort", |
| "effort": { |
| "low": "Low", |
| "medium": "Medium", |
| "high": "High" |
| }, |
| "auto_hint": "Auto mode: Automatically caps budget to 24576 for Flash, -thinking suffix models, and Web Search requests.", |
| "adaptive_hint": "Adaptive mode: The model automatically adjusts thinking budget based on task complexity. Recommended for Claude 4.6+.", |
| "passthrough_warning": "Passthrough: Uses caller's value directly. High values may cause failures.", |
| "custom_value_hint": "Rec: 24576 (Flash) or 51200 (Extended)", |
| "tokens": "tokens" |
| }, |
| "image_thinking_mode": { |
| "title": "Image Thinking Mode", |
| "hint": "Affects quality and generation flow", |
| "options": { |
| "enabled": "Enabled", |
| "disabled": "Disabled", |
| "enabled_desc": "On: Preserves thinking chain, returns sketch + final image.", |
| "disabled_desc": "Off: Disables thinking chain, generates single ultra-clear image (Quality First)." |
| } |
| }, |
| "global_system_prompt": { |
| "title": "Global System Prompt", |
| "hint": "Automatically injected into all systemInstructions", |
| "placeholder": "Enter global system prompt...\nExample: You are a senior full-stack developer. Please respond in English.", |
| "char_count": "{{count}} characters", |
| "long_prompt_warning": "Prompt is quite long (over 2000 chars) and may consume significant context space." |
| }, |
| "branding": { |
| "title": "Antigravity Tools", |
| "subtitle": "Professional Account Management" |
| } |
| }, |
| "tray": { |
| "current": "Current", |
| "quota": "Quota", |
| "switch_next": "Switch to Next Account", |
| "refresh_current": "Refresh Current Quota", |
| "show_window": "Show Main Window", |
| "quit": "Quit Application", |
| "no_account": "No Account", |
| "unknown_quota": "Unknown (Click to Refresh)", |
| "forbidden": "Account Forbidden" |
| }, |
| "proxy": { |
| "title": "API Proxy Service", |
| "error": { |
| "load_failed": "Failed to load configuration" |
| }, |
| "status": { |
| "running": "Service Running", |
| "stopped": "Service Stopped", |
| "accounts_available": "{{count}} Accounts Available", |
| "processing": "Processing..." |
| }, |
| "action": { |
| "start": "Start Service", |
| "stop": "Stop Service" |
| }, |
| "config": { |
| "title": "Service Configuration", |
| "request": { |
| "user_agent": "User-Agent Override", |
| "user_agent_tooltip": "Override the User-Agent header sent to upstream APIs. Leave empty to use default.", |
| "user_agent_hint": "Current Default: antigravity/<version> <os>/<arch>", |
| "user_agent_placeholder": "Enter custom User-Agent string..." |
| }, |
| "port": "Listen Port", |
| "port_tooltip": "TCP port the local API Proxy listens on. Stop the service to change it, then restart to apply.", |
| "port_hint": "Default 8045, restart required to apply changes", |
| "auto_start": "Auto Start with App", |
| "auto_start_tooltip": "Automatically starts the local API Proxy service when the app launches.", |
| "allow_lan_access": "Allow LAN Access", |
| "allow_lan_access_tooltip": "When enabled, the service binds to 0.0.0.0 so other devices on your LAN can access it. Keep authorization enabled and protect your API key; restart required to apply.", |
| "allow_lan_access_hint_enabled": "🌐 Listening on 0.0.0.0, LAN devices can access", |
| "allow_lan_access_hint_disabled": "🔒 Listening on 127.0.0.1 only, localhost access (Privacy First)", |
| "allow_lan_access_warning": "⚠️ LAN devices can access when enabled. Keep your API key secure", |
| "allow_lan_access_restart_hint": "ℹ️ Service restart required to apply changes", |
| "api_key": "API Key", |
| "api_key_tooltip": "Shared secret used by clients when proxy authorization is enabled. Regenerating the key immediately invalidates the old one.", |
| "btn_regenerate": "Regenerate Key", |
| "btn_edit": "Edit", |
| "btn_save": "Save", |
| "btn_copy": "Copy", |
| "btn_copied": "Copied", |
| "warning_key": "Note: Keep your API key secure. Do not share it.", |
| "api_key_invalid": "Invalid API key format, must start with sk- and be at least 10 characters long", |
| "api_key_updated": "API key updated", |
| "admin_password": "Web UI Management Password", |
| "admin_password_tooltip": "Password used to log in to the Web management console. If empty, the API Key is used by default.", |
| "admin_password_default": "(Same as API Key)", |
| "admin_password_placeholder": "Enter new password, leave empty to use API Key", |
| "admin_password_hint": "Tip: In Docker/Web deployment scenarios, you can set a separate login password to improve the security of your API Key.", |
| "admin_password_short": "Password too short (at least 4 characters)", |
| "admin_password_updated": "Web UI login password updated", |
| "auth": { |
| "title": "Authorization", |
| "title_tooltip": "Controls whether incoming requests must be authenticated, and which routes are protected.", |
| "enabled": "Enabled", |
| "enabled_tooltip": "Turns authorization on/off by switching the authorization mode. When enabled, clients must include the API key via Authorization: Bearer <API_KEY> or x-api-key.", |
| "mode": "Mode", |
| "mode_tooltip": "Selects which routes require the API key: Off = no auth; All = protect everything; All except Health = /healthz stays open; Auto = Off for localhost-only, otherwise All except Health.", |
| "hint": "When enabled, clients must send the API key via Authorization: Bearer ... (except health if selected).", |
| "modes": { |
| "off": "Off (Open)", |
| "strict": "All (Strict)", |
| "all_except_health": "All except Health", |
| "auto": "Auto (Recommended)" |
| } |
| }, |
| "zai": { |
| "title": "z.ai (GLM) Provider", |
| "title_tooltip": "Optional Anthropic-compatible upstream for Claude protocol. Only affects Anthropic endpoints; Google account routing remains unchanged.", |
| "subtitle": "Optional Anthropic-compatible upstream for Claude protocol only.", |
| "enabled": "Enabled", |
| "enabled_tooltip": "Enables z.ai routing for Anthropic requests according to the selected dispatch mode.", |
| "base_url": "Base URL", |
| "base_url_tooltip": "Anthropic-compatible base URL. The proxy appends paths like /v1/messages. Leave the default unless you use a custom gateway.", |
| "dispatch_mode": "Dispatch Mode", |
| "dispatch_mode_tooltip": "Controls when to use z.ai for Anthropic requests: Off disables it; All Anthropic requests forwards everything; Pooled adds z.ai as one slot in round-robin with Google accounts; Fallback uses z.ai only when there are no Google accounts.", |
| "api_key": "API Key", |
| "api_key_tooltip": "API key used to authenticate requests to z.ai. Stored locally and required for z.ai and MCP features.", |
| "api_key_placeholder": "Paste your z.ai API key here", |
| "warning": "Note: This key is stored locally in the app data directory.", |
| "models": { |
| "title": "Model Mapping", |
| "title_tooltip": "Fetch available z.ai model ids and configure how incoming Anthropic/Claude model names are translated to z.ai model ids.", |
| "refresh": "Fetch models", |
| "refreshing": "Fetching...", |
| "hint": "Available models: {{count}}. Select a suggestion or type a custom model id.", |
| "error": "Failed to fetch models: {{error}}", |
| "select_placeholder": "Select model...", |
| "opus": "Opus family → z.ai model", |
| "opus_tooltip": "Default z.ai model id used when the incoming model contains \"opus\" (e.g. claude-opus-*).", |
| "sonnet": "Sonnet family → z.ai model", |
| "sonnet_tooltip": "Default z.ai model id used for other Claude models (e.g. claude-sonnet-* and most claude-* requests).", |
| "haiku": "Haiku family → z.ai model", |
| "haiku_tooltip": "Default z.ai model id used when the incoming model contains \"haiku\" (e.g. claude-haiku-*).", |
| "advanced_title": "Advanced overrides", |
| "advanced_tooltip": "Optional exact-match overrides. If an incoming model string matches a rule key, it will be replaced with the mapped z.ai model id.", |
| "from_label": "Incoming model", |
| "to_label": "z.ai model", |
| "add_rule": "Add", |
| "empty": "No override rules configured.", |
| "from_placeholder": "From (e.g. claude-3-opus)", |
| "to_placeholder": "To (e.g. glm-4)" |
| }, |
| "modes": { |
| "off": "Off", |
| "exclusive": "All Anthropic requests", |
| "pooled": "Pooled (one slot)", |
| "fallback": "Fallback only" |
| }, |
| "mcp": { |
| "title": "MCP Servers (via local proxy)", |
| "title_tooltip": "Exposes optional /mcp/* endpoints on this local proxy so MCP clients can connect. Available only when the service is running, z.ai is configured, and the corresponding toggles are enabled.", |
| "enabled": "Enable MCP proxy", |
| "enabled_tooltip": "Master switch for MCP endpoints. When off, all /mcp/* routes return 404.", |
| "web_search": "Web Search", |
| "web_search_tooltip": "Exposes /mcp/web_search_prime/mcp and forwards requests to the z.ai Web Search MCP upstream.", |
| "web_reader": "Web Reader", |
| "web_reader_tooltip": "Exposes /mcp/web_reader/mcp and forwards requests to the z.ai Web Reader MCP upstream.", |
| "vision": "Vision", |
| "vision_tooltip": "Exposes /mcp/zai-mcp-server/mcp (local MCP server) that provides vision tools backed by z.ai.", |
| "local_endpoints": "Local endpoints (configure your MCP client to use these URLs):", |
| "local_endpoints_tooltip": "Use these URLs in your MCP client. They share the same host/port as the API Proxy and follow the proxy authorization policy." |
| } |
| }, |
| "request_timeout": "Request Timeout", |
| "request_timeout_tooltip": "Maximum time (seconds) the proxy waits for an upstream response, including streaming. Increase for long generations; restart required to apply.", |
| "request_timeout_hint": "Default 120s, range 30-7200s. Restart service to apply changes.", |
| "enable_logging": "Enable Request Logging", |
| "enable_logging_hint": "Record history for debugging (Minor perf cost)", |
| "upstream_proxy": { |
| "title": "Global Upstream Proxy (Global Proxy)", |
| "desc": "When enabled, all external requests (API Proxy, Token Refresh, Quota Check, Update Check) will be routed through this proxy.", |
| "desc_short": "Fallback proxy used when no suitable proxy is found in the pool.", |
| "enable": "Enable Upstream Proxy", |
| "url": "Proxy URL", |
| "url_placeholder": "e.g. http://127.0.0.1:7890 or socks5://127.0.0.1:7890", |
| "tip": "Supports HTTP, HTTPS and SOCKS5.", |
| "socks5h_hint": "To bypass upstream risk control and use Remote DNS resolution, manually change the protocol to socks5h://", |
| "validation_error": "Proxy URL is required when upstream proxy is enabled", |
| "restart_hint": "Proxy settings saved. Restart the app to apply changes." |
| }, |
| "scheduling": { |
| "title": "Account Rotation & Scheduling", |
| "title_tooltip": "Controls how sessions are bound to accounts and how rate limits are handled.", |
| "subtitle": "Optimizes Prompt Caching and rate limit handling for all protocols (OpenAI/Gemini/Claude).", |
| "mode": "Scheduling Mode", |
| "mode_tooltip": "Cache-First: Bind session to account, wait on rate limit (maximize cache utility); Balance: Bind session, switch account on rate limit; Performance: Standard Round-robin.", |
| "modes": { |
| "CacheFirst": "Cache First", |
| "Balance": "Balance", |
| "PerformanceFirst": "Performance" |
| }, |
| "modes_desc": { |
| "CacheFirst": "Binds session to account, waits precisely if limited (Maximizes Prompt Cache hits).", |
| "Balance": "Binds session, auto-switches to available account if limited (Balanced cache & availability).", |
| "PerformanceFirst": "No session binding, pure round-robin rotation (Best for high concurrency)." |
| }, |
| "max_wait": "Max Wait (sec)", |
| "max_wait_tooltip": "Only used in 'Cache First' mode: wait instead of switching if the rate limit reset time is below this value.", |
| "clear_bindings": "Clear Session Bindings", |
| "clear_bindings_tooltip": "Hard reset all session-account bindings, forcing accounts to be re-assigned on next request.", |
| "clear_rate_limits": "Clear Rate Limit Records", |
| "clear_rate_limits_tooltip": "Immediately clear local rate limit records for all accounts, forcing next requests to try upstream directly." |
| }, |
| "circuit_breaker": { |
| "title": "Adaptive Circuit Breaker", |
| "tooltip": "Automatically increases lockout duration for accounts that repeatedly fail with quota exhaustion. This prevents wasting API calls on dead accounts while allowing transient errors to recover quickly.", |
| "backoff_levels": "Backoff Levels (Seconds)", |
| "input_placeholder": "Enter backoff durations in seconds, separated by commas", |
| "level": "Lv {{level}}", |
| "invalid_format": "Invalid format. Use comma separated numbers (e.g. 60, 300)", |
| "clear_records": "Clear All Rate Limit Records" |
| }, |
| "experimental": { |
| "title": "Experimental Settings", |
| "title_tooltip": "Exploratory features that may be adjusted or removed in future versions.", |
| "enable_usage_scaling": "Enable Usage Scaling", |
| "enable_usage_scaling_tooltip": "For Claude protocol. Enables aggressive scaling when total input exceeds 30k tokens to prevent frequent client-side compression. Note: Reported usage will not reflect actual billing after enabling.", |
| "context_compression_threshold_l1": "L1 Compression Threshold (Tool Trimming)", |
| "context_compression_threshold_l1_tooltip": "Trims old tool call records to save space. Recommended: 0.4 (40%)", |
| "context_compression_threshold_l2": "L2 Compression Threshold (Thinking Compression)", |
| "context_compression_threshold_l2_tooltip": "Compresses early thinking blocks while preserving signatures. Recommended: 0.55 (55%)", |
| "context_compression_threshold_l3": "L3 Compression Threshold (Summary Pivot)", |
| "context_compression_threshold_l3_tooltip": "Ultimate reset: generates an XML state summary and pivots to a fresh session. Most token-efficient. Recommended: 0.7 (70%)" |
| }, |
| "opencode_sync": { |
| "card_title": "OpenCode", |
| "status": { |
| "detecting": "Detecting...", |
| "installed": "Installed ({{version}})", |
| "not_installed": "Not Installed", |
| "synced": "Synced", |
| "not_synced": "Not Synced", |
| "current_base_url": "Current Base URL" |
| }, |
| "sync_accounts": "Sync accounts to antigravity-accounts.json", |
| "btn_sync": "Sync Config", |
| "btn_view": "View Config", |
| "btn_restore": "Restore", |
| "btn_restore_backup": "Restore Backup", |
| "btn_clear": "Clear Config", |
| "clear_confirm_title": "Confirm Clear Config", |
| "clear_confirm_message": "Are you sure you want to clear OpenCode configuration? This will remove the config file.", |
| "toast": { |
| "config_missing": "Please generate API Key and start service first", |
| "sync_success": "OpenCode config synced successfully", |
| "sync_error": "OpenCode sync failed: {{error}}", |
| "clear_success": "OpenCode config cleared successfully", |
| "clear_error": "Failed to clear OpenCode config: {{error}}" |
| }, |
| "modal": { |
| "view_title": "OpenCode Config Viewer", |
| "copy_success": "Config copied" |
| }, |
| "sync_confirm_title": "Confirm Sync", |
| "sync_confirm_message": "OpenCode config will be overwritten based on current proxy settings. Continue?", |
| "restore_confirm": "Are you sure you want to restore OpenCode to default settings?", |
| "restore_backup_confirm": "Are you sure you want to restore OpenCode config from backup?", |
| "modal_title": "Select OpenCode Models", |
| "select_models": "Select models to sync", |
| "auth_plugin_warning": "Detected opencode-antigravity-auth plugin. Sync only creates provider antigravity-manager and will not overwrite the google provider/plugin.", |
| "btn_confirm_sync": "Confirm Sync", |
| "custom_base_url_label": "Custom Manager BaseURL", |
| "custom_base_url_desc": "For Docker Compose networking", |
| "custom_base_url_reset": "Reset" |
| }, |
| "droid_sync": { |
| "modal_title": "Add models to Droid", |
| "modal_desc": "Selected models will be added as customModels to settings.json", |
| "selected": "selected", |
| "btn_confirm_sync": "Add selected models", |
| "toast": { |
| "no_models_selected": "Please select at least one model", |
| "sync_success_count": "Added {{count}} model(s) to Droid", |
| "sync_error": "Sync failed: {{error}}" |
| } |
| } |
| }, |
| "cloudflared": { |
| "title": "Public Access (Cloudflared)", |
| "subtitle": "Expose your local service to the internet via Cloudflare Tunnel", |
| "not_installed": "Cloudflared not installed", |
| "install_hint": "Cloudflared is a free tunnel tool from Cloudflare. It exposes your local proxy to the internet without a public IP or port forwarding. Click the button below to install.", |
| "install": "Install Now", |
| "installing": "Installing...", |
| "install_success": "Cloudflared installed successfully", |
| "install_failed": "Installation failed: {{error}}", |
| "installed": "Installed", |
| "version": "Version", |
| "mode_label": "Tunnel Mode", |
| "mode_quick": "Quick Tunnel", |
| "mode_quick_desc": "Auto-generated temporary URL (*.trycloudflare.com), no account needed, URL changes on restart", |
| "mode_auth": "Named Tunnel", |
| "mode_auth_desc": "Use Cloudflare account token, supports custom domain, persistent URL", |
| "token": "Tunnel Token", |
| "token_placeholder": "Paste your Cloudflare Tunnel Token here", |
| "token_hint": "Get from Cloudflare Zero Trust dashboard", |
| "token_required": "Token is required for Named Tunnel mode", |
| "use_http2": "Use HTTP/2", |
| "use_http2_desc": "More compatible, recommended for China mainland", |
| "status_label": "Tunnel Status", |
| "status_stopped": "Stopped", |
| "status_starting": "Starting...", |
| "status_running": "Running", |
| "status_stopping": "Stopping...", |
| "status_error": "Error", |
| "public_url": "Public URL", |
| "public_url_placeholder": "Public URL will appear here after tunnel starts", |
| "copy_url": "Copy URL", |
| "url_copied": "URL copied", |
| "start_tunnel": "Start Tunnel", |
| "stop_tunnel": "Stop Tunnel", |
| "running": "Tunnel Running", |
| "started": "Tunnel started", |
| "stopped": "Tunnel stopped", |
| "start_failed": "Start failed: {{error}}", |
| "stop_failed": "Stop failed: {{error}}", |
| "require_proxy_running": "Please start the local proxy service first", |
| "connection_info": "Connection Info", |
| "local_port": "Local Port", |
| "tunnel_protocol": "Tunnel Protocol" |
| }, |
| "example": { |
| "title": "Usage Examples", |
| "curl": "cURL", |
| "python": "Python", |
| "python_anthropic": "from anthropic import Anthropic\n\nclient = Anthropic(\n # Recommended: 127.0.0.1\n base_url=\"{{baseUrl}}\",\n api_key=\"{{apiKey}}\"\n)\n\n# Note: Antigravity supports calling any model via the Anthropic SDK\nresponse = client.messages.create(\n model=\"{{modelId}}\",\n max_tokens=1024,\n messages=[{\"role\": \"user\", \"content\": \"Hello\"}]\n)\n\nprint(response.content[0].text)", |
| "python_gemini": "# Install: pip install google-generativeai\nimport google.generativeai as genai\n\n# Use Antigravity proxy address (recommended 127.0.0.1)\ngenai.configure(\n api_key=\"{{apiKey}}\",\n transport='rest',\n client_options={'api_endpoint': '{{rawBaseUrl}}'}\n)\n\nmodel = genai.GenerativeModel('{{modelId}}')\nresponse = model.generate_content(\"Hello\")\nprint(response.text)", |
| "python_openai_image": "from openai import OpenAI\n\nclient = OpenAI(\n base_url=\"{{baseUrl}}\",\n api_key=\"{{apiKey}}\"\n)\n\nresponse = client.chat.completions.create(\n model=\"{{modelId}}\",\n # Option 1: use size (recommended)\n # Supported: \"1024x1024\" (1:1), \"1280x720\" (16:9), \"720x1280\" (9:16), \"1216x896\" (4:3)\n extra_body={ \"size\": \"1024x1024\" },\n\n # Option 2: use model suffix\n # e.g. gemini-3-pro-image-16-9, gemini-3-pro-image-4-3\n # model=\"gemini-3-pro-image-16-9\",\n messages=[{\n \"role\": \"user\",\n \"content\": \"Draw a futuristic city\"\n }]\n)\n\nprint(response.choices[0].message.content)", |
| "python_openai": "from openai import OpenAI\n\nclient = OpenAI(\n base_url=\"{{baseUrl}}\",\n api_key=\"{{apiKey}}\"\n)\n\nresponse = client.chat.completions.create(\n model=\"{{modelId}}\",\n messages=[{\"role\": \"user\", \"content\": \"Hello\"}]\n)\n\nprint(response.choices[0].message.content)" |
| }, |
| "examples": { |
| "title": "Usage Examples" |
| }, |
| "dialog": { |
| "confirm_regenerate": "Are you sure to regenerate API Key? The old key will be invalid immediately.", |
| "operate_failed": "Operation failed: {{error}}", |
| "reset_mapping_title": "Reset Model Mapping", |
| "reset_mapping_msg": "Are you sure you want to reset all model mappings to system defaults? This action cannot be undone.", |
| "regenerate_key_title": "Regenerate API Key", |
| "regenerate_key_msg": "Are you sure you want to regenerate the API Key? The old key will be invalidated immediately.", |
| "clear_bindings_title": "Clear Session Bindings", |
| "clear_bindings_msg": "Are you sure you want to clear all session-account bindings?", |
| "clear_rate_limits_title": "Clear Rate Limit Records", |
| "clear_rate_limits_confirm": "Are you sure you want to clear all local rate limit records?" |
| }, |
| "model": { |
| "flash": "Fast Response", |
| "flash_preview": "Flash Preview (Flash 3.1)", |
| "flash_lite": "Lite & Fast (Lite)", |
| "flash_thinking": "Thinking Capability (Thinking)", |
| "pro_legacy": "Legacy Pro", |
| "pro_low": "3.1 Pro Low", |
| "pro_high": "3.1 Pro High", |
| "pro_image": "Image Generation (1:1)", |
| "pro_image_16_9": "Image Generation (16:9)", |
| "pro_image_9_16": "Image Generation (9:16)", |
| "pro_image_4_3": "Image Generation (4:3)", |
| "pro_image_3_4": "Image Generation (3:4)", |
| "pro_image_1_1": "Image Generation (1:1)", |
| "claude_sonnet": "Code Reasoning (Claude 4.6)", |
| "claude_sonnet_thinking": "Chain of Thought (4.6 Think)", |
| "claude_opus_thinking": "Strongest Thinking (Opus Think)", |
| "gemini_2_5_flash": "Flash Model (2.5 Flash)", |
| "gemini_2_5_pro": "High Performance (2.5 Pro)", |
| "claude_4_6": "Latest Reasoning (4.6)" |
| }, |
| "mapping": { |
| "title": "Claude Code Model Mapping", |
| "description": "Map Claude Code models to Antigravity models. Optimize cost and speed by routing requests intelligently.", |
| "default": "Default", |
| "sonnet_desc": "Most capable for complex work", |
| "opus_desc": "Premium tier", |
| "haiku_desc": "Fastest for quick answers", |
| "maps_to": "Maps to Antigravity", |
| "apply_recommended": "Apply Recommended", |
| "restore_defaults": "Restore Default Configuration", |
| "reset_all": "Reset All" |
| }, |
| "models": { |
| "flash": "Ultra-fast", |
| "flash_thinking": "Thinking Capability", |
| "pro_high": "Best Reasoning", |
| "pro_low": "Low Quota", |
| "sonnet": "Code Reasoning", |
| "sonnet_thinking": "Chain of Thought", |
| "opus_thinking": "Strongest Thinking" |
| }, |
| "router": { |
| "title": "Model Router", |
| "subtitle": "Route models by series or add custom exact mappings.\nNote: Native Claude pass-through models (e.g. claude-sonnet-4-6-thinking, claude-opus-4-6-thinking) bypass series groups by default. Use \"Expert Custom Routing\" to override.", |
| "subtitle_simple": "Customize model routing with wildcards or exact mappings", |
| "background_task_title": "Background Task Model", |
| "background_task_desc": "Model used for Claude CLI background tasks like title generation, summary, etc. (Default: gemini-2.5-flash)", |
| "use_default": "Use System Default", |
| "current_model": "Current Model", |
| "apply_presets": "Apply Presets", |
| "presets_applied": "Presets applied successfully", |
| "preset_default": "Default Preset", |
| "preset_default_desc": "GPT-4 → Gemini Pro, Claude → Opus", |
| "preset_performance": "Performance First", |
| "preset_performance_desc": "Use high-performance models for all", |
| "preset_cost": "Cost Optimized", |
| "preset_cost_desc": "Prioritize cost-effective models", |
| "preset_balanced": "Balanced Mode", |
| "preset_balanced_desc": "Balance performance and cost", |
| "built_in_presets": "Built-in Presets", |
| "custom_presets": "Custom Presets", |
| "apply_selected": "Apply Selected", |
| "add_preset": "Save Current Mapping", |
| "delete_preset": "Delete Current Preset", |
| "cannot_delete_builtin": "Cannot delete built-in presets", |
| "no_mapping_to_save": "No mapping configuration to save", |
| "preset_name_required": "Preset name is required", |
| "preset_saved": "Preset saved successfully", |
| "manage_presets_title": "Manage Custom Presets", |
| "save_current_as_preset": "Save Current Configuration", |
| "preset_name_placeholder": "Enter preset name...", |
| "save_hint": "Saves the currently active model mappings as a reusable preset.", |
| "your_presets": "Your Presets", |
| "no_custom_presets": "No custom presets yet", |
| "mappings_count": "mappings", |
| "custom_preset_desc": "User defined preset", |
| "custom_mappings": "Custom Mappings", |
| "group_title": "Series Groups", |
| "gemini3_group_label": "Gemini 3 (Recommended)", |
| "gemini3_option_high": "gemini-3.1-pro-high (High Quality)", |
| "gemini3_option_low": "gemini-3.1-pro-low (Balanced)", |
| "gemini3_option_flash": "gemini-3-flash (Fast)", |
| "groups": { |
| "claude_45": { |
| "name": "Opus 4.6 TK Series", |
| "desc": "Opus 4.5 TK (Thinking)" |
| }, |
| "claude_35": { |
| "name": "Claude 3.5 Series", |
| "desc": "Sonnet 3.5, Haiku 3.5" |
| }, |
| "gpt_4": { |
| "name": "GPT-4 / o1 Series", |
| "desc": "GPT-4, Turbo, o1-preview" |
| }, |
| "gpt_4o": { |
| "name": "GPT-4o / 3.5 Series", |
| "desc": "GPT-4o, Mini, 3.5 Turbo" |
| }, |
| "gpt_5": { |
| "name": "GPT-5 Series", |
| "desc": "GPT-5.1, GPT-5.2 xhigh" |
| } |
| }, |
| "expert_title": "Expert Custom Routing", |
| "expert_subtitle": "Precise matching for any original model ID.", |
| "custom_mapping_tip": "💡 Supports manual input of any model ID to experience unreleased models (e.g. claude-opus-4-6).", |
| "custom_mapping_warning": "Note: Not all accounts support unreleased models.", |
| "money_saving_tip": "💰 Cost-saving tip:", |
| "haiku_optimization_tip": "Claude CLI uses {{model}} for background tasks by default. Map it to a cheaper Flash model to save ~95% costs", |
| "haiku_optimization_btn": "Quick Optimize", |
| "haiku_tip_title": "💰 Cost-saving tip:", |
| "haiku_tip_body_before": "Claude CLI defaults to", |
| "haiku_tip_body_after": "for background tasks; mapping it to a cheaper Flash model can save about 95% of the cost.", |
| "haiku_tip_action": "Optimize", |
| "reset_confirm": "Reset all mappings to system defaults?", |
| "reset_mapping": "Reset Mapping", |
| "add_mapping": "Add Mapping", |
| "current_list": "Custom List", |
| "no_custom_mapping": "No custom mappings yet", |
| "gemini3_only_warning": "⚠️ Gemini 3 series only", |
| "default_suffix": " (Default)", |
| "original_id": "Original ID", |
| "route_to": "Route To", |
| "select_target_model": "Select Target Model", |
| "original_placeholder": "Original (e.g. gpt-4 or gpt-4*)" |
| }, |
| "multi_protocol": { |
| "title": "Multi-Protocol Support", |
| "subtitle": "Seamlessly integrate with your favorite AI tools and CLIs", |
| "description": "The local proxy supports OpenAI, Anthropic, and Gemini protocols, ensuring compatibility with a wide range of applications.", |
| "openai_label": "OpenAI Protocol", |
| "anthropic_label": "Anthropic Protocol", |
| "openai_tools": "Cherry Studio, NextChat", |
| "anthropic_tools": "Claude Code CLI", |
| "gemini_label": "Gemini Protocol", |
| "gemini_tools": "Google AI SDK, LangChain", |
| "quick_integration": "Quick Integration", |
| "click_tip": "👆 Click a model to update code examples", |
| "copy_base": "Copy Base" |
| }, |
| "supported_models": { |
| "title": "Supported Models & Integration", |
| "model_name": "Model Name", |
| "model_id": "Model ID", |
| "description": "Description", |
| "action": "Action" |
| }, |
| "cli_sync": { |
| "title": "One-click CLI Sync", |
| "subtitle": "Quickly sync current API endpoints and keys to your local AI CLI tools.", |
| "card_title": "{{name}} Config", |
| "status": { |
| "not_installed": "Not detected", |
| "installed": "v{{version}}", |
| "synced": "Pointed to this app", |
| "not_synced": "Not synced", |
| "detecting": "Detecting...", |
| "current_base_url": "Current Base URL" |
| }, |
| "model_select": "Select Model", |
| "btn_sync": "Sync Config Now", |
| "btn_view": "View Config", |
| "btn_restore": "Restore Defaults", |
| "btn_restore_backup": "Restore Backup", |
| "restore_confirm": "Are you sure you want to restore the configuration for {{name}} to the official default URL?", |
| "restore_backup_confirm": "Backup configuration found. Are you sure you want to restore it?", |
| "modal": { |
| "view_title": "{{name}} Config Content", |
| "copy_success": "Config content copied" |
| }, |
| "toast": { |
| "sync_success": "Sync successful! {{name}} is ready.", |
| "sync_error": "Sync failed: {{error}}" |
| }, |
| "sync_confirm_title": "Sync Confirmation", |
| "sync_confirm_message": "Ready to sync {{name}} configuration. ⚠️ Warning: This will overwrite your existing local configuration files (e.g. login tokens, API Keys). Are you sure you want to continue?" |
| } |
| }, |
| "monitor": { |
| "page_title": "API Monitor Dashboard", |
| "page_subtitle": "Real-time request logging and analysis", |
| "open_monitor": "Open Monitor", |
| "logging_status": { |
| "active": "Recording", |
| "paused": "Paused" |
| }, |
| "stats": { |
| "total": "Total", |
| "ok": "OK", |
| "err": "ERR" |
| }, |
| "filters": { |
| "placeholder": "Filter by model, path, or status...", |
| "quick_filters": "Quick Filters:", |
| "all": "All", |
| "error": "Error", |
| "chat": "Chat", |
| "gemini": "Gemini", |
| "claude": "Claude", |
| "images": "Images", |
| "reset": "Reset", |
| "by_account": "Filter by account", |
| "all_accounts": "All Accounts" |
| }, |
| "table": { |
| "status": "Status", |
| "method": "Method", |
| "model": "Model", |
| "protocol": "Protocol", |
| "account": "Account", |
| "path": "Path", |
| "usage": "Tokens", |
| "duration": "Duration", |
| "time": "Time", |
| "empty": "No requests recorded" |
| }, |
| "details": { |
| "title": "Request Details", |
| "request_payload": "Request Payload", |
| "response_payload": "Response Payload", |
| "duration": "Duration", |
| "tokens": "Tokens (I/O)", |
| "time": "Time", |
| "model": "Model", |
| "mapped_model": "Mapped Model", |
| "protocol": "Protocol", |
| "account_used": "Account Used", |
| "id": "Request ID", |
| "payload_empty": "No data" |
| }, |
| "dialog": { |
| "clear_title": "Clear Proxy Logs", |
| "clear_msg": "Are you sure you want to clear all proxy logs? This action cannot be undone." |
| }, |
| "network": { |
| "title": "Network Monitor", |
| "open": "Open Network Monitor", |
| "requests_count": "{{count}} requests", |
| "start_recording": "Start Recording", |
| "stop_recording": "Stop Recording", |
| "clear_requests": "Clear Requests", |
| "empty": "No requests recorded", |
| "waiting": "Waiting for response...", |
| "badge_error": "Error", |
| "table": { |
| "status": "Status", |
| "command": "Command", |
| "time": "Time", |
| "duration": "Duration" |
| }, |
| "sections": { |
| "general": "General", |
| "request_args": "Request Args", |
| "error_details": "Error Details", |
| "response": "Response" |
| }, |
| "fields": { |
| "status": "Status", |
| "start_time": "Start Time", |
| "duration": "Duration" |
| } |
| } |
| }, |
| "update_notification": { |
| "title": "Updating...", |
| "message": "A new version is ready with optimizations and improvements. Current: v{{current}}", |
| "ready": "Update Ready!", |
| "downloading": "Downloading update in background...", |
| "restarting": "Restarting application...", |
| "auto_update": "Auto Update", |
| "restart_prompt": "Update downloaded and ready to install. Restart now?", |
| "btn_restart": "Restart", |
| "btn_later": "Later", |
| "toast": { |
| "not_ready": "Update artifacts are not ready yet. Will retry later.", |
| "failed": "Auto-update failed" |
| } |
| }, |
| "login": { |
| "title": "Secure Access Control", |
| "desc": "Running in Web mode. Please enter management password or API Key to access.", |
| "placeholder": "Enter management password or API Key", |
| "btn_login": "Verify and Enter", |
| "btn_verifying": "Verifying...", |
| "error_invalid_key": "Invalid password or API Key, please try again", |
| "error_network": "Network connection failed, please check if the service is running", |
| "note": "Note: If a separate management password is set, please enter it; otherwise, enter API_KEY.", |
| "lookup_hint": "If forgotten, run docker logs antigravity-manager to find Current API Key or Web UI Password", |
| "config_hint": "Or run grep -E '\"api_key\"|\"admin_password\"' ~/.antigravity_tools/gui_config.json to view." |
| }, |
| "token_stats": { |
| "title": "Token Consumption Stats", |
| "hourly": "Hour", |
| "daily": "Day", |
| "weekly": "Week", |
| "total_tokens": "Total Tokens", |
| "input_tokens": "Input Tokens", |
| "output_tokens": "Output Tokens", |
| "accounts_used": "Active Accounts", |
| "models_used": "Models Used", |
| "model_trend": "Model Usage Trend", |
| "account_trend": "Account Usage Trend", |
| "usage_trend": "Token Usage Trend", |
| "by_account": "By Account", |
| "by_model": "By Model", |
| "by_account_view": "By Account", |
| "model_details": "Model Breakdown", |
| "account_details": "Account Breakdown", |
| "model": "Model", |
| "account": "Account", |
| "requests": "Requests", |
| "input": "Input", |
| "output": "Output", |
| "total": "Total", |
| "percentage": "Share", |
| "no_data": "No data available" |
| }, |
| "errors": { |
| "stream": { |
| "timeout_error": "Request timeout, please check your network connection", |
| "connection_error": "Connection failed, please check your network or proxy settings", |
| "decode_error": "Network unstable, data transmission interrupted. Try: 1) Check network 2) Switch proxy 3) Retry", |
| "stream_error": "Stream transmission error, please retry later", |
| "unknown_error": "Unknown error occurred, please retry later" |
| } |
| }, |
| "security": { |
| "title": "Security Monitor", |
| "refresh_data": "Refresh Data", |
| "refresh": "Refresh", |
| "tab_logs": "Access Logs", |
| "tab_stats": "Statistics", |
| "tab_blacklist": "Blacklist", |
| "tab_whitelist": "Whitelist", |
| "tab_config": "Security Config", |
| "stats": { |
| "total_requests": "Total Requests", |
| "total_requests_desc": "All recorded requests", |
| "unique_ips": "Unique IPs", |
| "unique_ips_desc": "Distinct client IP addresses", |
| "blocked_requests": "Blocked Requests", |
| "blocked_requests_desc": "Requests rejected by rules", |
| "ip_activity_token_usage": "IP Activity & Token Usage", |
| "hour": "Hr", |
| "day": "Day", |
| "week": "Wk", |
| "month": "Mo", |
| "rank": "Rank", |
| "ip_address": "IP Address", |
| "activity_reqs": "Activity (Reqs)", |
| "total_token": "Total Token", |
| "prompt": "Prompt", |
| "completion": "Completion", |
| "no_data": "No Data" |
| }, |
| "logs": { |
| "search_placeholder": "Search IP, Path, User Agent...", |
| "username": "User", |
| "show_blocked_only": "Show Blocked Only", |
| "status": "Status", |
| "ip_address": "IP Address", |
| "method": "Method", |
| "path": "Path", |
| "duration": "Duration", |
| "time": "Time", |
| "reason": "Reason", |
| "blocked": "Blocked", |
| "no_logs": "No logs available", |
| "total_records": "Total {{total}} records", |
| "prev_page": "Previous", |
| "next_page": "Next", |
| "page_num": "Page {{page}}", |
| "per_page_suffix": "/page" |
| }, |
| "blacklist": { |
| "add_ip": "Add IP", |
| "search_placeholder": "Search...", |
| "added_at": "Added At", |
| "expires_at": "Expires At", |
| "no_data": "No blacklist data", |
| "add_title": "Add to Blacklist", |
| "ip_cidr_label": "IP Address or CIDR", |
| "ip_cidr_placeholder": "e.g. 192.168.1.1 or 10.0.0.0/24", |
| "reason_label": "Reason (Optional)", |
| "reason_placeholder": "e.g. Malicious scanning", |
| "expires_label": "Expire Time (Hours, Optional)", |
| "expires_placeholder": "Leave empty for permanent", |
| "cancel": "Cancel", |
| "confirm": "Add", |
| "add_btn": "Add" |
| }, |
| "whitelist": { |
| "add_ip": "Add Trusted IP", |
| "no_data": "No whitelist data", |
| "add_title": "Add to Whitelist", |
| "description_label": "Description (Optional)", |
| "description_placeholder": "e.g. Internal Server", |
| "cancel": "Cancel", |
| "confirm": "Add", |
| "add_btn": "Add" |
| }, |
| "config": { |
| "title": "Security Settings", |
| "save": "Save Changes", |
| "saving": "Saving...", |
| "blacklist_title": "IP Blacklist", |
| "blacklist_desc": "Manage blocked IP addresses and rules.", |
| "enable_blacklist": "Enable Blacklist Protection", |
| "block_msg_label": "Custom Block Message", |
| "block_msg_desc": "Response content returned to blocked clients.", |
| "whitelist_title": "IP Whitelist", |
| "whitelist_desc": "Manage trusted IP addresses.", |
| "enable_whitelist": "Enable Whitelist Mode", |
| "whitelist_warning": "Warning: Enabling whitelist mode will block ALL requests from IPs not in the whitelist. If you access via proxy, be careful not to lock yourself out.", |
| "whitelist_priority": "Whitelist Priority (Overrides Blacklist)", |
| "whitelist_priority_desc": "If enabled, whitelisted IPs will be allowed even if they match blacklist rules.", |
| "load_error": "Failed to load configuration", |
| "save_success": "Configuration saved", |
| "save_error": "Failed to save configuration" |
| } |
| }, |
| "user_token": { |
| "title": "User Tokens", |
| "total_users": "Total Users", |
| "active_tokens": "Active Tokens", |
| "total_created": "Total Created", |
| "create": "Create Token", |
| "username": "Username", |
| "token": "Token", |
| "expires": "Expires", |
| "usage": "Usage", |
| "ip_limit": "IP Limit", |
| "created": "Created", |
| "today_requests": "Today Requests", |
| "never": "Never", |
| "renew": "Renew", |
| "renew_button": "Renew", |
| "unlimited": "Unlimited", |
| "create_title": "Create New Token", |
| "description": "Description", |
| "curfew": "Curfew (Service Unavailable Time)", |
| "edit_title": "Edit Token", |
| "username_required": "Username is required", |
| "renew_success": "Renewed successfully", |
| "expires_day": "1 Day", |
| "expires_week": "1 Week", |
| "expires_month": "1 Month", |
| "expires_never": "Never", |
| "no_data": "No tokens found", |
| "placeholder_username": "e.g. user1", |
| "placeholder_desc": "Optional notes", |
| "placeholder_max_ips": "0 = Unlimited", |
| "hint_max_ips": "0 = Unlimited", |
| "hint_curfew": "Leave empty to disable. Based on server time." |
| } |
| } |