fix(i18n): route Extensions panel through t() and patch 15 locales (#7581)
The Extensions settings pane (Gallery / Installed / Diagnostics) was the last large user-facing surface still rendering hardcoded English: - static/index.html carried the section meta, both loading placeholders, the Copy diagnostics button, and the whole Trust-model explainer block as plain HTML with no data-i18n attributes. - static/panels.js built the runtime / diagnostics cards from template literals with 14 untranslated row labels, a separate installed card, asset and warning card titles, sidecar card fields (Origin / Health path / Health URL / Proxy / Proxy path), the Enabled/Disabled and true/false badges, and every empty-state string (None, No warnings, No extension directory is configured., No manifest extensions are installed in the configured bundle., No loopback sidecars declared.) inline in JS. Every one of those call sites now routes through t() and the plain strings live in the locale bundles. data-i18n is used for the static HTML (the same mechanism the other selects already use, per #7582 triage), and esc(t(...)) for the template-literal DOM built in panels.js so no injected text can introduce markup. Locale keys are added to all 15 shipped locale bundles (en, ru, it, ja, es, de, zh, zh-Hant, pt, ko, fr, cs, tr, pl, vi), following the same key-parity contract that the #7602 triage enforced for the sessions_source keys: inserted right after each locale's identity (_label:_speech_) line so the brace-bounded locale extraction still finds the whole block, matching the same pattern upstream used to fix the sessions_source parity. No locale falls back to English at runtime because t() resolves every bundle. tests/test_extensions_settings_panel.py: assertions that used to match the inline English strings now match the corresponding locale keys, and the state_unknown_ids hint asserts both the key is used and the raw English is gone. Verified: - python3 -m pytest tests/ -k "i18n or extension or parity or japanese" -q -> 496 passed - node --check on the three touched static assets -> all valid Fixes #7581. Same surgical slice as #7602 (linked from #7579).
This commit is contained in:
1 parent
06d28c08cb
commit
4d2b35b943
4 files changed
+714
-51
No files matched your search
+660
@@ -748,6 +748,50 @@ const LOCALES = {
|
||||
settings_extensions_gallery_empty: 'No extensions found in the registry.',
|
||||
settings_extensions_gallery_error: 'Failed to load gallery.',
|
||||
ext_gallery_install: 'Install',
|
||||
settings_extensions_meta: 'Browse, install, and manage WebUI extensions.',
|
||||
settings_extensions_installed_loading: 'Loading installed extensions…',
|
||||
settings_extensions_copy_diagnostics: 'Copy diagnostics',
|
||||
settings_extensions_trust_model_label: 'Trust model',
|
||||
settings_extensions_trust_model_text: 'Extensions run in the WebUI browser origin and can access the same authenticated APIs as this session. Settings and extension-owned storage are browser-local and not for secrets. Only load trusted local extension directories; disabling an extension takes effect after reload for already-injected assets.',
|
||||
settings_extensions_runtime_title: 'Extension runtime',
|
||||
settings_extensions_runtime_status_from: 'Status from /api/extensions/status; toggles persist a local override for installed manifest entries.',
|
||||
settings_extensions_diag_extension_dir_configured: 'Extension dir configured',
|
||||
settings_extensions_diag_extension_dir_valid: 'Extension dir valid',
|
||||
settings_extensions_diag_manifest_configured: 'Manifest configured',
|
||||
settings_extensions_diag_manifest_loaded: 'Manifest loaded',
|
||||
settings_extensions_diag_manifest_status: 'Manifest status',
|
||||
settings_extensions_diag_manifest_entries: 'Manifest entries inspected',
|
||||
settings_extensions_diag_manifest_scripts: 'Manifest script count',
|
||||
settings_extensions_diag_manifest_stylesheets: 'Manifest stylesheet count',
|
||||
settings_extensions_diag_manifest_sidecars: 'Manifest sidecar count',
|
||||
settings_extensions_diag_final_scripts: 'Final script count',
|
||||
settings_extensions_diag_final_stylesheets: 'Final stylesheet count',
|
||||
settings_extensions_diag_loopback_sidecars: 'Loopback sidecar count',
|
||||
settings_extensions_diag_installed_extensions: 'Installed manifest extensions',
|
||||
settings_extensions_diag_user_disabled: 'User-disabled extensions',
|
||||
settings_extensions_installed_section_title: 'Installed manifest extensions',
|
||||
settings_extensions_installed_section_meta: 'Enable or disable already-present local extensions. Reload WebUI to apply injected asset changes to this browser tab.',
|
||||
settings_extensions_installed_empty: 'No manifest extensions are installed in the configured bundle.',
|
||||
settings_extensions_no_dir: 'No extension directory is configured.',
|
||||
ext_none: 'None',
|
||||
ext_no_warnings: 'No warnings.',
|
||||
ext_state_unknown_ids_hint: 'Some saved disabled-extension overrides no longer match the current manifest; re-added extensions with the same id may stay disabled.',
|
||||
ext_assets_title: 'Final public asset URLs',
|
||||
ext_assets_meta: 'Same-origin URLs that may be injected into the app shell.',
|
||||
ext_assets_scripts: 'Scripts',
|
||||
ext_assets_styles: 'Stylesheets',
|
||||
ext_warnings_title: 'Sanitized warnings',
|
||||
ext_warnings_meta: 'Codes and coarse sources only; paths and rejected values are not shown.',
|
||||
ext_sidecars_title: 'Loopback sidecars',
|
||||
ext_sidecars_meta: 'Declared local companions; health is checked directly from this browser with WebUI credentials omitted.',
|
||||
ext_sidecars_none: 'No loopback sidecars declared.',
|
||||
ext_sidecar_origin: 'Origin',
|
||||
ext_sidecar_health_path: 'Health path',
|
||||
ext_sidecar_health_url: 'Health URL',
|
||||
ext_sidecar_proxy: 'Proxy',
|
||||
ext_sidecar_proxy_path: 'Proxy path',
|
||||
ext_status_true: 'true',
|
||||
ext_status_false: 'false',
|
||||
ext_gallery_installing: 'Installing…',
|
||||
ext_gallery_installed: 'Installed',
|
||||
ext_gallery_uninstall: 'Uninstall',
|
||||
@@ -1793,6 +1837,50 @@ const LOCALES = {
|
||||
offline_stream_waiting: 'Connessione persa. In attesa di aggiornare…',
|
||||
_lang: 'it',
|
||||
_label: 'Italiano',
|
||||
settings_extensions_meta: 'Sfoglia, installa e gestisci le estensioni WebUI.',
|
||||
settings_extensions_installed_loading: 'Caricamento estensioni installate…',
|
||||
settings_extensions_copy_diagnostics: 'Copia diagnosi',
|
||||
settings_extensions_trust_model_label: 'Modello di fiducia',
|
||||
'settings_extensions_trust_model_text': "Le estensioni girano nell'origine browser del WebUI e possono accedere alle stesse API autenticate di questa sessione. Impostazioni e storage delle estensioni vivono solo nel browser e non sono pensati per segreti. Caricare solo directory di estensioni locali fidate; la disabilitazione di un'estensione ha effetto dopo il ricaricamento per gli asset già iniettati.",
|
||||
settings_extensions_runtime_title: 'Runtime delle estensioni',
|
||||
settings_extensions_runtime_status_from: 'Stato da /api/extensions/status; i toggle persistono una sovrascrittura locale per le voci manifest installate.',
|
||||
settings_extensions_diag_extension_dir_configured: 'Directory estensioni configurata',
|
||||
settings_extensions_diag_extension_dir_valid: 'Directory estensioni valida',
|
||||
settings_extensions_diag_manifest_configured: 'Manifest configurato',
|
||||
settings_extensions_diag_manifest_loaded: 'Manifest caricato',
|
||||
settings_extensions_diag_manifest_status: 'Stato manifest',
|
||||
settings_extensions_diag_manifest_entries: 'Voci manifest ispezionate',
|
||||
settings_extensions_diag_manifest_scripts: 'Script nel manifest',
|
||||
settings_extensions_diag_manifest_stylesheets: 'Stylesheet nel manifest',
|
||||
settings_extensions_diag_manifest_sidecars: 'Sidecar nel manifest',
|
||||
settings_extensions_diag_final_scripts: 'Script totali',
|
||||
settings_extensions_diag_final_stylesheets: 'Stylesheet totali',
|
||||
settings_extensions_diag_loopback_sidecars: 'Sidecar loopback',
|
||||
settings_extensions_diag_installed_extensions: 'Estensioni installate',
|
||||
settings_extensions_diag_user_disabled: 'Disabilitate da utente',
|
||||
settings_extensions_installed_section_title: 'Estensioni installate',
|
||||
settings_extensions_installed_section_meta: 'Abilita o disabilita estensioni locali già presenti. Ricarica il WebUI per applicare le modifiche delle risorse iniettate in questa scheda.',
|
||||
settings_extensions_installed_empty: 'Non ci sono estensioni manifest installate nel bundle configurato.',
|
||||
settings_extensions_no_dir: 'Directory delle estensioni non configurata.',
|
||||
ext_none: 'Nessuno',
|
||||
ext_no_warnings: 'Nessun avviso.',
|
||||
ext_state_unknown_ids_hint: 'Alcune sovrascritture di estensioni disabilitate non corrispondono più al manifest corrente; le estensioni riaggiunte con lo stesso id possono restare disabilitate.',
|
||||
ext_assets_title: 'URL risorse pubbliche finali',
|
||||
ext_assets_meta: "URL same-origin che possono essere iniettati nella shell dell'app.",
|
||||
ext_assets_scripts: 'Script',
|
||||
ext_assets_styles: 'Stylesheet',
|
||||
ext_warnings_title: 'Avvisi filtrati',
|
||||
ext_warnings_meta: 'Solo codici e fonti generali; percorsi e valori rifiutati non sono mostrati.',
|
||||
ext_sidecars_title: 'Sidecar',
|
||||
ext_sidecars_meta: "Compagni locali dichiarati; l'health check viene eseguito direttamente da questo browser senza inviare le credenziali WebUI.",
|
||||
ext_sidecars_none: 'Nessun sidecar loopback dichiarato.',
|
||||
ext_sidecar_origin: 'Origine',
|
||||
ext_sidecar_health_path: 'Percorso health',
|
||||
ext_sidecar_health_url: 'URL health',
|
||||
ext_sidecar_proxy: 'Proxy',
|
||||
ext_sidecar_proxy_path: 'Percorso proxy',
|
||||
ext_status_true: 'true',
|
||||
ext_status_false: 'false',
|
||||
sessions_source_webui: 'Sessioni WebUI ({0})',
|
||||
sessions_source_cli: 'Sessioni CLI ({0})',
|
||||
_speech: 'it-IT',
|
||||
@@ -3554,6 +3642,50 @@ const LOCALES = {
|
||||
offline_stream_waiting: '接続が切断されました。更新を待っています…',
|
||||
_lang: 'ja',
|
||||
_label: '日本語',
|
||||
settings_extensions_meta: 'WebUI拡張機能の閲覧、インストール、管理。',
|
||||
settings_extensions_installed_loading: 'インストール済み拡張機能を読み込み中…',
|
||||
settings_extensions_copy_diagnostics: '診断情報をコピー',
|
||||
settings_extensions_trust_model_label: '信頼モデル',
|
||||
settings_extensions_trust_model_text: '拡張機能は WebUI ブラウザオリジンで動作し、このセッションと同じ認証済み API にアクセスできます。設定と拡張機能が所有するストレージはブラウザローカルであり、シークレットの保存には使用しません。信頼できるローカル拡張ディレクトリのみ読み込んでください。拡張機能の無効化は再読み込み後に、既に注入されたアセットへ適用されます。',
|
||||
settings_extensions_runtime_title: '拡張機能ランタイム',
|
||||
settings_extensions_runtime_status_from: '状態は /api/extensions/status から取得します。トグルの状態は、インストール済みマニフェストエントリに対するローカル上書きとして保存されます。',
|
||||
settings_extensions_diag_extension_dir_configured: '拡張ディレクトリ設定済み',
|
||||
settings_extensions_diag_extension_dir_valid: '拡張ディレクトリ有効',
|
||||
settings_extensions_diag_manifest_configured: 'マニフェスト設定済み',
|
||||
settings_extensions_diag_manifest_loaded: 'マニフェスト読み込み済み',
|
||||
settings_extensions_diag_manifest_status: 'マニフェスト状態',
|
||||
settings_extensions_diag_manifest_entries: '検査済みマニフェストエントリ数',
|
||||
settings_extensions_diag_manifest_scripts: 'マニフェストスクリプト数',
|
||||
settings_extensions_diag_manifest_stylesheets: 'マニフェストスタイルシート数',
|
||||
settings_extensions_diag_manifest_sidecars: 'マニフェストサイドカー数',
|
||||
settings_extensions_diag_final_scripts: '最終スクリプト数',
|
||||
settings_extensions_diag_final_stylesheets: '最終スタイルシート数',
|
||||
settings_extensions_diag_loopback_sidecars: 'ループバックサイドカー数',
|
||||
settings_extensions_diag_installed_extensions: 'インストール済みマニフェスト拡張数',
|
||||
settings_extensions_diag_user_disabled: 'ユーザー無効化拡張数',
|
||||
settings_extensions_installed_section_title: 'インストール済みマニフェスト拡張',
|
||||
settings_extensions_installed_section_meta: '既に存在するローカル拡張を有効/無効化します。注入済みアセットの変更をこのブラウザタブに反映するには WebUI を再読み込みしてください。',
|
||||
settings_extensions_installed_empty: '設定されたバンドルにインストール済みマニフェスト拡張はありません。',
|
||||
settings_extensions_no_dir: '拡張ディレクトリが設定されていません。',
|
||||
ext_none: 'なし',
|
||||
ext_no_warnings: '警告はありません。',
|
||||
ext_state_unknown_ids_hint: '保存済みの無効化拡張設定の一部が現在のマニフェストと一致しなくなりました。同じ ID で再追加された拡張は無効のままになることがあります。',
|
||||
ext_assets_title: '最終パブリックアセット URL',
|
||||
ext_assets_meta: 'アプリシェルに注入される可能性のある同一オリジン URL。',
|
||||
ext_assets_scripts: 'スクリプト',
|
||||
ext_assets_styles: 'スタイルシート',
|
||||
ext_warnings_title: '整形済み警告',
|
||||
ext_warnings_meta: 'コードと大まかなソースのみ表示。パスと拒否された値は表示されません。',
|
||||
ext_sidecars_title: 'ループバックサイドカー',
|
||||
ext_sidecars_meta: '宣言されたローカル コンパニオン。WebUI の資格情報を送らずに、このブラウザから直接ヘルスチェックします。',
|
||||
ext_sidecars_none: '宣言されたループバックサイドカーはありません。',
|
||||
ext_sidecar_origin: 'オリジン',
|
||||
ext_sidecar_health_path: 'ヘルスパス',
|
||||
ext_sidecar_health_url: 'ヘルス URL',
|
||||
ext_sidecar_proxy: 'プロキシ',
|
||||
ext_sidecar_proxy_path: 'プロキシパス',
|
||||
ext_status_true: 'true',
|
||||
ext_status_false: 'false',
|
||||
sessions_source_webui: 'WebUIセッション ({0})',
|
||||
sessions_source_cli: 'CLIセッション ({0})',
|
||||
_speech: 'ja-JP',
|
||||
@@ -5343,6 +5475,50 @@ const LOCALES = {
|
||||
voice_mode_active: 'Голосовой режим включён',
|
||||
voice_mode_off: 'Голосовой режим выключен',
|
||||
session_imported: 'Сеанс импортирован',
|
||||
settings_extensions_meta: 'Обзор, установка и управление расширениями WebUI.',
|
||||
settings_extensions_installed_loading: 'Загрузка установленных расширений…',
|
||||
settings_extensions_copy_diagnostics: 'Копировать диагностику',
|
||||
settings_extensions_trust_model_label: 'Модель доверия',
|
||||
settings_extensions_trust_model_text: 'Расширения выполняются в браузерном origin WebUI и имеют доступ к тем же аутентифицированным API, что и эта сессия. Настройки и хранилище расширений живут только в браузере и не предназначены для секретов. Загружайте только доверенные локальные каталоги расширений; отключение расширения вступает в силу после перезагрузки для уже внедрённых ресурсов.',
|
||||
settings_extensions_runtime_title: 'Среда выполнения расширений',
|
||||
settings_extensions_runtime_status_from: 'Статус из /api/extensions/status; переключатели сохраняют локальное переопределение для установленных манифестных записей.',
|
||||
settings_extensions_diag_extension_dir_configured: 'Каталог расширений задан',
|
||||
settings_extensions_diag_extension_dir_valid: 'Каталог расширений валиден',
|
||||
settings_extensions_diag_manifest_configured: 'Манифест задан',
|
||||
settings_extensions_diag_manifest_loaded: 'Манифест загружен',
|
||||
settings_extensions_diag_manifest_status: 'Статус манифеста',
|
||||
settings_extensions_diag_manifest_entries: 'Записей манифеста проверено',
|
||||
settings_extensions_diag_manifest_scripts: 'Скриптов в манифесте',
|
||||
settings_extensions_diag_manifest_stylesheets: 'Стилей в манифесте',
|
||||
settings_extensions_diag_manifest_sidecars: 'Сайдкаров в манифесте',
|
||||
settings_extensions_diag_final_scripts: 'Скриптов в итоге',
|
||||
settings_extensions_diag_final_stylesheets: 'Стилей в итоге',
|
||||
settings_extensions_diag_loopback_sidecars: 'Сайдкаров loopback',
|
||||
settings_extensions_diag_installed_extensions: 'Установленных расширений',
|
||||
settings_extensions_diag_user_disabled: 'Отключённых пользователем',
|
||||
settings_extensions_installed_section_title: 'Установленные расширения',
|
||||
settings_extensions_installed_section_meta: 'Включайте или отключайте уже присутствующие локальные расширения. Перезагрузите WebUI, чтобы применить изменения внедрённых ресурсов в этой вкладке.',
|
||||
settings_extensions_installed_empty: 'В настроенном бандле нет установленных манифестных расширений.',
|
||||
settings_extensions_no_dir: 'Каталог расширений не настроен.',
|
||||
ext_none: 'Нет',
|
||||
ext_no_warnings: 'Предупреждений нет.',
|
||||
ext_state_unknown_ids_hint: 'Некоторые сохранённые переопределения отключённых расширений больше не совпадают с текущим манифестом; повторно добавленные расширения с тем же id могут остаться отключёнными.',
|
||||
ext_assets_title: 'Итоговые публичные URL ресурсов',
|
||||
ext_assets_meta: 'Same-origin URL, которые могут быть внедрены в оболочку приложения.',
|
||||
ext_assets_scripts: 'Скрипты',
|
||||
ext_assets_styles: 'Стили',
|
||||
ext_warnings_title: 'Отфильтрованные предупреждения',
|
||||
ext_warnings_meta: 'Только коды и общие источники; пути и отклонённые значения не показываются.',
|
||||
ext_sidecars_title: 'Сайдкары расширений',
|
||||
ext_sidecars_meta: 'Объявленные локальные компаньоны; проверка состояния выполняется прямо этим браузером без отправки учётных данных WebUI.',
|
||||
ext_sidecars_none: 'Объявленных loopback-сайдкаров нет.',
|
||||
ext_sidecar_origin: 'Origin',
|
||||
ext_sidecar_health_path: 'Путь проверки',
|
||||
ext_sidecar_health_url: 'URL проверки',
|
||||
ext_sidecar_proxy: 'Прокси',
|
||||
ext_sidecar_proxy_path: 'Путь прокси',
|
||||
ext_status_true: 'да',
|
||||
ext_status_false: 'нет',
|
||||
sessions_source_webui: 'Сеансы WebUI ({0})',
|
||||
sessions_source_cli: 'Сеансы CLI ({0})',
|
||||
import_failed: 'Не удалось импортировать: ',
|
||||
@@ -7060,6 +7236,50 @@ const LOCALES = {
|
||||
offline_stream_waiting: 'Conexión perdida. Esperando para actualizar…',
|
||||
_lang: 'es',
|
||||
_label: 'Español',
|
||||
settings_extensions_meta: 'Explora, instala y gestiona las extensiones WebUI.',
|
||||
settings_extensions_installed_loading: 'Cargando extensiones instaladas…',
|
||||
settings_extensions_copy_diagnostics: 'Copiar diagnóstico',
|
||||
settings_extensions_trust_model_label: 'Modelo de confianza',
|
||||
settings_extensions_trust_model_text: 'Las extensiones se ejecutan en el origen de navegador del WebUI y pueden acceder a las mismas API autenticadas que esta sesión. Los ajustes y el almacenamiento de las extensiones viven solo en el navegador y no son para secretos. Carga solo directorios locales de extensiones de confianza; deshabilitar una extensión surte efecto tras recargar para los recursos ya inyectados.',
|
||||
settings_extensions_runtime_title: 'Runtime de extensiones',
|
||||
settings_extensions_runtime_status_from: 'Estado de /api/extensions/status; los interruptores persisten un reemplazo local para las entradas de manifest instaladas.',
|
||||
settings_extensions_diag_extension_dir_configured: 'Directorio de extensiones configurado',
|
||||
settings_extensions_diag_extension_dir_valid: 'Directorio de extensiones válido',
|
||||
settings_extensions_diag_manifest_configured: 'Manifest configurado',
|
||||
settings_extensions_diag_manifest_loaded: 'Manifest cargado',
|
||||
settings_extensions_diag_manifest_status: 'Estado del manifest',
|
||||
settings_extensions_diag_manifest_entries: 'Entradas de manifest inspeccionadas',
|
||||
settings_extensions_diag_manifest_scripts: 'Scripts en manifest',
|
||||
settings_extensions_diag_manifest_stylesheets: 'Stylesheets en manifest',
|
||||
settings_extensions_diag_manifest_sidecars: 'Sidecars en manifest',
|
||||
settings_extensions_diag_final_scripts: 'Scripts finales',
|
||||
settings_extensions_diag_final_stylesheets: 'Stylesheets finales',
|
||||
settings_extensions_diag_loopback_sidecars: 'Sidecars loopback',
|
||||
settings_extensions_diag_installed_extensions: 'Extensiones instaladas',
|
||||
settings_extensions_diag_user_disabled: 'Deshabilitadas por usuario',
|
||||
settings_extensions_installed_section_title: 'Extensiones instaladas',
|
||||
settings_extensions_installed_section_meta: 'Habilita o deshabilita extensiones locales ya presentes. Recarga el WebUI para aplicar los cambios de recursos inyectados en esta pestaña.',
|
||||
settings_extensions_installed_empty: 'No hay extensiones manifest instaladas en el paquete configurado.',
|
||||
settings_extensions_no_dir: 'No se ha configurado directorio de extensiones.',
|
||||
ext_none: 'Ninguno',
|
||||
ext_no_warnings: 'Sin avisos.',
|
||||
ext_state_unknown_ids_hint: 'Algunas sobrescrituras de extensiones deshabilitadas ya no coinciden con el manifest actual; las extensiones re-agregadas con el mismo id pueden permanecer deshabilitadas.',
|
||||
ext_assets_title: 'URLs finales de recursos públicos',
|
||||
ext_assets_meta: 'URL same-origin que pueden inyectarse en el shell de la aplicación.',
|
||||
ext_assets_scripts: 'Scripts',
|
||||
ext_assets_styles: 'Stylesheets',
|
||||
ext_warnings_title: 'Avisos filtrados',
|
||||
ext_warnings_meta: 'Solo códigos y fuentes generales; las rutas y los valores rechazados no se muestran.',
|
||||
ext_sidecars_title: 'Sidecars',
|
||||
ext_sidecars_meta: 'Compañeros locales declarados; la verificación de estado se hace directamente desde este navegador sin credenciales WebUI.',
|
||||
ext_sidecars_none: 'No hay sidecars loopback declarados.',
|
||||
ext_sidecar_origin: 'Origen',
|
||||
ext_sidecar_health_path: 'Ruta de health',
|
||||
ext_sidecar_health_url: 'URL de health',
|
||||
ext_sidecar_proxy: 'Proxy',
|
||||
ext_sidecar_proxy_path: 'Ruta de proxy',
|
||||
ext_status_true: 'true',
|
||||
ext_status_false: 'false',
|
||||
sessions_source_webui: 'Sesiones WebUI ({0})',
|
||||
sessions_source_cli: 'Sesiones CLI ({0})',
|
||||
_speech: 'es-ES',
|
||||
@@ -8767,6 +8987,50 @@ const LOCALES = {
|
||||
offline_stream_waiting: 'Verbindung verloren. Warte auf Aktualisierung…',
|
||||
_lang: 'de',
|
||||
_label: 'Deutsch',
|
||||
settings_extensions_meta: 'WebUI-Erweiterungen durchsehen, installieren und verwalten.',
|
||||
settings_extensions_installed_loading: 'Installierte Erweiterungen werden geladen…',
|
||||
settings_extensions_copy_diagnostics: 'Diagnose kopieren',
|
||||
settings_extensions_trust_model_label: 'Vertrauensmodell',
|
||||
settings_extensions_trust_model_text: 'Erweiterungen laufen im Browser-Origin des WebUI und haben Zugriff auf dieselben authentifizierten APIs wie diese Sitzung. Einstellungen und Erweiterungs-Speicher bleiben im Browser und sind nicht für Geheimnisse gedacht. Nur vertrauenswürdige lokale Erweiterungsverzeichnisse laden; das Deaktivieren einer Erweiterung greift nach dem Neuladen für bereits injizierte Assets.',
|
||||
settings_extensions_runtime_title: 'Erweiterungs-Runtime',
|
||||
settings_extensions_runtime_status_from: 'Status aus /api/extensions/status; Schalter speichern eine lokale Überschreibung für installierte Manifest-Einträge.',
|
||||
settings_extensions_diag_extension_dir_configured: 'Erweiterungsverzeichnis konfiguriert',
|
||||
settings_extensions_diag_extension_dir_valid: 'Erweiterungsverzeichnis gültig',
|
||||
settings_extensions_diag_manifest_configured: 'Manifest konfiguriert',
|
||||
settings_extensions_diag_manifest_loaded: 'Manifest geladen',
|
||||
settings_extensions_diag_manifest_status: 'Manifest-Status',
|
||||
settings_extensions_diag_manifest_entries: 'Geprüfte Manifest-Einträge',
|
||||
settings_extensions_diag_manifest_scripts: 'Skripte im Manifest',
|
||||
settings_extensions_diag_manifest_stylesheets: 'Stylesheets im Manifest',
|
||||
settings_extensions_diag_manifest_sidecars: 'Sidecars im Manifest',
|
||||
settings_extensions_diag_final_scripts: 'Skripte insgesamt',
|
||||
settings_extensions_diag_final_stylesheets: 'Stylesheets insgesamt',
|
||||
settings_extensions_diag_loopback_sidecars: 'Loopback-Sidecars',
|
||||
settings_extensions_diag_installed_extensions: 'Installierte Erweiterungen',
|
||||
settings_extensions_diag_user_disabled: 'Vom Nutzer deaktiviert',
|
||||
settings_extensions_installed_section_title: 'Installierte Erweiterungen',
|
||||
settings_extensions_installed_section_meta: 'Bereits vorhandene lokale Erweiterungen ein- oder ausschalten. WebUI neu laden, um Änderungen der injizierten Assets in diesem Tab anzuwenden.',
|
||||
settings_extensions_installed_empty: 'Im konfigurierten Bundle sind keine installierten Manifest-Erweiterungen vorhanden.',
|
||||
settings_extensions_no_dir: 'Kein Erweiterungsverzeichnis konfiguriert.',
|
||||
ext_none: 'Keine',
|
||||
ext_no_warnings: 'Keine Warnungen.',
|
||||
ext_state_unknown_ids_hint: 'Einige gespeicherte Overrides für deaktivierte Erweiterungen passen nicht mehr zum aktuellen Manifest; erneut hinzugefügte Erweiterungen mit derselben ID können deaktiviert bleiben.',
|
||||
ext_assets_title: 'Finale öffentliche Asset-URLs',
|
||||
ext_assets_meta: 'Same-Origin-URLs, die in die App-Shell injiziert werden können.',
|
||||
ext_assets_scripts: 'Skripte',
|
||||
ext_assets_styles: 'Stylesheets',
|
||||
ext_warnings_title: 'Gefilterte Warnungen',
|
||||
ext_warnings_meta: 'Nur Codes und grobe Quellen; Pfade und abgelehnte Werte werden nicht angezeigt.',
|
||||
ext_sidecars_title: 'Sidecars',
|
||||
ext_sidecars_meta: 'Deklarierte lokale Begleiter; die Prüfung erfolgt direkt aus diesem Browser ohne WebUI-Anmeldeinformationen.',
|
||||
ext_sidecars_none: 'Keine Loopback-Sidecars deklariert.',
|
||||
ext_sidecar_origin: 'Origin',
|
||||
ext_sidecar_health_path: 'Health-Pfad',
|
||||
ext_sidecar_health_url: 'Health-URL',
|
||||
ext_sidecar_proxy: 'Proxy',
|
||||
ext_sidecar_proxy_path: 'Proxy-Pfad',
|
||||
ext_status_true: 'true',
|
||||
ext_status_false: 'false',
|
||||
sessions_source_webui: 'WebUI-Sitzungen ({0})',
|
||||
sessions_source_cli: 'CLI-Sitzungen ({0})',
|
||||
_speech: 'de-DE',
|
||||
@@ -10468,6 +10732,50 @@ const LOCALES = {
|
||||
offline_stream_waiting: '连接已断开。正在等待刷新…',
|
||||
_lang: 'zh',
|
||||
_label: '\u7b80\u4f53\u4e2d\u6587',
|
||||
settings_extensions_meta: '浏览、安装并管理 WebUI 扩展。',
|
||||
settings_extensions_installed_loading: '正在加载已安装的扩展…',
|
||||
settings_extensions_copy_diagnostics: '复制诊断',
|
||||
settings_extensions_trust_model_label: '信任模型',
|
||||
settings_extensions_trust_model_text: '扩展运行在 WebUI 浏览器源中,并可以访问与本会话相同的已认证 API。设置与扩展自有的存储仅存在于浏览器内,不应存放机密。只加载可信的本地扩展目录;禁用扩展会在重新加载后对已注入的资源生效。',
|
||||
settings_extensions_runtime_title: '扩展运行时',
|
||||
settings_extensions_runtime_status_from: '状态来自 /api/extensions/status;开关会为已安装的 manifest 项保存本地覆盖。',
|
||||
settings_extensions_diag_extension_dir_configured: '已配置扩展目录',
|
||||
settings_extensions_diag_extension_dir_valid: '扩展目录有效',
|
||||
settings_extensions_diag_manifest_configured: '已配置 manifest',
|
||||
settings_extensions_diag_manifest_loaded: '已加载 manifest',
|
||||
settings_extensions_diag_manifest_status: 'manifest 状态',
|
||||
settings_extensions_diag_manifest_entries: '已检查的 manifest 条目',
|
||||
settings_extensions_diag_manifest_scripts: 'manifest 脚本数',
|
||||
settings_extensions_diag_manifest_stylesheets: 'manifest 样式表数',
|
||||
settings_extensions_diag_manifest_sidecars: 'manifest sidecar 数',
|
||||
settings_extensions_diag_final_scripts: '最终脚本数',
|
||||
settings_extensions_diag_final_stylesheets: '最终样式表数',
|
||||
settings_extensions_diag_loopback_sidecars: 'Loopback sidecar 数',
|
||||
settings_extensions_diag_installed_extensions: '已安装扩展数',
|
||||
settings_extensions_diag_user_disabled: '用户禁用数',
|
||||
settings_extensions_installed_section_title: '已安装的 manifest 扩展',
|
||||
settings_extensions_installed_section_meta: '启用或禁用已存在的本地扩展。重新加载 WebUI 以把已注入资源的变化应用到本浏览器标签。',
|
||||
settings_extensions_installed_empty: '已配置的 bundle 中未安装任何 manifest 扩展。',
|
||||
settings_extensions_no_dir: '未配置扩展目录。',
|
||||
ext_none: '无',
|
||||
ext_no_warnings: '没有警告。',
|
||||
ext_state_unknown_ids_hint: '某些保存的已禁用扩展覆盖不再匹配当前 manifest;以相同 ID 重新添加的扩展可能仍保持禁用。',
|
||||
ext_assets_title: '最终公共资源 URL',
|
||||
ext_assets_meta: '可注入应用外壳的同源 URL。',
|
||||
ext_assets_scripts: '脚本',
|
||||
ext_assets_styles: '样式表',
|
||||
ext_warnings_title: '已过滤的警告',
|
||||
ext_warnings_meta: '仅显示代码和大致来源;不会显示路径或被拒绝的具体值。',
|
||||
ext_sidecars_title: 'Sidecar',
|
||||
ext_sidecars_meta: '已声明的本地伴侣;此浏览器会直接检查其健康状态且不带 WebUI 凭据。',
|
||||
ext_sidecars_none: '没有声明任何 loopback sidecar。',
|
||||
ext_sidecar_origin: '源',
|
||||
ext_sidecar_health_path: '健康路径',
|
||||
ext_sidecar_health_url: '健康 URL',
|
||||
ext_sidecar_proxy: '代理',
|
||||
ext_sidecar_proxy_path: '代理路径',
|
||||
ext_status_true: '是',
|
||||
ext_status_false: '否',
|
||||
sessions_source_webui: 'WebUI 会话 ({0})',
|
||||
sessions_source_cli: 'CLI 会话 ({0})',
|
||||
_speech: 'zh-CN',
|
||||
@@ -12164,6 +12472,50 @@ const LOCALES = {
|
||||
offline_stream_waiting: '連線中斷。等待重新整理…',
|
||||
_lang: 'zh-Hant',
|
||||
_label: '繁體中文',
|
||||
settings_extensions_meta: '瀏覽、安裝並管理 WebUI 擴充功能。',
|
||||
settings_extensions_installed_loading: '正在載入已安裝的擴充功能…',
|
||||
settings_extensions_copy_diagnostics: '複製診斷',
|
||||
settings_extensions_trust_model_label: '信任模型',
|
||||
settings_extensions_trust_model_text: '擴充功能執行在 WebUI 瀏覽器源,可存取與本會話相同的已驗證 API。設定與擴充功能自有的儲存僅存在於瀏覽器內,不應存放機密。僅載入可信的本地擴充功能目錄;停用擴充功能會在重新載入後對已注入的資源生效。',
|
||||
settings_extensions_runtime_title: '擴充功能執行時',
|
||||
settings_extensions_runtime_status_from: '狀態來自 /api/extensions/status;切換會為已安裝的 manifest 項保存本地覆蓋。',
|
||||
settings_extensions_diag_extension_dir_configured: '已設定擴充功能目錄',
|
||||
settings_extensions_diag_extension_dir_valid: '擴充功能目錄有效',
|
||||
settings_extensions_diag_manifest_configured: '已設定 manifest',
|
||||
settings_extensions_diag_manifest_loaded: '已載入 manifest',
|
||||
settings_extensions_diag_manifest_status: 'manifest 狀態',
|
||||
settings_extensions_diag_manifest_entries: '已檢查的 manifest 項目',
|
||||
settings_extensions_diag_manifest_scripts: 'manifest 腳本數',
|
||||
settings_extensions_diag_manifest_stylesheets: 'manifest 樣式表數',
|
||||
settings_extensions_diag_manifest_sidecars: 'manifest sidecar 數',
|
||||
settings_extensions_diag_final_scripts: '最終腳本數',
|
||||
settings_extensions_diag_final_stylesheets: '最終樣式表數',
|
||||
settings_extensions_diag_loopback_sidecars: 'Loopback sidecar 數',
|
||||
settings_extensions_diag_installed_extensions: '已安裝擴充功能數',
|
||||
settings_extensions_diag_user_disabled: '使用者停用數',
|
||||
settings_extensions_installed_section_title: '已安裝的 manifest 擴充功能',
|
||||
settings_extensions_installed_section_meta: '啟用或停用既有的本機擴充功能。重新載入 WebUI 以將注入資源的變更套用到此瀏覽器分頁。',
|
||||
settings_extensions_installed_empty: '已設定的 bundle 中未安裝任何 manifest 擴充功能。',
|
||||
settings_extensions_no_dir: '未設定擴充功能目錄。',
|
||||
ext_none: '無',
|
||||
ext_no_warnings: '沒有警告。',
|
||||
ext_state_unknown_ids_hint: '某些已保存的停用擴充功能覆蓋不再符合目前 manifest;以相同 ID 重新加入的擴充功能可能仍保持停用。',
|
||||
ext_assets_title: '最終公開資源 URL',
|
||||
ext_assets_meta: '可注入應用程式外殼的 same-origin URL。',
|
||||
ext_assets_scripts: '腳本',
|
||||
ext_assets_styles: '樣式表',
|
||||
ext_warnings_title: '已過濾的警告',
|
||||
ext_warnings_meta: '僅顯示代碼與粗略來源;路徑與被拒絕的具體值不會顯示。',
|
||||
ext_sidecars_title: 'Sidecar',
|
||||
ext_sidecars_meta: '已宣告的本機伴生程序;健康檢查由這個瀏覽器直接發送,不會附帶 WebUI 憑證。',
|
||||
ext_sidecars_none: '沒有宣告任何 loopback sidecar。',
|
||||
ext_sidecar_origin: '源',
|
||||
ext_sidecar_health_path: '健康路徑',
|
||||
ext_sidecar_health_url: '健康 URL',
|
||||
ext_sidecar_proxy: '代理',
|
||||
ext_sidecar_proxy_path: '代理路徑',
|
||||
ext_status_true: '是',
|
||||
ext_status_false: '否',
|
||||
sessions_source_webui: 'WebUI 對話 ({0})',
|
||||
sessions_source_cli: 'CLI 對話 ({0})',
|
||||
_speech: 'zh-TW',
|
||||
@@ -13927,6 +14279,50 @@ const LOCALES = {
|
||||
offline_stream_waiting: 'Conexão perdida. Aguardando para atualizar…',
|
||||
_lang: 'pt',
|
||||
_label: 'Português',
|
||||
settings_extensions_meta: 'Explorar, instalar e gerenciar extensões WebUI.',
|
||||
settings_extensions_installed_loading: 'Carregando extensões instaladas…',
|
||||
settings_extensions_copy_diagnostics: 'Copiar diagnósticos',
|
||||
settings_extensions_trust_model_label: 'Modelo de confiança',
|
||||
settings_extensions_trust_model_text: 'As extensões rodam no browser origin do WebUI e podem acessar as mesmas APIs autenticadas desta sessão. Configurações e armazenamento das extensões vivem apenas no navegador e não são para segredos. Carigue somente diretórios locais de extensões confiáveis; desabilitar uma extensão só tem efeito após recarregar para assets já injetados.',
|
||||
settings_extensions_runtime_title: 'Runtime de extensões',
|
||||
settings_extensions_runtime_status_from: 'Status de /api/extensions/status; os toggles persistem um override local para entradas de manifest instaladas.',
|
||||
settings_extensions_diag_extension_dir_configured: 'Diretório de extensões configurado',
|
||||
settings_extensions_diag_extension_dir_valid: 'Diretório de extensões válido',
|
||||
settings_extensions_diag_manifest_configured: 'Manifest configurado',
|
||||
settings_extensions_diag_manifest_loaded: 'Manifest carregado',
|
||||
settings_extensions_diag_manifest_status: 'Status do manifest',
|
||||
settings_extensions_diag_manifest_entries: 'Entradas de manifest inspecionadas',
|
||||
settings_extensions_diag_manifest_scripts: 'Scripts no manifest',
|
||||
settings_extensions_diag_manifest_stylesheets: 'Stylesheets no manifest',
|
||||
settings_extensions_diag_manifest_sidecars: 'Sidecars no manifest',
|
||||
settings_extensions_diag_final_scripts: 'Scripts finais',
|
||||
settings_extensions_diag_final_stylesheets: 'Stylesheets finais',
|
||||
settings_extensions_diag_loopback_sidecars: 'Sidecars loopback',
|
||||
settings_extensions_diag_installed_extensions: 'Extensões instaladas',
|
||||
settings_extensions_diag_user_disabled: 'Desabilitadas pelo usuário',
|
||||
settings_extensions_installed_section_title: 'Extensões instaladas',
|
||||
settings_extensions_installed_section_meta: 'Habilita ou desabilita extensões locais já presentes. Recarregue o WebUI para aplicar as alterações de assets injetados nesta aba do navegador.',
|
||||
settings_extensions_installed_empty: 'Não há extensões manifest instaladas no bundle configurado.',
|
||||
settings_extensions_no_dir: 'Nenhum diretório de extensões configurado.',
|
||||
ext_none: 'Nenhum',
|
||||
ext_no_warnings: 'Nenhum aviso.',
|
||||
ext_state_unknown_ids_hint: 'Algumas overrides salvas de extensões desabilitadas não correspondem mais ao manifest atual; extensões re-adicionadas com o mesmo id podem permanecer desabilitadas.',
|
||||
ext_assets_title: 'URLs finais de assets públicos',
|
||||
ext_assets_meta: 'URLs same-origin que podem ser injetados no app shell.',
|
||||
ext_assets_scripts: 'Scripts',
|
||||
ext_assets_styles: 'Stylesheets',
|
||||
ext_warnings_title: 'Avisos filtrados',
|
||||
ext_warnings_meta: 'Apenas códigos e fontes gerais; caminhos e valores rejeitados não são mostrados.',
|
||||
ext_sidecars_title: 'Sidecars',
|
||||
ext_sidecars_meta: 'Companheiros locais declarados; a checagem de saúde é feita diretamente deste navegador sem credenciais do WebUI.',
|
||||
ext_sidecars_none: 'Nenhum sidecar loopback declarado.',
|
||||
ext_sidecar_origin: 'Origem',
|
||||
ext_sidecar_health_path: 'Caminho de health',
|
||||
ext_sidecar_health_url: 'URL de health',
|
||||
ext_sidecar_proxy: 'Proxy',
|
||||
ext_sidecar_proxy_path: 'Caminho do proxy',
|
||||
ext_status_true: 'true',
|
||||
ext_status_false: 'false',
|
||||
sessions_source_webui: 'Sessões WebUI ({0})',
|
||||
sessions_source_cli: 'Sessões CLI ({0})',
|
||||
_speech: 'pt-BR',
|
||||
@@ -15507,6 +15903,50 @@ const LOCALES = {
|
||||
offline_stream_waiting: '연결이 끊겼습니다. 새로고침을 기다리는 중…',
|
||||
_lang: 'ko',
|
||||
_label: '한국어',
|
||||
settings_extensions_meta: 'WebUI 확장 기능을 탐색, 설치하고 관리합니다.',
|
||||
settings_extensions_installed_loading: '설치된 확장 기능 불러오는 중…',
|
||||
settings_extensions_copy_diagnostics: '진단 정보 복사',
|
||||
settings_extensions_trust_model_label: '신뢰 모델',
|
||||
settings_extensions_trust_model_text: '확장 기능은 WebUI 브라우저 origin에서 실행되며 이 세션과 동일한 인증된 API에 접근할 수 있습니다. 설정과 확장 기능 소유 저장소는 브라우저 로컬에만 존재하며 비밀 정보용이 아닙니다. 신뢰할 수 있는 로컬 확장 디렉터리만 불러오세요. 확장 기능 비활성화는 새로고침 후 이미 삽입된 자산에 적용됩니다.',
|
||||
settings_extensions_runtime_title: '확장 런타임',
|
||||
settings_extensions_runtime_status_from: '상태는 /api/extensions/status에서 가져오며, 토글은 설치된 manifest 항목에 대한 로컬 재정의를 유지합니다.',
|
||||
settings_extensions_diag_extension_dir_configured: '확장 디렉터리 설정됨',
|
||||
settings_extensions_diag_extension_dir_valid: '확장 디렉터리 유효함',
|
||||
settings_extensions_diag_manifest_configured: '매니페스트 설정됨',
|
||||
settings_extensions_diag_manifest_loaded: '매니페스트 로드됨',
|
||||
settings_extensions_diag_manifest_status: '매니페스트 상태',
|
||||
settings_extensions_diag_manifest_entries: '검사한 매니페스트 항목 수',
|
||||
settings_extensions_diag_manifest_scripts: '매니페스트 스크립트 수',
|
||||
settings_extensions_diag_manifest_stylesheets: '매니페스트 스타일시트 수',
|
||||
settings_extensions_diag_manifest_sidecars: '매니페스트 사이드카 수',
|
||||
settings_extensions_diag_final_scripts: '최종 스크립트 수',
|
||||
settings_extensions_diag_final_stylesheets: '최종 스타일시트 수',
|
||||
settings_extensions_diag_loopback_sidecars: '루프백 사이드카 수',
|
||||
settings_extensions_diag_installed_extensions: '설치된 확장 수',
|
||||
settings_extensions_diag_user_disabled: '사용자가 비활성화한 확장 수',
|
||||
settings_extensions_installed_section_title: '설치된 매니페스트 확장',
|
||||
settings_extensions_installed_section_meta: '이미 존재하는 로컬 확장을 사용하거나 중지합니다. 이 브라우저 탭에 삽입된 자산 변경을 적용하려면 WebUI를 다시 불러오세요.',
|
||||
settings_extensions_installed_empty: '구성된 번들에 설치된 매니페스트 확장이 없습니다.',
|
||||
settings_extensions_no_dir: '확장 디렉터리가 설정되어 있지 않습니다.',
|
||||
ext_none: '없음',
|
||||
ext_no_warnings: '경고가 없습니다.',
|
||||
ext_state_unknown_ids_hint: '일부 저장된 비활성화 확장 오버라이드가 현재 매니페스트와 더 이상 일치하지 않습니다. 동일한 ID로 다시 추가한 확장은 비활성화 상태로 남을 수 있습니다.',
|
||||
ext_assets_title: '최종 공개 자산 URL',
|
||||
ext_assets_meta: '앱 셸에 삽입될 수 있는 same-origin URL.',
|
||||
ext_assets_scripts: '스크립트',
|
||||
ext_assets_styles: '스타일시트',
|
||||
ext_warnings_title: '필터링된 경고',
|
||||
ext_warnings_meta: '코드와 대략적 출처만 표시하며, 경로와 거부된 값은 보여주지 않습니다.',
|
||||
ext_sidecars_title: '사이드카',
|
||||
ext_sidecars_meta: '선언된 로컬 컴패니언. 이 브라우저가 WebUI 자격 증명 없이 직접 상태를 확인합니다.',
|
||||
ext_sidecars_none: '선언된 루프백 사이드카가 없습니다.',
|
||||
ext_sidecar_origin: 'Origin',
|
||||
ext_sidecar_health_path: '헬스 경로',
|
||||
ext_sidecar_health_url: '헬스 URL',
|
||||
ext_sidecar_proxy: '프록시',
|
||||
ext_sidecar_proxy_path: '프록시 경로',
|
||||
ext_status_true: 'true',
|
||||
ext_status_false: 'false',
|
||||
sessions_source_webui: 'WebUI 세션 ({0})',
|
||||
sessions_source_cli: 'CLI 세션 ({0})',
|
||||
_speech: 'ko-KR',
|
||||
@@ -17258,6 +17698,50 @@ const LOCALES = {
|
||||
offline_stream_waiting: 'Connexion perdue. En attente de rafraîchissement\u2026',
|
||||
_lang: 'fr',
|
||||
_label: 'Français',
|
||||
settings_extensions_meta: 'Parcourir, installer et gérer les extensions WebUI.',
|
||||
settings_extensions_installed_loading: 'Chargement des extensions installées…',
|
||||
settings_extensions_copy_diagnostics: 'Copier le diagnostic',
|
||||
settings_extensions_trust_model_label: 'Modèle de confiance',
|
||||
settings_extensions_trust_model_text: 'Les extensions s’exécutent dans l’origine navigateur du WebUI et peuvent accéder aux mêmes API authentifiées que cette session. Les réglages et le stockage des extensions restent locaux au navigateur et ne sont pas destinés aux secrets. Chargez uniquement des répertoires d’extensions locaux de confiance ; la désactivation d’une extension prend effet après rechargement pour les ressources déjà injectées.',
|
||||
settings_extensions_runtime_title: 'Runtime des extensions',
|
||||
settings_extensions_runtime_status_from: 'Statut depuis /api/extensions/status ; les bascules enregistrent une surcharge locale pour les entrées de manifest installées.',
|
||||
settings_extensions_diag_extension_dir_configured: 'Répertoire d’extensions configuré',
|
||||
settings_extensions_diag_extension_dir_valid: 'Répertoire d’extensions valide',
|
||||
settings_extensions_diag_manifest_configured: 'Manifest configuré',
|
||||
settings_extensions_diag_manifest_loaded: 'Manifest chargé',
|
||||
settings_extensions_diag_manifest_status: 'Statut du manifest',
|
||||
settings_extensions_diag_manifest_entries: 'Entrées de manifest inspectées',
|
||||
settings_extensions_diag_manifest_scripts: 'Scripts dans le manifest',
|
||||
settings_extensions_diag_manifest_stylesheets: 'Feuilles de style dans le manifest',
|
||||
settings_extensions_diag_manifest_sidecars: 'Sidecars dans le manifest',
|
||||
settings_extensions_diag_final_scripts: 'Scripts au total',
|
||||
settings_extensions_diag_final_stylesheets: 'Feuilles de style au total',
|
||||
settings_extensions_diag_loopback_sidecars: 'Sidecars loopback',
|
||||
settings_extensions_diag_installed_extensions: 'Extensions installées',
|
||||
settings_extensions_diag_user_disabled: 'Désactivées par l’utilisateur',
|
||||
settings_extensions_installed_section_title: 'Extensions installées',
|
||||
settings_extensions_installed_section_meta: 'Activez ou désactivez les extensions locales déjà présentes. Rechargez le WebUI pour appliquer les modifications des ressources injectées dans cet onglet.',
|
||||
settings_extensions_installed_empty: 'Aucune extension manifest installée dans le bundle configuré.',
|
||||
settings_extensions_no_dir: 'Aucun répertoire d’extensions configuré.',
|
||||
ext_none: 'Aucun',
|
||||
ext_no_warnings: 'Aucun avertissement.',
|
||||
ext_state_unknown_ids_hint: 'Certaines surcharges d’extensions désactivées ne correspondent plus au manifest actuel ; les extensions ré-ajoutées avec le même id peuvent rester désactivées.',
|
||||
ext_assets_title: 'URL publiques finales des ressources',
|
||||
ext_assets_meta: 'URL same-origin qui peuvent être injectées dans le shell de l’application.',
|
||||
ext_assets_scripts: 'Scripts',
|
||||
ext_assets_styles: 'Feuilles de style',
|
||||
ext_warnings_title: 'Avertissements filtrés',
|
||||
ext_warnings_meta: 'Uniquement des codes et des sources générales ; les chemins et les valeurs rejetées ne sont pas affichés.',
|
||||
ext_sidecars_title: 'Sidecars',
|
||||
ext_sidecars_meta: 'Compagnons locaux déclarés ; la vérification d’état est faite directement par ce navigateur sans identifiants WebUI.',
|
||||
ext_sidecars_none: 'Aucun sidecar loopback déclaré.',
|
||||
ext_sidecar_origin: 'Origine',
|
||||
ext_sidecar_health_path: 'Chemin de santé',
|
||||
ext_sidecar_health_url: 'URL de santé',
|
||||
ext_sidecar_proxy: 'Proxy',
|
||||
ext_sidecar_proxy_path: 'Chemin du proxy',
|
||||
ext_status_true: 'true',
|
||||
ext_status_false: 'false',
|
||||
sessions_source_webui: 'Sessions WebUI ({0})',
|
||||
sessions_source_cli: 'Sessions CLI ({0})',
|
||||
_speech: 'fr-FR',
|
||||
@@ -18988,6 +19472,50 @@ const LOCALES = {
|
||||
sessions_source_cli: 'Relace CLI ({0})',
|
||||
_lang: 'cs',
|
||||
_speech: 'cs-CZ',
|
||||
settings_extensions_meta: 'Procházet, instalovat a spravovat rozšíření WebUI.',
|
||||
settings_extensions_installed_loading: 'Načítání nainstalovaných rozšíření…',
|
||||
settings_extensions_copy_diagnostics: 'Kopírovat diagnostiku',
|
||||
settings_extensions_trust_model_label: 'Model důvěry',
|
||||
settings_extensions_trust_model_text: 'Rozšíření běží v prohlížečovém originu WebUI a mají přístup ke stejným autentizovaným API jako tato relace. Nastavení a úložisko rozšíření zůstává v prohlížeči a není určeno pro tajemství. Načítajte jen důvěryhodné lokální adresáře rozšíření; vypnutí rozšíření se projeví až po reloadu pro již vložené assety.',
|
||||
settings_extensions_runtime_title: 'Runtime rozšíření',
|
||||
settings_extensions_runtime_status_from: 'Stav z /api/extensions/status; přepínače ukládají lokální override pro nainstalované manifest položky.',
|
||||
settings_extensions_diag_extension_dir_configured: 'Adresář rozšíření nastaven',
|
||||
settings_extensions_diag_extension_dir_valid: 'Adresář rozšíření je platný',
|
||||
settings_extensions_diag_manifest_configured: 'Manifest nastaven',
|
||||
settings_extensions_diag_manifest_loaded: 'Manifest načten',
|
||||
settings_extensions_diag_manifest_status: 'Stav manifestu',
|
||||
settings_extensions_diag_manifest_entries: 'Zkontrolované manifest položky',
|
||||
settings_extensions_diag_manifest_scripts: 'Skripty v manifestu',
|
||||
settings_extensions_diag_manifest_stylesheets: 'StyleSheety v manifestu',
|
||||
settings_extensions_diag_manifest_sidecars: 'Sidecary v manifestu',
|
||||
settings_extensions_diag_final_scripts: 'Skripty celkem',
|
||||
settings_extensions_diag_final_stylesheets: 'StyleSheety celkem',
|
||||
settings_extensions_diag_loopback_sidecars: 'Loopback sidecary',
|
||||
settings_extensions_diag_installed_extensions: 'Nainstalovaná rozšíření',
|
||||
settings_extensions_diag_user_disabled: 'Vypnutá uživatelem',
|
||||
settings_extensions_installed_section_title: 'Nainstalovaná rozšíření',
|
||||
settings_extensions_installed_section_meta: 'Zapíná nebo vypíná už přítomná lokální rozšíření. Pro aplikování změn vložených assetů na tuto kartu prohlížeče reloadujte WebUI.',
|
||||
settings_extensions_installed_empty: 'V nakonfigurovaném bundle nejsou žádná nainstalovaná manifest rozšíření.',
|
||||
settings_extensions_no_dir: 'Není nastaven adresář rozšíření.',
|
||||
ext_none: 'Žádné',
|
||||
ext_no_warnings: 'Žádná varování.',
|
||||
ext_state_unknown_ids_hint: 'Některá uložená přepsání vypnutých rozšíření už neodpovídají současnému manifestu; znovu-přidaná rozšíření se stejným id mohou zůstat vypnutá.',
|
||||
ext_assets_title: 'Konečné veřejné URL assetů',
|
||||
ext_assets_meta: 'Same-origin URL, které mohou být vloženy do shellu aplikace.',
|
||||
ext_assets_scripts: 'Skripty',
|
||||
ext_assets_styles: 'StyleSheety',
|
||||
ext_warnings_title: 'Vyfiltrovaná varování',
|
||||
ext_warnings_meta: 'Jen kódy a hrubé zdroje; cesty a odmítnuté hodnoty se nezobrazují.',
|
||||
ext_sidecars_title: 'Sidecary',
|
||||
ext_sidecars_meta: 'Deklarované lokální doplňky; zdravotní kontrola jde přímo z tohoto prohlížeče bez přihlašovacích údajů WebUI.',
|
||||
ext_sidecars_none: 'Žádné deklarované loopback sidecary.',
|
||||
ext_sidecar_origin: 'Origin',
|
||||
ext_sidecar_health_path: 'Cesta ke stavu',
|
||||
ext_sidecar_health_url: 'URL stavu',
|
||||
ext_sidecar_proxy: 'Proxy',
|
||||
ext_sidecar_proxy_path: 'Cesta proxy',
|
||||
ext_status_true: 'ano',
|
||||
ext_status_false: 'ne',
|
||||
copy_relative_path: 'Kopírovat relativní cestu',
|
||||
cron_schedule_hour_label: 'Hodina',
|
||||
cron_schedule_minute_label: 'Minuta',
|
||||
@@ -20716,6 +21244,50 @@ const LOCALES = {
|
||||
offline_stream_waiting: 'Bağlantı kesildi. Yenilenmesi bekleniyor\u2026',
|
||||
_lang: 'tr',
|
||||
_label: 'Türkçe',
|
||||
settings_extensions_meta: 'WebUI uzantılarını görüntüle, yükle ve yönet.',
|
||||
settings_extensions_installed_loading: 'Yüklü uzantılar yükleniyor…',
|
||||
settings_extensions_copy_diagnostics: 'Tanılama kopyala',
|
||||
settings_extensions_trust_model_label: 'Güven modeli',
|
||||
settings_extensions_trust_model_text: "Uzantılar WebUI tarayıcı kaynağında çalışır ve bu oturumun erişebildiği aynı kimliği doğrulanmış API'lere erişebilir. Ayarlar ve uzantıya ait depolama tarayıcıda lokal kalır ve gizli bilgi için değildir. Sadece güvenilir lokale uzantı dizinlerini yükle; bir uzantıyı devre dışı bırakmak reload sonrasında halihazırda enjekte edilmiş varlıkları etkiler.",
|
||||
settings_extensions_runtime_title: 'Uzantı çalışma ortamı',
|
||||
settings_extensions_runtime_status_from: 'Durum /api/extensions/status kaynaklıdır; anahtarlar, kurulu manifest girdileri için yerel bir override kaydeder.',
|
||||
settings_extensions_diag_extension_dir_configured: 'Uzantı dizini yapılandırıldı',
|
||||
settings_extensions_diag_extension_dir_valid: 'Uzantı dizini geçerli',
|
||||
settings_extensions_diag_manifest_configured: 'Manifest yapılandırıldı',
|
||||
settings_extensions_diag_manifest_loaded: 'Manifest yüklendi',
|
||||
settings_extensions_diag_manifest_status: 'Manifest durumu',
|
||||
settings_extensions_diag_manifest_entries: 'İncelenen manifest girdileri',
|
||||
settings_extensions_diag_manifest_scripts: 'Manifest betik sayısı',
|
||||
settings_extensions_diag_manifest_stylesheets: 'Manifest stil sayfası sayısı',
|
||||
settings_extensions_diag_manifest_sidecars: 'Manifest sidecar sayısı',
|
||||
settings_extensions_diag_final_scripts: 'Betik toplamı',
|
||||
settings_extensions_diag_final_stylesheets: 'Stil sayfası toplamı',
|
||||
settings_extensions_diag_loopback_sidecars: 'Loopback sidecar sayısı',
|
||||
settings_extensions_diag_installed_extensions: 'Yüklü uzantılar',
|
||||
settings_extensions_diag_user_disabled: 'Kullanıcı devre dışı bıraktı',
|
||||
settings_extensions_installed_section_title: 'Yüklü manifest uzantıları',
|
||||
settings_extensions_installed_section_meta: "Önceden var olan lokale uzantıları aç ya da kapat. Bu tarayıcı sekmesine enjekte edilen varlık değişikliklerini uygulamak için WebUI'yi yeniden yükle.",
|
||||
settings_extensions_installed_empty: 'Yapılandırılan pakette yüklü manifest uzantısı yok.',
|
||||
settings_extensions_no_dir: 'Bir uzantı dizini yapılandırılmadı.',
|
||||
ext_none: 'Yok',
|
||||
ext_no_warnings: 'Uyarı yok.',
|
||||
ext_state_unknown_ids_hint: 'Kaydedilen bazı devre dışı bırakılmış uzantı geçersiz kılmaları genel manifestla artık eşleşmiyor; aynı id ile tekrar eklenen uzantılar devre dışı kalabilir.',
|
||||
ext_assets_title: 'Son genel varlık URL adresleri',
|
||||
ext_assets_meta: 'Uygulama kabuğuna enjekte edilebilecek same-origin URL adresleri.',
|
||||
ext_assets_scripts: 'Betikler',
|
||||
ext_assets_styles: 'Stil sayfaları',
|
||||
ext_warnings_title: 'Filtrelenmiş uyarılar',
|
||||
ext_warnings_meta: 'Yalnızca kodlar ve genel kaynaklar; yollar ve reddedilen değerler gösterilmez.',
|
||||
ext_sidecars_title: 'Sidecarlar',
|
||||
ext_sidecars_meta: 'Bildirilen lokale yardımcılar; sağlık kontrolü bu tarayıcıdan WebUI kimlik bilgileri olmadan yapılır.',
|
||||
ext_sidecars_none: 'Bildirilen loopback sidecar yok.',
|
||||
ext_sidecar_origin: 'Kaynak',
|
||||
ext_sidecar_health_path: 'Sağlık yolu',
|
||||
ext_sidecar_health_url: 'Sağlık URL adresi',
|
||||
ext_sidecar_proxy: 'Proxy',
|
||||
ext_sidecar_proxy_path: 'Proxy yolu',
|
||||
ext_status_true: 'true',
|
||||
ext_status_false: 'false',
|
||||
sessions_source_webui: 'WebUI oturumları ({0})',
|
||||
sessions_source_cli: 'CLI oturumları ({0})',
|
||||
_speech: 'tr-TR',
|
||||
@@ -22468,6 +23040,50 @@ const LOCALES = {
|
||||
offline_stream_waiting: 'Połączenie utracone. Oczekiwanie na odświeżenie…',
|
||||
_lang: 'pl',
|
||||
_label: 'Polski',
|
||||
settings_extensions_meta: 'Przeglądaj, instaluj i zarządzaj rozszerzeniami WebUI.',
|
||||
settings_extensions_installed_loading: 'Wczytywanie zainstalowanych rozszerzeń…',
|
||||
settings_extensions_copy_diagnostics: 'Kopiuj diagnostykę',
|
||||
settings_extensions_trust_model_label: 'Model zaufania',
|
||||
settings_extensions_trust_model_text: 'Rozszerzenia działają w przeglądarkowym origin WebUI i mogą korzystać z tych samych uwierzytelnionych API co ta sesja. Ustawienia i magazyn rozszerzeń pozostają w przeglądarce i nie służą do przechowywania sekretów. Wczytuj tylko zaufane lokalne katalogi rozszerzeń; wyłączenie rozszerzenia zadziała po ponownym wczytaniu dla już wstrzykniętych assetów.',
|
||||
settings_extensions_runtime_title: 'Runtime rozszerzeń',
|
||||
settings_extensions_runtime_status_from: 'Status z /api/extensions/status; przełączniki utrwalają lokalne nadpisanie dla zainstalowanych wpisów manifestu.',
|
||||
settings_extensions_diag_extension_dir_configured: 'Skonfigurowano katalog rozszerzeń',
|
||||
settings_extensions_diag_extension_dir_valid: 'Katalog rozszerzeń jest poprawny',
|
||||
settings_extensions_diag_manifest_configured: 'Skonfigurowano manifest',
|
||||
settings_extensions_diag_manifest_loaded: 'Załadowano manifest',
|
||||
settings_extensions_diag_manifest_status: 'Status manifestu',
|
||||
settings_extensions_diag_manifest_entries: 'Pozycje manifestu w inspekcji',
|
||||
settings_extensions_diag_manifest_scripts: 'Skrypty w manifeście',
|
||||
settings_extensions_diag_manifest_stylesheets: 'Arkusze stylów w manifeście',
|
||||
settings_extensions_diag_manifest_sidecars: 'Sidecary w manifeście',
|
||||
settings_extensions_diag_final_scripts: 'Skrypty łącznie',
|
||||
settings_extensions_diag_final_stylesheets: 'Arkusze stylów łącznie',
|
||||
settings_extensions_diag_loopback_sidecars: 'Loopback sidecary',
|
||||
settings_extensions_diag_installed_extensions: 'Zainstalowane rozszerzenia',
|
||||
settings_extensions_diag_user_disabled: 'Wyłączone przez użytkownika',
|
||||
settings_extensions_installed_section_title: 'Zainstalowane rozszerzenia',
|
||||
settings_extensions_installed_section_meta: 'Włącz/wyłącz już istniejące lokalne rozszerzenia. Wczytaj WebUI ponownie, aby zastosować zmiany wstrzykniętych assetów w tej karcie.',
|
||||
settings_extensions_installed_empty: 'W skonfigurowanym pakiecie nie ma zainstalowanych rozszerzeń manifestu.',
|
||||
settings_extensions_no_dir: 'Nie skonfigurowano katalogu rozszerzeń.',
|
||||
ext_none: 'Brak',
|
||||
ext_no_warnings: 'Brak ostrzeżeń.',
|
||||
ext_state_unknown_ids_hint: 'Niektóre zapisane nadpisania wyłączonych rozszerzeń nie pasują już do aktualnego manifestu; ponownie dodane rozszerzenia z tym samym id mogą pozostać wyłączone.',
|
||||
ext_assets_title: 'Ostateczne publiczne adresy URL assetów',
|
||||
ext_assets_meta: 'Adresy URL same-origin, które można wstrzyknąć do shellu aplikacji.',
|
||||
ext_assets_scripts: 'Skrypty',
|
||||
ext_assets_styles: 'Arkusze stylów',
|
||||
ext_warnings_title: 'Odfiltrowane ostrzeżenia',
|
||||
ext_warnings_meta: 'Tylko kody i ogólne źródła; ścieżki i odrzucone wartości nie są pokazywane.',
|
||||
ext_sidecars_title: 'Sidecary',
|
||||
ext_sidecars_meta: 'Zadeklarowani lokalni pomocnicy; sprawdzenie kondycji odbywa się bezpośrednio z tej przeglądarki bez poświadczeń WebUI.',
|
||||
ext_sidecars_none: 'Brak zadeklarowanych loopback sidecarów.',
|
||||
ext_sidecar_origin: 'Origin',
|
||||
ext_sidecar_health_path: 'Ścieżka health',
|
||||
ext_sidecar_health_url: 'URL health',
|
||||
ext_sidecar_proxy: 'Proxy',
|
||||
ext_sidecar_proxy_path: 'Ścieżka proxy',
|
||||
ext_status_true: 'tak',
|
||||
ext_status_false: 'nie',
|
||||
sessions_source_webui: 'Sesje WebUI ({0})',
|
||||
sessions_source_cli: 'Sesje CLI ({0})',
|
||||
_speech: 'pl-PL',
|
||||
@@ -24224,6 +24840,50 @@ const LOCALES = {
|
||||
offline_stream_waiting: 'Mất kết nối. Đang chờ làm mới…',
|
||||
_lang: 'vi',
|
||||
_label: 'Tiếng Việt',
|
||||
settings_extensions_meta: 'Duyệt, cài đặt và quản lý các tiện ích WebUI.',
|
||||
settings_extensions_installed_loading: 'Đang tải các tiện ích đã cài…',
|
||||
settings_extensions_copy_diagnostics: 'Sao chép thông tin chẩn đoán',
|
||||
settings_extensions_trust_model_label: 'Mô hình tin cậy',
|
||||
settings_extensions_trust_model_text: 'Tiện ích chạy trong browser origin của WebUI và có thể truy cập cùng các API đã xác thực như phiên này. Cài đặt và kho lưu trữ thuộc về tiện ích chỉ tồn tại trên trình duyệt và không dùng cho thông tin mật. Chỉ tải các thư mục tiện ích cục bộ đáng tin cậy; việc tắt một tiện ích có hiệu lực sau khi tải lại đối với các tài nguyên đã được tiêm.',
|
||||
settings_extensions_runtime_title: 'Runtime của tiện ích',
|
||||
settings_extensions_runtime_status_from: 'Trạng thái từ /api/extensions/status; công tắc giữ một local override cho các mục manifest đã cài.',
|
||||
settings_extensions_diag_extension_dir_configured: 'Đã cấu hình thư mục tiện ích',
|
||||
settings_extensions_diag_extension_dir_valid: 'Thư mục tiện ích hợp lệ',
|
||||
settings_extensions_diag_manifest_configured: 'Đã cấu hình manifest',
|
||||
settings_extensions_diag_manifest_loaded: 'Đã nạp manifest',
|
||||
settings_extensions_diag_manifest_status: 'Trạng thái manifest',
|
||||
settings_extensions_diag_manifest_entries: 'Các mục manifest đã kiểm tra',
|
||||
settings_extensions_diag_manifest_scripts: 'Số script trong manifest',
|
||||
settings_extensions_diag_manifest_stylesheets: 'Số stylesheet trong manifest',
|
||||
settings_extensions_diag_manifest_sidecars: 'Số sidecar trong manifest',
|
||||
settings_extensions_diag_final_scripts: 'Tổng số script',
|
||||
settings_extensions_diag_final_stylesheets: 'Tổng số stylesheet',
|
||||
settings_extensions_diag_loopback_sidecars: 'Số sidecar loopback',
|
||||
settings_extensions_diag_installed_extensions: 'Các tiện ích đã cài',
|
||||
settings_extensions_diag_user_disabled: 'Người dùng đã tắt',
|
||||
settings_extensions_installed_section_title: 'Các tiện ích manifest đã cài',
|
||||
settings_extensions_installed_section_meta: 'Bật hoặc tắt các tiện ích cục bộ đã có sẵn. Tải lại WebUI để áp dụng thay đổi tài nguyên đã tiêm cho tab trình duyệt này.',
|
||||
settings_extensions_installed_empty: 'Không có tiện ích manifest nào được cài trong bundle đã cấu hình.',
|
||||
settings_extensions_no_dir: 'Chưa cấu hình thư mục tiện ích.',
|
||||
ext_none: 'Không có',
|
||||
ext_no_warnings: 'Không có cảnh báo.',
|
||||
ext_state_unknown_ids_hint: 'Một số override đã lưu cho tiện ích bị tắt không còn khớp với manifest hiện tại; các tiện ích được thêm lại với cùng id có thể vẫn giữ trạng thái tắt.',
|
||||
ext_assets_title: 'URL tài nguyên công khai cuối cùng',
|
||||
ext_assets_meta: 'URL cùng nguồn gốc có thể được tiêm vào vỏ ứng dụng.',
|
||||
ext_assets_scripts: 'Scripts',
|
||||
ext_assets_styles: 'Stylesheets',
|
||||
ext_warnings_title: 'Cảnh báo đã lọc',
|
||||
ext_warnings_meta: 'Chỉ mã và nguồn tổng quát; đường dẫn và giá trị bị từ chối không được hiển thị.',
|
||||
ext_sidecars_title: 'Sidecar',
|
||||
ext_sidecars_meta: 'Companion cục bộ đã khai báo; kiểm tra tình trạng được thực hiện trực tiếp từ trình duyệt này mà không cần thông tin xác thực WebUI.',
|
||||
ext_sidecars_none: 'Không khai báo sidecar loopback nào.',
|
||||
ext_sidecar_origin: 'Origin',
|
||||
ext_sidecar_health_path: 'Đường dẫn kiểm tra',
|
||||
ext_sidecar_health_url: 'URL kiểm tra',
|
||||
ext_sidecar_proxy: 'Proxy',
|
||||
ext_sidecar_proxy_path: 'Đường dẫn proxy',
|
||||
ext_status_true: 'true',
|
||||
ext_status_false: 'false',
|
||||
sessions_source_webui: 'Phiên WebUI ({0})',
|
||||
sessions_source_cli: 'Phiên CLI ({0})',
|
||||
_speech: 'vi-VN',
|
||||
|
||||
+6
-6
@@ -1504,7 +1504,7 @@
|
||||
<div class="settings-section-head">
|
||||
<div>
|
||||
<div class="settings-section-title" data-i18n="settings_tab_extensions">Extensions</div>
|
||||
<div class="settings-section-meta">Browse, install, and manage WebUI extensions.</div>
|
||||
<div class="settings-section-meta" data-i18n="settings_extensions_meta">Browse, install, and manage WebUI extensions.</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="extensions-tab-bar" role="tablist">
|
||||
@@ -1528,20 +1528,20 @@
|
||||
</div>
|
||||
<div data-extensions-pane="installed" hidden>
|
||||
<div id="extensionsInstalled" class="extensions-gallery" aria-live="polite">
|
||||
<div class="extensions-loading">Loading installed extensions…</div>
|
||||
<div class="extensions-loading" data-i18n="settings_extensions_installed_loading">Loading installed extensions…</div>
|
||||
</div>
|
||||
</div>
|
||||
<div data-extensions-pane="diagnostics" hidden>
|
||||
<div class="settings-section-head" style="padding-top:8px">
|
||||
<div></div>
|
||||
<button class="sm-btn extensions-copy-diagnostics-btn" id="extensionsCopyDiagnosticsBtn" type="button" onclick="copyExtensionsDiagnostics()" disabled>Copy diagnostics</button>
|
||||
<button class="sm-btn extensions-copy-diagnostics-btn" id="extensionsCopyDiagnosticsBtn" type="button" onclick="copyExtensionsDiagnostics()" disabled><span data-i18n="settings_extensions_copy_diagnostics">Copy diagnostics</span></button>
|
||||
</div>
|
||||
<div class="settings-field extensions-trust-note" id="extensionsTrustModel">
|
||||
<label>Trust model</label>
|
||||
<div>Extensions run in the WebUI browser origin and can access the same authenticated APIs as this session. Settings and extension-owned storage are browser-local and not for secrets. Only load trusted local extension directories; disabling an extension takes effect after reload for already-injected assets.</div>
|
||||
<label data-i18n="settings_extensions_trust_model_label">Trust model</label>
|
||||
<div data-i18n="settings_extensions_trust_model_text">Extensions run in the WebUI browser origin and can access the same authenticated APIs as this session. Settings and extension-owned storage are browser-local and not for secrets. Only load trusted local extension directories; disabling an extension takes effect after reload for already-injected assets.</div>
|
||||
</div>
|
||||
<div id="extensionsDiagnostics" class="extensions-diagnostics" aria-live="polite">
|
||||
<div class="extensions-loading">Loading extension diagnostics…</div>
|
||||
<div class="extensions-loading" data-i18n="settings_extensions_installed_loading">Loading extension diagnostics…</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
+39
-39
@@ -9766,31 +9766,31 @@ async function loadSettingsPanel(){
|
||||
// ── Extensions panel (browser-origin diagnostics + local enable controls) ──
|
||||
|
||||
function _extensionStatusLabel(value){
|
||||
return value ? 'Enabled' : 'Disabled';
|
||||
return value ? t('plugins_enabled') : t('plugins_disabled');
|
||||
}
|
||||
|
||||
function _extensionBooleanBadge(value){
|
||||
const cls=value?'extension-status-badge-on':'extension-status-badge-off';
|
||||
return `<span class="extension-status-badge ${cls}">${value?'true':'false'}</span>`;
|
||||
return `<span class="extension-status-badge ${cls}">${value?t('ext_status_true'):t('ext_status_false')}</span>`;
|
||||
}
|
||||
|
||||
function _extensionAssetList(urls){
|
||||
if(!Array.isArray(urls)||urls.length===0){
|
||||
return '<div class="extension-url-empty">None</div>';
|
||||
return '<div class="extension-url-empty">'+t('ext_none')+'</div>';
|
||||
}
|
||||
return '<ul class="extension-url-list">'+urls.map(url=>`<li><code>${esc(url)}</code></li>`).join('')+'</ul>';
|
||||
}
|
||||
|
||||
function _extensionWarningList(warnings){
|
||||
if(!Array.isArray(warnings)||warnings.length===0){
|
||||
return '<div class="extension-url-empty">No warnings.</div>';
|
||||
return '<div class="extension-url-empty">'+t('ext_no_warnings')+'</div>';
|
||||
}
|
||||
return '<ul class="extension-warning-list">'+warnings.map(item=>{
|
||||
const rawCode=(item&&item.code)||'unknown_warning';
|
||||
const code=esc(rawCode);
|
||||
const source=esc((item&&item.source)||'unknown');
|
||||
const hint=rawCode==='extension_state_unknown_ids'
|
||||
? '<span>Some saved disabled-extension overrides no longer match the current manifest; re-added extensions with the same id may stay disabled.</span>'
|
||||
? '<span>'+t('ext_state_unknown_ids_hint')+'</span>'
|
||||
: '';
|
||||
return `<li><code>${code}</code><span>${source}</span>${hint}</li>`;
|
||||
}).join('')+'</ul>';
|
||||
@@ -9890,8 +9890,8 @@ function _extensionConfigureButton(entry,surface){
|
||||
function _extensionInstalledList(extensions,extensionDirConfigured,surface){
|
||||
const list=Array.isArray(extensions)?extensions:[];
|
||||
if(!list.length){
|
||||
if(!extensionDirConfigured) return '<div class="extension-url-empty">No extension directory is configured.</div>';
|
||||
return '<div class="extension-url-empty">No manifest extensions are installed in the configured bundle.</div>';
|
||||
if(!extensionDirConfigured) return '<div class="extension-url-empty">'+t('settings_extensions_no_dir')+'</div>';
|
||||
return '<div class="extension-url-empty">'+t('settings_extensions_installed_empty')+'</div>';
|
||||
}
|
||||
return `<div class="extension-installed-list">${list.map(entry=>{
|
||||
const id=(entry&&entry.id)||'';
|
||||
@@ -10035,23 +10035,23 @@ function _extensionSidecarCard(sidecars){
|
||||
</div>
|
||||
<div class="extension-sidecar-meta">${esc(meta)}</div>
|
||||
<div class="extension-sidecar-fields">
|
||||
<div><span>Origin</span><code>${esc(origin)}</code></div>
|
||||
<div><span>Health path</span><code>${esc(healthPath)}</code></div>
|
||||
<div><span>Health URL</span><code>${esc(healthUrl)}</code></div>
|
||||
<div><span>Proxy</span><code>${esc(proxyStatus)}</code></div>
|
||||
<div><span>Proxy path</span><code>${esc(proxyPath)}</code></div>
|
||||
<div><span>${esc(t('ext_sidecar_origin'))}</span><code>${esc(origin)}</code></div>
|
||||
<div><span>${esc(t('ext_sidecar_health_path'))}</span><code>${esc(healthPath)}</code></div>
|
||||
<div><span>${esc(t('ext_sidecar_health_url'))}</span><code>${esc(healthUrl)}</code></div>
|
||||
<div><span>${esc(t('ext_sidecar_proxy'))}</span><code>${esc(proxyStatus)}</code></div>
|
||||
<div><span>${esc(t('ext_sidecar_proxy_path'))}</span><code>${esc(proxyPath)}</code></div>
|
||||
</div>
|
||||
<div class="extension-sidecar-actions">${proxyButton}</div>
|
||||
${proxyWarning}
|
||||
<div class="extension-sidecar-runtime" data-sidecar-runtime-index="${index}" hidden></div>
|
||||
</div>`;
|
||||
}).join('')}</div>`:'<div class="extension-url-empty">No loopback sidecars declared.</div>';
|
||||
}).join('')}</div>`:'<div class="extension-url-empty">'+t('ext_sidecars_none')+'</div>';
|
||||
return `
|
||||
<div class="provider-card extension-sidecars-card">
|
||||
<div class="provider-card-header plugin-card-header">
|
||||
<div class="provider-card-info">
|
||||
<div class="provider-card-name">Loopback sidecars</div>
|
||||
<div class="provider-card-meta">Declared local companions; health is checked directly from this browser with WebUI credentials omitted.</div>
|
||||
<div class="provider-card-name">${esc(t('ext_sidecars_title'))}</div>
|
||||
<div class="provider-card-meta">${esc(t('ext_sidecars_meta'))}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="provider-card-body extension-card-body">
|
||||
@@ -10144,35 +10144,35 @@ function _renderExtensionsPanel(data,seq){
|
||||
<div class="provider-card extension-status-card ${statusClass}">
|
||||
<div class="provider-card-header plugin-card-header">
|
||||
<div class="provider-card-info">
|
||||
<div class="provider-card-name">Extension runtime</div>
|
||||
<div class="provider-card-meta">Status from /api/extensions/status; toggles persist a local override for installed manifest entries.</div>
|
||||
<div class="provider-card-name">${esc(t('settings_extensions_runtime_title'))}</div>
|
||||
<div class="provider-card-meta">${esc(t('settings_extensions_runtime_status_from'))}</div>
|
||||
</div>
|
||||
<span class="provider-card-badge ${data&&data.enabled?'':'plugin-card-badge-disabled'}">${_extensionStatusLabel(!!(data&&data.enabled))}</span>
|
||||
</div>
|
||||
<div class="provider-card-body extension-card-body">
|
||||
<div class="extension-summary-grid">
|
||||
<div><span>Extension dir configured</span>${_extensionBooleanBadge(!!(data&&data.extension_dir_configured))}</div>
|
||||
<div><span>Extension dir valid</span>${_extensionBooleanBadge(!!(data&&data.extension_dir_valid))}</div>
|
||||
<div><span>Manifest configured</span>${_extensionBooleanBadge(!!manifest.configured)}</div>
|
||||
<div><span>Manifest loaded</span>${_extensionBooleanBadge(!!manifest.loaded)}</div>
|
||||
<div><span>Manifest status</span><code>${esc(manifest.status||'unknown')}</code></div>
|
||||
<div><span>Manifest entries inspected</span><code>${Number(manifest.entry_count)||0}</code></div>
|
||||
<div><span>Manifest script count</span><code>${Number(manifest.script_count)||0}</code></div>
|
||||
<div><span>Manifest stylesheet count</span><code>${Number(manifest.stylesheet_count)||0}</code></div>
|
||||
<div><span>Manifest sidecar count</span><code>${Number(manifest.sidecar_count)||0}</code></div>
|
||||
<div><span>Final script count</span><code>${scriptCount}</code></div>
|
||||
<div><span>Final stylesheet count</span><code>${styleCount}</code></div>
|
||||
<div><span>Loopback sidecar count</span><code>${sidecarCount}</code></div>
|
||||
<div><span>Installed manifest extensions</span><code>${manifestExtensionCount}</code></div>
|
||||
<div><span>User-disabled extensions</span><code>${userDisabledCount}</code></div>
|
||||
<div><span>${esc(t('settings_extensions_diag_extension_dir_configured'))}</span>${_extensionBooleanBadge(!!(data&&data.extension_dir_configured))}</div>
|
||||
<div><span>${esc(t('settings_extensions_diag_extension_dir_valid'))}</span>${_extensionBooleanBadge(!!(data&&data.extension_dir_valid))}</div>
|
||||
<div><span>${esc(t('settings_extensions_diag_manifest_configured'))}</span>${_extensionBooleanBadge(!!manifest.configured)}</div>
|
||||
<div><span>${esc(t('settings_extensions_diag_manifest_loaded'))}</span>${_extensionBooleanBadge(!!manifest.loaded)}</div>
|
||||
<div><span>${esc(t('settings_extensions_diag_manifest_status'))}</span><code>${esc(manifest.status||'unknown')}</code></div>
|
||||
<div><span>${esc(t('settings_extensions_diag_manifest_entries'))}</span><code>${Number(manifest.entry_count)||0}</code></div>
|
||||
<div><span>${esc(t('settings_extensions_diag_manifest_scripts'))}</span><code>${Number(manifest.script_count)||0}</code></div>
|
||||
<div><span>${esc(t('settings_extensions_diag_manifest_stylesheets'))}</span><code>${Number(manifest.stylesheet_count)||0}</code></div>
|
||||
<div><span>${esc(t('settings_extensions_diag_manifest_sidecars'))}</span><code>${Number(manifest.sidecar_count)||0}</code></div>
|
||||
<div><span>${esc(t('settings_extensions_diag_final_scripts'))}</span><code>${scriptCount}</code></div>
|
||||
<div><span>${esc(t('settings_extensions_diag_final_stylesheets'))}</span><code>${styleCount}</code></div>
|
||||
<div><span>${esc(t('settings_extensions_diag_loopback_sidecars'))}</span><code>${sidecarCount}</code></div>
|
||||
<div><span>${esc(t('settings_extensions_diag_installed_extensions'))}</span><code>${manifestExtensionCount}</code></div>
|
||||
<div><span>${esc(t('settings_extensions_diag_user_disabled'))}</span><code>${userDisabledCount}</code></div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="provider-card extension-installed-card">
|
||||
<div class="provider-card-header plugin-card-header">
|
||||
<div class="provider-card-info">
|
||||
<div class="provider-card-name">Installed manifest extensions</div>
|
||||
<div class="provider-card-meta">Enable or disable already-present local extensions. Reload WebUI to apply injected asset changes to this browser tab.</div>
|
||||
<div class="provider-card-name">${esc(t('settings_extensions_installed_section_title'))}</div>
|
||||
<div class="provider-card-meta">${esc(t('settings_extensions_installed_section_meta'))}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="provider-card-body extension-card-body">
|
||||
@@ -10182,14 +10182,14 @@ function _renderExtensionsPanel(data,seq){
|
||||
<div class="provider-card extension-assets-card">
|
||||
<div class="provider-card-header plugin-card-header">
|
||||
<div class="provider-card-info">
|
||||
<div class="provider-card-name">Final public asset URLs</div>
|
||||
<div class="provider-card-meta">Same-origin URLs that may be injected into the app shell.</div>
|
||||
<div class="provider-card-name">${esc(t('ext_assets_title'))}</div>
|
||||
<div class="provider-card-meta">${esc(t('ext_assets_meta'))}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="provider-card-body extension-card-body">
|
||||
<div class="provider-card-label">Scripts</div>
|
||||
<div class="provider-card-label">${esc(t('ext_assets_scripts'))}</div>
|
||||
${_extensionAssetList(scripts)}
|
||||
<div class="provider-card-label extension-section-label">Stylesheets</div>
|
||||
<div class="provider-card-label extension-section-label">${esc(t('ext_assets_styles'))}</div>
|
||||
${_extensionAssetList(styles)}
|
||||
</div>
|
||||
</div>
|
||||
@@ -10197,8 +10197,8 @@ function _renderExtensionsPanel(data,seq){
|
||||
<div class="provider-card extension-warnings-card">
|
||||
<div class="provider-card-header plugin-card-header">
|
||||
<div class="provider-card-info">
|
||||
<div class="provider-card-name">Sanitized warnings</div>
|
||||
<div class="provider-card-meta">Codes and coarse sources only; paths and rejected values are not shown.</div>
|
||||
<div class="provider-card-name">${esc(t('ext_warnings_title'))}</div>
|
||||
<div class="provider-card-meta">${esc(t('ext_warnings_meta'))}</div>
|
||||
</div>
|
||||
</div>
|
||||
<div class="provider-card-body extension-card-body">
|
||||
|
||||
@@ -166,7 +166,10 @@ def test_extensions_panel_renders_sanitized_status_payload():
|
||||
assert "const code=esc(rawCode)" in warning_block
|
||||
assert "esc((item&&item.source)||'unknown')" in warning_block
|
||||
assert "extension_state_unknown_ids" in warning_block
|
||||
assert "Some saved disabled-extension overrides no longer match the current manifest" in warning_block
|
||||
# #7581: the hint text is now routed through t(); the raw English must live
|
||||
# only in the locale bundle, not inline in the JS.
|
||||
assert "Some saved disabled-extension overrides no longer match the current manifest" not in warning_block
|
||||
assert "ext_state_unknown_ids_hint" in warning_block
|
||||
assert "Rejected" not in render_block # rejected values must never be rendered directly
|
||||
|
||||
|
||||
@@ -179,8 +182,8 @@ def test_extensions_panel_renders_loopback_sidecar_monitor_safely():
|
||||
load_block = _between("async function loadExtensionsPanel", "async function copyExtensionsDiagnostics")
|
||||
load_catch_block = load_block[load_block.index("}catch(e){"):]
|
||||
|
||||
assert "Loopback sidecars" in sidecar_block
|
||||
assert "No loopback sidecars declared." in sidecar_block
|
||||
assert "ext_sidecars_title" in sidecar_block
|
||||
assert "ext_sidecars_none" in sidecar_block
|
||||
assert "esc(title)" in sidecar_block
|
||||
assert "esc(meta)" in sidecar_block
|
||||
assert "esc(origin)" in sidecar_block
|
||||
@@ -191,7 +194,7 @@ def test_extensions_panel_renders_loopback_sidecar_monitor_safely():
|
||||
assert "proxy.consented===true" in sidecar_block
|
||||
assert "proxy.consent_required===true" in sidecar_block
|
||||
assert "proxy.origin_changed===true" in sidecar_block
|
||||
assert "Proxy path" in sidecar_block
|
||||
assert "ext_sidecar_proxy_path" in sidecar_block
|
||||
assert "data-extension-sidecar-proxy-id" in sidecar_block
|
||||
assert "data-extension-sidecar-proxy-approved" in sidecar_block
|
||||
assert 'data-sidecar-runtime-index="${index}"' in sidecar_block
|
||||
@@ -251,8 +254,8 @@ def test_extensions_panel_toggle_uses_dedicated_endpoint_without_settings_or_ins
|
||||
|
||||
assert "data-extension-toggle-id" in installed_block
|
||||
assert "data-extension-next-enabled" in installed_block
|
||||
assert "No extension directory is configured." in installed_block
|
||||
assert "No manifest extensions are installed in the configured bundle." in installed_block
|
||||
assert "settings_extensions_no_dir" in installed_block
|
||||
assert "settings_extensions_installed_empty" in installed_block
|
||||
assert "extensionDirConfigured" in installed_block
|
||||
assert "Manifest-disabled entries cannot be enabled from WebUI." in installed_block
|
||||
assert "api('/api/extensions/toggle',{method:'POST',body:JSON.stringify({id,enabled})})" in toggle_block
|
||||
|
||||
Reference in new issue
Block a user