diff --git a/api/routes.py b/api/routes.py index fd8b0f38..589f2afc 100644 --- a/api/routes.py +++ b/api/routes.py @@ -9204,6 +9204,15 @@ _LOGIN_LOCALE = { "invalid_pw": "M\u1eadt kh\u1ea9u kh\u00f4ng h\u1ee3p l\u1ec7", "conn_failed": "K\u1ebft n\u1ed1i th\u1ea5t b\u1ea1i", }, + "cs": { + "lang": "cs-CZ", + "title": "P\u0159ihl\u00e1sit se", + "subtitle": "Zadejte heslo pro pokra\u010dov\u00e1n\u00ed", + "placeholder": "Heslo", + "btn": "P\u0159ihl\u00e1sit se", + "invalid_pw": "Neplatn\u00e9 heslo", + "conn_failed": "P\u0159ipojen\u00ed selhalo", + }, } diff --git a/static/i18n.js b/static/i18n.js index 88832e47..d04a8e81 100644 --- a/static/i18n.js +++ b/static/i18n.js @@ -18102,6 +18102,1651 @@ const LOCALES = { outline_loading: 'Chargement\u2026', }, + cs: { + _label: 'Čeština', + _lang: 'cs', + _speech: 'cs-CZ', + copy_relative_path: 'Kopírovat relativní cestu', + cron_schedule_hour_label: 'Hodina', + cron_schedule_minute_label: 'Minuta', + cron_schedule_weekday_label: 'Den v týdnu', + cron_schedule_month_day_label: 'Den v měsíci', + cron_schedule_time_label: 'Čas', + cron_schedule_conj_on: 'v', + cron_schedule_conj_on_day: 'v den', + cron_schedule_conj_at: 'v', + cron_schedule_conj_at_minute: 'v minutě', + cron_weekday_sun: 'Neděle', + cron_weekday_mon: 'Pondělí', + cron_weekday_tue: 'Úterý', + cron_weekday_wed: 'Středa', + cron_weekday_thu: 'Čtvrtek', + cron_weekday_fri: 'Pátek', + cron_weekday_sat: 'Sobota', + cron_schedule_time_hint: 'Čas je serverový; cron běží na straně serveru.', + active_conversation_meta: (title, count) => `${title} · ${count} zpráv${count === 1 ? 'a' : ''}`, + active_conversation_none: 'Žádná aktivní konverzace není vybrána.', + add: 'Přidat', + add_failed: 'Přidání selhalo: ', + agent_soul: 'Duch agenta', + all_uploads_failed: (n) => `Všech ${n} nahrávání selhalo`, + approval_skip_all: '⚡ Přeskočit vše pro tuto relaci', + approval_skip_all_title: 'Přeskočit všechny výzvy ke schválení pro tuto relaci', + archive_extracted: (n, c) => `Rozbaleno ${n} souborů z ${c} archivů`, + auth_ack_save_failed: 'Nepodařilo se aktualizovat potvrzení: ', + auth_acknowledged_label: 'Zkontroloval jsem toto riziko; zobrazit méně urgentní varování v navigaci.', + auth_disabled: 'Auth zakázáno — ochrana heslem odstraněna', + auth_disabled_warning_message: 'Tato instance je přístupná bez autentifikace.', + auth_status_passkey_only: 'Pouze passkey', + auth_status_password: 'Heslová autentifikace', + auth_status_unauthenticated: 'Neautentifikováno', + auth_warning_badge: 'Auth zakázáno', + bg_error_multi: (count) => `${count} relací narazilo na chybu`, + bg_error_single: (title) => `"${title}" narazil na chybu`, + cancel: 'Zrušit', + checkpoint_date: 'Datum', + checkpoint_diff_files_changed: (n) => `${n} souborů změněno`, + checkpoint_diff_no_changes: 'Žádné rozdíly mezi tímto kontrolním bodem a aktuálním pracovním prostorem.', + checkpoint_diff_title: 'Změny v kontrolním bodě', + checkpoint_empty: 'Pro tento pracovní prostor nebyl nalezen žádný kontrolní bod.', + checkpoint_error: 'Nepodařilo se načíst kontrolní body', + checkpoint_files: 'Soubory', + checkpoint_loading: 'Načítám kontrolní body…', + checkpoint_message: 'Zpráva', + checkpoint_restore: 'Obnovit', + checkpoint_restore_confirm_message: (ckpt) => `Obnovit pracovní prostor do kontrolního bodu "${ckpt}"? Toto přepíše soubory uloženými verzemi. Soubory přidané po tomto kontrolním bodě nebudou smazány.`, + checkpoint_restore_confirm_title: 'Obnovit kontrolní bod?', + checkpoint_restored: 'Kontrolní bod obnoven', + checkpoint_title: 'Kontrolní body', + checkpoint_view_diff: 'Zobrazit rozdíly', + clear_conversation_btn_tooltip: 'Vymazat všechny zprávy v této konverzaci', + clear_conversation_message: 'Vymazat všechny zprávy? Toto nelze vrátit zpět.', + clear_conversation_title: 'Vymazat konverzaci', + clear_failed: 'Vymazání selhalo: ', + close_menu: 'Zavřít nabídku', + cmd_reasoning: 'Přepnout viditelnost přemýšlení (zobrazit/skrýt), nastavit úroveň úsilí nebo zkontrolovat aktuální stav', + cmd_yolo: 'Přepnout YOLO režim (přeskočit schválení)', + composer_compression_will_queue: 'Napište zprávu — bude zařazena do fronty a odeslána po kompresi', + composer_control_attach: 'Přiložit', + composer_control_bg_badge: 'Odznak na pozadí', + composer_control_context: 'Kontext', + composer_control_mic: 'Mikrofon', + composer_control_mobile_config: 'Mobilní konfigurace', + composer_control_model: 'Model', + composer_control_profile: 'Profil', + composer_control_quota_chip: 'Čip kvóty', + composer_control_reasoning: 'Uvažování', + composer_control_saved_prompts: 'Uložené výzvy', + composer_control_status: 'Stav', + composer_control_toolsets: 'Sady nástrojů', + composer_control_voice_mode: 'Hlasový režim', + composer_control_workspace: 'Pracovní prostor', + composer_control_yolo: 'YOLO', + composer_disabled_clarify: 'Odpovězte na žádost o upřesnění', + composer_disabled_compression: 'Čekám na dokončení komprese', + composer_disabled_empty: 'Napište zprávu k odeslání', + composer_interrupt: 'Přerušit a odeslat', + composer_mobile_context: 'Kontext', + composer_mobile_model: 'Model', + composer_mobile_quota: 'Kvóta', + composer_mobile_reasoning: 'Uvažování', + composer_mobile_workspace: 'Pracovní prostor', + composer_queue: 'Zařadit zprávu do fronty', + composer_send: 'Odeslat zprávu', + composer_steer: 'Řídit aktuální odpověď', + composer_stop: 'Zastavit generování', + content_required: 'Obsah je povinný', + create_failed: 'Vytvoření selhalo: ', + create_job: 'Vytvořit úlohu', + created: 'Vytvořeno ', + cron_all_runs: 'Všechna spuštění', + cron_attention_copy_diagnostics: 'Kopírovat diagnostiku', + cron_attention_croniter_hint: 'Runtime gateway možná postrádá balíček croniter. Restartujte gateway s podporou cron a poté pokračujte v této úloze.', + cron_attention_desc: 'Tato opakující se úloha nemá čas dalšího spuštění. Plánovač možná nedokázal vypočítat další spuštění.', + cron_attention_resume: 'Obnovit a přepočítat', + cron_attention_run_once: 'Spustit jednou nyní', + cron_collapse_output: 'Sbalit výstup', + cron_collapse_prompt: 'Sbalit výzvu', + cron_completion_status: (name, status) => `Cron „${name}“ ${status}`, + cron_delete_confirm_message: 'Toto nelze vrátit zpět.', + cron_delete_confirm_title: 'Smazat cron úlohu', + cron_deliver_custom: 'Vlastní cíl doručení', + cron_deliver_label: 'Doručit výstup do', + cron_deliver_local: 'Lokálně (pouze uložit výstup)', + cron_diagnostics_copied: 'Diagnostika cronu zkopírována', + cron_duplicate: 'Duplikovat', + cron_duplicated: 'Úloha duplikována (pozastavena)', + cron_expand_output: 'Rozbalit výstup', + cron_expand_prompt: 'Rozbalit výzvu', + cron_hide_runs: 'Skrýt spuštění', + cron_job_created: 'Úloha vytvořena', + cron_job_deleted: 'Úloha smazána', + cron_job_name_placeholder: 'Název úlohy', + cron_job_paused: 'Úloha pozastavena', + cron_job_resumed: 'Úloha obnovena', + cron_job_triggered: 'Úloha spuštěna', + cron_job_updated: 'Úloha aktualizována', + cron_jobs_project: 'Cron úlohy', + cron_last: 'Poslední', + cron_last_output: 'Poslední výstup', + cron_mode_agent: 'Agent', + cron_mode_label: 'Režim', + cron_mode_script: 'Skript', + cron_model_hint: 'Přepsat výchozí model pro tuto úlohu.', + cron_model_label: 'Přepsání modelu', + cron_model_no_agent_hint: 'Úlohy bez agenta spouštějí nakonfigurovaný skript přímo; model se nepoužívá.', + cron_model_use_default: 'Výchozí (použít výchozí nastavení profilu/systému)', + cron_name_label: 'Název', + cron_name_placeholder: 'Volitelné', + cron_next: 'Další', + cron_no_jobs: 'Nebyly nalezeny žádné naplánované úlohy.', + cron_no_runs_yet: '(zatím žádná spuštění)', + cron_pause: 'Pozastavit', + cron_profile_label: 'Profil', + cron_profile_server_default: 'výchozí serveru', + cron_profile_server_default_hint: 'Používá výchozí profil WebUI serveru v době spuštění. Stávající úlohy bez profilu si zachovávají toto starší chování.', + cron_prompt_label: 'Výzva', + cron_prompt_placeholder: 'Výzva', + cron_prompt_required: 'Výzva je povinná', + cron_resume: 'Obnovit', + cron_run_now: 'Spustit nyní', + cron_schedule_hint: "Použijte 'every 1h' nebo cron výraz pro opakující se úlohy. Holé doby trvání jako '30m' se spustí jednou.", + cron_schedule_label: 'Rozvrh', + cron_schedule_once_warning: "Formy doby trvání jako '30m' se spustí jednou a po spuštění se odeberou. Použijte 'every 30m' pro zachování opakující se úlohy.", + cron_schedule_placeholder: 'Rozvrh', + cron_schedule_preset_custom: 'Vlastní', + cron_schedule_preset_daily: 'Denně', + cron_schedule_preset_hourly: 'Každou hodinu', + cron_schedule_preset_label: 'Předvolba', + cron_schedule_preset_monthly: 'Měsíčně', + cron_schedule_preset_weekdays: 'V pracovní dny', + cron_schedule_preset_weekly: 'Týdně', + cron_schedule_required: 'Rozvrh je povinný', + cron_schedule_required_example: 'Rozvrh je povinný (např. "0 9 * * *" nebo "every 1h")', + cron_script_badge_title: 'Skript úloha (bez agenta)', + cron_script_card_title: 'Skript', + cron_script_job_banner: 'Spouští skript podle rozvrhu — stdout je doručen do cíle. Bez agenta, výzvy nebo dovedností.', + cron_script_output: 'Výstup skriptu', + cron_script_path_hint: 'Řešeno v ~/.hermes/scripts/ pokud není absolutní cesta. Upravte soubor skriptu na serveru pro změnu chování.', + cron_script_path_label: 'Cesta skriptu', + cron_skills_edit_hint: 'Seznam dovedností nelze po vytvoření upravovat.', + cron_skills_label: 'Dovednosti', + cron_skills_placeholder: 'Přidat dovednosti (volitelné)…', + cron_status_active: 'aktivní', + cron_status_error: 'chyba', + cron_status_needs_attention: 'vyžaduje pozornost', + cron_status_off: 'vypnuto', + cron_status_paused: 'pozastaveno', + cron_status_running: 'běží…', + cron_toast_notifications_disabled: 'Zakázáno', + cron_toast_notifications_enabled: 'Povoleno', + cron_toast_notifications_hint: 'Zobrazit toast po dokončení tohoto cronu. Odznak Úloh a nový ukazatel běhu se stále aktualizují když je toto vypnuto.', + cron_toast_notifications_label: 'Dokončovací notifikace', + cron_view_full_output: 'Zobrazit celý výstup', + cron_workdir_label: 'Pracovní adresář', + csv_error: 'Nepodařilo se načíst CSV soubor', + csv_header_note: 'První řádek zobrazen jako záhlaví tabulky', + csv_loading: 'Načítám CSV', + csv_no_data: 'CSV soubor nemá dostatek dat pro vykreslení jako tabulka', + csv_too_large: 'CSV soubor je příliš velký pro vložené vykreslení', + current_password_incorrect: 'Současné heslo je nesprávné.', + current_password_label: 'Současné heslo', + current_password_placeholder: 'Zadejte současné heslo…', + current_password_required: 'Současné heslo je povinné pro změnu nebo zakázání autentifikace.', + current_task_list: 'Aktuální seznam úkolů', + dashboard_loopback_warning: 'Dashboard je na serveru pouze loopback. Buď prohlížejte ze serveru samotného nebo ho restartujte s --host 0.0.0.0 (nebezpečné).', + default: 'výchozí', + disable: 'Zakázat', + disable_auth: 'Zakázat autentifikaci', + disable_auth_confirm_message: 'Kdokoliv bude moci přistupovat k této instanci.', + disable_auth_confirm_title: 'Zakázat ochranu heslem', + disable_auth_failed: 'Nepodařilo se zakázat autentifikaci: ', + disable_auth_typed_confirm: 'Zadejte DISABLE AUTH pro potvrzení', + discard_file_edits_message: 'Přepnutí pracovních prostorů zahodí neuložené úpravy souborů v náhledu.', + discard_file_edits_title: 'Zahodit úpravy souborů?', + dismiss: 'Zavřít', + done: 'Hotovo', + download_transcript: 'Stáhnout jako Markdown', + editing: 'Úpravy', + empty_dir: '(prázdný)', + empty_subtitle: 'Zeptejte se na cokoliv, spouštějte příkazy, prozkoumávejte soubory nebo spravujte naplánované úlohy.', + empty_title: 'Jak vám mohu pomoci?', + error_prefix: 'Chyba: ', + excalidraw_download: 'Stáhnout', + excalidraw_empty: 'Prázdný diagram', + excalidraw_error: 'Nepodařilo se načíst Excalidraw soubor', + excalidraw_invalid: 'Neplatný formát Excalidraw souboru', + excalidraw_label: 'Diagram', + excalidraw_loading: 'Načítám diagram', + excalidraw_render_error: 'Nepodařilo se vykreslit diagram', + excalidraw_simplified: 'Zjednodušený SVG náhled — není pixelově identický s plátnem Excalidraw', + excalidraw_too_large: 'Excalidraw soubor je příliš velký pro vložené vykreslení', + export_session_html: 'HTML', + export_session_html_tooltip: 'Exportovat jako samostatnou HTML stránku', + export_session_json: 'JSON', + export_session_json_tooltip: 'Exportovat celou relaci jako JSON', + ext_gallery_after_install: 'Po instalaci', + ext_gallery_author: 'Autor', + ext_gallery_capabilities: 'Schopnosti', + ext_gallery_install: 'Instalovat', + ext_gallery_install_followup: 'Rozšíření nainstalováno. Viz karta pro další kroky.', + ext_gallery_install_ok: 'Rozšíření úspěšně nainstalováno.', + ext_gallery_install_restart_required: 'Rozšíření nainstalováno. Je vyžadován restart pro aplikaci.', + ext_gallery_installed: 'Nainstalováno', + ext_gallery_installing: 'Instaluji…', + ext_gallery_local_app_label: 'Lokální aplikace', + ext_gallery_local_component_required: 'Toto rozšíření má lokální komponent. Po instalaci spusťte požadovanou lokální aplikaci nebo sidecar.', + ext_gallery_native_host_required: 'Je vyžadován nativní hostitel', + ext_gallery_next_step: 'Další krok', + ext_gallery_open_setup_guide: 'Otevřít průvodce nastavením', + ext_gallery_permissions_empty: 'Nejsou deklarována žádná další oprávnění.', + ext_gallery_permissions_hide: 'Skrýt oprávnění', + ext_gallery_permissions_show: 'Oprávnění', + ext_gallery_required_suffix: 'Je vyžadován {0}', + ext_gallery_restart_required: 'Je vyžadován restart', + ext_gallery_sidecar_required: 'Je vyžadován sidecar', + ext_gallery_uninstall: 'Odinstalovat', + ext_gallery_uninstall_ok: 'Rozšíření odinstalováno.', + ext_gallery_uninstalling: 'Odinstalovávám…', + ext_gallery_version: 'Verze', + external_notes_auto: 'auto', + external_notes_auto_recall_hint: 'Automatické připomenutí relace je nezměněno; tento zásuvný panel pouze zobrazuje nakonfigurované zdroje a dostupné nástroje pro čtení/hledání.', + external_notes_configured_hint: 'Názvy nástrojů se očekávají z tohoto nakonfigurovaného zdroje; živá schémata se zobrazí, když je WebUI runtime zpřístupní.', + external_notes_empty: 'Nejsou viditelné žádné zdroje poznámek nebo znalostí MCP. Nakonfigurujte Joplin, Obsidian, Notion, llm-wiki nebo jiný server poznámek pro jeho zobrazení zde.', + external_notes_no_tools: 'Pro tento zdroj nejsou aktuálně viditelné žádné nástroje pro čtení/hledání.', + external_notes_recent_ai: 'Nedávno použito AI', + external_notes_recent_ai_reason: 'Automatické připomenutí', + external_notes_search_empty: 'Pro náhled poznámek zde vyhledejte nakonfigurovaný zdroj poznámek.', + external_notes_search_placeholder: 'Hledat poznámky…', + external_notes_sources: 'Poznámky třetích stran', + external_notes_tool_count: (count) => `${count} dostupných nástrojů pro poznámky`, + filter_conversations: 'Filtrovat konverzace...', + first_token_time: 'Čas do prvního tokenu', + folder_add_as_space_btn: 'Přidat jako prostor', + folder_add_as_space_msg: 'Přidat tuto složku jako nový prostor do seznamu pracovních prostorů?', + folder_add_as_space_title: 'Přidat jako prostor?', + folder_create_failed: 'Vytvoření složky selhalo: ', + folder_created: 'Vytvořena složka ', + font_size_default: 'Výchozí', + font_size_large: 'Velká', + font_size_small: 'Malá', + font_size_xlarge: 'Extra velká', + gateway_endpoint_unreachable: 'Koncový bod gateway není dosažitelný', + gateway_last_active: 'Naposledy aktivní: ', + gateway_load_failed: 'Nepodařilo se načíst stav gateway', + gateway_metadata_stale: 'Metadata gateway jsou zastaralá', + gateway_not_configured: 'Gateway není nakonfigurován', + gateway_not_running: 'Gateway neběží', + gateway_running_label: 'Běží', + gateway_session_count: (n) => `${n} ${n === 1 ? 'relace' : 'relací'}`, + import: 'Importovat', + import_session_json_tooltip: 'Importovat relaci z JSON', + insights_activity_by_day: 'Aktivita podle dne', + insights_activity_by_hour: 'Aktivita podle hodiny', + insights_cache_hit: 'Úspěšnost prompt-cache', + insights_cost: 'Odhadované náklady', + insights_daily_tokens: 'Denní tokeny', + insights_footer: 'Zobrazeny údaje za posledních {days} dnů', + insights_input_tokens: 'Vstup', + insights_messages: 'Zprávy', + insights_model_cache: 'Mezipaměť', + insights_model_cost: 'Náklady', + insights_model_health_cost_per_m: 'Náklady / 1M', + insights_model_health_provider: 'Poskytovatel', + insights_model_health_replacement: 'Průvodce náhrady', + insights_model_health_title: 'Srovnání zdraví modelů', + insights_model_name: 'Model', + insights_model_sessions: 'Relace', + insights_model_share: 'Podíl', + insights_model_tokens: 'Tokeny', + insights_models: 'Modely', + insights_no_cost: 'Nedostupné', + insights_no_usage_data: 'Zatím žádná data o využití', + insights_output_tokens: 'Výstup', + insights_peak_hour: 'Špička: {hour}', + insights_sessions: 'Relace', + insights_skill_usage_col_patches: 'Záplaty', + insights_skill_usage_col_share: 'Podíl použití %', + insights_skill_usage_col_skill: 'Dovednost', + insights_skill_usage_col_uses: 'Použití', + insights_skill_usage_col_views: 'Zobrazení', + insights_skill_usage_footer: 'Počty z ~/.hermes/skills/', + insights_skill_usage_no_data: 'Zatím žádná data o použití dovedností', + insights_skill_usage_no_data_hint: 'Dovednosti se zde zobrazí po použití v konverzacích.', + insights_skill_usage_skills_used: 'Použité dovednosti', + insights_skill_usage_sub: 'Frekvence volání nástrojů', + insights_skill_usage_title: 'Použití dovedností', + insights_skill_usage_total: 'Celkem volání', + insights_title: 'Analýza využití', + insights_token_breakdown: 'Rozložení tokenů', + insights_tokens: 'Tokeny', + insights_total: 'Celkem', + kanban_add_comment: 'Přidat komentář', + kanban_add_dependency: 'Přidat závislost', + kanban_all_assignees: 'Všichni přiřazení', + kanban_all_tenants: 'Všichni tenanti', + kanban_archive_board: 'Archivovat aktuální desku…', + kanban_archive_board_confirm: 'Archivovat desku "{name}"? Úkoly zůstávají na disku a desku lze obnovit z kanban/boards/_archived/.', + kanban_assignee: 'Přiřazený', + kanban_assignee_other_label: 'Jiný (CLI jízdní pruhy / odstraněné profily)', + kanban_assignee_placeholder: 'Volitelné — nechte prázdné pro jakéhokoliv pracovníka', + kanban_assignee_profiles_label: 'Hermes profily', + kanban_assignee_unassigned: '— Nepřiřazeno (nebude automaticky spuštěno) —', + kanban_back_to_board: 'Zpět na desku', + kanban_block: 'Blokovat', + kanban_board: 'Deska', + kanban_board_archived: 'Deska archivována', + kanban_board_color: 'Barva (volitelná)', + kanban_board_description: 'Popis (volitelný)', + kanban_board_icon: 'Ikona (emoji, volitelná)', + kanban_board_name: 'Název', + kanban_board_name_required: 'Název je povinný', + kanban_board_slug: 'Slug (malá písmena, pomlčky)', + kanban_board_slug_required: 'Slug je povinný', + kanban_bulk_action: 'Hromadná akce', + kanban_card_archive: 'archivovat', + kanban_card_complete: 'dokončit', + kanban_children: 'Potomci', + kanban_clear_filters: 'Vymazat filtry', + kanban_comments_count: 'Komentáře ({0})', + kanban_dependency_placeholder: 'ID úkolu k propojení', + kanban_dependency_self: 'Úkol nemůže záviset sám na sobě', + kanban_description: 'Popis', + kanban_description_placeholder: 'Volitelné — co je třeba udělat, kritéria přijetí, odkazy', + kanban_dispatch_auto_blocked: 'auto-blokovaný', + kanban_dispatch_crashed: 'padl', + kanban_dispatch_preview_prefix: 'Náhled:', + kanban_dispatch_promoted: 'povýšen', + kanban_dispatch_reclaimed: 'získán zpět', + kanban_dispatch_run_prefix: 'Odesláno:', + kanban_dispatch_skipped_nonspawnable: 'přeskočeno (neznámý profil)', + kanban_dispatch_skipped_unassigned: 'přeskočeno (bez přiřazení)', + kanban_dispatch_spawned: 'vytvořen', + kanban_dispatch_timed_out: 'vypršel čas', + kanban_edit_task: 'Upravit úkol', + kanban_empty: 'Prázdné', + kanban_events_count: 'Události ({0})', + kanban_include_archived: 'Zahrnout archivované', + kanban_lanes_by_profile: 'Jízdní pruhy podle profilu', + kanban_links: 'Odkazy', + kanban_max_runtime_hint: 'Nechte prázdné pro neomezené.', + kanban_max_runtime_invalid: 'Maximální doba běhu musí být celé číslo v sekundách větší než 0.', + kanban_max_runtime_seconds: 'Maximální doba běhu (sekundy)', + kanban_new_board: 'Nová deska…', + kanban_new_task: 'Nový úkol', + kanban_no_comments: 'Žádné komentáře', + kanban_no_data: 'Žádná data Kanban', + kanban_no_description: 'Bez popisu', + kanban_no_events: 'Žádné události', + kanban_no_matching_tasks: 'Žádné odpovídající úkoly', + kanban_no_runs: 'Žádná spuštění', + kanban_nudge_dispatcher: 'Náhled dispečera', + kanban_only_mine: 'Pouze mé', + kanban_parents: 'Rodiče', + kanban_parents_modal: 'Závislosti rodičů', + kanban_parents_placeholder: 'ID nadřazeného úkolu', + kanban_priority: 'Priorita', + kanban_priority_hint: 'Vyšší čísla běží první. Výchozí je 0.', + kanban_read_only: 'Zobrazení pouze pro čtení', + kanban_ready_needs_assignee: 'Zvolili jste Nepřiřazeno + Připraveno. Dispečer tento úkol přeskočí. Odešlete znovu pro potvrzení nebo zvolte profil.', + kanban_refresh: 'Obnovit', + kanban_remove_dependency: 'Odebrat závislost', + kanban_rename_board: 'Přejmenovat aktuální desku…', + kanban_run_dispatcher: 'Spustit dispečera', + kanban_run_dispatcher_confirm: 'Toto získá úkoly ve stavu Připraveno na této desce a vytvoří pracovní dílčí procesy (jeden na úkol, až 8 na kliknutí). Pokračovat?', + kanban_runs_count: 'Spuštění ({0})', + kanban_search_tasks: 'Hledat úkoly', + kanban_skills: 'Dovednosti', + kanban_skills_placeholder: 'Názvy dovedností oddělené čárkami, např. python,git', + kanban_stats: 'Statistiky', + kanban_status: 'Stav', + kanban_status_archived: 'Archivováno', + kanban_status_blocked: 'Blokováno', + kanban_status_done: 'Hotovo', + kanban_status_original_hint: 'Skutečný stav: {0}. Toto dialog pouze podporuje úpravy Triage/Todo/Ready.', + kanban_status_ready: 'Připraveno', + kanban_status_running: 'Běží', + kanban_status_todo: 'K udělání', + kanban_status_triage: 'Třídění', + kanban_task: 'Úkol', + kanban_tasks_hidden_by_filters: 'Úkoly skryté filtry', + kanban_tenant: 'Nájemce', + kanban_tenant_placeholder: 'Volitelné — slug projektu nebo týmu', + kanban_title: 'Název', + kanban_title_required: 'Název je povinný.', + kanban_unassigned: 'nepřiřazeno', + kanban_unavailable: 'Kanban není dostupný', + kanban_unblock: 'Odblokovat', + kanban_view_consolidated: 'Konsolidované zobrazení', + kanban_view_consolidated_saved: 'Zobrazení Kanban: konsolidované', + kanban_view_lanes: 'Jízdní pruhy podle profilu', + kanban_view_lanes_saved: 'Zobrazení Kanban: jízdní pruhy podle profilu', + kanban_view_update_failed: 'Nepodařilo se aktualizovat zobrazení Kanban: ', + kanban_visible_tasks: 'Viditelných úkolů: {0}', + kanban_work_queue_hint: 'Toto je fronta úkolů Hermes agenta. Vytvořte nebo triážujte úkol, přiřaďte ho, přesuňte do stavu Připraveno a nechte dispečera ho získat.', + kanban_worker_log: 'Pracovní log', + kanban_workspace_dir: 'Adresář', + kanban_workspace_kind: 'Typ pracovního prostoru', + kanban_workspace_path: 'Cesta pracovního prostoru', + kanban_workspace_path_placeholder: 'Cesta k pracovnímu prostoru', + kanban_workspace_path_required: 'Cesta pracovního prostoru je povinná pro ne-scratch pracovní prostory.', + kanban_workspace_scratch: 'Scratch', + kanban_workspace_worktree: 'Worktree', + linked_files: 'Propojené soubory', + login_btn: 'Přihlásit se', + login_conn_failed: 'Připojení selhalo', + login_invalid_pw: 'Neplatné heslo', + login_placeholder: 'Heslo', + login_subtitle: 'Zadejte heslo pro pokračování', + login_title: 'Přihlášení', + logs_auto_refresh: 'Automatická obnova (5s)', + logs_copied: 'Logy zkopírovány', + logs_copy_all: 'Kopírovat vše', + logs_empty: 'Zatím žádné logy.', + logs_file: 'Soubor', + logs_filter_active: 'zobrazeno (filtr aktivní)', + logs_load_failed: 'Načtení logů selhalo', + logs_loading: 'Načítám logy…', + logs_no_mtime: 'ještě nepsáno', + logs_severity: 'Závažnost', + logs_severity_all: 'Všechny', + logs_severity_errors: 'Chyby', + logs_severity_warnings: 'Varování+', + logs_status_idle: 'Zvolte soubor logu pro zobrazení posledních řádků.', + logs_tail: 'Tail', + logs_title: 'Logy', + logs_truncated_hint: 'Zobrazen konec velkého log souboru; starší bajty byly přeskočeny pro udržení paměti.', + logs_wrap: 'Zalamovat řádky', + manage_profiles: 'Spravovat profily', + markdown_table_filter: 'Filtrovat tabulku', + markdown_table_sort_column: 'Řadit sloupec', + mcp_disable_server: 'Zakázat tento MCP server', + mcp_enable_server: 'Povolit tento MCP server', + media_audio_label: 'Zvuk', + media_download: 'Stáhnout', + media_svg_label: 'Diagram', + media_video_label: 'Video', + memory_notes_label: 'paměť (poznámky)', + memory_saved: 'Paměť uložena', + my_notes: 'Moje poznámky', + name_required: 'Název je povinný', + never: 'nikdy', + new_conversation: 'Nová konverzace', + new_file: 'Nový soubor', + new_file_prompt: 'Nový název souboru (např. notes.md):', + new_file_prompt_title: 'Nový název souboru v {0}:', + new_folder: 'Nová složka', + new_folder_prompt: 'Nový název složky:', + new_folder_prompt_title: 'Nový název složky v {0}:', + new_job: 'Nová úloha', + new_profile: 'Nový profil', + new_skill: 'Nová dovednost', + no_notes_yet: 'Zatím žádné poznámky.', + no_profile_yet: 'Zatím žádný profil.', + no_soul_yet: 'Zatím není definována žádná duše.', + not_available: 'Nedostupné', + notifications_denied: 'Notifikace jsou v tomto prohlížeči blokovány. Povolte je v nastavení prohlížeče.', + notifications_enable_btn: 'Povolit notifikace', + notifications_enabled_toast: 'Notifikace povoleny.', + notifications_permission_status: (status) => `Povolení: ${status}`, + notifications_test_btn: 'Odeslat test', + notifications_unsupported: 'Notifikace nejsou v tomto prohlížeči podporovány.', + oauth_codex_error: 'OAuth přihlášení selhalo', + oauth_codex_expired: 'Kód vypršel, prosím zkuste znovu', + oauth_codex_polling: 'Čekám na autorizaci…', + oauth_codex_step1: 'Krok 1: Navštivte tuto URL a zadejte kód', + oauth_codex_step2: 'Krok 2: Zadejte tento kód na stránce', + oauth_codex_success: 'Codex OAuth přihlášení úspěšné!', + oauth_login_codex: 'Přihlásit se přes Codex (ChatGPT)', + onboarding_api_key_help_keyless: 'Většina instalací LM Studio / Ollama / vLLM běží bez klíče — nechte prázdné pokud váš server nevyžaduje autentifikaci. Pro ověření použijte tlačítko Test připojení.', + onboarding_api_key_help_prefix: 'Uloženo jako tajemství v souboru .env vašeho Herma pomocí', + onboarding_api_key_label: 'API klíč', + onboarding_api_key_label_optional: 'API klíč (volitelný)', + onboarding_api_key_placeholder: 'Nechte prázdné pro zachování existujícího uloženého klíče', + onboarding_api_key_placeholder_optional: 'Nechte prázdné pro servery bez klíče', + onboarding_back: 'Zpět', + onboarding_badge: 'PRVNÍ SPUŠTĚNÍ', + onboarding_base_url_help: 'Použijte toto pro OpenAI-kompatibilní routery, samostatně hostované servery, LiteLLM, Ollama, LM Studio, vLLM nebo podobné koncové body.', + onboarding_base_url_label: 'Základní URL', + onboarding_base_url_placeholder: 'https://vas-endpoint.example/v1', + onboarding_check_agent: 'Hermes Agent', + onboarding_check_agent_missing: 'Chybí nebo částečně importovatelný', + onboarding_check_agent_ready: 'Detekován a importovatelný', + onboarding_check_password: 'Heslo', + onboarding_check_password_disabled: 'Ještě nepovoleno', + onboarding_check_password_enabled: 'Již povoleno', + onboarding_check_provider: 'Konfigurace poskytovatele', + onboarding_check_provider_partial: 'Uloženo ale neúplné', + onboarding_check_provider_pending: 'Vyžaduje ověření', + onboarding_check_provider_ready: 'Připraveno k chatu', + onboarding_config_file: 'Konfigurační soubor:', + onboarding_continue: 'Pokračovat', + onboarding_current_provider: 'Aktuální nastavení:', + onboarding_custom_model_help: 'Pro vlastní koncové body zadejte přesné ID modelu, které váš server očekává.', + onboarding_custom_model_placeholder: 'název-vašeho-modelu', + onboarding_env_file: 'Soubor .env:', + onboarding_error_base_url_required: 'Základní URL je povinná pro vlastní koncové body.', + onboarding_error_choose_model: 'Před pokračováním zvolte model.', + onboarding_error_choose_workspace: 'Před pokračováním zvolte pracovní prostor.', + onboarding_error_model_required: 'Model je povinný.', + onboarding_error_probe_failed: 'Nepodařilo se ověřit nakonfigurovanou základní URL.', + onboarding_error_provider_required: 'Před pokračováním zvolte režim nastavení.', + onboarding_error_workspace_required: 'Pracovní prostor je povinný.', + onboarding_finish_help: 'Dokončení ukládá onboarding_completed do nastavení a přenese vás do normální aplikace.', + onboarding_lead: 'Rychlé vedené nastavení ověří Herma, uloží skutečnou konfiguraci poskytovatele, zvolí pracovní prostor a model a volitelně ochrání aplikaci heslem.', + onboarding_missing_imports: 'Chybějící importy:', + onboarding_model_label: 'Výchozí model', + onboarding_not_set: 'Nenastaveno', + onboarding_notice_finish: 'Nastavení můžete znovu otevřít později a změnit cokoliv.', + onboarding_notice_password_enabled: 'Heslo je již nakonfigurováno. Zadejte nové pouze pokud ho chcete nahradit.', + onboarding_notice_password_recommended: 'Volitelné ale doporučené pokud budete vystavovat UI mimo localhost.', + onboarding_notice_setup_already_ready: 'Je detekováno funkční nastavení poskytovatele Herma. Můžete ho zachovat nebo nahradit zde.', + onboarding_notice_setup_required: 'Zvolte jednoduchou cestu poskytovatele zde. Pokročilé OAuth toky stále patří do CLI Herma.', + onboarding_notice_system_ready: 'Hermes Agent se jeví jako dosažitelný z Web UI.', + onboarding_notice_system_unavailable: 'Hermes Agent ještě není plně dostupný. Bootstrap ho může nainstalovat, ale nastavení poskytovatele může stále vyžadovat terminál.', + onboarding_notice_workspace: 'Tyto hodnoty znovu používají stejná nastavení API jako normální aplikace.', + onboarding_oauth_provider_not_ready_body: 'Tato instance je nakonfigurována používat {provider}, který používá OAuth namísto API klíče. Spusťte hermes auth nebo hermes model v terminálu pro autentifikaci a poté znovu načtěte Web UI.', + onboarding_oauth_provider_not_ready_title: 'OAuth poskytovatel ještě není autentifikován', + onboarding_oauth_provider_ready_body: 'Tato instance je nakonfigurována používat OAuth poskytovatele ({provider}), který byl nastaven přes Hermes CLI. Žádný API klíč zde není potřeba — klikněte Pokračovat pro dokončení nastavení.', + onboarding_oauth_provider_ready_title: 'Poskytovatel již autentifikován', + onboarding_oauth_switch_hint: 'Nebo zvolte jiného poskytovatele níže pro přepnutí na nastavení s API klíčem:', + onboarding_open: 'Otevřít Herma', + onboarding_password_help: 'Hesla jsou ukládána přes existující API nastavení a hashovaná na serveru.', + onboarding_password_keep_existing: 'Zachovat aktuální heslo', + onboarding_password_label: 'Heslo (volitelné)', + onboarding_password_placeholder: 'Nechte prázdné pro přeskočení', + onboarding_password_remains_disabled: 'Zůstane zakázáno', + onboarding_password_skipped: 'Přeskočeno prozatím', + onboarding_password_will_enable: 'Bude povoleno', + onboarding_password_will_replace: 'Bude nahrazeno', + onboarding_probe_error_connect_refused: 'Připojení odmítnuto — server pravděpodobně neběží na této adrese. Z Dockeru zkuste IP hostitele místo localhostu.', + onboarding_probe_error_dns: 'Nelze přeložit hostitele. Zkontrolujte URL nebo použijte IP adresu hostitele.', + onboarding_probe_error_generic: 'Nelze dosáhnout nakonfigurované základní URL.', + onboarding_probe_error_http_4xx: 'Koncový bod vrátil chybu klienta. Zkontrolujte autentifikaci a cestu URL (obvykle končí na /v1).', + onboarding_probe_error_http_5xx: 'Koncový bod vrátil chybu serveru. Zkontrolujte logy serveru LM Studio / Ollama.', + onboarding_probe_error_invalid_url: 'Základní URL musí začínat http:// nebo https://.', + onboarding_probe_error_parse: 'Koncový bod nevrátil seznam modelů v očekávaném tvaru. Ověřte že URL ukazuje na kořen OpenAI-kompatibilního API.', + onboarding_probe_error_timeout: 'Koncový bod včas neodpověděl. Zkontrolujte že server běží a URL je správná.', + onboarding_probe_error_unreachable: 'Nelze dosáhnout nakonfigurované základní URL.', + onboarding_probe_ok: 'Připojeno. Dostupných {n} modelů.', + onboarding_probe_probing: 'Testuji připojení…', + onboarding_probe_test_button: 'Test připojení', + onboarding_provider_label: 'Režim nastavení', + onboarding_quick_setup_badge: 'rychlé nastavení', + onboarding_skipped: 'Nastavení přeskočeno — používám existující konfiguraci.', + onboarding_step_finish_desc: 'Zkontrolujte a vstupte do aplikace.', + onboarding_step_finish_title: 'Dokončit', + onboarding_step_password_desc: 'Chraňte Web UI před jeho sdílením.', + onboarding_step_password_title: 'Volitelné heslo', + onboarding_step_setup_desc: 'Uložte minimální konfiguraci poskytovatele Herma.', + onboarding_step_setup_title: 'Nastavení poskytovatele', + onboarding_step_system_desc: 'Ověřte dostupnost a viditelnost konfigurace agenta Herma.', + onboarding_step_system_title: 'Systémová kontrola', + onboarding_step_workspace_desc: 'Zvolte výchozí nastavení pro nové relace a chat.', + onboarding_step_workspace_title: 'Pracovní prostor + model', + onboarding_title: 'Vítejte v Hermes Web UI', + onboarding_unknown: 'Neznámý', + onboarding_workspace_help: 'Zvolte model který má Hermes používat pro nové chaty po dokončení nastavení.', + onboarding_workspace_label: 'Pracovní prostor', + onboarding_workspace_or_path: 'Nebo zadejte cestu pracovního prostoru', + onboarding_workspace_placeholder: '/home/you/workspace', + open_in_browser: 'Otevřít v prohlížeči', + outline_empty: 'Zatím žádné otázky.', + outline_loading: 'Načítám…', + outline_title: 'Osnova', + password_env_var_locked: 'Proměnná prostředí HERMES_WEBUI_PASSWORD je aktuálně nastavena a má přednost. Zrušte ji a restartujte server pro správu hesla odtud.', + password_env_var_locked_placeholder: 'Uzamčeno: je nastavena proměnná prostředí HERMES_WEBUI_PASSWORD', + password_placeholder: 'Zadejte nové heslo…', + personal_memory: 'Osobní paměť', + plugins_active_provider: 'Aktivní (poskytovatel)', + plugins_disabled: 'Zakázáno', + plugins_enable_toggle: 'Povolit', + plugins_enabled: 'Povoleno', + plugins_load_failed: 'Nepodařilo se načíst pluginy: ', + plugins_no_description: 'Nebyl poskytnut žádný popis.', + plugins_no_hooks: 'Žádné registrované háčky životního cyklu', + plugins_provider_no_hooks: 'Plugin poskytovatele — žádné háčky viditelné pro agenta', + plugins_registered_hooks: 'Registrované háčky', + plugins_unnamed: 'Nepojmenovaný plugin', + profile_active: 'AKTIVNÍ', + profile_api_key_label: 'API klíč', + profile_api_key_placeholder: 'API klíč (volitelný)', + profile_api_keys_configured: 'API klíče nakonfigurovány', + profile_base_url_label: 'Základní URL', + profile_base_url_placeholder: 'Základní URL (volitelná, např. http://localhost:11434)', + profile_base_url_rule: 'Základní URL musí začínat http:// nebo https://', + profile_clone_label: 'Klonovat konfiguraci z aktivního profilu', + profile_created: (name) => `Profil vytvořen: ${name}`, + profile_default_label: '(výchozí)', + profile_delete_confirm_message: 'Všechny relace, konfigurace, dovednosti a paměť tohoto profilu budou trvale smazány. Toto nelze vrátit zpět.', + profile_delete_confirm_title: (name) => `Smazat profil "${name}"?`, + profile_delete_title: 'Smazat tento profil', + profile_deleted: (name) => `Profil smazán: ${name}`, + profile_gateway_running: 'Gateway běží', + profile_gateway_stopped: 'Gateway zastaven', + profile_model_hint: 'Zvolte z nakonfigurovaných poskytovatelů a modelů pro tento nový profil.', + profile_model_label: 'Model / poskytovatel', + profile_model_use_default: 'Použít výchozí nastavení aktivního profilu', + profile_name_label: 'Název', + profile_name_placeholder: 'Název profilu (malá písmena, a-z 0-9 pomlčky)', + profile_name_rule: 'Pouze malá písmena, čísla, pomlčky a podtržítka', + profile_no_configuration: 'Bez konfigurace', + profile_skill_count: (count) => `${count} dovedností${count === 1 ? '' : 'í'}`, + profile_switch_title: 'Přepnout na tento profil', + profile_switched: (name) => `Přepnuto na profil: ${name}`, + profile_switched_new_conversation: (name) => `Přepnuto na profil: ${name} — zahájena nová konverzace`, + profile_use: 'Použít', + profiles_empty_sub: 'Zvolte profil agenta z bočního panelu pro zobrazení a úpravu jeho nastavení, nebo vytvořte nový.', + profiles_empty_title: 'Zvolte profil', + profiles_load_failed: 'Nepodařilo se načíst profily', + profiles_no_profiles: 'Nebyly nalezeny žádné profily.', + project_name_prompt: 'Název projektu:', + provider_category_easy_start: 'Snadný start', + provider_category_self_hosted: 'Otevřené / samostatně hostované', + provider_category_specialized: 'Specializované', + provider_cost_budget_clear: 'Vymazat', + provider_cost_budget_label: 'Měsíční rozpočet', + provider_cost_budget_pct: '{0}% z rozpočtu ${1} (měsíční tempo)', + provider_cost_budget_placeholder: 'např. 50.00', + provider_cost_budget_save_failed: 'Nepodařilo se uložit rozpočet', + provider_cost_budget_set: 'Nastavit', + provider_quota_account_limits_loaded: 'Limity účtu načteny.', + provider_quota_active_provider: 'Aktivní poskytovatel', + provider_quota_credential_label: 'Pověření {0}', + provider_quota_credential_pool: 'Fond pověření', + provider_quota_last_checked: 'Naposledy kontrolováno {0}', + provider_quota_last_checked_after_refresh: 'Naposledy kontrolováno po obnovení', + provider_quota_metric_limit: 'Limit', + provider_quota_metric_remaining: 'Zbývající', + provider_quota_metric_used: 'Použito', + provider_quota_pool_no_windows: 'Nejsou hlášena žádná okna limitů účtu.', + provider_quota_pool_plans: 'Plány: {0}', + provider_quota_pool_summary_available: '{0}/{1} dostupných', + provider_quota_pool_summary_checked: '{0} zkontrolováno', + provider_quota_pool_summary_exhausted: '{0} vyčerpáno', + provider_quota_pool_summary_failed: '{0} selhalo', + provider_quota_refresh_failed: 'Obnovení využití poskytovatele selhalo', + provider_quota_refresh_succeeded: 'Využití poskytovatele obnoveno', + provider_quota_refresh_title: 'Nyní obnovit limity využití poskytovatele', + provider_quota_refresh_usage: 'Obnovit využití', + provider_quota_refreshing: 'Obnovování…', + provider_quota_resets_meta: 'resetuje {0}', + provider_quota_retry_after: 'Zkusit znovu za {0}', + provider_quota_session_limit: '5-hodinový limit', + provider_quota_status_available: 'dostupné', + provider_quota_status_checked: 'zkontrolováno', + provider_quota_status_exhausted: 'vyčerpáno', + provider_quota_status_failed: 'selhalo', + provider_quota_status_invalid_key: 'neplatný klíč', + provider_quota_status_no_key: 'bez klíče', + provider_quota_status_unavailable: 'nedostupné', + provider_quota_status_unsupported: 'nepodporováno', + provider_quota_title: 'Kvóta aktivního poskytovatele', + provider_quota_unavailable: 'Stav kvóty nedostupný', + provider_quota_used_meta: '{0} použito', + provider_quota_weekly_limit: 'Týdenní limit', + provider_quota_window_fallback: 'Okno', + providers_empty: 'Nebyli nalezeni žádní konfigurovatelní poskytovatelé.', + providers_enter_key: 'Prosím zadejte API klíč', + providers_key_placeholder_new: 'sk-…', + providers_key_placeholder_replace: 'Zadejte nový klíč pro nahrazení…', + providers_key_removed: 'API klíč odstraněn', + providers_key_updated: 'API klíč uložen', + providers_models_refreshed: 'Modely obnoveny', + providers_oauth_config_yaml_hint: 'Token nakonfigurován přes config.yaml. Pro aktualizaci upravte sekci poskytovatele ve vašem config.yaml nebo spusťte hermes auth.', + providers_oauth_hint: 'Autentifikováno přes OAuth. Žádný API klíč není potřeba.', + providers_oauth_not_configured_hint: 'Neautentifikováno. Spusťte hermes auth v terminálu pro konfiguraci tohoto poskytovatele.', + providers_refresh_models: 'Obnovit modely', + providers_refreshing: 'Obnovování…', + providers_remove: 'Odebrat', + providers_removing: 'Odebírám…', + providers_save: 'Uložit', + providers_saving: 'Ukládám…', + providers_section_meta: 'Spravujte API klíče pro AI poskytovatele. Změny se okamžitě projeví.', + providers_section_title: 'Poskytovatelé', + providers_status_api_key: 'API klíč', + providers_status_configured: 'API klíč nakonfigurován', + providers_status_model: 'Model', + providers_status_not_configured: 'Bez API klíče', + providers_status_not_configured_label: 'Nenakonfigurováno', + providers_status_oauth: 'OAuth', + providers_tab_title: 'Poskytovatelé', + remove_failed: 'Odebrání selhalo: ', + remove_title: 'Odebrat', + save_skill: 'Uložit dovednost', + scheduled_jobs: 'Naplánované úlohy', + search: 'Hledat', + search_skills: 'Hledat dovednosti...', + session_archive: 'Archivovat konverzaci', + session_archive_desc: 'Skrýt tuto konverzaci dokud se nezobrazí archivované', + session_archive_failed: 'Archivace selhala: ', + session_archive_worktree_desc: 'Skrýt tuto konverzaci; zachovat její worktree na disku', + session_archived: 'Relace archivována', + session_archived_worktree: 'Relace archivována. Worktree zůstává na disku.', + session_batch_archive: 'Archivovat', + session_batch_archive_confirm: 'Archivovat {0} konverzací?', + session_batch_archive_worktree_confirm: 'Archivovat {0} konverzací? {1} konverzace s worktree si ponechají své adresáře worktree na disku.', + session_batch_delete: 'Smazat', + session_batch_delete_confirm: 'Smazat {0} konverzací?', + session_batch_delete_worktree_confirm: 'Smazat {0} konverzací? {1} konverzace s worktree zanechají své adresáře worktree na disku.', + session_batch_move: 'Přesunout do projektu', + session_child_toggle_hint: '{0} — podřízené konverzace vytvořené z této relace. Klikněte pro zobrazení nebo skrytí.', + session_delete: 'Smazat konverzaci', + session_delete_confirm: 'Smazat tuto konverzaci?', + session_delete_desc: 'Trvale odstranit tuto konverzaci', + session_delete_worktree_confirm: (path) => `Smazat tuto konverzaci? Worktree na ${path} zůstane na disku.`, + session_delete_worktree_desc: 'Smazat pouze WebUI konverzaci; zachovat worktree na disku', + session_deleted: 'Konverzace smazána', + session_deleted_worktree: 'Konverzace smazána. Worktree zůstává na disku.', + session_deselect_all: 'Odznačit vše', + session_duplicate: 'Duplikovat konverzaci', + session_duplicate_desc: 'Vytvořit kopii se stejným pracovním prostorem a modelem', + session_duplicate_failed: 'Duplikace selhala: ', + session_duplicated: 'Relace duplikována', + session_export_html: 'Exportovat jako HTML', + session_export_html_desc: 'Stáhnout tuto konverzaci jako samostatný HTML soubor', + session_hidden: 'Relace skryta ze seznamu', + session_hide_external: 'Skrýt ze seznamu', + session_hide_external_desc: 'Skrýt tuto importovanou relaci z WebUI bez mazání zdrojové historie.', + session_lineage_segment_open: 'Otevřít segment linie', + session_lineage_segment_untitled: 'Neoznačený segment', + session_lineage_static_hint: '{0} — dřívější kontextové tahy jsou zde sbaleny.', + session_lineage_toggle_hint: '{0} — dřívější kontextové tahy jsou zde sbaleny. Klikněte pro zobrazení nebo skrytí.', + session_link_copied: 'Odkaz na konverzaci zkopírován do schránky', + session_link_copy_failed: 'Kopírování odkazu na konverzaci selhalo: ', + session_meta_children: (n) => `${n} potomek${n === 1 ? '' : 'ci'}`, + session_meta_messages: (n) => `${n} zpráv${n === 1 ? 'a' : ''}`, + session_meta_segments: (n) => `${n} předchozích tah${n === 1 ? '' : 'ů'}`, + session_move_project: 'Přesunout do projektu', + session_move_project_desc_has: 'Změnit projekt této konverzace', + session_move_project_desc_none: 'Přiřadit projekt této konverzaci', + session_no_selection: 'Nejsou vybrány žádné konverzace', + session_pin: 'Připnout konverzaci', + session_pin_desc: 'Ponechat tuto konverzaci nahoře', + session_pin_failed: 'Připnutí selhalo: ', + session_readonly_title_hint: 'Importovaná relace pouze pro čtení — {0}', + session_restore: 'Obnovit konverzaci', + session_restore_desc: 'Vrátit tuto konverzaci zpět do hlavního seznamu', + session_restored: 'Relace obnovena', + session_select_all: 'Vybrat vše', + session_select_mode: 'Vybrat', + session_select_mode_desc: 'Vybrat konverzace pro hromadnou správu', + session_selected_count: '{0} vybráno', + session_stop_response: 'Zastavit odpověď', + session_stop_response_desc: 'Zrušit běžící odpověď této konverzace', + session_time_bucket_last_week: 'Minulý týden', + session_time_bucket_older: 'Starší', + session_time_bucket_this_week: 'Tento týden', + session_time_bucket_today: 'Dnes', + session_time_bucket_yesterday: 'Včera', + session_time_days_ago: (n) => `${n} d`, + session_time_hours_ago: (n) => `${n} h`, + session_time_last_week: '1t', + session_time_minutes_ago: (n) => `${n} min`, + session_time_unknown: 'Neznámý', + session_unpin: 'Odpnout konverzaci', + session_unpin_desc: 'Odebrat z připnutých', + session_worktree_remove: 'Odebrat worktree', + session_worktree_remove_ahead_warning: (ahead) => `${ahead} nepushnutých commitů bude ztraceno.`, + session_worktree_remove_confirm: (path) => `Odebrat git worktree z disku?\n\nCesta: ${path}\n\nToto smaže celý adresář worktree. Data relace zůstanou ve WebUI.`, + session_worktree_remove_confirm_label: 'Odebrat', + session_worktree_remove_desc: (path) => `Smazat git worktree na ${path} z disku`, + session_worktree_remove_dirty_warning: 'UPOZORNĚNÍ: Tento worktree má necommitované změny které budou ztraceny.', + session_worktree_remove_failed: 'Odebrání worktree selhalo: ', + session_worktree_remove_locked_by_stream: 'Nelze odebrat — aktivní streamovací relace používá tento worktree.', + session_worktree_remove_locked_by_terminal: 'Nelze odebrat — aktivní terminálová relace používá tento worktree.', + session_worktree_remove_not_exists: (path) => `Worktree na ${path} již neexistuje na disku.`, + session_worktree_remove_status_failed: 'Čtení stavu worktree selhalo: ', + session_worktree_remove_unsafe_blocked: 'Vyřešte lokální změny nebo nepushnuté commity před odebráním tohoto worktree.', + session_worktree_remove_untracked_warning: (count) => `${count} nesledovaných souborů bude trvale smazáno.`, + session_worktree_removed: 'Worktree odebrán.', + settings_auto_title_refresh_10: 'Každých 10 výměn', + settings_auto_title_refresh_20: 'Každých 20 výměn', + settings_auto_title_refresh_5: 'Každých 5 výměn', + settings_auto_title_refresh_off: 'Vypnuto', + settings_autosave_failed: 'Uložení selhalo', + settings_autosave_retry: 'Zkusit znovu', + settings_autosave_saved: 'Uloženo', + settings_autosave_saving: 'Ukládání…', + settings_aux_advanced_api_key: 'Přepsání API klíče', + settings_aux_advanced_api_key_clear: 'Vymazat existující přepsání API klíče', + settings_aux_advanced_api_key_empty_hint: 'Nechte prázdné pro použití pověření poskytovatele/výchozích.', + settings_aux_advanced_api_key_set_hint: 'API klíč je nastaven. Nechte prázdné pro jeho zachování, nebo použijte vymazání pro jeho odstranění.', + settings_aux_advanced_base_url: 'Základní URL', + settings_aux_advanced_base_url_desc: 'Volitelné přepsání koncového bodu poskytovatele.', + settings_aux_advanced_button_aria: 'Pokročilé možnosti pro {task}', + settings_aux_advanced_button_title: 'Pokročilé možnosti', + settings_aux_advanced_download_timeout: 'Časový limit stahování v sekundách', + settings_aux_advanced_download_timeout_desc: 'Relevantní pouze pro úlohy stahující média/obsah, např. vision. Prázdné používá výchozí.', + settings_aux_advanced_extra_body: 'Extra tělo JSON', + settings_aux_advanced_extra_body_desc: 'Volitelný JSON objekt sloučený do těla požadavku modelu.', + settings_aux_advanced_extra_body_invalid_json: 'Extra body musí být platný JSON', + settings_aux_advanced_extra_body_object_required: 'Extra body musí být JSON objekt', + settings_aux_advanced_max_concurrency: 'Maximální souběžnost', + settings_aux_advanced_max_concurrency_desc: 'Volitelný limit souběžnosti na úlohu. Prázdné používá výchozí.', + settings_aux_advanced_save: 'Uložit možnosti', + settings_aux_advanced_save_failed: 'Nepodařilo se uložit pomocné možnosti', + settings_aux_advanced_saved: 'Pomocné možnosti uloženy', + settings_aux_advanced_subtitle: 'Pokročilá konfigurace pro pomocný.', + settings_aux_advanced_timeout: 'Časový limit v sekundách', + settings_aux_advanced_timeout_desc: 'Časový limit požadavku pro tuto pomocnou úlohu. Prázdné používá výchozí Hermes.', + settings_aux_advanced_title: 'Možnosti {task}', + settings_aux_load_failed: 'Nepodařilo se načíst nastavení pomocného modelu. Ujistěte se že API agenta je dostupné.', + settings_aux_loading: 'Načítám pomocné modely…', + settings_aux_model_auto: 'auto (použít výchozí nastavení poskytovatele)', + settings_aux_model_custom: 'Vlastní model…', + settings_aux_model_custom_prompt: 'Zadejte ID modelu:', + settings_aux_no_changes: 'Žádné změny k aplikování', + settings_aux_provider_auto: 'použít hlavní model', + settings_aux_reset_confirm_msg: 'Toto nastaví všechny pomocné úlohy na auto (použít hlavní model).', + settings_aux_reset_confirm_title: 'Resetovat pomocné modely?', + settings_aux_reset_done: 'Pomocné modely resetovány na auto', + settings_aux_save_failed: 'Nepodařilo se uložit pomocný model', + settings_aux_saved: 'Pomocné modely aktualizovány', + settings_aux_task_approval: 'Schvalování', + settings_aux_task_approval_desc: 'chytré schvalování příkazů', + settings_aux_task_compression: 'Komprese', + settings_aux_task_compression_desc: 'sumarizace kontextu', + settings_aux_task_curator: 'Kurátor', + settings_aux_task_curator_desc: 'revize použití dovedností', + settings_aux_task_kanban_decomposer: 'Kanban dekompozitor', + settings_aux_task_kanban_decomposer_desc: 'dekompozice úkolů', + settings_aux_task_mcp: 'MCP', + settings_aux_task_mcp_desc: 'uvažování o nástrojích MCP', + settings_aux_task_profile_describer: 'Profil popisovač', + settings_aux_task_profile_describer_desc: 'souhrny profilů', + settings_aux_task_session_search: 'Hledání relací', + settings_aux_task_session_search_desc: 'připomenutí minulých konverzací', + settings_aux_task_skills_hub: 'Centrum dovedností', + settings_aux_task_skills_hub_desc: 'hledání/instalace dovedností', + settings_aux_task_title_generation: 'Generování názvů', + settings_aux_task_title_generation_desc: 'názvy relací', + settings_aux_task_triage_specifier: 'Triáž specifikátor', + settings_aux_task_triage_specifier_desc: 'specifikace triáže problémů/úkolů', + settings_aux_task_vision: 'Vidění', + settings_aux_task_vision_desc: 'analýza obrázků/screenshotů', + settings_aux_task_web_extract: 'Extrakce webu', + settings_aux_task_web_extract_desc: 'sumarizace webových stránek', + settings_btn_apply_aux_models: 'Aplikovat změny', + settings_btn_reset_aux_models: 'Resetovat vše na auto', + settings_btn_shutdown: 'Zastavit server', + settings_check_now: 'Zkontrolovat nyní', + settings_checking: 'Kontroluji…', + settings_dashboard_mode_always: 'Vždy zobrazit', + settings_dashboard_mode_auto: 'Automatická detekce', + settings_dashboard_mode_never: 'Nikdy nezobrazovat', + settings_dashboard_save: 'Uložit nastavení dashboard odkazu', + settings_default_message_mode_interrupt: 'Přerušit aktuální tah', + settings_default_message_mode_queue: 'Zařadit navazující zprávu', + settings_default_message_mode_steer: 'Steer (mezitahová oprava)', + settings_desc_api_redact: 'Uživatelé samostatně hostované instance mohou zakázat pro transparentnost (nedoporučeno pro sdílené instance).', + settings_desc_auto_scroll_follow: 'Když povoleno, zobrazení se posouvá dolů jak nové tokeny přicházejí. Když zakázáno, pozici posouvání ovládáte manuálně.', + settings_desc_auto_title_refresh: 'Automaticky regeneruje název relace na základě poslední výměny, udržuje ho relevantní jak konverzace pokračuje. Vyžaduje aby byl nakonfigurován LLM model pro generování názvů.', + settings_desc_auxiliary_models: 'Směrování vedlejších úloh pro vision, kompresi, generování názvů atd. "Auto" používá váš hlavní chatovací model.', + settings_desc_bot_name: 'Použito pouze pro výchozí profil. Ostatní profily používají vlastní názvy profilů.', + settings_desc_chat_activity_display_mode: 'Kompaktní Worklog seskupuje podpůrnou aktivitu do tichého souhrnu. Transparentní Stream zachovává každou událost přemýšlení/nástroje jako vlastní chronologicky rozbalitelný řádek.', + settings_desc_check_updates: 'Zobrazit banner když jsou dostupné novější verze WebUI nebo Agenta. Spouští periodické git fetch na pozadí.', + settings_desc_claude_code_sessions: 'Zobrazit importované relace Claude Code v bočním panelu, nebo je skrýt při zachování ostatních externích relací viditelných.', + settings_desc_composer_controls: 'Přepínat které ovládací prvky jsou zobrazeny v zápatí chatu. Přetáhněte čipy pro změnu pořadí každé skupiny zápatí.', + settings_desc_composer_situational_controls: 'Tyto ovládací prvky se ne vždy zobrazí, v závislosti na viewportu, režimu nebo stavu runtime. Stále je můžete vypnout pokud je to potřeba.', + settings_desc_conversation_outline: 'Zobrazit seznam otázek uživatele v aktuální konverzaci (pouze desktop). Standardně vypnuto.', + settings_desc_cron_sessions: 'Zobrazit výstup cron úloh jako konverzace v bočním panelu. Aktivní pouze když jsou povoleny externí relace. Standardně vypnuto; úlohy s vysokou frekvencí mohou zaplavit boční panel.', + settings_desc_dashboard_mode: 'Zobrazit odkaz navigačního pruhu když je oficiální hermes dashboard dosažitelný. Veřejné reverse-proxy URL jsou ukládány jako odkazy pouze v prohlížeči a nikdy nejsou kontrolovány serverem.', + settings_desc_default_message_mode: 'Řídí co se stane když odešlete zprávu zatímco agent běží. Fronta čeká; Přerušení ruší a začíná novou; Steer vkládá opravu mezitah bez přerušení. Pokud Steer není dostupný, návrh je obnoven pro výběr další akce.', + settings_desc_external_sessions: 'Zobrazit konverzace z CLI, Telegramu, Discordu, Slacku a dalších kanálů v seznamu relací. Klikněte pro import a pokračování.', + settings_desc_gateway_status: 'Stav Hermes gateway (Telegram, Discord, Slack atd.)', + settings_desc_hide_suggestions: 'Skrýt tři výchozí tlačítka návrhů na prázdné obrazovce nového chatu pro vyhnutí se náhodným klepnutím.', + settings_desc_ignore_agent_updates: 'Zachovat kontroly aktualizací WebUI zapnuté, ale skrýt oznámení aktualizací Agenta a přeskočit fetchování aktualizací Agenta.', + settings_desc_large_text_paste_as_attachment: 'Když povoleno, dlouhý vložený text se stane přílohou .md místo vyplnění kompozitoru.', + settings_desc_notifications: 'Zobrazit systémovou notifikaci když se odpověď dokončí zatímco je aplikace na pozadí.', + settings_desc_password: 'Zadejte nové heslo pro nastavení nebo změnu. Nechte prázdné pro zachování aktuálního nastavení.', + settings_desc_pinned_limit: 'Maximální počet aktivních konverzací které mohou být připnuty v bočním panelu. Výchozí je 3.', + settings_desc_previous_messaging_sessions: 'Zobrazit starší Discord, Telegram, Slack a Weixin relace které byly nahrazeny resetem nebo kompresí.', + settings_desc_project_quick_create: 'Když povoleno, každý čip projektu v bočním panelu získá tlačítko + pro zahájení konverzace v tomto projektu.', + settings_desc_quota_chip: 'Zobrazuje indikátor zbývající kvóty (např. zůstatek kreditu OpenRouter) v zápatí kompozitoru. Standardně vypnuto. Viditelné pouze na širokých displejích (>=1400px) když povoleno, pro zachování přehlednosti kompozitoru na šířce notebooku a standardního desktopu.', + settings_desc_raw_audio: 'Nahrávat a odesílat původní audio soubor agentovi místo prvního převodu na text. Agent ho pak může přepsat nebo zpracovat (emoce, pozadí, vlastní STT). Podobně jako hlasové zprávy na Telegramu.', + settings_desc_render_user_markdown: 'Když povoleno, tučné, kurzíva, odkazy a další markdown ve vašich vlastních zprávách jsou vykresleny. Standardně vypnuto; ohraničené bloky kódu a matematika jsou vždy vykresleny bez ohledu na toto nastavení.', + settings_desc_session_endless_scroll: 'Když povoleno, starší zprávy se načítají automaticky při posouvání nahoru. Když zakázáno, použijte tlačítko starších zpráv.', + settings_desc_session_jump_buttons: 'Zobrazit plovoucí tlačítka Spustit a Konec při čtení dlouhých historií relací.', + settings_desc_show_titlebar_profile: 'Když povoleno, přepínač profilů se objeví v levém horním záhlaví aplikace pro změnu profilů z jakékoliv karty. Standardně vypnuto; zápatí kompozitoru vždy obsahuje přepínač profilů bez ohledu na toto nastavení.', + settings_desc_shutdown_after_cmd: ' nebo nativní aplikace) před tím než je WebUI znovu dosažitelný.', + settings_desc_shutdown_before_cmd: 'Řízeně zastaví lokální WebUI server. Užitečné pokud jste spustili přes ', + settings_desc_shutdown_between_cmds: ' a chcete zastavit bez přepnutí do terminálu. Budete muset znovu spustit server (', + settings_desc_sidebar_density: 'Řídí kolik metadat seznam relací zobrazuje v levém bočním panelu.', + settings_desc_sound: 'Přehrát zvuk když asistent dokončí odpověď.', + settings_desc_structured_code: 'Když je vybráno Auto, JSON/YAML bloky s alespoň tímto počtem řádků se otevřou ve Stromovém zobrazení. Strom vždy otevře strukturovanou prohlížeč; Zdroj zachovává zvýrazněný text. Stále můžete přepínat Strom/Zdroj na každém bloku.', + settings_desc_sync_insights: 'Zrcadlí využití tokenů WebUI do state.db takže hermes /insights zahrnuje data relace prohlížeče. Standardně vypnuto.', + settings_desc_tab_visibility: 'Zvolte které karty se zobrazí v bočním panelu a liště. Přetáhněte čipy pro změnu pořadí. Chat a Nastavení jsou vždy viditelné.', + settings_desc_terminal_auto_expand: 'Automaticky rozbalit sbalený terminálový panel když běžící příkaz emituje nový výstup.', + settings_desc_token_speed: 'Zobrazuje tokeny za sekundu v záhlavích zpráv asistenta během streamování a po dokončení odpovědi. Standardně vypnuto.', + settings_desc_token_usage: 'Zobrazuje počet vstupních/výstupních tokenů pod každou odpovědí asistenta. Také přepínáno s /usage.', + settings_desc_tts: 'Zobrazit tlačítko reproduktoru na každé zprávě asistenta pro přečtení nahlas pomocí syntetizátoru řeči vašeho prohlížeče.', + settings_desc_tts_auto_read: 'Automaticky číst každou novou odpověď asistenta když se dokončí. Pozastaví když začnete psát.', + settings_desc_tts_engine: 'Zvolte engine řeči. Edge TTS používá Microsoft neurální hlasy přes server.', + settings_desc_tts_voice: 'Preferovaný hlas. Naplněno z dostupných hlasů vašeho prohlížeče.', + settings_desc_virtualize_transcript: 'Experimentální. Vykresluje pouze viditelnou část velmi dlouhých chat transcriptů (přes 80 zpráv) pro urychlení posouvání. Standardně vypnuto protože to může způsobit blikání při posouvání na dlouhých relacích s velkými bloky volání nástrojů. Zapněte to pro vyzkoušení; nechte vypnuté pro vykreslení celého transcriptu najednou (a tak vyhledávání prohlížeče (Ctrl+F) odpovídá celé konverzaci).', + settings_desc_voice_mode: 'Zobrazit tlačítko hlasového režimu (audio vlna) vedle mikrofonu pro diktování. Umožňuje mluvit přirozeně — Hermes automaticky odesílá po pauze a čte odpovědi nahlas. Vyžaduje prohlížeč který podporuje rozpoznávání řeči i TTS.', + settings_desc_webhook_sessions: 'Zobrazit webhook běhy jako konverzace v bočním panelu. Aktivní pouze když jsou povoleny externí relace. Standardně vypnuto; vysokoobjemové trasy mohou zaplavit boční panel.', + settings_desc_whats_new_summary: 'Mění akci Co je nového z otevření raw diff první na generování krátkého lidsky čitelného souhrnu. Regulární srovnání diff zůstává dostupné po souhrnu.', + settings_desc_worklog_details_expanded_default: 'Když povoleno, detaily Worklog se začínají rozbalené tak aby byly viditelné nástroje, přemýšlení a karty pokroku bez dalšího kliknutí. Když vypnuto, detaily zůstávají sbalené standardně; manuální volby sbalení/rozbalení na úroveň tahu stále vyhrávají.', + settings_desc_workspace_panel_open: 'Když povoleno, panel pracovního prostoru / prohlížeč souborů se otevírá automaticky s každou novou relací. Stále ho můžete kdykoliv manuálně zavřít.', + settings_desc_workspace_todos_tab: 'Když povoleno, záložka Úkoly se objeví v panelu pracovního prostoru. Panel Úkoly v bočním panelu zůstává dostupný.', + settings_dropdown_appearance: 'Vzhled', + settings_dropdown_conversation: 'Konverzace', + settings_dropdown_preferences: 'Předvolby', + settings_dropdown_providers: 'Poskytovatelé', + settings_dropdown_system: 'Systém', + settings_extensions_diagnostics_tab: 'Diagnostika', + settings_extensions_gallery_empty: 'V registru nebyla nalezena žádná rozšíření.', + settings_extensions_gallery_error: 'Načtení galerie selhalo.', + settings_extensions_gallery_loading: 'Načítám galerii…', + settings_extensions_gallery_tab: 'Galerie', + settings_extensions_installed_tab: 'Instalované', + settings_heading_subtitle: 'Předvolby, nástroje konverzace a systémové ovládací prvky.', + settings_heading_title: 'Ovládací centrum', + settings_help_docs_desc: 'Průvodci, referenční dokumentace konfigurace a kompletní README Hermes WebUI.', + settings_help_docs_label: 'Dokumentace', + settings_help_docs_link: 'Otevřít dokumentaci', + settings_help_issue_desc: 'Hledat existující zprávy nebo otevřít novou na GitHubu.', + settings_help_issue_label: 'Máte problém?', + settings_help_issue_link: 'Otevřít GitHub Issues', + settings_help_meta: 'Zdroje a podpora pro Hermes WebUI.', + settings_label_api_redact: 'Redakce citlivých dat v odpovědích API', + settings_label_auto_scroll_follow: 'Automatické sledování nového obsahu', + settings_label_auto_title_refresh: 'Adaptivní obnovení názvu', + settings_label_auxiliary_models: 'Pomocné modely', + settings_label_bot_name: 'Výchozí název asistenta', + settings_label_chat_activity_display_mode: 'Zobrazení aktivity', + settings_label_check_updates: 'Kontrolovat aktualizace', + settings_label_claude_code_sessions: 'Zobrazit Claude Code relace', + settings_label_composer_controls: 'Ovládací prvky zápatí chatu', + settings_label_composer_situational_controls: 'Situační ovládací prvky zápatí', + settings_label_conversation_outline: 'Zobrazit osnovu konverzace', + settings_label_cron_sessions: 'Zobrazit cron relace', + settings_label_dashboard_mode: 'Oficiální Hermes Dashboard', + settings_label_default_message_mode: 'Výchozí režim zpráv', + settings_label_external_sessions: 'Zobrazit externí relace', + settings_label_font_size: 'Velikost písma', + settings_label_gateway_status: 'Stav Gateway', + settings_label_hide_suggestions: 'Skrýt návrhy nového chatu', + settings_label_ignore_agent_updates: 'Ignorovat aktualizace Agenta', + settings_label_large_text_paste_as_attachment: 'Přiložit velký vložený text jako soubor', + settings_label_notifications: 'Notifikace prohlížeče', + settings_label_password: 'Heslo přístupu', + settings_label_pinned_limit: 'Limit připnutých konverzací', + settings_label_previous_messaging_sessions: 'Zobrazit předchozí messaging relace', + settings_label_project_quick_create: 'Zobrazit tlačítka nové konverzace na projekt', + settings_label_quota_chip: 'Zobrazit čip kvóty poskytovatele v kompozitoru', + settings_label_raw_audio: 'Odesílat surové audio místo přepisu', + settings_label_render_user_markdown: 'Vykreslovat markdown ve zprávách uživatele', + settings_label_session_endless_scroll: 'Načítat starší zprávy při posouvání nahoru', + settings_label_session_jump_buttons: 'Zobrazit tlačítka skoku relace', + settings_label_show_titlebar_profile: 'Zobrazit přepínač profilů v záhlaví', + settings_label_shutdown: 'Zastavit Hermes WebUI server', + settings_label_sidebar_density: 'Hustota bočního panelu', + settings_label_skin: 'Vzhled', + settings_label_sound: 'Zvuk notifikace', + settings_label_structured_code: 'JSON/YAML bloky kódu', + settings_label_structured_code_auto_lines: 'Automatický práh řádků', + settings_label_sync_insights: 'Synchronizovat do přehledů', + settings_label_tab_visibility: 'Záložky bočního panelu', + settings_label_terminal_auto_expand: 'Automaticky rozbalit terminál při výstupu', + settings_label_token_speed: 'Zobrazit rychlost tokenů (TPS)', + settings_label_token_usage: 'Zobrazit využití tokenů', + settings_label_tts: 'Text-na-řeč pro odpovědi', + settings_label_tts_auto_read: 'Automaticky číst odpovědi nahlas', + settings_label_tts_engine: 'TTS engine', + settings_label_tts_pitch: 'Výška řeči', + settings_label_tts_rate: 'Rychlost řeči', + settings_label_tts_voice: 'Hlas', + settings_label_virtualize_transcript: 'Virtualizovat dlouhé transcripty (experimentální)', + settings_label_voice_mode: 'Tlačítko hands-free hlasového režimu', + settings_label_webhook_sessions: 'Zobrazit webhook relace', + settings_label_whats_new_summary: 'Shrnout Co je nového s AI', + settings_label_worklog_details_expanded_default: 'Automaticky otevírat detaily Worklog', + settings_label_workspace_panel_open: 'Ve výchozím stavu otevřít panel pracovního prostoru', + settings_label_workspace_todos_tab: 'Zobrazit záložku Úkoly v panelu pracovního prostoru', + settings_load_failed: 'Načtení nastavení selhalo: ', + settings_main_advanced_button_aria: 'Pokročilé možnosti pro hlavní model', + settings_main_advanced_save_failed: 'Nepodařilo se uložit možnosti hlavního modelu', + settings_main_advanced_saved: 'Možnosti hlavního modelu uloženy', + settings_main_advanced_service_tier: 'Úroveň služby', + settings_main_advanced_service_tier_default: 'Výchozí / vypnuto', + settings_main_advanced_service_tier_desc: 'Volitelné nastavení požadavku pro poskytovatele rodiny OpenAI.', + settings_main_advanced_service_tier_priority: 'Priorita (rychlé)', + settings_main_advanced_subtitle: 'Pokročilá konfigurace pro výchozí chatovací model.', + settings_main_advanced_title: 'Možnosti hlavního modelu', + settings_option_compact_worklog: 'Kompaktní Worklog', + settings_option_structured_code_auto: 'Auto: Strom pro dlouhé bloky', + settings_option_structured_code_off: 'Zdroj standardně', + settings_option_structured_code_on: 'Strom standardně', + settings_option_transparent_stream: 'Transparentní Stream', + settings_plugins_empty: 'Žádné Hermes pluginy nejsou aktuálně viditelné. Nainstalujte nebo povolte pluginy z Hermes CLI/config pro jejich zobrazení zde.', + settings_plugins_meta: 'Zobrazit nainstalované Hermes pluginy a háčky životního cyklu, které registrují. Tento panel je pouze pro čtení.', + settings_plugins_title: 'Pluginy', + settings_save_btn: 'Uložit nastavení', + settings_save_failed: 'Uložení selhalo: ', + settings_saved: 'Nastavení uloženo', + settings_saved_pw: 'Nastavení uloženo — ochrana heslem povolena a tento prohlížeč zůstává přihlášen', + settings_saved_pw_updated: 'Nastavení uloženo — heslo aktualizováno', + settings_search_no_results: 'Nenalezena žádná nastavení.', + settings_search_placeholder: 'Hledat nastavení…', + settings_section_appearance_meta: 'Motiv, barvy a vizuální styl.', + settings_section_appearance_title: 'Vzhled', + settings_section_conversation_title: 'Konverzace', + settings_section_preferences_meta: 'Výchozí nastavení a chování UI pro Hermes Web UI.', + settings_section_preferences_title: 'Předvolby', + settings_section_system_meta: 'Verze instance a kontroly přístupu.', + settings_section_system_title: 'Systém', + settings_shutdown_confirm_btn: 'Zastavit', + settings_shutdown_confirm_message: 'Zastavit Hermes WebUI server?', + settings_shutdown_confirm_title: 'Zastavit Hermes WebUI', + settings_shutdown_stopped_message: 'Server zastaven. Tuto záložku můžete zavřít.', + settings_sidebar_density_compact: 'Kompaktní', + settings_sidebar_density_detailed: 'Detailní', + settings_tab_appearance: 'Vzhled', + settings_tab_conversation: 'Konverzace', + settings_tab_extensions: 'Rozšíření', + settings_tab_help: 'Nápověda', + settings_tab_plugins: 'Pluginy', + settings_tab_preferences: 'Předvolby', + settings_tab_system: 'Systém', + settings_title: 'Nastavení', + settings_unsaved_changes: 'Máte neuložené změny.', + settings_up_to_date: 'Aktuální ✓', + settings_update_check_failed: 'Kontrola aktualizací selhala', + settings_update_no_git: 'Nelze kontrolovat aktualizace (nejde o git checkout)', + settings_updates_available: 'Dostupných {count} aktualizací', + settings_updates_disabled: 'Kontroly aktualizací zakázány', + sign_out: 'Odhlásit se', + sign_out_failed: 'Odhlášení selhalo: ', + skill_category: 'Kategorie', + skill_category_placeholder: 'Volitelná, např. devops', + skill_content: 'Obsah SKILL.md', + skill_content_placeholder: 'YAML frontmatter + markdown tělo', + skill_created: 'Dovednost vytvořena', + skill_delete_confirm: 'Smazat dovednost "{0}"?', + skill_deleted: 'Dovednost smazána', + skill_disabled: 'Zakázáno', + skill_enabled: 'Povoleno', + skill_file_load_failed: 'Nelze načíst soubor: ', + skill_load_failed: 'Nelze načíst dovednost: ', + skill_metadata: 'Metadata', + skill_name: 'Název', + skill_name_required: 'Název dovednosti je povinný', + skill_rename_not_supported: 'Přejmenování dovednosti není podporováno. Vytvořte novou dovednost a smažte starou pro přejmenování.', + skill_toggle_failed: 'Přepnutí dovednosti selhalo: ', + skill_updated: 'Dovednost aktualizována', + skills_back_to: 'Zpět na {0}', + skills_delete: 'Smazat', + skills_edit: 'Upravit', + skills_empty_sub: 'Zvolte dovednost z bočního panelu pro zobrazení jejího obsahu, nebo vytvořte novou.', + skills_empty_title: 'Zvolte dovednost', + skills_no_match: 'Žádné odpovídající dovednosti.', + source_active: 'aktivní', + source_configured: 'nakonfigurováno', + status_completed: 'dokončeno', + status_failed: 'selhalo', + suggest_files: 'Jaké soubory jsou v tomto pracovním prostoru?', + suggest_plan: 'Pomozte mi naplánovat malý projekt.', + suggest_schedule: 'Co mám dnes v plánu?', + switch_failed: 'Přepnutí selhalo: ', + tab_chat: 'Chat', + tab_dashboard: 'Hermes Dashboard', + tab_insights: 'Přehledy', + tab_kanban: 'Kanban', + tab_logs: 'Logy', + tab_memory: 'Paměť', + tab_profiles: 'Profily', + tab_settings: 'Nastavení', + tab_skills: 'Dovednosti', + tab_tasks: 'Úkoly', + tab_todos: 'Úkoly', + tab_workspaces: 'Prostory', + tasks_empty_sub: 'Zvolte úlohu z bočního panelu pro zobrazení jejích detailů a běhů, nebo vytvořte novou.', + tasks_empty_title: 'Zvolte naplánovanou úlohu', + todos_no_active: 'V této relaci není aktivní seznam úkolů.', + tool_target_skill_suffix: 'dovednost', + transcript: 'Transkript', + tts_listen: 'Poslouchat', + tts_not_supported: 'Syntéza řeči není v tomto prohlížeči podporována.', + upload_failed: 'Nahrání selhalo: ', + upload_too_large: (maxMb, fileMb) => `Soubor je příliš velký (${fileMb} MB). Maximální velikost nahrávání je ${maxMb} MB.`, + uploaded: 'Nahráno', + uploading: 'Nahrávám…', + user_profile: 'Uživatelský profil', + view: 'Zobrazit', + voice_raw_attached: 'Audio přiloženo. Stiskněte Odeslat nebo napište více.', + voice_send_raw: 'Odeslat surové audio', + wiki_browse: 'Procházet wiki', + wiki_no_pages: 'Nenalezeny žádné wiki stránky', + wiki_not_configured: 'Wiki není nakonfigurována', + wiki_search_placeholder: 'Hledat stránky...', + worklog_thinking: 'Přemýšlím', + workspace_add_path_placeholder: 'Přidat cestu pracovního prostoru (např. /home/user/my-project)', + workspace_added: 'Pracovní prostor přidán', + workspace_already_saved: 'Pracovní prostor již uložen — zvolte ho ze seznamu', + workspace_auto_create_folder: 'Vytvořit složku pokud neexistuje', + workspace_busy_switch: 'Nelze přepnout pracovní prostor, zatímco agent běží', + workspace_choose_path: 'Zvolit cestu pracovního prostoru', + workspace_choose_path_meta: 'Přidat ověřenou cestu a přepnout tuto konverzaci', + workspace_desc: 'Přidávejte a přepínejte pracovní prostory pro vaše relace.', + workspace_drag_hint: 'Přetáhněte pro změnu pořadí', + workspace_manage: 'Spravovat pracovní prostory', + workspace_manage_meta: 'Otevřít panel Prostory', + workspace_name_label: 'Název', + workspace_name_placeholder: 'Volitelný přátelský název', + workspace_new_title: 'Nový prostor', + workspace_not_added: 'Pracovní prostor nebyl přidán', + workspace_path_label: 'Cesta', + workspace_path_readonly: 'Cesta nemůže být změněna. Pouze přejmenování.', + workspace_path_required: 'Cesta je povinná', + workspace_paths_validated_hint: 'Cesty jsou ověřovány jako existující adresáře před uložením.', + workspace_remove_confirm_message: (path) => `Odebrat "${path}"?`, + workspace_remove_confirm_title: 'Odebrat pracovní prostor', + workspace_removed: 'Pracovní prostor odebrán', + workspace_renamed: 'Pracovní prostor přejmenován', + workspace_reorder_failed: 'Změna pořadí selhala', + workspace_root: 'kořen pracovního prostoru', + workspace_switch_prompt_confirm: 'Přepnout', + workspace_switch_prompt_message: 'Zadejte absolutní cestu pracovního prostoru pro přidání a přepnutí této konverzace.', + workspace_switch_prompt_placeholder: '/Users/you/project', + workspace_switch_prompt_title: 'Přepnout pracovní prostor', + workspace_switched_to: (name) => `Přepnuto na ${name}`, + workspace_use: 'Použít', + workspace_use_title: 'Použít v aktuální relaci', + workspaces_empty_sub: 'Zvolte prostor z bočního panelu pro zobrazení jeho souborů a nastavení, nebo přidejte nový.', + workspaces_empty_title: 'Zvolte prostor', + yolo_disabled: 'YOLO režim VYPNUT', + yolo_enabled: '⚡ YOLO režim ZAPNUT — schválení přeskočena pro tuto relaci', + yolo_no_session: 'Žádná aktivní relace', + yolo_pill_label: 'YOLO', + yolo_pill_title_active: 'YOLO režim aktivní — klikněte pro zakázání', + approval_btn_always: 'Vždy povolit', + approval_btn_always_title: 'Vždy povolit tento vzor příkazu', + approval_btn_deny: 'Odmítnout', + approval_btn_deny_title: 'Odmítnout — tento příkaz nespouštět', + approval_btn_once: 'Povolit jednou', + approval_btn_once_title: 'Povolit tento jeden příkaz (Enter)', + approval_btn_session: 'Povolit relaci', + approval_btn_session_title: 'Povolit tuto relaci konverzace', + approval_desc_prefix: 'Byl zjištěn nebezpečný příkaz', + approval_gateway_unsupported: 'Schválení vyžadují novější gateway. Upgradujte připojený Hermes gateway.', + approval_gateway_unsupported_label: 'Schválení nejsou podporována', + approval_heading: 'Požadováno schválení', + approval_responding: 'Reakce\u2026', + auto_compress_label: 'Automatická komprese', + available_commands: 'Dostupné příkazy', + available_personalities: 'Dostupné osobnosti:', + bg_complete: 'Úkol na pozadí dokončen', + bg_failed: 'Úkol na pozadí se nezdařil:', + bg_label: 'Výsledek na pozadí:', + bg_no_answer: 'Žádná odpověď', + bg_running: 'Běží na pozadí...', + branch_failed: 'Rozvětvení selhalo: ', + branch_forked: 'Rozvětveno do nové relace', + btw_asking: 'Kladení vedlejší otázky...', + btw_done: 'Vedlejší otázka zodpovězena', + btw_failed: 'Vedlejší otázka selhala:', + btw_label: 'Vedlejší otázka — není v historii', + btw_no_answer: 'Nebyla přijata žádná odpověď.', + busy_interrupt_confirm: 'Přerušeno — odeslání nové zprávy', + busy_steer_fallback: 'Řízení není k dispozici — návrh byl obnoven', + cancel_failed: 'Zrušení selhalo: ', + cancel_unavailable: 'Zrušení není k dispozici.', + cancelling: 'Rušení\u2026', + clarify_heading: 'Zde je zapotřebí vyjasnění.', + clarify_hint: 'Vyberte si možnost nebo zadejte svou vlastní odpověď níže.', + clarify_input_placeholder: 'Sem napište odpověď', + clarify_other: 'Jiné', + clarify_responding: 'Reakce\u2026', + clarify_send: 'Odeslat', + clear: 'Vymazat', + cmd_background: 'Spustit výzvu na pozadí', + cmd_background_usage: '/background — běh paralelně bez blokování', + cmd_branch: 'Rozvětvit tuto konverzaci do nové relace', + cmd_branch_usage: '/branch [name] — rozvětvit konverzaci (volitelně s názvem)', + cmd_btw: 'Položit vedlejší otázku (pomíjivá)', + cmd_btw_usage: '/btw — položit vedlejší otázku pomocí kontextu relace', + cmd_clear: 'Vymazat konverzační zprávy', + cmd_compact_alias: 'Starší alias pro /compress', + cmd_compress: 'Ručně komprimovat kontext konverzace (použití: /compress [focus topic])', + cmd_goal: 'Nastavte nebo zkontrolujte trvalý cíl', + cmd_help: 'Zobrazit dostupné příkazy', + cmd_interrupt: 'Zrušit aktuální tah a odeslat novou zprávu', + cmd_interrupt_confirm: 'Přerušeno — odeslání nové zprávy', + cmd_interrupt_no_msg: 'Použití: /interrupt ', + cmd_model: 'Přepnout model (např. /model gpt-4o)', + cmd_new: 'Začít novou chat relaci', + cmd_personality: 'Přepnout osobnost agenta', + cmd_queue: 'Zařaď zprávu na další tah', + cmd_queue_confirm: 'Zpráva ve frontě', + cmd_queue_no_msg: 'Použití: /queue ', + cmd_queue_not_busy: 'Žádná aktivní úloha — stačí odeslat normálně', + cmd_retry: 'Znovu odeslat poslední zprávu', + cmd_skills: 'Seznam dostupných dovedností Hermes', + cmd_status: 'Zobrazit informace o relaci', + cmd_steer: 'Vložit opravu během tahu bez přerušení agenta', + cmd_steer_delivered: 'Řízení dodáno — agent to uvidí ve svém dalším výsledku nástroje', + cmd_steer_fallback: 'Řízení není k dispozici — návrh byl obnoven', + cmd_steer_no_msg: 'Použití: /steer ', + cmd_stop: 'Zastavit aktuální odpověď', + cmd_terminal: 'Otevřete terminál pracovního prostoru', + cmd_theme: "Přepnout vzhled (motiv: system\/dark\/light, skin: default\/ares\/mono\/graphite\/slate\/poseidon\/sisyphus\/charizard\/sienna\/catppuccin\/nous\/geist-contrast/zeus/verdigris)", + cmd_title: 'Získat nebo nastavit název relace', + cmd_undo: 'Odebrat poslední výměnu', + cmd_usage: 'Zapnout/vypnout zobrazení použití tokenu', + cmd_use: 'Vynutit dovednost pro další zprávu', + cmd_voice: 'Přepnout vstup mikrofonu', + cmd_voice_use_mic: 'Klikněte na tlačítko mikrofonu v editoru zprávy.', + cmd_webui_only_session: 'Tento příkaz není k dispozici pro relace importované CLI.', + cmd_workspace: 'Přepnout pracovní prostor podle názvu', + collapse_all: 'Sbalit vše', + command_label: 'Příkaz', + composer_placeholder_busy_interrupt: 'Enter = přerušení | /queue | /background | /steer', + composer_placeholder_busy_queue: 'Enter = fronta | /interrupt | /background | /steer', + composer_placeholder_busy_steer: 'Enter = řízení | /queue | /background | /interrupt', + compress_complete_label: 'Komprese dokončena', + compress_failed_label: 'Komprimace se nezdařila', + compress_running_label: 'Komprimace', + compressing: 'Vyžaduje se komprese kontextu...', + context_block_flush_aria: 'Kontextové bloky budou zahrnuty při odesílání', + context_block_name_default: 'Kontext', + context_block_remove: 'Odebrat kontextový blok', + context_block_rename_aria: 'Přejmenovat kontextový blok', + context_block_rename_hint: 'Klikněte nebo stiskněte Enter pro přejmenování', + context_compaction_label: 'Komprese kontextu', + conversation_cleared: 'Konverzace vymazána', + copied: 'Zkopírováno!', + copy: 'Kopírovat', + copy_failed: 'Kopírování selhalo', + copy_file_path: 'Kopírovat cestu souboru', + create: 'Vytvořit', + ctx_compress_action: '⚠ Komprimovat nyní pro uvolnění kontextu', + ctx_compress_hint: 'Komprimujte kontext, abyste uvolnili místo →', + delete_confirm: (name) => `Odstranit ${name}?`, + delete_dir_confirm: (name) => `Odstranit složku „${name}“ a celý její obsah?`, + delete_failed: 'Vymazání se nezdařilo', + delete_title: 'Smazat', + deleted: 'Odstraněno', + dialog_confirm_btn: 'Potvrdit', + dialog_confirm_title: 'Potvrdit činnost', + dialog_prompt_title: 'Zadejte hodnotu', + diff_error: 'Nelze načíst opravný soubor', + diff_loading: 'Načítání rozdílu', + diff_too_large: 'Záplatový soubor je příliš velký pro zobrazení v řádku', + discard: 'Zahodit', + double_click_rename: 'Dvakrát klikněte pro přejmenování', + download_folder: 'Složka pro stahování', + downloading: (name) => `Stahování ${name}\u2026`, + edit: 'Upravit', + edit_failed: 'Úprava se nezdařila:', + edit_message: 'Upravit zprávu', + edit_title: 'Upravit tento soubor', + expand_all: 'Rozbalit vše', + external_link_grant_expired: 'Toto externí zobrazení vypršelo. Znovu otevřete symbolický odkaz únikového cíle a znovu jej autorizujte.', + external_link_open_confirm: 'Tento symbolický odkaz ukazuje mimo pracovní prostor. Otevřít v externím zobrazení pouze pro čtení pro tuto relaci prohlížeče?', + external_link_read_only: 'Toto externí zobrazení je pouze pro čtení. Vytváření, přejmenování, přesun, odstranění, nahrávání, odhalení a akce editoru zde zůstávají zakázané.', + failed_colon: 'Selhalo:', + file_open_failed: 'Nelze otevřít soubor', + focus_label: 'Zaměření', + fork_from_here: 'Rozvětvit odtud', + forked_from: 'Rozvětveno z', + gateway_auth_label: 'Ověření brány se nezdařilo', + gateway_restart: 'Restartovat', + gateway_restart_failed: 'Restart gateway selhal', + gateway_restart_success: 'Restart gateway dokončen.', + gateway_running: 'Běží', + gateway_session: 'relace', + gateway_sessions: 'relace', + gateway_start: 'Spustit', + gateway_start_failed: 'Spuštění gateway selhalo', + gateway_start_success: 'Spuštění gateway dokončeno.', + gateway_status_load_failed: 'Načtení stavu gateway selhalo', + gateway_stop: 'Zastavit', + gateway_stop_failed: 'Zastavení gateway selhalo', + gateway_stop_success: 'Zastavení gateway dokončeno.', + goal_achieved: (reason) => `✓ Cíl dosažen: ${reason}`, + goal_cleared: 'Cíl vymazán.', + goal_continuing: (turns, max_turns, reason) => `↻ Pokračuji k cíli (${turns}/${max_turns}): ${reason}`, + goal_continuing_toast: 'Pokračujeme k cíli...', + goal_evaluating_progress: 'Vyhodnocování pokroku cíle...', + goal_no_goal: 'Žádný aktivní cíl.', + goal_paused: (goal) => `⏸ Cíl pozastaven: ${goal}`, + goal_paused_budget_exhausted: (turns, max_turns) => `⏸ Cíl pozastaven — využito ${turns}/${max_turns} tahů. Použijte /goal resume pro pokračování nebo /goal clear pro ukončení.`, + goal_resumed: (goal) => `▶ Cíl obnoven: ${goal}`, + goal_set: (turns, goal) => `⊙ Cíl nastaven (rozpočet ${turns} tahů): ${goal}`, + goal_status_active: (turns, max_turns, goal) => `⊙ Cíl (aktivní, ${turns}/${max_turns} tahů): ${goal}`, + goal_status_done: (turns, max_turns, goal) => `✓ Cíl splněn (${turns}/${max_turns}): ${goal}`, + goal_status_none: 'Žádný aktivní cíl. Nastavte jeden pomocí /goal .', + goal_status_paused: (turns, max_turns, reason, goal) => `⏸ Cíl (pozastaveno, ${turns}/${max_turns}${reason ? `, ${reason}` : ''}): ${goal}`, + goal_working_toward: 'Práce směrem k cíli...', + html_error: 'Vykreslení náhledu HTML se nezdařilo', + html_loading: 'Načítání náhledu HTML...', + html_open_full: 'Otevřít celou stránku', + html_sandbox_label: 'Náhled HTML (v sandboxu)', + html_too_large: 'HTML příliš velké pro vložený náhled', + image_load_failed: 'Nelze načíst obrázek', + image_pasted: 'Vložený obrázek:', + import_failed: 'Import selhal', + import_invalid_json: 'Neplatná data JSON', + jump_to_question: 'na odpověď', + jump_to_question_label: 'Skočit na začátek této odpovědi', + load_older_messages: '↑ Posunutím nahoru nebo kliknutím načtete starší zprávy', + loading: 'Načítání…', + mcp_add_server: 'Přidat server', + mcp_cancel: 'Zrušit', + mcp_command_required: 'Pro přenos stdio je vyžadován příkaz.', + mcp_delete_confirm_message: 'Odstranit MCP server „{0}“? Tuto akci nelze vrátit zpět.', + mcp_delete_confirm_title: 'Smazat server MCP', + mcp_delete_failed: 'Odstranění serveru MCP se nezdařilo.', + mcp_deleted: 'MCP server smazán.', + mcp_disabled_toast: (name) => `MCP server „${name}“ byl zakázán.`, + mcp_enabled_no: 'Zakázáno', + mcp_enabled_toast: (name) => `MCP server „${name}“ byl povolen.`, + mcp_enabled_yes: 'Povoleno', + mcp_field_args: 'Argumenty (oddělené čárkami)', + mcp_field_command: 'Příkaz', + mcp_field_name: 'Název serveru', + mcp_field_timeout: 'Časový limit (sekundy)', + mcp_field_url: 'URL', + mcp_load_failed: 'Načtení serverů MCP se nezdařilo.', + mcp_name_required: 'Je vyžadováno jméno serveru.', + mcp_no_servers: 'Nejsou nakonfigurovány žádné servery MCP.', + mcp_restart_hint: 'Změny serveru jsou zatím jen pro čtení. Upravte config.yaml a restartujte Hermes, aby se změny projevily.', + mcp_save: 'Uložit', + mcp_save_failed: 'Uložení serveru MCP se nezdařilo.', + mcp_saved: 'MCP server uložen.', + mcp_servers_desc: 'Zobrazit servery MCP nakonfigurované v config.yaml.', + mcp_servers_title: 'Servery MCP', + mcp_status_active: 'Aktivní', + mcp_status_configured: 'Nastavené', + mcp_status_disabled: 'Zakázáno', + mcp_status_invalid_config: 'Neplatná konfigurace', + mcp_status_unknown: 'Neznámé', + mcp_toggle_failed: 'Aktualizace serveru MCP se nezdařila.', + mcp_toggle_followup: 'Povolení/zakázání ovládacích prvků je záměrně odloženo, dokud nebude sémantika opakovaného načtení MCP explicitní.', + mcp_tool_count: '{0} nástrojů', + mcp_tools_desc: 'Vyhledávejte známé nástroje na aktivních serverech MCP.', + mcp_tools_inactive_configured_servers: (servers) => `Nakonfigurováno, ale neaktivní v tomto běhovém prostředí WebUI: ${servers}.`, + mcp_tools_load_failed: 'Načtení nástrojů MCP se nezdařilo.', + mcp_tools_next_page: 'Následující', + mcp_tools_next_page_aria: 'Další stránka nástrojů MCP', + mcp_tools_no_matches: 'Vašemu vyhledávání neodpovídají žádné nástroje MCP.', + mcp_tools_no_tools: 'Z aktivního běhového inventáře nejsou k dispozici žádné nástroje MCP.', + mcp_tools_page_size_prefix: 'Zobrazit', + mcp_tools_page_size_suffix: 'na stránku', + mcp_tools_pagination_label: 'Stránkování nástrojů MCP', + mcp_tools_per_page_aria: 'Nástroje MCP na stránku', + mcp_tools_previous_page: 'PŘEDCHOZÍ', + mcp_tools_previous_page_aria: 'Předchozí stránka nástrojů MCP', + mcp_tools_runtime_note: 'Inventář nástrojů používá pouze již známá aktivní MCP runtime data; WebUI nespouští ani nesonduje servery.', + mcp_tools_schema_empty: 'Žádné parametry schématu.', + mcp_tools_search_placeholder: 'Hledat nástroje podle názvu, serveru nebo popisu…', + mcp_tools_summary_matching: (query) => ` odpovídající „${query}“`, + mcp_tools_summary_no_matches: (query,total) => `Žádné MCP nástroje neodpovídají „${query}“ (celkem ${total} MCP nástrojů).`, + mcp_tools_summary_none: 'Žádné nástroje MCP k zobrazení.', + mcp_tools_summary_showing: (start,end,filtered,searchNote,totalNote,page,pages) => `Zobrazuji ${start}–${end} z ${filtered} MCP nástrojů${searchNote}${totalNote}. Stránka ${page} z ${pages}.`, + mcp_tools_summary_total_note: (total) => ` (celkem ${total} MCP nástrojů)`, + mcp_tools_title: 'Nástroje MCP', + mcp_transport_label: 'Typ transportu', + mcp_url_required: 'Pro přenos http je vyžadována adresa URL.', + mic_denied: 'Přístup k mikrofonu byl odepřen. Zkontrolujte oprávnění prohlížeče.', + mic_error: 'Chyba hlasového vstupu:', + mic_insecure_origin: 'Hlasový vstup vyžaduje zabezpečené spojení. Otevřete Hermes přes HTTPS nebo z localhost pro použití mikrofonu.', + mic_network: 'Rozpoznávání řeči není k dispozici.', + mic_no_speech: 'Žádný rozpoznaný hlas. Zkuste to znovu.', + model_custom_label: 'Vlastní model ID', + model_custom_placeholder: 'např. openai/gpt-5.4', + model_did_you_mean: (m) => ` — měli jste na mysli „${m}“?`, + model_group_configured: 'Nastavené', + model_not_found_label: 'Model nenalezen', + model_scope_advisory: 'Vztahuje se na tuto konverzaci z vaší další zprávy.', + model_scope_toast: 'Vztahuje se na tuto konverzaci z vaší další zprávy.', + model_search_no_results: 'Nenalezeny žádné modely', + model_search_placeholder: 'Hledat modely…', + model_show_all_models: 'Zobrazit všech {0} modelů', + model_unavailable: '(nedostupné)', + model_unavailable_title: 'Tento model již není ve vašem aktuálním seznamu poskytovatelů', + model_usage: 'Použití: /model ', + move_failed: 'Přesun se nezdařil.', + moved_to: 'Přesunuto do ', + n_messages: (n) => `${n} ${_i18nCsPlural(n,'zpráva','zprávy','zpráv')}`, + new_session: 'Vytvořena nová relace', + new_session_creating: 'Vytváření nové konverzace...', + no_active_session: 'Žádná aktivní relace', + no_active_task: 'Žádná aktivní úloha k zastavení.', + no_model_match: 'Nevyhovuje žádný model "', + no_personalities: 'Nebyly nalezeny žádné osobnosti (přidejte je do ~/.hermes/personalities/)', + no_workspace: 'Žádný pracovní prostor', + no_workspace_match: 'Žádná shoda pracovního prostoru "', + offline_autorefresh: 'Obnovím tuto stránku automaticky, když bude Hermes dosažitelný znovu.', + offline_browser_detail: 'Váš prohlížeč hlásí, že zařízení je offline.', + offline_check_now: 'Zkontrolovat teď', + offline_checking: 'Kontroluje se…', + offline_network_detail: 'Hermes není právě dosažitelný z tohoto prohlížeče.', + offline_stream_waiting: 'Spojení ztraceno. Čekám na obnovení…', + offline_title: 'Spojení ztraceno', + onboarding_complete: 'Onboarding dokončen!', + onboarding_skip: 'Přeskočit instalaci', + open_in_vscode: 'Otevřít ve VS Code', + open_in_vscode_failed: 'Otevření ve VS Code se nezdařilo: ', + parse_failed_note: 'interpretace se nezdařila', + path_copied: 'Cesta k souboru zkopírována do schránky', + path_copy_failed: 'Zkopírování se nezdařilo', + pdf_download: 'Stáhnout PDF', + pdf_error: 'Zobrazení náhledu PDF se nezdařilo', + pdf_loading: 'Načítání PDF {0}…', + pdf_no_pages: 'PDF nemá žádné stránky', + pdf_too_large: 'PDF příliš velké pro vložený náhled', + pdf_truncated: 'Zobrazuji prvních {0} z {1} stránek — stáhněte pro celý dokument', + personalities_load_failed: 'Načtení osobností se nezdařilo', + personality_cleared: 'Osobnost očištěna', + personality_set: 'Osobnost: ', + personality_switch_hint: '\n\nPoužijte `/personality ` pro přepnutí nebo `/personality none` pro vymazání.', + preserved_task_list_label: 'Zachovaný seznam úkolů', + provider_mismatch_label: 'Neshoda poskytovatele', + provider_mismatch_warning: (m,p)=>`"${m}" nemusí fungovat s vaším nakonfigurovaným poskytovatelem (${p}). Přesto odeslat, nebo spusťte \`hermes model\` v terminálu pro přepnutí.`, + queued_cancel: 'Zrušit zprávu ve frontě', + queued_count: (n) => n === 1 ? '1 ve frontě' : `${n} ve frontě`, + queued_label: 'Odešle po odpovědi', + raw_view: 'Surový', + reconnect_active: 'Odpověď se stále generuje. Znovu načíst, až budete připraveni?', + reconnect_finished: 'Když jste naposledy odešli, probíhala odezva. Zprávy mohly být aktualizovány.', + reference_only_label: 'Pouze jako odkaz', + regen_failed: 'Obnovení selhalo:', + regenerate: 'Znovu generovat odpověď', + remove: 'Odebrat', + rename_failed: 'Přejmenování selhalo:', + rename_prompt: 'Nové jméno:', + rename_title: 'Přejmenovat', + renamed_to: 'Přejmenováno na', + retrieval_context_label: 'Indexovaný kontext', + retrieval_context_preview: 'Dřívější zprávy jsou uloženy a načteny pomocí kontextových nástrojů', + retry_failed: 'Opakování se nezdařilo:', + reveal_failed: 'Nepodařilo se odhalit:', + reveal_in_finder: 'Otevřít ve správci souborů', + save: 'Uložit', + save_failed: 'Uložení selhalo', + save_title: 'Uložit změny', + saved: 'Uloženo', + saved_prompts_delete: 'Odstranit výzvu', + saved_prompts_empty: 'Žádné uložené prompty zatím.', + saved_prompts_empty_input: 'Nejprve zadejte výzvu k uložení', + saved_prompts_save_current: 'Uložit aktuální vstup jako prompt', + saved_prompts_saved: 'Prompt uložen', + selected_text_reply: 'Odpovědět výběrem', + selected_text_reply_appended: 'Vybraný text přidán do editoru zprávy', + selected_text_reply_title: 'Připojit vybraný text chatu jako citovaný kontext', + session_attention_approval: (n) => n === 1 ? 'Schválení' : `${n} schválení`, + session_attention_approval_title: 'Čekání na rozhodnutí o povolení', + session_attention_clarify: (n) => n === 1 ? 'Otázka' : `${n} ${_i18nCsPlural(n,'otázka','otázky','otázek')}`, + session_attention_clarify_title: 'Čekání na vaši odpověď', + session_attention_generic: (n) => n === 1 ? 'Upozornění' : `${n} ${_i18nCsPlural(n,'položka','položky','položek')}`, + session_attention_generic_title: 'Čekání na akci uživatele', + session_copy_link: 'Kopírovat odkaz na konverzaci', + session_copy_link_desc: 'Zkopírujte přímý odkaz na tuto konverzaci', + session_imported: 'Relace importována', + session_jump_end: 'Konec', + session_jump_end_label: 'Skok na konec relace', + session_jump_start: 'Začátek', + session_jump_start_label: 'Skok na začátek relace', + session_new_message: 'Nová zpráva', + session_new_message_label: 'Nová zpráva k dispozici, přeskoč na konec', + session_rename: 'Přejmenovat konverzaci', + session_rename_desc: 'Upravit název této konverzace', + session_rename_failed_no_row: 'Nelze spustit přejmenování — řádek nebyl nalezen.', + session_title_regenerate: 'Znovu vygenerovat název', + session_title_regenerate_desc: 'Požádejte Hermese, aby z konverzace vygeneroval nový název', + session_title_regenerate_failed: 'Obnovení názvu se nezdařilo:', + session_title_regenerated: (title) => `Název byl přegenerován: ${title}`, + session_title_regenerating: 'Probíhá regenerace názvu...', + session_toolsets: 'Sady nástrojů relace', + session_toolsets_applied: 'Sady nástrojů byly aktualizovány', + session_toolsets_apply: 'Použít', + session_toolsets_clear: 'Použít výchozí', + session_toolsets_cleared: 'Použití výchozích hodnot aktivního profilu', + session_toolsets_configured_servers: 'Nastavené MCP servers', + session_toolsets_custom: 'Vlastní přepsání', + session_toolsets_desc: 'Použít výchozí hodnoty aktivního profilu nebo zvolit vlastní seznam nástrojů pro tuto relaci', + session_toolsets_failed: 'Aktualizace sad nástrojů se nezdařila:', + session_toolsets_global: 'Výchozí hodnoty aktivního profilu', + session_toolsets_loading_servers: 'Načítání nakonfigurovaných serverů...', + session_toolsets_no_configured_servers: 'Žádné nakonfigurované servery MCP', + session_toolsets_placeholder: 'tool1, tool2, …', + session_toolsets_profile_defaults: 'Výchozí hodnoty aktivního profilu', + session_toolsets_use_profile_defaults: 'Použít výchozí hodnoty aktivního profilu', + session_worktree_badge: 'Worktree', + settings_desc_busy_placeholder_hint: 'Zobrazuje zástupný symbol editoru zprávy s aktuální zaneprázdněnou akcí, když je relace spuštěna a koncept je prázdný.', + settings_desc_fade_text_effect: 'Během odpovědi asistenta vyblednou nově streamovaná slova. Podobně jako OpenWebUI; ve výchozím nastavení vypnuto pro maximální výkon.', + settings_desc_max_tokens: 'Omezuje výstup asistenta pro nové streamované tahy. Ponechte prázdné pro použití záložní konfigurace aktivního profilu.', + settings_desc_model: 'Používá se pro nové konverzace. Stávající konverzace si zachovají svůj vybraný model.', + settings_desc_rtl: 'Převrátí zarovnání chatových zpráv a vstupního pole editoru pro jazyky jako arabština nebo hebrejština. Ovlivňuje pouze oblast chatu — postranní panel a další panely zůstávají zleva doprava.', + settings_label_busy_placeholder_hint: 'Zobrazit nápovědu zaneprázdněného zástupného symbolu', + settings_label_fade_text_effect: 'Efekt vyblednutí textu', + settings_label_language: 'Jazyk', + settings_label_max_tokens: 'Maximální výstupní tokeny', + settings_label_model: 'Výchozí model', + settings_label_rtl: 'Rozložení chatu zprava doleva', + settings_label_send_key: 'Klávesa pro odeslání', + settings_label_theme: 'Motiv', + settings_placeholder_max_tokens_fallback: 'Bez přepsání (výchozí: {0})', + settings_placeholder_max_tokens_none: 'Žádné přepsání', + slash_skill_badge: 'Dovednost', + slash_skill_desc: 'Vyvolat tuto dovednost', + status_agent_running: 'Agent běží', + status_ephemeral: 'Efemérní snímek — neuložen do historie přepisu.', + status_heading: 'Stav relace', + status_hermes_home: 'Domovská složka Hermes', + status_load_failed: 'Stav se nepodařilo načíst:', + status_messages: 'Zprávy', + status_model: 'Model', + status_no: 'Ne', + status_no_tokens: 'Nebyly použity žádné tokeny', + status_personality: 'osobnost', + status_profile: 'Profil', + status_provider: 'Poskytovatel', + status_session_id: 'ID relace', + status_started: 'Spuštěno', + status_title: 'Název', + status_tokens: 'Tokeny', + status_unknown: 'Neznámé', + status_updated: 'Aktualizováno', + status_workspace: 'Pracovní prostor', + status_yes: 'Ano', + steer_fail_agent_lacks_steer: 'Tato verze agenta nepodporuje steer', + steer_fail_network_error: 'Chyba sítě — zkontrolujte připojení', + steer_fail_no_cached_agent: 'Pro tuto relaci není uložen žádný agent — zkuste aktualizaci', + steer_fail_not_running: 'Agent právě neběží', + steer_fail_session_not_found: 'Relace nebyla nalezena — mohla vypršet', + steer_fail_steer_error: 'Doručení řízení se nezdařilo — agent mohl dokončit', + steer_fail_stream_dead: 'Stream agent ukončen', + steer_fail_unknown: 'Steer nedostupný', + steer_leftover_queued: 'Řízení ve frontě na další tah', + steer_recovery_dismiss: 'Zamítnout', + steer_recovery_retry: 'Zkusit znovu', + stream_stopped: 'Odpověď byla zastavena.', + subagent_children: 'Relace subagentů', + switched_to: 'Přepnuto na ', + switched_workspace: 'Přepnuto na pracovní prostor:', + symlink_link_to: 'Symbolický odkaz → {target}', + terminal_clear: 'Vymazat', + terminal_close: 'Zavřít', + terminal_collapse: 'Sbalit', + terminal_copy_failed: 'Kopírování se nezdařilo', + terminal_copy_output: 'Kopírovat výstup', + terminal_error: 'Chyba terminálu', + terminal_expand: 'Roztáhnout', + terminal_input_failed: 'Vstup terminálu se nezdařil:', + terminal_input_placeholder: 'Spustit příkaz:', + terminal_no_workspace_title: 'Vyberte pracovní prostor pro otevření terminálu', + terminal_open_title: 'Otevřít terminál pracovního prostoru', + terminal_remote_backend_unsupported: 'Vestavěný terminál je podporován pouze pro místní backendy terminálů.', + terminal_restart: 'Restartovat', + terminal_start_failed: 'Spuštění terminálu se nezdařilo:', + terminal_title: 'Terminál', + text_pasted: 'Vložený text připojen jako', + theme_set: 'Šablona:', + theme_usage: 'Použití: /theme', + thinking: 'myšlení', + title_change_hint: 'Pro přejmenování použijte `/title `.', + title_current: 'Aktuální titul:', + title_set: 'Název nastaven na', + token_usage_off: 'Využití tokenu vypnuto', + token_usage_on: 'Používání tokenu zapnuto', + tree_view: 'Strom', + type_slash: 'Pro zobrazení příkazů napište /', + undid_messages_suffix: 'zpráv(y)', + undid_n_messages: 'Odstraněno', + undo_exchange: 'Vrátit zpět poslední výměnu', + undo_failed: 'Krok zpět selhal', + unsaved_confirm: 'Máte neuložené změny v náhledu. Zahodit a přejít?', + untitled: 'Bez názvu', + usage_cache_hit_detail: 'Cache: {0}% ({1} čtení / {2} zápis)', + usage_cached_percent: '{0}% cacheované', + usage_default_model: 'výchozí', + usage_estimated_cost: 'Odhadované náklady', + usage_heading: 'Použití tokenů', + usage_input_tokens: 'Vstupní tokeny', + usage_load_failed: 'Načtení využití se nezdařilo:', + usage_output_tokens: 'Výstupní tokeny', + usage_personality_none: 'žádná', + usage_settings_tip: 'Poznámka: odhady nákladů jsou přibližné.', + usage_total: 'Celkem tokenů', + usage_unknown: 'neznámé', + voice_dictate: 'Diktovat', + voice_dictate_active: 'Zastavit diktování', + voice_error: 'Hlas není v tomto prohlížeči podporován', + voice_listening: 'Poslech…', + voice_mode_active: 'Hlasový režim zapnutý', + voice_mode_off: 'Hlasový režim vypnutý', + voice_mode_toggle: 'Hlasový režim', + voice_mode_toggle_active: 'Ukončit hlasový režim', + voice_recording_active: 'Zastavit nahrávání', + voice_speaking: 'Mluvení…', + voice_thinking: 'myšlení', + workspace_empty_dir: 'Tento pracovní prostor je prázdný.', + workspace_empty_no_path: 'Není vybrán žádný pracovní prostor. Nastavte pracovní prostor v Nastavení \u2192 Pracovní prostor pro procházení souborů.', + workspace_hidden_files_visible: 'skryté viditelné', + workspace_hidden_files_visible_title: 'Skryté soubory jsou viditelné — klikněte pro možnosti', + workspace_new_worktree_conversation: 'Nová konverzace ve worktree', + workspace_new_worktree_conversation_meta: 'Vytvořit izolovaný git worktree pro tento workspace.', + workspace_options: 'Možnosti pracovního prostoru', + workspace_show_hidden_files: 'Zobrazit skryté soubory', + workspace_show_hidden_files_desc: 'Do stromu souborů zahrňte soubory .DS_Store, .git, node_modules a další skryté / systémové soubory.', + workspace_switch_failed: 'Přepnutí workspace selhalo: ', + workspace_usage: 'Použití: /workspace ', + workspace_worktree_created: 'Worktree konverzace vytvořena', + workspace_worktree_failed: 'Vytvoření worktree selhalo: ', + ws_no_results: 'Nenalezeny žádné pracovní prostory', + ws_search_placeholder: 'Hledat pracovní prostory…', + you: 'Vy', + // tool/worklog references + processed_elapsed: _i18nProcessedElapsedCs, + tool_action_label: _i18nToolActionLabelCs, + tool_worklog_summary: _i18nToolWorklogSummaryCs, + tool_summary_join: _i18nToolSummaryJoinCs, + }, tr: { @@ -23360,6 +25005,53 @@ function _i18nToolSummaryJoinVi(parts) { return Array.isArray(parts) ? parts.filter(Boolean).join(', ') : ''; } +// Czech (cs) tool/worklog helpers — Slavic plural forms (1 / few 2-4 / many 5+ handled by _i18nToolWorklogSummaryFromMap's singular/plural split; UI uses n===1 vs plural). +function _i18nCsPlural(n, one, few, many) { + const abs = Math.abs(Number(n) || 0); + if (abs === 1) return one; + if (abs >= 2 && abs <= 4) return few; + return many; +} +const _I18N_TOOL_ACTION_TEXT_CS = { + shell: { running: 'Spouštění', done: 'Spuštěno', fail: 'spustit', fallback: 'příkaz' }, + read: { running: 'Čtení', done: 'Přečteno', fail: 'přečíst', fallback: 'soubor' }, + list: { running: 'Výpis', done: 'Vypsáno', fail: 'vypsat', fallback: 'soubory' }, + search: { running: 'Prohledávání', done: 'Prohledáno', fail: 'prohledat', fallback: 'pracovní prostor' }, + web: { running: 'Kontrola', done: 'Zkontrolováno', fail: 'zkontrolovat', fallback: 'webová data' }, + write: { running: 'Aktualizace', done: 'Aktualizováno', fail: 'aktualizovat', fallback: 'soubor' }, + skill: { running: 'Načítání', done: 'Načteno', fail: 'načíst', fallback: 'dovednost' }, + memory: { running: 'Ukládání', done: 'Uloženo', fail: 'uložit', fallback: 'paměť' }, + delegate: { running: 'Delegování', done: 'Delegováno', fail: 'delegovat', fallback: 'úkol' }, + unknown: { running: 'Spouštění', done: 'Spuštěno', fail: 'spustit', fallback: 'nástroj' }, +}; +const _I18N_TOOL_SUMMARY_TEXT_CS = { + shell: { running: ['Spouštění příkazu', 'Spouštění {n} příkazů'], done: ['Spuštěn příkaz', 'Spuštěno {n} příkazů'] }, + read: { running: ['Čtení souboru', 'Čtení {n} souborů'], done: ['Přečten soubor', 'Přečteno {n} souborů'] }, + list: { running: ['Výpis souboru', 'Výpis {n} souborů'], done: ['Vypsán soubor', 'Vypsáno {n} souborů'] }, + search: { running: ['Prohledávání prac. prostoru', 'Prohledávání prac. prostoru {n}×'], done: ['Prohledán prac. prostor', 'Prohledán prac. prostor {n}×'] }, + web: { running: ['Kontrola webu', 'Kontrola webu {n}×'], done: ['Zkontrolován web', 'Zkontrolován web {n}×'] }, + write: { running: ['Aktualizace souboru', 'Aktualizace {n} souborů'], done: ['Aktualizován soubor', 'Aktualizováno {n} souborů'] }, + skill: { running: ['Načítání dovednosti', 'Načítání {n} dovedností'], done: ['Načtena dovednost', 'Načteno {n} dovedností'] }, + memory: { running: ['Ukládání paměti', 'Ukládání {n} záznamů paměti'], done: ['Uložena paměť', 'Uloženo {n} záznamů paměti'] }, + delegate: { running: ['Delegování úkolu', 'Delegování {n} úkolů'], done: ['Delegován úkol', 'Delegováno {n} úkolů'] }, + unknown: { running: ['Spouštění nástroje', 'Spouštění {n} nástrojů'], done: ['Spuštěn nástroj', 'Spuštěno {n} nástrojů'] }, +}; +function _i18nProcessedElapsedCs(duration) { + return _i18nProcessedElapsed('Zpracováno', duration); +} +function _i18nToolActionLabelCs(kind, state, target, display, failed) { + const verbs = _I18N_TOOL_ACTION_TEXT_CS[kind] || _I18N_TOOL_ACTION_TEXT_CS.unknown; + const object = target || verbs.fallback || display || 'nástroj'; + if (failed) return `Nepodařilo se ${verbs.fail || 'spustit'} ${object}`; + return `${verbs[state] || verbs.running} ${object}`; +} +function _i18nToolWorklogSummaryCs(kind, state, count) { + return _i18nToolWorklogSummaryFromMap(_I18N_TOOL_SUMMARY_TEXT_CS, kind, state, count); +} +function _i18nToolSummaryJoinCs(parts) { + return Array.isArray(parts) ? parts.filter(Boolean).join(', ') : ''; +} + // Active locale — defaults to English; overridden by loadLocale() at boot. diff --git a/tests/test_2735_open_in_vscode.py b/tests/test_2735_open_in_vscode.py index c510caa3..b5ecc226 100644 --- a/tests/test_2735_open_in_vscode.py +++ b/tests/test_2735_open_in_vscode.py @@ -229,7 +229,7 @@ class TestOpenInVsCodeI18n: """open_in_vscode key must appear exactly once per locale (14 total).""" src = I18N.read_text(encoding="utf-8") count = src.count("open_in_vscode:") - assert count == 14, ( + assert count == 15, ( f"Expected 14 open_in_vscode: entries (one per locale), found {count}" ) @@ -237,7 +237,7 @@ class TestOpenInVsCodeI18n: """open_in_vscode_failed key must appear exactly once per locale (14 total).""" src = I18N.read_text(encoding="utf-8") count = src.count("open_in_vscode_failed:") - assert count == 14, ( + assert count == 15, ( f"Expected 14 open_in_vscode_failed: entries (one per locale), found {count}" ) diff --git a/tests/test_5144_busy_composer_placeholder_hint.py b/tests/test_5144_busy_composer_placeholder_hint.py index 6650fe89..9ae1c118 100644 --- a/tests/test_5144_busy_composer_placeholder_hint.py +++ b/tests/test_5144_busy_composer_placeholder_hint.py @@ -78,7 +78,7 @@ def test_busy_placeholder_helper_preserves_compression_and_drafts(): def test_locale_blocks_cover_new_keys(): locale_blocks = I18N_JS.count("settings_default_message_mode_steer") - assert locale_blocks == 14 + assert locale_blocks == 15 for key in [ "settings_label_busy_placeholder_hint", "settings_desc_busy_placeholder_hint", diff --git a/tests/test_auxiliary_models_settings.py b/tests/test_auxiliary_models_settings.py index 2af243de..0e85a20b 100644 --- a/tests/test_auxiliary_models_settings.py +++ b/tests/test_auxiliary_models_settings.py @@ -330,7 +330,7 @@ class TestAuxiliaryModelsI18n: """Count of each key should equal the number of locales (12 with Turkish).""" for key in self.REQUIRED_KEYS: count = I18N_JS.count(f"{key}:") - assert count == 14, ( + assert count == 15, ( f"i18n key '{key}' found {count} times — expected 14 (one per locale)" ) diff --git a/tests/test_czech_locale.py b/tests/test_czech_locale.py new file mode 100644 index 00000000..bceeb612 --- /dev/null +++ b/tests/test_czech_locale.py @@ -0,0 +1,197 @@ +from collections import Counter +from pathlib import Path +import re + + +REPO = Path(__file__).resolve().parent.parent + + +def read(path: Path) -> str: + return path.read_text(encoding="utf-8") + + +def extract_locale_block(src: str, locale_key: str) -> str: + start_match = re.search(rf"\b{re.escape(locale_key)}\s*:\s*\{{", src) + assert start_match, f"{locale_key} locale block not found" + + start = start_match.end() - 1 + depth = 0 + in_single = False + in_double = False + in_backtick = False + escape = False + + for i in range(start, len(src)): + ch = src[i] + + if escape: + escape = False + continue + + if in_single: + if ch == "\\": + escape = True + elif ch == "'": + in_single = False + continue + + if in_double: + if ch == "\\": + escape = True + elif ch == '"': + in_double = False + continue + + if in_backtick: + if ch == "\\": + escape = True + elif ch == "`": + in_backtick = False + continue + + if ch == "'": + in_single = True + continue + if ch == '"': + in_double = True + continue + if ch == "`": + in_backtick = True + continue + + if ch == "{": + depth += 1 + continue + if ch == "}": + depth -= 1 + if depth == 0: + return src[start + 1 : i] + + raise AssertionError(f"{locale_key} locale block braces are not balanced") + + +def locale_keys(src: str, locale_key: str) -> list[str]: + key_pattern = re.compile(r"^\s*([a-zA-Z0-9_]+)\s*:", re.MULTILINE) + return key_pattern.findall(extract_locale_block(src, locale_key)) + + +def test_czech_locale_block_exists(): + src = read(REPO / "static" / "i18n.js") + cs_block = extract_locale_block(src, "cs") + assert cs_block + assert "_lang: 'cs'" in cs_block + assert "_label: 'Čeština'" in cs_block + assert "_speech: 'cs-CZ'" in cs_block + + +def test_czech_locale_includes_representative_translations(): + src = read(REPO / "static" / "i18n.js") + cs_block = extract_locale_block(src, "cs") + expected = [ + "settings_title: 'Nastavení'", + "settings_label_language: 'Jazyk'", + "login_title: 'Přihlášení'", + "approval_heading: 'Požadováno schválení'", + "tab_tasks: 'Úkoly'", + "tab_profiles: 'Profily'", + "empty_title: 'Jak vám mohu pomoci?'", + "onboarding_title: 'Vítejte v Hermes Web UI'", + ] + for entry in expected: + assert entry in cs_block, f"missing expected Czech translation: {entry}" + + +def test_czech_locale_matches_english_key_coverage(): + src = read(REPO / "static" / "i18n.js") + en_keys = set(locale_keys(src, "en")) + cs_keys = set(locale_keys(src, "cs")) + assert sorted(en_keys - cs_keys) == [] + assert sorted(cs_keys - en_keys) == [] + + +def test_czech_locale_has_no_duplicate_keys(): + src = read(REPO / "static" / "i18n.js") + keys = locale_keys(src, "cs") + + duplicates = sorted(k for k, count in Counter(keys).items() if count > 1) + assert not duplicates, f"Czech locale has duplicate keys: {duplicates}" + + +def test_czech_locale_keys_use_standard_indentation(): + src = read(REPO / "static" / "i18n.js") + cs_block = extract_locale_block(src, "cs") + + # Enforce strict 4-space indentation for keys. + badly_indented = [] + for line in cs_block.splitlines(): + m = re.match(r"^(\s*)[a-zA-Z0-9_]+\s*:", line) + if m and len(m.group(1)) != 4: + badly_indented.append(f"{len(m.group(1))} spaces: {line.strip()}") + assert badly_indented == [] + + +def test_czech_locale_arrow_function_values_mirror_english(): + src = read(REPO / "static" / "i18n.js") + en_block = extract_locale_block(src, "en") + cs_block = extract_locale_block(src, "cs") + + value_re = re.compile(r"^\s+([a-zA-Z0-9_]+):\s*(.+?)(?:,\s*$|\s*$)", re.MULTILINE) + arrow_re = re.compile(r"^\s*\(?[a-zA-Z_,\s]*\)?\s*=>") + helper_re = re.compile(r"^_i18n[A-Za-z]+$") + + def callable_values(block): + out = set() + for k, v in value_re.findall(block): + v = v.strip() + if arrow_re.match(v) or helper_re.match(v): + out.add(k) + return out + + # Every key whose English value is a function must also be a function in cs + # (either an arrow or a named _i18n* helper reference). + assert callable_values(en_block) == callable_values(cs_block) + + +def test_czech_locale_preserves_placeholder_patterns(): + src = read(REPO / "static" / "i18n.js") + en_block = extract_locale_block(src, "en") + cs_block = extract_locale_block(src, "cs") + + value_re = re.compile(r"^\s+([a-zA-Z0-9_]+):\s*(.+?)(?:,\s*$|\s*$)", re.MULTILINE) + placeholder_re = re.compile(r"\{[0-9]+\}|\$\{[a-zA-Z_][a-zA-Z0-9_]*\}") + + def kv(block): + out = {} + for k, v in value_re.findall(block): + out[k] = v + return out + + en_kv = kv(en_block) + cs_kv = kv(cs_block) + + for key, en_val in en_kv.items(): + if key not in cs_kv: + continue + en_vars = sorted(placeholder_re.findall(en_val)) + cs_vars = sorted(placeholder_re.findall(cs_kv[key])) + # Skip arrow functions which might contain conditional logic and thus more template vars. + if "=>" not in cs_kv[key]: + if en_vars or cs_vars: + assert cs_vars == en_vars, f"Key '{key}' placeholder mismatch in cs locale" + + +def test_czech_locale_has_no_double_escaped_unicode_sequences(): + """JSON-style double escapes (\\\\u2026) render literal backslash-u in the UI.""" + src = read(REPO / "static" / "i18n.js") + cs_block = extract_locale_block(src, "cs") + for bad in ("\\\\u2026", "\\\\u2192", "\\\\u2713"): + assert bad not in cs_block, f"Czech locale must not contain {bad!r}" + + +def test_czech_locale_uses_real_utf8_diacritics(): + """Czech uses á č ď é ě í ň ó ř š ť ú ů ý ž — confirm the block carries real + UTF-8 diacritics, not ASCII-only text (which would mean nothing was translated).""" + src = read(REPO / "static" / "i18n.js") + cs_block = extract_locale_block(src, "cs") + diacritics = "áčďéěíňóřšťúůýžÁČĎÉĚÍŇÓŘŠŤÚŮÝŽ" + assert any(ch in cs_block for ch in diacritics), "Czech locale has no diacritics" diff --git a/tests/test_issue1488_composer_voice_buttons.py b/tests/test_issue1488_composer_voice_buttons.py index 5e1dc335..33c5173a 100644 --- a/tests/test_issue1488_composer_voice_buttons.py +++ b/tests/test_issue1488_composer_voice_buttons.py @@ -123,7 +123,7 @@ class TestComposerVoiceButtonI18n: "voice_mode_toggle_active", ) - LOCALES = ("en", "fr", "it", "ja", "ru", "es", "de", "zh", "zh-Hant", "pt", "ko", "tr", "pl", "vi") + LOCALES = ("en", "fr", "it", "ja", "ru", "es", "de", "zh", "zh-Hant", "pt", "ko", "tr", "pl", "vi", "cs") def test_legacy_voice_toggle_key_removed(self): """The old key whose string was 'Voice input' caused the duplicate- @@ -171,7 +171,7 @@ class TestComposerVoiceButtonI18n: class TestVoiceModePreferenceGate: """boot.js must hide btnVoiceMode by default, surface it via Preferences.""" - LOCALES = ("en", "fr", "it", "ja", "ru", "es", "de", "zh", "zh-Hant", "pt", "ko", "tr", "pl", "vi") + LOCALES = ("en", "fr", "it", "ja", "ru", "es", "de", "zh", "zh-Hant", "pt", "ko", "tr", "pl", "vi", "cs") def test_voice_mode_pref_is_localstorage_backed(self): """The pref reads from localStorage key 'hermes-voice-mode-button'.""" diff --git a/tests/test_issue2419_cache_usage_display.py b/tests/test_issue2419_cache_usage_display.py index 836694ee..d3cda64b 100644 --- a/tests/test_issue2419_cache_usage_display.py +++ b/tests/test_issue2419_cache_usage_display.py @@ -63,8 +63,8 @@ def test_context_indicator_surfaces_cache_hit_rate(): def test_cache_usage_labels_are_localized(): src = (ROOT / "static" / "i18n.js").read_text() - assert src.count("usage_cache_hit_detail:") == 14 - assert src.count("usage_cached_percent:") == 14 + assert src.count("usage_cache_hit_detail:") == 15 + assert src.count("usage_cached_percent:") == 15 assert "usage_cache_hit_detail: 'Cache: {0}% hit ({1} read / {2} write)'" in src assert "usage_cached_percent: '{0}% cached'" in src diff --git a/tests/test_issue2679_hide_suggestions.py b/tests/test_issue2679_hide_suggestions.py index 33c8bbc3..3a260398 100644 --- a/tests/test_issue2679_hide_suggestions.py +++ b/tests/test_issue2679_hide_suggestions.py @@ -50,8 +50,8 @@ def test_panels_round_trip_and_hot_apply_hide_suggestions(): def test_hide_suggestions_i18n_all_locales_and_changelog(): js = I18N.read_text(encoding="utf-8") - assert js.count("settings_label_hide_suggestions:") == 14 - assert js.count("settings_desc_hide_suggestions:") == 14 + assert js.count("settings_label_hide_suggestions:") == 15 + assert js.count("settings_desc_hide_suggestions:") == 15 changelog = CHANGELOG.read_text(encoding="utf-8") assert "#2679" in changelog assert "hide_empty_state_suggestions" in changelog diff --git a/tests/test_issue3227_help_tab.py b/tests/test_issue3227_help_tab.py index 99d58aec..37fc86de 100644 --- a/tests/test_issue3227_help_tab.py +++ b/tests/test_issue3227_help_tab.py @@ -6,7 +6,7 @@ PANELS_JS = (ROOT / "static" / "panels.js").read_text(encoding="utf-8") I18N_JS = (ROOT / "static" / "i18n.js").read_text(encoding="utf-8") STYLE_CSS = (ROOT / "static" / "style.css").read_text(encoding="utf-8") -LOCALE_COUNT = 14 # en, it, ja, ru, es, de, zh, zh-TW, pt, ko, fr, tr, pl +LOCALE_COUNT = 15 # en, it, ja, ru, es, de, zh, zh-Hant, pt, ko, fr, tr, pl, vi, cs def test_help_nav_button_present(): diff --git a/tests/test_issue3242_3214_i18n_tooltips.py b/tests/test_issue3242_3214_i18n_tooltips.py index cf5d13a4..845863af 100644 --- a/tests/test_issue3242_3214_i18n_tooltips.py +++ b/tests/test_issue3242_3214_i18n_tooltips.py @@ -5,7 +5,7 @@ BOOT_JS = (ROOT / "static" / "boot.js").read_text(encoding="utf-8") I18N_JS = (ROOT / "static" / "i18n.js").read_text(encoding="utf-8") SESSIONS_JS = (ROOT / "static" / "sessions.js").read_text(encoding="utf-8") -LOCALE_COUNT = 14 +LOCALE_COUNT = 15 def test_raw_audio_active_recording_uses_dedicated_i18n_key(): diff --git a/tests/test_issue4325_virtualization_toggle.py b/tests/test_issue4325_virtualization_toggle.py index 1f0fbc62..93a404ae 100644 --- a/tests/test_issue4325_virtualization_toggle.py +++ b/tests/test_issue4325_virtualization_toggle.py @@ -76,8 +76,8 @@ def test_panels_round_trip_and_hot_apply_virtualize_toggle(): def test_virtualize_toggle_i18n_all_locales(): js = I18N.read_text(encoding="utf-8") - assert js.count("settings_label_virtualize_transcript:") == 14 - assert js.count("settings_desc_virtualize_transcript:") == 14 + assert js.count("settings_label_virtualize_transcript:") == 15 + assert js.count("settings_desc_virtualize_transcript:") == 15 # ── #4343 force-off-for-everyone migration (load_settings behavior) ────────── diff --git a/tests/test_issue4356_no_git_update_check.py b/tests/test_issue4356_no_git_update_check.py index be823d07..41477294 100644 --- a/tests/test_issue4356_no_git_update_check.py +++ b/tests/test_issue4356_no_git_update_check.py @@ -86,4 +86,4 @@ def test_i18n_no_git_key_all_locales(): # Count occurrences of the new key (should be exactly 13, one per locale) count = content.count("settings_update_no_git") - assert count == 14, f"Expected exactly 14 settings_update_no_git keys, found {count}" + assert count == 15, f"Expected exactly 15 settings_update_no_git keys, found {count}" diff --git a/tests/test_issue4470_kanban_task_editor_fields.py b/tests/test_issue4470_kanban_task_editor_fields.py index 66ba14fd..1bd4c68e 100644 --- a/tests/test_issue4470_kanban_task_editor_fields.py +++ b/tests/test_issue4470_kanban_task_editor_fields.py @@ -130,7 +130,7 @@ def test_i18n_new_keys_in_all_locales(): ] for key in required: count = I18N_JS.count(f"{key}:") - assert count == 14, f"Key '{key}' appears {count} times, expected 14 (one per locale)" + assert count == 15, f"Key '{key}' appears {count} times, expected 15 (one per locale)" def test_backend_already_accepts_new_fields(): diff --git a/tests/test_pr1721_rtl_salvage.py b/tests/test_pr1721_rtl_salvage.py index f7c8cb61..4824425e 100644 --- a/tests/test_pr1721_rtl_salvage.py +++ b/tests/test_pr1721_rtl_salvage.py @@ -112,5 +112,5 @@ def test_rtl_in_config_defaults_and_writable_keys(): def test_rtl_localized_in_all_locales(): js = I18N.read_text(encoding="utf-8") # Count occurrences — should match the 11 locale blocks - assert js.count("settings_label_rtl:") == 14 - assert js.count("settings_desc_rtl:") == 14 + assert js.count("settings_label_rtl:") == 15 + assert js.count("settings_desc_rtl:") == 15 diff --git a/tests/test_quota_chip_settings_toggle.py b/tests/test_quota_chip_settings_toggle.py index 13387873..332265d9 100644 --- a/tests/test_quota_chip_settings_toggle.py +++ b/tests/test_quota_chip_settings_toggle.py @@ -88,5 +88,5 @@ def test_quota_chip_panels_round_trip(): def test_quota_chip_localized_in_all_locales(): js = I18N.read_text(encoding="utf-8") - assert js.count("settings_label_quota_chip:") == 14, "12 locales expected" - assert js.count("settings_desc_quota_chip:") == 14, "12 locales expected" + assert js.count("settings_label_quota_chip:") == 15, "12 locales expected" + assert js.count("settings_desc_quota_chip:") == 15, "12 locales expected" diff --git a/tests/test_verdigris_skin.py b/tests/test_verdigris_skin.py index 0c8c6ce4..7d8105fa 100644 --- a/tests/test_verdigris_skin.py +++ b/tests/test_verdigris_skin.py @@ -38,4 +38,4 @@ def test_verdigris_has_no_light_variant(): def test_verdigris_i18n_lists_skin_in_all_locales(): # There are 12 locales; each should now include verdigris as the trailing skin. # 10 locales use ASCII closing paren, 2 Chinese locales use full-width paren. - assert I18N_JS.count("verdigris)") + I18N_JS.count("verdigris)") == 14 + assert I18N_JS.count("verdigris)") + I18N_JS.count("verdigris)") == 15 diff --git a/tests/test_zeus_skin.py b/tests/test_zeus_skin.py index abca40e9..852183c8 100644 --- a/tests/test_zeus_skin.py +++ b/tests/test_zeus_skin.py @@ -45,4 +45,4 @@ def test_zeus_modals_are_not_navy(): def test_zeus_i18n_lists_skin_in_all_locales(): # There are 12 locales; each should include zeus in the skin list. - assert I18N_JS.count("/zeus/") == 14 + assert I18N_JS.count("/zeus/") == 15