522 lines
27 KiB
JavaScript
522 lines
27 KiB
JavaScript
(() => {
|
|
const LOCALES = {
|
|
en: {
|
|
_lang: "en",
|
|
_label: "English",
|
|
_speech: "en-US",
|
|
// boot.js
|
|
cancelling: "Cancelling\u2026",
|
|
cancel_failed: "Cancel failed: ",
|
|
mic_denied: "Microphone access denied. Check browser permissions.",
|
|
mic_no_speech: "No speech detected. Try again.",
|
|
mic_network: "Speech recognition unavailable.",
|
|
mic_error: "Voice input error: ",
|
|
session_imported: "Session imported",
|
|
import_failed: "Import failed: ",
|
|
import_invalid_json: "Invalid JSON",
|
|
image_pasted: "Image pasted: ",
|
|
// messages.js
|
|
edit_message: "Edit message",
|
|
regenerate: "Regenerate response",
|
|
copy: "Copy",
|
|
copied: "Copied!",
|
|
you: "You",
|
|
thinking: "Thinking",
|
|
expand_all: "Expand all",
|
|
collapse_all: "Collapse all",
|
|
edit_failed: "Edit failed: ",
|
|
regen_failed: "Regenerate failed: ",
|
|
reconnect_active: "A response is still being generated. Reload when ready?",
|
|
reconnect_finished: "A response was in progress when you last left. Messages may have updated.",
|
|
// approval card
|
|
approval_heading: "Approval required",
|
|
approval_desc_prefix: "Dangerous command detected",
|
|
approval_btn_once: "Allow once",
|
|
approval_btn_once_title: "Allow this one command (Enter)",
|
|
approval_btn_session: "Allow session",
|
|
approval_btn_session_title: "Allow for this conversation session",
|
|
approval_btn_always: "Always allow",
|
|
approval_btn_always_title: "Always allow this command pattern",
|
|
approval_btn_deny: "Deny",
|
|
approval_btn_deny_title: "Deny \u2014 do not run this command",
|
|
approval_responding: "Responding\u2026",
|
|
clarify_heading: "Clarification needed",
|
|
clarify_hint: "Pick a choice, or type your own answer below.",
|
|
clarify_other: "Other",
|
|
clarify_send: "Send",
|
|
clarify_input_placeholder: "Type your response\u2026",
|
|
clarify_responding: "Responding\u2026",
|
|
untitled: "Untitled",
|
|
n_messages: (n) => `${n} messages`,
|
|
model_unavailable: " (unavailable)",
|
|
model_unavailable_title: "This model is no longer in your current provider list",
|
|
provider_mismatch_warning: (m, p) => `"${m}" may not work with your configured provider (${p}). Send anyway, or run \`hermes model\` in your terminal to switch.`,
|
|
provider_mismatch_label: "Provider mismatch",
|
|
model_custom_label: "Custom model ID",
|
|
model_custom_placeholder: "e.g. openai/gpt-5.4",
|
|
model_search_placeholder: "Search models\u2026",
|
|
model_search_no_results: "No models found",
|
|
// commands.js
|
|
cmd_clear: "Clear conversation messages",
|
|
cmd_compress: "Manually compress conversation context (usage: /compress [focus topic])",
|
|
cmd_compact_alias: "Legacy alias for /compress",
|
|
cmd_model: "Switch model (e.g. /model gpt-4o)",
|
|
cmd_workspace: "Switch workspace by name",
|
|
cmd_new: "Start a new chat session",
|
|
cmd_usage: "Toggle token usage display on/off",
|
|
cmd_theme: "Switch appearance (theme: system/dark/light, skin: default/ares/mono/slate/poseidon/sisyphus/charizard)",
|
|
cmd_personality: "Switch agent personality",
|
|
cmd_skills: "List available Hermes skills",
|
|
available_commands: "Available commands:",
|
|
type_slash: "Type / to see commands",
|
|
conversation_cleared: "Conversation cleared",
|
|
command_label: "Command",
|
|
context_compaction_label: "Context compaction",
|
|
reference_only_label: "Reference only",
|
|
model_usage: "Usage: /model <name>",
|
|
no_model_match: 'No model matching "',
|
|
switched_to: "Switched to ",
|
|
workspace_usage: "Usage: /workspace <name>",
|
|
no_workspace_match: 'No workspace matching "',
|
|
switched_workspace: "Switched to workspace: ",
|
|
workspace_switch_failed: "Workspace switch failed: ",
|
|
new_session: "New session created",
|
|
compressing: "Requesting context compression...",
|
|
compress_running_label: "Compressing",
|
|
compress_complete_label: "Compression complete",
|
|
compress_failed_label: "Compression failed",
|
|
focus_label: "Focus",
|
|
token_usage_on: "Token usage on",
|
|
token_usage_off: "Token usage off",
|
|
theme_usage: "Usage: /theme ",
|
|
theme_set: "Theme: ",
|
|
no_active_session: "No active session",
|
|
slash_skill_badge: "Skill",
|
|
slash_skill_desc: "Invoke this skill",
|
|
cmd_stop: "Stop the current response",
|
|
cmd_title: "Get or set the session title",
|
|
cmd_retry: "Resend the last message",
|
|
cmd_undo: "Remove the last exchange",
|
|
cmd_status: "Show session info",
|
|
cmd_voice: "Toggle microphone input",
|
|
stream_stopped: "Response stopped.",
|
|
no_active_task: "No active task to stop.",
|
|
cancel_unavailable: "Cancel not available.",
|
|
retry_failed: "Retry failed: ",
|
|
undo_failed: "Undo failed: ",
|
|
undid_n_messages: "Removed",
|
|
undid_messages_suffix: "message(s).",
|
|
status_heading: "Session Status",
|
|
status_session_id: "Session ID",
|
|
status_title: "Title",
|
|
status_model: "Model",
|
|
status_workspace: "Workspace",
|
|
status_personality: "Personality",
|
|
status_messages: "Messages",
|
|
status_agent_running: "Agent running",
|
|
status_yes: "Yes",
|
|
status_no: "No",
|
|
status_load_failed: "Failed to load status: ",
|
|
title_current: "Current title",
|
|
title_change_hint: "Use `/title <new name>` to rename.",
|
|
title_set: "Title set to",
|
|
cmd_webui_only_session: "This command is not available for CLI-imported sessions.",
|
|
cmd_voice_use_mic: "Click the mic button in the composer.",
|
|
usage_heading: "Token Usage",
|
|
usage_default_model: "default",
|
|
usage_unknown: "unknown",
|
|
usage_input_tokens: "Input tokens",
|
|
usage_output_tokens: "Output tokens",
|
|
usage_total: "Total tokens",
|
|
usage_estimated_cost: "Estimated cost",
|
|
usage_settings_tip: "Note: cost estimates are approximate.",
|
|
usage_load_failed: "Failed to load usage: ",
|
|
usage_personality_none: "none",
|
|
no_personalities: "No personalities found (add them to ~/.hermes/personalities/)",
|
|
available_personalities: "Available personalities:",
|
|
personality_switch_hint: "\n\nUse `/personality <name>` to switch, or `/personality none` to clear.",
|
|
personalities_load_failed: "Failed to load personalities",
|
|
personality_cleared: "Personality cleared",
|
|
personality_set: "Personality: ",
|
|
failed_colon: "Failed: ",
|
|
// ui.js
|
|
no_workspace: "No workspace",
|
|
workspace_empty_no_path: "No workspace selected. Set a workspace in Settings \u2192 Workspace to browse files.",
|
|
workspace_empty_dir: "This workspace is empty.",
|
|
dialog_confirm_title: "Confirm action",
|
|
dialog_prompt_title: "Enter a value",
|
|
dialog_confirm_btn: "Confirm",
|
|
// workspace.js
|
|
unsaved_confirm: "You have unsaved changes in the preview. Discard and navigate?",
|
|
discard: "Discard",
|
|
save: "Save",
|
|
edit: "Edit",
|
|
clear: "Clear",
|
|
create: "Create",
|
|
remove: "Remove",
|
|
save_title: "Save changes",
|
|
edit_title: "Edit this file",
|
|
saved: "Saved",
|
|
save_failed: "Save failed: ",
|
|
image_load_failed: "Could not load image",
|
|
file_open_failed: "Could not open file",
|
|
downloading: (name) => `Downloading ${name}\u2026`,
|
|
double_click_rename: "Double-click to rename",
|
|
renamed_to: "Renamed to ",
|
|
rename_failed: "Rename failed: ",
|
|
delete_title: "Delete",
|
|
delete_confirm: (name) => `Delete ${name}?`,
|
|
deleted: "Deleted ",
|
|
delete_failed: "Delete failed: ",
|
|
new_file_prompt: "New file name (e.g. notes.md):",
|
|
project_name_prompt: "Project name:",
|
|
created: "Created ",
|
|
create_failed: "Create failed: ",
|
|
new_folder_prompt: "New folder name:",
|
|
folder_created: "Created folder ",
|
|
folder_create_failed: "Create folder failed: ",
|
|
remove_title: "Remove",
|
|
empty_dir: "(empty)",
|
|
upload_failed: "Upload failed: ",
|
|
all_uploads_failed: (n) => `All ${n} upload(s) failed`,
|
|
// settings panel
|
|
settings_title: "Settings",
|
|
settings_save_btn: "Save Settings",
|
|
settings_label_model: "Default Model",
|
|
settings_label_send_key: "Send Key",
|
|
settings_label_theme: "Theme",
|
|
settings_label_skin: "Skin",
|
|
settings_label_language: "Language",
|
|
settings_label_token_usage: "Show token usage",
|
|
settings_label_bubble_layout: "Chat bubble layout",
|
|
settings_label_cli_sessions: "Show agent sessions",
|
|
settings_label_sync_insights: "Sync to insights",
|
|
settings_label_check_updates: "Check for updates",
|
|
settings_label_bot_name: "Assistant Name",
|
|
settings_label_password: "Access Password",
|
|
settings_saved: "Settings saved",
|
|
settings_save_failed: "Save failed: ",
|
|
settings_load_failed: "Failed to load settings: ",
|
|
settings_saved_pw: "Settings saved \u2014 password protection enabled and this browser stays signed in",
|
|
settings_saved_pw_updated: "Settings saved \u2014 password updated",
|
|
// login page
|
|
login_title: "Sign in",
|
|
login_subtitle: "Enter your password to continue",
|
|
login_placeholder: "Password",
|
|
login_btn: "Sign in",
|
|
login_invalid_pw: "Invalid password",
|
|
login_conn_failed: "Connection failed",
|
|
// Sidebar & Tabs
|
|
tab_chat: "Chat",
|
|
tab_tasks: "Tasks",
|
|
tab_skills: "Skills",
|
|
tab_memory: "Memory",
|
|
tab_workspaces: "Spaces",
|
|
tab_profiles: "Profiles",
|
|
new_conversation: "New conversation",
|
|
filter_conversations: "Filter conversations...",
|
|
session_time_unknown: "Unknown",
|
|
session_time_just_now: "gerade eben",
|
|
session_time_minutes_ago: (n) => `vor ${n} Min.`,
|
|
session_time_hours_ago: (n) => `vor ${n} Std.`,
|
|
session_time_days_ago: (n) => `vor ${n} Tag${n === 1 ? "" : "en"}`,
|
|
session_time_last_week: "letzte Woche",
|
|
session_time_bucket_today: "Heute",
|
|
session_time_bucket_yesterday: "Gestern",
|
|
session_time_bucket_this_week: "Diese Woche",
|
|
session_time_bucket_last_week: "Letzte Woche",
|
|
session_time_bucket_older: "\xC4lter",
|
|
scheduled_jobs: "Geplante Aufgaben",
|
|
new_job: "+ Neue Aufgabe",
|
|
loading: "Wird geladen...",
|
|
search_skills: "Search skills...",
|
|
new_skill: "New skill",
|
|
personal_memory: "Personal memory",
|
|
workspace_desc: "Add and switch workspaces for your sessions.",
|
|
new_profile: "New profile",
|
|
transcript: "Transcript",
|
|
download_transcript: "Download as Markdown",
|
|
import: "Import",
|
|
// Settings detail
|
|
settings_label_sound: "Notification sound",
|
|
settings_desc_sound: "Play a sound when the assistant finishes a response.",
|
|
settings_label_notifications: "Browser notifications",
|
|
settings_desc_notifications: "Show a system notification when a response completes while the app is in the background.",
|
|
settings_desc_token_usage: "Displays input/output token count below each assistant reply. Also toggled with /usage.",
|
|
settings_desc_bubble_layout: "Right-align user messages and left-align assistant replies. Off by default to keep code blocks and tool output full-width.",
|
|
settings_desc_cli_sessions: "Merges sessions from the Hermes CLI (state.db) into the session list. Click a CLI session to import it and continue the conversation.",
|
|
settings_desc_sync_insights: "Mirrors WebUI token usage to state.db so hermes /insights includes browser session data. Off by default.",
|
|
settings_desc_check_updates: "Show a banner when newer versions of the WebUI or Agent are available. Runs a background git fetch periodically.",
|
|
settings_desc_bot_name: "Display name for the assistant throughout the UI. Defaults to Hermes.",
|
|
settings_desc_password: "Enter a new password to set or change it. Leave blank to keep current setting.",
|
|
password_placeholder: "Enter new password\u2026",
|
|
disable_auth: "Disable Auth",
|
|
sign_out: "Sign Out",
|
|
cancel: "Cancel",
|
|
create_job: "Create job",
|
|
save_skill: "Save skill",
|
|
editing: "Editing",
|
|
// Empty state
|
|
empty_title: "What can I help with?",
|
|
empty_subtitle: "Ask anything, run commands, explore files, or manage your scheduled tasks.",
|
|
suggest_files: "What files are in this workspace?",
|
|
suggest_schedule: "What's on my schedule today?",
|
|
suggest_plan: "Help me plan a small project.",
|
|
// onboarding
|
|
onboarding_badge: "FIRST RUN",
|
|
onboarding_title: "Welcome to Hermes Web UI",
|
|
onboarding_lead: "A quick guided setup will verify Hermes, save a real provider configuration, choose a workspace and model, and optionally protect the app with a password.",
|
|
onboarding_back: "Back",
|
|
onboarding_continue: "Continue",
|
|
onboarding_skip: "Skip setup",
|
|
onboarding_skipped: "Setup skipped \u2014 using existing config.",
|
|
onboarding_open: "Open Hermes",
|
|
onboarding_step_system_title: "System check",
|
|
onboarding_step_system_desc: "Verify Hermes Agent and config visibility.",
|
|
onboarding_step_setup_title: "Provider setup",
|
|
onboarding_step_setup_desc: "Save the minimum Hermes provider config.",
|
|
onboarding_step_workspace_title: "Workspace + model",
|
|
onboarding_step_workspace_desc: "Pick defaults for new sessions and chat.",
|
|
onboarding_step_password_title: "Optional password",
|
|
onboarding_step_password_desc: "Protect the Web UI before sharing it.",
|
|
onboarding_step_finish_title: "Finish",
|
|
onboarding_step_finish_desc: "Review and enter the app.",
|
|
onboarding_notice_system_ready: "Hermes Agent looks reachable from the Web UI.",
|
|
onboarding_notice_system_unavailable: "Hermes Agent is not fully available yet. Bootstrap can install it, but provider setup may still require a terminal.",
|
|
onboarding_check_agent: "Hermes Agent",
|
|
onboarding_check_agent_ready: "Detected and importable",
|
|
onboarding_check_agent_missing: "Missing or partially importable",
|
|
onboarding_check_password: "Password",
|
|
onboarding_check_password_enabled: "Already enabled",
|
|
onboarding_check_password_disabled: "Not enabled yet",
|
|
onboarding_check_provider: "Provider config",
|
|
onboarding_check_provider_ready: "Ready to chat",
|
|
onboarding_check_provider_partial: "Saved but incomplete",
|
|
onboarding_check_provider_pending: "Needs verification",
|
|
onboarding_config_file: "Config file:",
|
|
onboarding_env_file: ".env file:",
|
|
onboarding_unknown: "Unknown",
|
|
onboarding_current_provider: "Current setup:",
|
|
onboarding_missing_imports: "Missing imports:",
|
|
onboarding_notice_setup_required: "Choose a simple provider path here. Advanced OAuth flows still belong in the Hermes CLI for now.",
|
|
onboarding_notice_setup_already_ready: "A working Hermes provider setup is already detected. You can keep it or replace it here.",
|
|
onboarding_oauth_provider_ready_title: "Provider already authenticated",
|
|
onboarding_oauth_provider_ready_body: "This instance is configured to use an OAuth provider (<strong>{provider}</strong>) that was set up via the Hermes CLI. No API key is needed here \u2014 click Continue to finish setup.",
|
|
onboarding_oauth_provider_not_ready_title: "OAuth provider not yet authenticated",
|
|
onboarding_oauth_provider_not_ready_body: "This instance is configured to use <strong>{provider}</strong>, which uses OAuth rather than an API key. Run <code>hermes auth</code> or <code>hermes model</code> in a terminal to authenticate, then reload the Web UI.",
|
|
onboarding_oauth_switch_hint: "Or choose a different provider below to switch to an API-key setup:",
|
|
onboarding_notice_workspace: "These values reuse the same settings APIs as the normal app.",
|
|
onboarding_workspace_label: "Workspace",
|
|
onboarding_workspace_or_path: "Or enter a workspace path",
|
|
onboarding_workspace_placeholder: "/home/you/workspace",
|
|
onboarding_provider_label: "Setup mode",
|
|
onboarding_quick_setup_badge: "quick setup",
|
|
onboarding_api_key_label: "API key",
|
|
onboarding_api_key_placeholder: "Leave blank to keep an existing saved key",
|
|
onboarding_api_key_help_prefix: "Saved as a secret in your Hermes .env file using",
|
|
onboarding_base_url_label: "Base URL",
|
|
onboarding_base_url_placeholder: "https://your-endpoint.example/v1",
|
|
onboarding_base_url_help: "Use this for OpenAI-compatible routers, self-hosted servers, LiteLLM, Ollama, LM Studio, vLLM, or similar endpoints.",
|
|
onboarding_model_label: "Default model",
|
|
onboarding_workspace_help: "Pick the model Hermes should use for new chats after setup completes.",
|
|
onboarding_custom_model_placeholder: "your-model-name",
|
|
onboarding_custom_model_help: "For custom endpoints, enter the exact model ID your server expects.",
|
|
onboarding_notice_password_enabled: "A password is already configured. Enter a new one only if you want to replace it.",
|
|
onboarding_notice_password_recommended: "Optional but recommended if you will expose the UI beyond localhost.",
|
|
onboarding_password_label: "Password (optional)",
|
|
onboarding_password_placeholder: "Leave blank to skip",
|
|
onboarding_password_help: "Passwords are stored through the existing settings API and hashed server-side.",
|
|
onboarding_notice_finish: "You can reopen Settings later to change any of this.",
|
|
onboarding_not_set: "Not set",
|
|
onboarding_password_will_enable: "Will be enabled",
|
|
onboarding_password_will_replace: "Will be replaced",
|
|
onboarding_password_keep_existing: "Keep current password",
|
|
onboarding_password_remains_disabled: "Will remain disabled",
|
|
onboarding_password_skipped: "Skipped for now",
|
|
onboarding_finish_help: "Finishing stores <code>onboarding_completed</code> in settings and drops you into the normal app.",
|
|
onboarding_error_choose_workspace: "Choose a workspace before continuing.",
|
|
onboarding_error_choose_model: "Choose a model before continuing.",
|
|
onboarding_error_provider_required: "Choose a setup mode before continuing.",
|
|
onboarding_error_base_url_required: "Base URL is required for custom endpoints.",
|
|
onboarding_error_workspace_required: "Workspace is required.",
|
|
onboarding_error_model_required: "Model is required.",
|
|
onboarding_complete: "Onboarding complete",
|
|
// panel/runtime i18n
|
|
error_prefix: "Error: ",
|
|
not_available: "N/A",
|
|
never: "never",
|
|
add: "Add",
|
|
add_failed: "Add failed: ",
|
|
remove_failed: "Remove failed: ",
|
|
switch_failed: "Switch failed: ",
|
|
name_required: "Name is required",
|
|
content_required: "Content is required",
|
|
view: "View",
|
|
dismiss: "Dismiss",
|
|
disable: "Disable",
|
|
cron_no_jobs: "Keine geplanten Aufgaben gefunden.",
|
|
cron_status_off: "AUS",
|
|
cron_status_paused: "PAUSIERT",
|
|
cron_status_error: "FEHLER",
|
|
cron_status_active: "AKTIV",
|
|
cron_next: "N\xE4chste",
|
|
cron_last: "Letzte",
|
|
cron_run_now: "Jetzt starten",
|
|
cron_pause: "Pausieren",
|
|
cron_resume: "Fortsetzen",
|
|
cron_job_name_placeholder: "Aufgabenname",
|
|
cron_schedule_placeholder: "Zeitplan",
|
|
cron_prompt_placeholder: "Prompt",
|
|
cron_last_output: "Letzte Ausgabe",
|
|
cron_all_runs: "Alle Ausf\xFChrungen",
|
|
cron_hide_runs: "Ausf\xFChrungen verbergen",
|
|
cron_no_runs_yet: "(noch keine Ausf\xFChrung)",
|
|
cron_schedule_required_example: 'Zeitplan erforderlich (z.B. "0 9 * * *" oder "every 1h")',
|
|
cron_schedule_required: "Zeitplan erforderlich",
|
|
cron_prompt_required: "Prompt erforderlich",
|
|
cron_loading: "Laden...",
|
|
cron_add_skills_placeholder: "Skills hinzuf\xFCgen (optional)...",
|
|
cron_deliver_local: "Lokal (nur speichern)",
|
|
cron_deliver_discord: "Discord",
|
|
cron_deliver_telegram: "Telegram",
|
|
cron_job_created: "Aufgabe erstellt",
|
|
cron_job_triggered: "Aufgabe gestartet",
|
|
cron_job_paused: "Aufgabe pausiert",
|
|
cron_job_resumed: "Aufgabe fortgesetzt",
|
|
cron_job_updated: "Aufgabe aktualisiert",
|
|
cron_delete_confirm_title: "Aufgabe l\xF6schen",
|
|
cron_delete_confirm_message: "Dies kann nicht r\xFCckg\xE4ngig gemacht werden.",
|
|
cron_job_deleted: "Aufgabe gel\xF6scht",
|
|
cron_completion_status: (name, status) => `Aufgabe "${name}" ${status}`,
|
|
status_failed: "fehlgeschlagen",
|
|
status_completed: "abgeschlossen",
|
|
clear_conversation_title: "Chat leeren",
|
|
clear_conversation_message: "Alle Nachrichten l\xF6schen? Dies kann nicht r\xFCckg\xE4ngig gemacht werden.",
|
|
clear_failed: "Leeren fehlgeschlagen: ",
|
|
cron_running: "L\xE4uft...",
|
|
// inline cron labels (used directly in HTML templates)
|
|
cron_label_schedule: "Zeitplan",
|
|
cron_label_next_run: "N\xE4chste Ausf\xFChrung",
|
|
cron_label_last_ran: "Zuletzt gelaufen",
|
|
cron_label_prompt: "Prompt",
|
|
cron_label_edit: "Bearbeiten",
|
|
cron_label_delete: "L\xF6schen",
|
|
cron_label_never: "nie",
|
|
skills_no_match: "Keine Skills gefunden.",
|
|
linked_files: "Linked Files",
|
|
skill_load_failed: "Could not load skill: ",
|
|
skill_file_load_failed: "Could not load file: ",
|
|
skill_name_required: "Skill name is required",
|
|
skill_updated: "Skill updated",
|
|
skill_created: "Skill created",
|
|
memory_notes_label: "memory (notes)",
|
|
memory_saved: "Memory saved",
|
|
my_notes: "My Notes",
|
|
user_profile: "User Profile",
|
|
no_notes_yet: "No notes yet.",
|
|
no_profile_yet: "No profile yet.",
|
|
workspace_choose_path: "Choose workspace path",
|
|
workspace_choose_path_meta: "Add a validated path and switch this conversation",
|
|
workspace_manage: "Manage workspaces",
|
|
workspace_manage_meta: "Open the Spaces panel",
|
|
workspace_use_title: "Use in current session",
|
|
workspace_use: "Use",
|
|
workspace_add_path_placeholder: "Add workspace path (e.g. /home/user/my-project)",
|
|
workspace_paths_validated_hint: "Paths are validated as existing directories before saving.",
|
|
workspace_added: "Workspace added",
|
|
workspace_remove_confirm_title: "Remove workspace",
|
|
workspace_remove_confirm_message: (path) => `Remove "${path}"?`,
|
|
workspace_removed: "Workspace removed",
|
|
workspace_switch_prompt_title: "Switch workspace",
|
|
workspace_switch_prompt_message: "Enter an absolute workspace path to add and switch this conversation to.",
|
|
workspace_switch_prompt_confirm: "Switch",
|
|
workspace_switch_prompt_placeholder: "/Users/you/project",
|
|
workspace_not_added: "Workspace was not added",
|
|
workspace_already_saved: "Workspace already saved \u2014 choose it from the list",
|
|
workspace_busy_switch: "Cannot switch workspace while agent is running",
|
|
discard_file_edits_title: "Discard file edits?",
|
|
discard_file_edits_message: "Switching workspaces will discard unsaved file edits in the preview.",
|
|
workspace_switched_to: (name) => `Switched to ${name}`,
|
|
profiles_no_profiles: "No profiles found.",
|
|
profile_api_keys_configured: "API keys configured",
|
|
profile_gateway_running: "Gateway running",
|
|
profile_gateway_stopped: "Gateway stopped",
|
|
profile_active: "ACTIVE",
|
|
profile_no_configuration: "No configuration",
|
|
profile_skill_count: (count) => `${count} skill${count === 1 ? "" : "s"}`,
|
|
profile_use: "Use",
|
|
profile_switch_title: "Switch to this profile",
|
|
profile_delete_title: "Delete this profile",
|
|
profile_default_label: "(default)",
|
|
profile_name_placeholder: "Profile name (lowercase, a-z 0-9 hyphens)",
|
|
profile_clone_label: "Clone config from active profile",
|
|
profile_base_url_placeholder: "Base URL (optional, e.g. http://localhost:11434)",
|
|
profile_api_key_placeholder: "API key (optional)",
|
|
manage_profiles: "Manage profiles",
|
|
profiles_load_failed: "Failed to load profiles",
|
|
profiles_busy_switch: "Cannot switch profiles while agent is running",
|
|
profile_switched_new_conversation: (name) => `Switched to profile: ${name} \u2014 new conversation started`,
|
|
profile_switched: (name) => `Switched to profile: ${name}`,
|
|
profile_name_rule: "Lowercase letters, numbers, hyphens, underscores only",
|
|
profile_base_url_rule: "Base URL must start with http:// or https://",
|
|
profile_created: (name) => `Profile created: ${name}`,
|
|
profile_delete_confirm_title: (name) => `Delete profile "${name}"?`,
|
|
profile_delete_confirm_message: "This removes all config, skills, memory, and sessions for this profile.",
|
|
profile_deleted: (name) => `Profile deleted: ${name}`,
|
|
gateways_no_gateways: "No gateways configured.",
|
|
gateway_running: "Running",
|
|
gateway_stopped: "Stopped",
|
|
gateway_stop: "Stop",
|
|
gateway_start: "Start",
|
|
gateway_restart: "Restart",
|
|
gateway_stop_title: "Stop this gateway",
|
|
gateway_start_title: "Start this gateway",
|
|
gateway_restart_title: "Restart this gateway",
|
|
gateway_started: (name) => `Gateway started: ${name}`,
|
|
gateway_stopped_msg: (name) => `Gateway stopped: ${name}`,
|
|
gateway_restarted: (name) => `Gateway restarted: ${name}`,
|
|
gateway_start_failed: "Failed to start gateway: ",
|
|
gateway_stop_failed: "Failed to stop gateway: ",
|
|
gateway_restart_failed: "Failed to restart gateway: ",
|
|
gateway_add: "Add Gateway",
|
|
gateway_add_title: "Add New Gateway",
|
|
gateway_add_message: "Enter gateway name (e.g. telegram, openclaw):",
|
|
gateway_added: (name) => `Gateway added: ${name}`,
|
|
gateway_add_failed: "Failed to add gateway: ",
|
|
active_conversation_none: "No active conversation selected.",
|
|
active_conversation_meta: (title, count) => `${title} \xB7 ${count} message${count === 1 ? "" : "s"}`,
|
|
settings_unsaved_changes: "You have unsaved changes.",
|
|
sign_out_failed: "Sign out failed: ",
|
|
disable_auth_confirm_title: "Disable password protection",
|
|
disable_auth_confirm_message: "Anyone will be able to access this instance.",
|
|
auth_disabled: "Auth disabled \u2014 password protection removed",
|
|
disable_auth_failed: "Failed to disable auth: ",
|
|
bg_error_single: (title) => `"${title}" has encountered an error`,
|
|
bg_error_multi: (count) => `${count} sessions have encountered an error`
|
|
}
|
|
};
|
|
function t(key, ...args) {
|
|
const lang = typeof _locale !== "undefined" && _locale && _locale._lang ? _locale._lang : "en";
|
|
const locale = LOCALES[lang] || LOCALES["en"] || LOCALES.en;
|
|
const en = LOCALES["en"];
|
|
let val = locale[key];
|
|
if (val === void 0) val = en[key];
|
|
if (val === void 0) return key;
|
|
if (typeof val === "function") {
|
|
try {
|
|
return val(...args);
|
|
} catch {
|
|
return key;
|
|
}
|
|
}
|
|
if (typeof val === "string" && args.length > 0) {
|
|
return args.reduce((result, arg, i) => {
|
|
return result.replace(new RegExp(`\\{${i}\\}`, "g"), String(arg));
|
|
}, val);
|
|
}
|
|
return val;
|
|
}
|
|
window.t = t;
|
|
})();
|
|
//# sourceMappingURL=i18n.js.map
|