// ─── English Translations ─────────────────────────────── // This is the source of truth — all other languages match these keys. const en: Record = { // Sidebar "nav.dashboard": "Dashboard", "nav.models": "Models", "nav.providers": "Providers", "nav.providers_models": "Providers & Models", "nav.subagents": "Subagents", "providers_models.subtitle": "Manage model providers and models. Changes are written to ~/.pi/agent/.", "providers_models.config_sync_ready": "Config Sync Ready", "providers_models.providers_indexed": "Providers Indexed", "providers_models.models_catalogued": "Models Catalogued", "providers_models.builtin_custom": "Builtin / Custom", "providers_models.configured": "configured", "providers_models.enabled": "enabled", "providers_models.routing_sources": "routing sources", "providers_models.custom_providers": "Custom Providers", "providers_models.model_list": "Model List", "providers_models.add_provider_title": "Add Model Provider", "providers_models.add_provider_desc": "Configure a fully custom API endpoint and initial models.", "providers_models.name": "Name", "providers_models.name_placeholder": "e.g. Zhipu GLM", "providers_models.select_hint": "Select or add a provider", "providers_models.delete_provider_note": "This will remove the provider and all its models from your configuration.", "providers_models.saved": "Saved", "providers_models.save_failed": "Save failed, please retry", "providers_models.test_connection": "Test Connection", "providers_models.testing": "Testing...", "providers_models.test_ok": "Connected ({0} ms)", "providers_models.test_fail": "Failed: {0}", "providers_models.invalid_url": "Enter a valid http(s) URL", "providers_models.baseurl_override": "This URL overrides the built-in default (saved to models.json)", "providers_models.enable_all": "Enable All", "providers_models.disable_all": "Disable All", "providers_models.enabled_models_title": "Enabled Models", "providers_models.no_enabled_models": "No enabled models yet. Enable models in a provider's model list and they'll appear here.", "providers_models.api_key_env": "Uses the value of environment variable {0} as the key (not stored in plaintext)", "providers_models.api_key_add": "Add Key", "providers_models.api_key_count": "{0} keys", "providers_models.api_key_active": "In use", "providers_models.api_key_use": "Use this key", "providers_models.api_key_show": "Show key", "providers_models.api_key_hide": "Hide key", "providers_models.api_key_delete": "Delete key", "providers_models.api_key_empty": "No key yet — add one below.", "providers_models.api_key_duplicate": "This key is already in the list", "providers_models.api_key_switch_hint": "Pick a key to switch instantly — pi uses the one marked “In use”.", "providers_models.manual_key_switch_note": "Keys are used only from the one you mark In use; automatic switching is disabled.", "providers_models.auto_failover": "Auto key failover (429 / out of balance)", "providers_models.auto_failover_desc": "When the current key hits a rate limit or runs out of balance, automatically retry with the next key (terminal and Web Chat)", "providers_models.auto_failover_ineligible": "Requires a custom provider with ≥2 keys, a Base URL and API type (!command keys are not supported)", "providers_models.auto_failover_note": "Requires the pi-web-switch extension package (pi install). Keys paused for insufficient balance stay paused until manually restored here or via /pi-key-reset; rate-limit cooldown is ~60s.", "providers_models.key_paused_balance": "Paused · out of balance", "providers_models.key_cooldown": "Cooldown {0}s", "providers_models.key_reset_health": "Restore this key (clear paused/cooldown state)", "providers_models.test_all": "Test All", "providers_models.id_exists": "ID “{0}” already exists, pick another name", "providers_models.id_preview": "Will be saved as ID “{0}”", "providers_models.import": "Import", "providers_models.import_title": "Import Provider Config", "providers_models.import_desc": "Paste name, baseurl, key or key-1/key-2, and modelid. The provider, multiple keys, and models are detected automatically; imported models are enabled by default.", "providers_models.import_placeholder": "tokenrouter baseurl: https://api.example.com/v1\nkey-1: sk-xxxx\nkey-2: sk-yyyy\nmodelid: vendor/model-name", "providers_models.import_keys": "API key pool", "providers_models.import_key_count": "{0} keys", "providers_models.import_keys_placeholder": "key-1: sk-...\nkey-2: sk-...", "providers_models.import_keys_hint": "One key per line. Labels such as key-1, api-key-2, and token-3 are supported. The first key becomes active.", "providers_models.import_empty": "No valid content detected in the text", "providers_models.import_merge": "Provider “{0}” already exists — models will be merged into it", "providers_models.import_builtin_conflict": "Conflicts with builtin provider “{0}” — please change the name", "providers_models.fetch_models": "Fetch Models", "providers_models.fetch_no_endpoint": "This provider has no usable /models endpoint", "providers_models.fetching": "Fetching...", "providers_models.fetch_error": "Failed: {0}", "providers_models.fetch_empty": "No models returned by this provider", "providers_models.modality_vision": "Vision", "providers_models.modality_text": "Text", "providers_models.id_invalid": "Cannot derive a valid ID from the name or URL — fill in the base URL or use an ASCII name", "providers_models.fetch_title": "Import Models", "providers_models.fetch_desc": "Fetch available models from {0}'s /models endpoint and select models to import.", "providers_models.select_all": "Select All", "providers_models.deselect_all": "Deselect All", "providers_models.selected_count": "{0}/{1} models selected", "providers_models.confirm_import": "Import Selected", "providers_models.import_done": "Imported {0} models", "providers_models.no_match": "No matching models found", "nav.sessions": "Sessions", "nav.memory": "Memory", "nav.settings": "Settings", "mode.label": "Interface mode", "mode.basic": "Basic", "mode.chat": "Chat", "nav.speed_test": "Model Speed Test", "nav.generate": "Agnes 3.0 Flash", "nav.native": "Native macOS", "speed_test.title": "Model Speed Test", "speed_test.subtitle": "Fetch all models per provider and benchmark call latency and success rate with one click.", "speed_test.runs_note": "{0} runs per model", "speed_test.providers": "Providers", "speed_test.models": "models", "speed_test.run_all": "Run Speed Test", "speed_test.slow_mode": "Slow mode (avoid rate limit)", "speed_test.fetch_models": "Fetch Models", "speed_test.fetching": "Fetching", "speed_test.fetched_count": "Fetched and stored {0} models locally", "speed_test.fetch_failed": "Failed to fetch model list", "speed_test.clear": "Clear", "speed_test.empty_catalog": "No models fetched yet", "speed_test.empty_catalog_desc": "Click \"Fetch Models\" to pull all models from the provider endpoint. Used only for speed testing; does not affect configured models.", "speed_test.testing": "Testing", "speed_test.col_action": "Action", "speed_test.add_to_provider": "Add", "speed_test.exists": "Exists", "speed_test.add_all_passed": "Add all passed", "speed_test.add_all_passed_desc": "Add every model that passed 100% and is not yet configured to this provider", "speed_test.reset": "Reset", "speed_test.pending": "Pending", "speed_test.ok": "All OK", "speed_test.partial": "Partial", "speed_test.fail": "Failed", "speed_test.col_model": "Model", "speed_test.col_success_rate": "Success Rate", "speed_test.col_avg_latency": "Avg Latency", "speed_test.col_range": "Range (ms)", "speed_test.col_status": "Status", "speed_test.no_provider": "No testable providers", "speed_test.no_provider_desc": "Configure a provider with a base URL and models in Providers & Models first.", "official_usage.title": "Official Usage Query", "official_usage.subtitle": "Connect an official quota endpoint and monitor your remaining allowance.", "official_usage.local_secure": "LOCAL SECURE CONFIG", "official_usage.endpoint_config": "Endpoint Configuration", "official_usage.endpoint": "Request Endpoint", "official_usage.auth_mode": "Authentication Mode", "official_usage.auth_auto": "Auto detect", "official_usage.api_keys": "API Keys", "official_usage.api_keys_placeholder": "One API key per line or comma-separated", "official_usage.api_keys_hint": "Keys are stored locally on the server and never returned in plaintext. Use {apiKey} in the URL when required.", "official_usage.save_and_test": "Save & Test Query", "official_usage.saved_and_tested": "Saved and verified", "official_usage.configured_keys": "{0} API keys configured", "official_usage.query_failed": "Official usage query failed", "official_usage.loading": "Loading saved configuration...", "official_usage.current_quota": "Current Quota", "official_usage.refresh": "Refresh", "official_usage.total_quota": "Total Quota", "official_usage.used_quota": "Used", "official_usage.remaining_quota": "Remaining", "official_usage.remaining_percent": "Remaining Percentage", "official_usage.used_percent": "Used {0}%", "official_usage.no_result": "No quota result yet", "official_usage.no_result_desc": "Enter an official usage endpoint and API key, then save to test the query and display quota usage.", "app.subtitle": "Configuration Manager", "app.version": "pi-switch v0.9.4", "changelog.button": "Changelog", "changelog.title": "What's New", "changelog.0_9_4_1": "Added a lightweight Swift/AppKit Native macOS menu bar app for Pi usage, local ChatGPT/Codex usage, and official Codex quota.", "changelog.0_9_4_2": "The web Settings page can show or hide the Native menu bar feature through ~/.pi/agent/settings.json.", "changelog.0_9_4_3": "Improved the Native usage panel layout and documented its build and launch commands.", "changelog.0_9_2_1": "Fixed: editing models or adding/removing providers could silently delete disabled custom providers.", "changelog.0_9_2_2": "Provider import now builds a key pool — numbered labels like key-1 / key-2 no longer overwrite each other.", "changelog.0_9_2_3": "Docs: added the sister project pi-desktop and removed the stale Electron sections.", "changelog.0_9_1_1": "New Pi CLI settings page: 30 options across 6 sections, including per-model thinking levels.", "changelog.0_9_1_2": "New Skills and Commands pages listing local skill packs and Pi's built-in slash commands.", "changelog.0_9_1_3": "Single layout with chat as a nav item; nested settings writes no longer clobber sibling fields.", "changelog.0_9_0_1": "New Codex-style local chat workspace: streaming replies, collapsible thinking/tool steps.", "changelog.0_9_0_2": "Chat: model & thinking-level pickers, edit-and-resend, stop run, session usage panel.", "changelog.0_9_0_3": "Sidebar becomes a session list grouped by project, with new/delete/batch trash.", "changelog.0_9_0_4": "Basic/Chat UI mode switching; native folder picker for the chat workspace.", "changelog.0_9_0_5": "Providers can be disabled and re-enabled; config is kept while disabled.", "changelog.0_8_3_1": "Usage: shows the local openai-codex sign-in state under Pi.", "changelog.0_8_3_2": "Shows official OpenAI 5-hour and 7-day quota remaining, countdowns, and exact reset timestamps.", "changelog.0_8_2_1": "Speed-test results now persist across page switches; the last selected provider is remembered.", "changelog.0_8_2_2": "Models that pass 100% can be added to their provider in one click (single or batch); already-configured ones are marked.", "changelog.0_8_2_3": "Newly added models default to disabled until manually enabled.", "changelog.0_8_2_4": "Removed the search boxes from the provider model list and the remote-model fetch dialog.", "changelog.0_8_1_1": "Settings: removed the top stat cards (providers / enabled models / theme).", "changelog.0_8_1_2": "Package browser gained a \"Recommended\" tab; the search tab is filterable by All/Available/Installed.", "changelog.0_8_1_3": "Fix: memory & subagent model pickers are now real dropdowns; the subagent panel updates immediately after saving.", "changelog.0_8_0_1": "Settings: added a package browser dialog with \"Recommended\" and \"Search\" tabs.", "changelog.0_8_0_2": "Search tab fuzzy-searches npm for pi packages, filterable by All/Available/Installed.", "changelog.0_8_0_3": "One-click install with an installed-state indicator.", "changelog.0_7_0_1": "Added a floating \"User Guide\" button (bottom-right) with a project overview and per-module how-to.", "changelog.0_7_0_2": "Added \"Join Telegram group\" entry points (sidebar + user guide dialog).", "changelog.0_7_0_3": "Added this \"What’s New\" changelog dialog.", "changelog.0_6_2_1": "Subagents: edit a custom agent’s model and thinking level directly from the panel.", "changelog.0_6_1_1": "Fix: one-click optimize now runs in an async process, no longer freezing the dev server or auto-reloading the page.", "changelog.0_6_0_1": "Memory: added \"Optimize Memory\" to consolidate all three memory files at once.", "changelog.0_6_0_2": "Memory: added auto-write model config plus capacity limits and overflow strategy.", "changelog.0_6_0_3": "Memory: added per-file capacity progress bars and live optimize progress.", "changelog.0_6_0_4": "Settings: removed the GitHub Copilot config section.", "changelog.0_5_0_1": "Added the \"Model Speed Test\" module, replacing \"Official Usage\".", "changelog.0_5_0_2": "Speed test: one-click fetch models (stored separately) and a slow mode to avoid rate limits.", "changelog.0_5_0_3": "Providers page hides built-in providers for a cleaner UI.", // Subagents "subagents.summary": "{0} agents · {1} chains", "subagents.tab_agents": "Agents", "subagents.tab_chains": "Chains", "subagents.tab_history": "Run History", "subagents.no_agents": "No agents found", "subagents.no_agents_desc": "Create agent .md files in ~/.pi/agent/agents/ to get started.", "subagents.no_chains": "No chains found", "subagents.no_chains_desc": "Create chain .chain.md files in ~/.pi/agent/chains/ to get started.", "subagents.no_history": "No run history", "subagents.no_history_desc": "Subagent run history will appear here after agents are executed.", "subagents.model": "Model", "subagents.edit": "Edit", "subagents.save": "Save", "subagents.saving": "Saving…", "subagents.cancel": "Cancel", "subagents.saved": "Saved", "subagents.save_failed": "Save failed", "subagents.model_placeholder": "provider/model-id (blank = default)", "subagents.model_default": "(default)", "subagents.thinking_default": "(default)", "subagents.thinking": "Thinking Level", "subagents.tools": "Tools", "subagents.system_prompt_mode": "System Prompt Mode", "subagents.input": "Input Types", "subagents.system_prompt": "System Prompt", "subagents.empty_prompt": "(empty)", "subagents.steps_count": "steps", "subagents.pipeline": "Pipeline", "subagents.phase": "Phase", "subagents.label": "Label", "subagents.output": "Output", "subagents.agent": "Agent", "subagents.time": "Time", "subagents.status": "Status", "subagents.duration": "Duration", "subagents.status_ok": "OK", "subagents.status_error": "Error", "subagents.showing_recent": "Showing 100 most recent records", // Dashboard "dashboard.title": "Usage Statistics", "dashboard.source_pi": "Pi", "dashboard.source_all": "All sources", "dashboard.codex_logged_in": "Signed in to openai-codex", "dashboard.codex_not_logged_in": "Not signed in to openai-codex", "dashboard.codex_5h": "5 hours", "dashboard.codex_7d": "7 days", "dashboard.codex_remaining": "{0} remaining", "dashboard.codex_resets": "resets {0}", "dashboard.codex_quota_unavailable": "Official quota unavailable", "dashboard.source_chatgpt": "ChatGPT", "dashboard.data_source": "Data Source", "dashboard.copilot_not_configured": "GitHub Copilot not configured — add username & token in Settings → Advanced", "dashboard.copilot_api_error": "Failed to fetch Copilot usage from GitHub API — check token and billing platform", "dashboard.requests_count": "{0} requests · {1} total cost", "dashboard.subscription_usage": "Subscription usage", "dashboard.not_billed": "Not billed separately", "dashboard.load_error": "Unable to load usage data", "dashboard.load_error_hint": "The local usage reader did not respond. Check the service and try again.", "dashboard.retry": "Retry", "dashboard.refreshing": "updating", "dashboard.range.all": "All", "dashboard.range.today": "Today", "dashboard.range.7d": "7 Days", "dashboard.range.30d": "30 Days", "dashboard.range.custom": "Custom", "dashboard.to": "to", "dashboard.total_tokens": "Total Tokens", "dashboard.total_requests": "Total Requests", "dashboard.total_cost": "Total Cost", "dashboard.cache_hit_rate": "Cache Hit Rate", "dashboard.input": "Input", "dashboard.output": "Output", "dashboard.cache_create": "Cache Create", "dashboard.cache_hit": "Cache Hit", "dashboard.api_calls": "API calls made", "dashboard.usd": "USD", "dashboard.usage_trend": "Usage Trend", "dashboard.tokens_k": "Tokens (K)", "dashboard.cost_label": "Cost ($)", "dashboard.cost_label_usd": "Cost ($)", "dashboard.cost_label_cny": "Cost (¥)", "dashboard.request_log": "Request Log", "dashboard.provider_stats": "Provider Stats", "dashboard.model_stats": "Model Stats", "dashboard.time": "Time", "dashboard.provider": "Provider", "dashboard.model": "Model", "dashboard.cost": "Cost", "dashboard.requests": "Requests", "dashboard.no_data": "No request data in this time range", "dashboard.provider_stats_desc": "Provider statistics aggregated by provider", "dashboard.model_stats_desc": "Model statistics aggregated by model", "dashboard.last_updated": "Last updated {0}", "dashboard.refresh_now": "Refresh now", "dashboard.refresh_interval": "Refresh interval", "dashboard.switch_currency": "Switch currency", "dashboard.off": "Off", "dashboard.vs_prev": "vs previous period", "dashboard.invalid_range": "Start date cannot be later than end date", "dashboard.export_csv": "Export CSV", "dashboard.total_items": "{0} items", "dashboard.prev_page": "Prev", "dashboard.next_page": "Next", "dashboard.tokens": "Tokens", "dashboard.models_count": "Models", "dashboard.cost_share": "Cost share", "dashboard.operational_overview": "Operational Overview", "dashboard.avg_tokens_request": "Avg. Tokens / Request", "dashboard.avg_tokens_request_detail": "Across {0} active models", "dashboard.avg_cost_request": "Avg. Cost / Request", "dashboard.avg_cost_request_detail": "Across {0} active providers", "dashboard.peak_activity": "Peak Activity", "dashboard.peak_activity_detail": "{0} requests in this slot", "dashboard.active_models": "Active Models", "dashboard.active_models_detail": "Across {0} providers", "dashboard.token_composition": "Token Composition", "dashboard.cache_total": "Cache tokens", "dashboard.provider_mix": "Provider Distribution", "dashboard.provider_models": "{0} models", "dashboard.request_activity": "Request Activity", "dashboard.model_leaderboard": "Model Leaderboard", "dashboard.model_mix": "Model Distribution", "dashboard.detailed_analysis": "Detailed analysis", "dashboard.detailed_analysis_hint": "Operational metrics, composition and rankings", "dashboard.raw_data": "Raw data", "dashboard.raw_data_hint": "Request log and grouped statistics", "dashboard.monthly_view": "monthly view", // Models "models.search_placeholder": "Search models...", "models.add_model": "Add Model", "models.test_model": "Test Model", "models.edit_model": "Edit Model", "models.delete_model": "Delete Model", "models.no_models": "No models found", "models.enabled": "Enabled", "models.disabled": "Disabled", "models.model_id": "Model ID", "models.display_name": "Display Name", "models.free": "Free", "models.reasoning": "Reasoning", "models.image_input": "Image Input", "models.context_window": "Context Window", "models.max_tokens": "Max Tokens", "models.max_tokens_hint": "Default: {0}", "models.cost_input": "Input", "models.cost_output": "Output", "models.cost_cache_read": "Cache Read", "models.cost_cache_write": "Cache Write", "models.save": "Save", "models.cancel": "Cancel", "models.select_all": "Select All", "models.deselect_all": "Deselect All", "models.batch_delete": "Batch Delete", "models.batch_delete_count": "Delete ({0})", "models.batch_delete_confirm": "Delete {0} selected models? This cannot be undone.", "models.delete_confirm": "Are you sure you want to delete this model?", "models.pick_preset": "Pick from catalog", "models.pick_preset_placeholder": "Search popular models (Claude, GPT, Qwen, GLM, DeepSeek…)", "models.detected_catalog": "Matched: {0}", "models.detected_catalog_meta": "Matched: {0} · Context {1} · Max output {2}", "models.detected_heuristic": "Guessed from model ID", "models.manual_fill": "Manual", "models.preset_claude": "Claude-style", "models.preset_gpt": "GPT-style", "models.preset_reasoning": "Reasoning", "models.preset_small_local": "Local small", "models.audio_input": "Audio input", "models.quick_add": "Quick add", "models.quick_add_placeholder": "Type a model ID and press Enter (params auto-detected)", "models.copy_params": "Copy params", "models.params_copied": "Params copied", "models.catalog_hint": "Can't find your model? Just type the ID below — common parameters are detected automatically.", // Compat "compat.title": "API Compatibility", "compat.desc": "Keep the recommended values unless the matching error appears.", "compat.helper_title": "Compatibility helper", "compat.helper_desc": "After a model test finds a known error, this panel offers a one-click fix. You can also restore the recommended values.", "compat.helper_defaults": "Restore defaults", "compat.helper_detected": "Possible compatibility error detected", "compat.helper_apply": "Apply suggestion", "compat.developer_error": "400 developer is not one of [...] / unsupported role: developer", "compat.finish_error": "Stream ended without finish_reason", "compat.supports_developer_role": "Send system prompt as 'developer' role", "compat.supports_developer_role_desc": "When unset, pi uses developer by default. Keep it on only when the API supports it; turn it off for 400 developer is not one of [...] or unsupported role: developer.", "compat.developer_action_off": "Use system (turn off)", "compat.developer_action_on": "Turn on developer", "compat.supports_finish_reason": "Require finish_reason in the stream", "compat.supports_finish_reason_desc": "On by default: require finish_reason in the stream. Turn it off for Stream ended without finish_reason; turn it on for finish_reason is required.", "compat.finish_action_off": "Turn off strict check", "compat.finish_action_on": "Turn on strict check", "compat.supports_reasoning_effort": "Supports reasoning_effort", "compat.supports_reasoning_effort_desc": "Send reasoning_effort parameter. Disable if the API does not support it.", // Providers "providers.add_provider": "Add Provider", "providers.delete_provider": "Delete Provider", "providers_models.expand": "Expand ({0} more)", "providers_models.collapse": "Collapse", "providers_models.disable_provider": "Disable provider", "providers_models.enable_provider": "Enable provider", "providers_models.disabled": "Disabled", "providers.duplicate_provider": "Duplicate Provider", "providers.custom": "Custom", "providers.builtin": "Built-in", "providers.configured": "Configured", "providers.api_key": "API Key", "providers.base_url": "Base URL", "providers.api_type": "API Type", "providers.delete_confirm": "Are you sure you want to delete this provider?", // Sessions "sessions.title": "Sessions", "sessions.summary": "{0} sessions across {1} projects", "sessions.filter_placeholder": "Search projects or sessions...", "sessions.no_sessions": "No sessions found", "sessions.no_search_results": "No sessions match your search", "sessions.last_active": "Last active {0}", "sessions.sessions_count": "{0} sessions", "sessions.messages": "{0} messages", "sessions.delete_title": "Move to Trash", "sessions.delete_confirm": "Are you sure you want to move this session to the trash?", "sessions.delete_to_trash_note": "The session will be moved to the trash (~/.pi/agent/.trash) and can be restored anytime.", "sessions.cancel": "Cancel", "sessions.delete": "Delete", "sessions.deleting": "Deleting...", "sessions.protected": "Updated in the last 3 days — cannot delete", "sessions.delete_failed": "Failed to delete session file", "sessions.delete_error": "Error deleting session", "sessions.load_failed": "Failed to load sessions", "sessions.refresh": "Refresh", "sessions.auto_trashed": "Automatically moved {0} inactive sessions older than 14 days to Trash.", "sessions.expand_all": "Expand All", "sessions.collapse_all": "Collapse All", "sessions.more_count": "{0} more", "sessions.tab_sessions": "Sessions", "sessions.tab_trash": "Trash", "sessions.trash_desc": "Deleted sessions are kept in ~/.pi/agent/.trash and can be restored or permanently deleted.", "sessions.trash_empty": "Trash is empty", "sessions.restore": "Restore", "sessions.delete_forever": "Delete Forever", "sessions.delete_forever_confirm": "Are you sure you want to permanently delete? This cannot be undone.", "sessions.trashed_at": "Deleted {0}", "sessions.select_all": "Select all", "sessions.selected_count": "{0} selected", "sessions.restore_selected": "Restore Selected", "sessions.delete_selected": "Delete Selected", "sessions.preview_title": "Session Preview", "sessions.preview_total": "{0} messages total, showing first {1}", "sessions.preview_empty": "No previewable messages in this session", "sessions.preview_failed": "Failed to load preview", // Memory "memory.title": "Memory", "memory.summary": "pi-hermes-memory · {0} memories · {1} files", "memory.no_memory": "No memory files found", "memory.no_memory_desc": "pi-hermes-memory extension is not installed", "memory.project_memories": "Project Memories", "memory.user_profile": "User Profile", "memory.failure_records": "Failure Records", "memory.entries_count": "{0} entries", "memory.other": "Other", "memory.empty_file": "No memory entries", "memory.load_failed": "Failed to load memory", "memory.refresh": "Refresh", "memory.search_placeholder": "Search memory content...", "memory.no_results": "No matching memory entries", "memory.copy": "Copy", "memory.copied": "Copied", "memory.delete": "Delete", "memory.delete_title": "Delete Memory Entry", "memory.delete_confirm": "Are you sure you want to delete this memory entry?", "memory.delete_note": "This will modify the memory file directly and cannot be undone.", "memory.delete_failed": "Failed to delete memory entry", "memory.deleting": "Deleting...", "memory.cancel": "Cancel", "memory.files_indexed": "Files Indexed", "memory.entry_count": "Entry Count", "memory.text_volume": "Text Volume", "memory.characters_indexed": "characters indexed", "memory.channels": "Memory Channels", "memory.knowledge_synced": "Knowledge Base // Synced", "memory.files_indexed_detail": "{0} files · {1} memories", "memory.optimize": "Optimize Memory", "memory.optimizing": "Optimizing…", "memory.optimize_done": "Optimized · freed {0}", "memory.optimize_none": "Optimized · nothing to trim", "memory.optimize_failed": "Optimize failed: {0}", "memory.optimize_hint": "Runs pi's memory consolidation to merge duplicates and drop stale entries", "memory.config": "Memory Model", "memory.config_title": "Model for automatic memory writes", "memory.config_desc": "Automatic memory writes and consolidation run on this model (blank = default)", "memory.config_model": "Model", "memory.config_model_default": "(default / unset)", "memory.config_thinking": "Thinking level", "memory.config_timeout": "Consolidation timeout (s)", "memory.config_save": "Save", "memory.config_saving": "Saving…", "memory.config_saved": "Saved", "memory.config_save_failed": "Save failed", "memory.config_cancel": "Cancel", "memory.config_mem_limit": "Project memory limit (chars)", "memory.config_mem_limit_hint": "Failure records get 2x: {0}", "memory.config_user_limit": "User profile limit (chars)", "memory.config_overflow": "Overflow strategy", "memory.config_overflow_auto": "Auto-consolidate (recommended)", "memory.config_overflow_reject": "Reject writes", "memory.config_overflow_fifo": "Evict oldest", "common.today": "Today", "common.yesterday": "Yesterday", "common.days_ago": "{0} days ago", // Settings "settings.title": "Settings", "settings.subtitle": "Manage the pi coding agent's appearance, default models and extensions", "settings.stat_providers": "Providers", "settings.stat_enabled": "Enabled Models", "settings.stat_theme": "Active Theme", "settings.tab_models": "Models", "settings.tab_advanced": "Advanced", "settings.theme": "Theme", "settings.theme_desc": "Pick a color scheme for the interface", "settings.font_size": "Font Size", "settings.font_size_desc": "Adjust the overall interface font size", "settings.ui_zoom": "Interface Zoom", "settings.ui_zoom_desc": "Scale the entire interface by percentage (50%–200%)", "settings.ui_zoom_reset": "Reset", "settings.enabled_models_desc": "Click a tag to enable or disable a model", "settings.copilot_title": "GitHub Copilot", "settings.copilot_desc": "Track Copilot usage from the GitHub billing API (premium requests / AI credits)", "settings.copilot_username": "GitHub username", "settings.copilot_token": "Token (classic PAT)", "settings.copilot_save": "Save", "settings.copilot_saving": "Saving…", "settings.copilot_saved": "Saved — usage will refresh on next dashboard load", "settings.copilot_save_failed": "Save failed", "settings.copilot_token_hint": "Create a classic personal access token at github.com/settings/tokens (fine-grained tokens are not supported by the billing usage endpoints). Copilot usage only appears for accounts on the enhanced billing platform.", "settings.updates_title": "Update Check", "settings.updates_desc": "Check npm for new versions of pi core and installed extensions.", "settings.check_updates": "Check for Updates", "settings.updates_summary": "{0} update(s) available", "settings.updates_all_latest": "Everything is up to date", "settings.update_available": "Update available", "settings.updates_up_to_date": "Up to date", "settings.updates_lookup_failed": "Lookup failed", "settings.updates_failed": "Update check failed", "settings.update_all": "Update All", "settings.updating": "Updating…", "settings.update_success": "Successfully updated {0} item(s)", "settings.update_failed_names": "{0} item(s) failed to update: {1}", "settings.updates_hint": "Extensions are updated with npm install in ~/.pi/agent/npm; pi core is updated by running `pi update`. Restart pi after updating.", "settings.defaults": "Defaults", "settings.default_provider": "Default Provider", "settings.default_model": "Default Model", "settings.default_thinking": "Default Thinking Level", "settings.project_trust": "Project Trust", "settings.none": "— None —", "settings.appearance": "Appearance", "settings.light": "Light", "settings.dark": "Dark", "settings.system": "System", "settings.hide_thinking": "Hide thinking blocks", "settings.expand_run_steps": "Expand thinking and tool steps by default", "settings.show_native": "Show Native macOS menu bar", "settings.show_native_desc": "Controls the Pi and ChatGPT usage menu bars separately. The legacy showNative setting is still used as the default for compatibility.", "settings.show_pi_native": "Show Pi usage menu bar", "settings.show_chatgpt_native": "Show ChatGPT usage menu bar", "native.title": "Native macOS", "native.subtitle": "Lightweight native menu bar apps for viewing Pi and ChatGPT usage without opening the web panel.", "native.app_title": "Pi & ChatGPT Usage Menu Bars", "native.app_desc": "Build and launch separate Swift/AppKit menu bar apps for Pi and ChatGPT usage. They refresh data in the background and keep the web panel independent.", "native.requirement": "Requires macOS and the Swift Command Line Tools.", "native.features_title": "Features", "native.feature_usage": "Pi and ChatGPT token, cost, request, and cache statistics", "native.feature_quota": "ChatGPT / Codex official quota overview", "native.feature_background": "Background refresh without blocking the menu bar", "native.feature_lightweight": "Native Swift/AppKit implementation, no Electron or WebView", "native.source": "View Native source", "settings.enabled_models": "Enabled Models", "settings.no_models_enabled": "No models enabled. Enable models from the Models page.", "settings.packages": "Extensions & Packages", "settings.package_placeholder": "npm:package-name", "settings.add": "Add", "settings.install": "Install", "settings.browse_packages": "Browse & add packages", "settings.tab_recommended": "Recommended", "settings.tab_search": "Search", "settings.filter_all": "All", "settings.filter_available": "Available", "settings.filter_installed": "Installed", "settings.search_packages_placeholder": "Search packages (fuzzy)…", "settings.no_packages_found": "No matching packages found", "settings.installed": "Installed", "settings.view_on_npm": "View on npm", "settings.recommended_packages": "Recommended packages (one-click install)", "settings.install_all_recommended": "Install all recommended", "settings.add_custom_package": "Add another package manually…", "pkg.hermes_memory": "Long-term memory (read/write + consolidation)", "pkg.context_mode": "Large-output handling & knowledge base", "pkg.subagents": "Subagents & multi-step orchestration", "pkg.web_access": "Web fetch & search", "pkg.smart_fetch": "Browser-fingerprint web fetch", "pkg.rtk_optimizer": "RTK optimization & conventions", "pkg.puppeteer": "Browser automation", "pkg.intercom": "Cross-session coordination", "pkg.prompt_template": "Custom prompt templates & models", "pkg.notify": "Cross-platform notifications", "settings.no_packages": "No packages installed", "settings.import_export": "Import & Export", "settings.export": "Export Config", "settings.import": "Import Config", "settings.import_error": "Invalid config file format", "settings.danger_zone": "Danger Zone", "settings.reset": "Reset to Defaults", "settings.reset_title": "Reset Configuration?", "settings.reset_confirm": "This will reset all settings, auth keys, and custom providers to defaults. Changes are written directly to your pi config files (~/.pi/agent/). This action cannot be undone.", "settings.cancel": "Cancel", "settings.reset_action": "Reset", // InitGate / Loading "loading.config": "Loading pi configuration...", "loading.initializing": "Initializing...", "loading.error_title": "Failed to Load Configuration", "loading.retry": "Retry", // Language Switcher "language.label": "Language", "language.en": "English", "language.zh-CN": "简体中文", "language.zh-TW": "繁體中文", "language.ja": "日本語", "help.button": "User Guide", "help.title": "User Guide", "help.overview_title": "About this project", "help.overview_desc": "pi-web-switch is a visual control panel for the pi coding agent: review sessions, manage long-term memory, configure providers and models, edit subagents, benchmark models, and adjust global settings. All changes write directly to the config files under ~/.pi/agent and take effect immediately.", "help.modules_title": "Modules", "help.dashboard_title": "01 Dashboard", "help.dashboard_desc": "Overview of usage and recent activity.", "help.dashboard_s1": "See token usage, cost, and per-model stats.", "help.dashboard_s2": "Click \"Refresh now\" to rescan session data.", "help.sessions_title": "02 Sessions", "help.sessions_desc": "Browse, preview, and manage past sessions.", "help.sessions_s1": "Sessions are grouped by project; expand/collapse each.", "help.sessions_s2": "Deleting a session moves it to Trash — restore or purge.", "help.sessions_s3": "In Trash you can select and permanently delete in bulk.", "help.memory_title": "03 Memory", "help.memory_desc": "View and optimize pi-hermes-memory long-term memory.", "help.memory_s1": "Progress bars show each file’s capacity usage (by characters).", "help.memory_s2": "\"Optimize Memory\" runs a model to merge duplicates and drop stale entries.", "help.memory_s3": "\"Memory Model\" sets the auto-write model, thinking level, and capacity limits.", "help.providers_title": "04 Providers & Models", "help.providers_desc": "Manage API providers and their models.", "help.providers_s1": "Add a custom provider with its baseUrl and API key.", "help.providers_s2": "Use \"Fetch models\" to pull and search available models, then enable them.", "help.providers_s3": "Adjust per-model params like maxTokens.", "help.subagents_title": "05 Subagents", "help.subagents_desc": "View and edit subagents, chains, and run history.", "help.subagents_s1": "In \"Agents\", select a custom agent and click \"Edit\" to change its model and thinking level.", "help.subagents_s2": "The model field has a dropdown of all configured models.", "help.settings_title": "06 Settings", "help.settings_desc": "Appearance, model defaults, and advanced options.", "help.settings_s1": "Switch theme, font size, UI zoom, and language.", "help.settings_s2": "Manage pi packages and check for updates.", "help.speedtest_title": "07 Model Speed Test", "help.speedtest_desc": "Batch-test custom provider models for availability and latency.", "help.speedtest_s1": "Pick a provider and use \"Fetch models\" to load the test set (stored separately).", "help.speedtest_s2": "Run the test to see success rate, average latency, and latency range.", "help.speedtest_s3": "Enable \"Slow mode\" to reduce 429 rate limits.", "help.contact_title": "Need help?", "help.contact_desc": "For questions, suggestions, or bug reports, join our Telegram group — click the button below to join.", "help.contact_join": "Join Telegram group", }; export default en;