feat(engines): frame uninstalled engines as headroom, not failures (#1531)

The catalogue's group captions read "Available" / "Not installed", which
renders a fresh install (3 of 16 engines ready) as a mostly-broken app.
The sections now say "Ready to use" / "Add more engines", and the
unavailable-row details toggle asks "What it needs" instead of "Why
unavailable?" — same information, framed as headroom to unlock.

Council outcome (first-run seat): unavailable engines must read as more
you could install, never as brokenness. Keys added to all 21 locales.

Co-authored-by: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
Palash Debnath
2026-08-13 15:38:35 +00:00
committed by GitHub
co-authored by Claude Fable 5
parent 9832fbd693
commit f81ace68d1
23 changed files with 69 additions and 22 deletions
+1
View File
@@ -11,6 +11,7 @@ the frozen-backend fallback mirror it for their toolchains.
**Highlights**
- Switch TTS, ASR and LLM engines from the status bar or workspace, with ready-only choices, memory status and environment-pin protection. (#1530)
- The engine catalogue frames uninstalled engines as "Add more engines" with a "What it needs" explainer, instead of a wall of unavailable rows. (#1531)
- Docker/server mode now requires an API key for remote changes and side-effectful admin checks across workers, engines, media tools, MCP, pronunciation, diagnostics, and LLM providers. (#1525)
- The unified Support page no longer throws while opening a section in browsers or test environments without `scrollIntoView`. (#1525)
- A faster, cleaner Dub workspace for multilingual production (#1489)
@@ -815,7 +815,11 @@ export default function EngineCompatibilityMatrix({
MUTED,
)}
>
{b.available ? t('engines.available') : t('engines.notInstalled')}
{/* Section framing, not status: "ready to use" vs "add
more" frames the grey majority as headroom to unlock
rather than a mostly-broken app (13 of 16 rows read as
failures under a plain "Not installed" caption). */}
{b.available ? t('engines.sectionReady') : t('engines.sectionMore')}
</div>
)}
<div
+3 -1
View File
@@ -677,7 +677,9 @@
"activeEngine": "نشط {{family}}: {{engine}}",
"engineCompatLabel": "{{family}} توافق المحرك",
"active": "نشط",
"whyUnavailable": "لماذا غير متوفر؟",
"whyUnavailable": "ما الذي يحتاجه",
"sectionReady": "جاهزة للاستخدام",
"sectionMore": "أضف المزيد من المحركات",
"lastError": "الخطأ الأخير: {{error}}",
"installedAndReady": "مثبتة وجاهزة",
"notInstalled": "غير مثبت",
+3 -1
View File
@@ -677,7 +677,9 @@
"activeEngine": "Aktiv {{family}}: {{engine}}",
"engineCompatLabel": "{{family}} Motorkompatibilität",
"active": "aktiv",
"whyUnavailable": "Warum nicht verfügbar?",
"whyUnavailable": "Was benötigt wird",
"sectionReady": "Einsatzbereit",
"sectionMore": "Weitere Motoren hinzufügen",
"lastError": "Letzter Fehler: {{error}}",
"installedAndReady": "Installiert und fertig",
"notInstalled": "Nicht installiert",
+3 -1
View File
@@ -1971,7 +1971,9 @@
"activeEngine": "Active {{family}}: {{engine}}",
"engineCompatLabel": "{{family}} engine compatibility",
"active": "active",
"whyUnavailable": "Why unavailable?",
"whyUnavailable": "What it needs",
"sectionReady": "Ready to use",
"sectionMore": "Add more engines",
"lastError": "Last error: {{error}}",
"installedAndReady": "Installed and ready",
"notInstalled": "Not installed",
+3 -1
View File
@@ -677,7 +677,9 @@
"activeEngine": "Activo {{family}}: {{engine}}",
"engineCompatLabel": "{{family}} compatibilidad del motor",
"active": "activo",
"whyUnavailable": "¿Por qué no está disponible?",
"whyUnavailable": "Qué necesita",
"sectionReady": "Listos para usar",
"sectionMore": "Añadir más motores",
"lastError": "Último error: {{error}}",
"installedAndReady": "Instalado y listo",
"notInstalled": "No instalado",
+3 -1
View File
@@ -677,7 +677,9 @@
"activeEngine": "Actif {{family}} : {{engine}}",
"engineCompatLabel": "Compatibilité moteur {{family}}",
"active": "actif",
"whyUnavailable": "Pourquoi indisponible ?",
"whyUnavailable": "Ce qu'il lui faut",
"sectionReady": "Prêts à l'emploi",
"sectionMore": "Ajouter d'autres moteurs",
"lastError": "Dernière erreur : {{error}}",
"installedAndReady": "Installé et prêt",
"notInstalled": "Non installé",
+3 -1
View File
@@ -677,7 +677,9 @@
"activeEngine": "सक्रिय {{family}}: {{engine}}",
"engineCompatLabel": "{{family}} इंजन अनुकूलता",
"active": "सक्रिय",
"whyUnavailable": "अनुपलब्ध क्यों?",
"whyUnavailable": "इसे क्या चाहिए",
"sectionReady": "उपयोग के लिए तैयार",
"sectionMore": "और इंजन जोड़ें",
"lastError": "अंतिम त्रुटि: {{error}}",
"installedAndReady": "स्थापित और तैयार",
"notInstalled": "स्थापित नहीं",
+3 -1
View File
@@ -677,7 +677,9 @@
"activeEngine": "Aktif {{family}}: {{engine}}",
"engineCompatLabel": "{{family}} kompatibilitas mesin",
"active": "aktif",
"whyUnavailable": "Mengapa tidak tersedia?",
"whyUnavailable": "Apa yang dibutuhkan",
"sectionReady": "Siap digunakan",
"sectionMore": "Tambahkan mesin lainnya",
"lastError": "Kesalahan terakhir: {{error}}",
"installedAndReady": "Terpasang dan siap",
"notInstalled": "Tidak dipasang",
+3 -1
View File
@@ -677,7 +677,9 @@
"activeEngine": "Attivo {{family}}: {{engine}}",
"engineCompatLabel": "{{family}} compatibilità motore",
"active": "attivo",
"whyUnavailable": "Perché non disponibile?",
"whyUnavailable": "Cosa serve",
"sectionReady": "Pronti all'uso",
"sectionMore": "Aggiungi altri motori",
"lastError": "Ultimo errore: {{error}}",
"installedAndReady": "Installato e pronto",
"notInstalled": "Non installato",
+3 -1
View File
@@ -677,7 +677,9 @@
"activeEngine": "アクティブ {{family}}: {{engine}}",
"engineCompatLabel": "{{family}} エンジンの互換性",
"active": "アクティブな",
"whyUnavailable": "なぜ利用できないのでしょうか?",
"whyUnavailable": "必要なもの",
"sectionReady": "すぐに使える",
"sectionMore": "エンジンを追加",
"lastError": "最後のエラー: {{error}}",
"installedAndReady": "インストールされて準備完了",
"notInstalled": "インストールされていません",
+3 -1
View File
@@ -677,7 +677,9 @@
"activeEngine": "활성 {{family}}: {{engine}}",
"engineCompatLabel": "{{family}} 엔진 호환성",
"active": "활성",
"whyUnavailable": "왜 사용할 수 없나요?",
"whyUnavailable": "필요한 것",
"sectionReady": "바로 사용 가능",
"sectionMore": "엔진 추가",
"lastError": "마지막 오류: {{error}}",
"installedAndReady": "설치 및 준비 완료",
"notInstalled": "설치되지 않음",
+3 -1
View File
@@ -677,7 +677,9 @@
"activeEngine": "Actief {{family}}: {{engine}}",
"engineCompatLabel": "{{family}} motorcompatibiliteit",
"active": "actief",
"whyUnavailable": "Waarom niet beschikbaar?",
"whyUnavailable": "Wat het nodig heeft",
"sectionReady": "Klaar voor gebruik",
"sectionMore": "Meer motoren toevoegen",
"lastError": "Laatste fout: {{error}}",
"installedAndReady": "Geïnstalleerd en klaar",
"notInstalled": "Niet geïnstalleerd",
+3 -1
View File
@@ -677,7 +677,9 @@
"activeEngine": "Aktywny {{family}}: {{engine}}",
"engineCompatLabel": "{{family}} kompatybilność silnika",
"active": "aktywny",
"whyUnavailable": "Dlaczego niedostępne?",
"whyUnavailable": "Czego potrzebuje",
"sectionReady": "Gotowe do użycia",
"sectionMore": "Dodaj więcej silników",
"lastError": "Ostatni błąd: {{error}}",
"installedAndReady": "Zainstalowany i gotowy",
"notInstalled": "Nie zainstalowano",
+3 -1
View File
@@ -677,7 +677,9 @@
"activeEngine": "Ativo {{family}}: {{engine}}",
"engineCompatLabel": "{{family}} compatibilidade do motor",
"active": "ativo",
"whyUnavailable": "Por que indisponível?",
"whyUnavailable": "O que falta",
"sectionReady": "Prontos para usar",
"sectionMore": "Adicionar mais motores",
"lastError": "Último erro: {{error}}",
"installedAndReady": "Instalado e pronto",
"notInstalled": "Não instalado",
+3 -1
View File
@@ -677,7 +677,9 @@
"activeEngine": "Активен {{family}}: {{engine}}",
"engineCompatLabel": "Совместимость с двигателем {{family}}",
"active": "активный",
"whyUnavailable": "Почему недоступен?",
"whyUnavailable": "Что нужно",
"sectionReady": "Готовы к использованию",
"sectionMore": "Добавить больше двигателей",
"lastError": "Последняя ошибка: {{error}}",
"installedAndReady": "Установлен и готов",
"notInstalled": "Не установлено",
+3 -1
View File
@@ -677,7 +677,9 @@
"activeEngine": "Aktiv {{family}}: {{engine}}",
"engineCompatLabel": "{{family}} motorkompatibilitet",
"active": "aktiv",
"whyUnavailable": "Varför inte tillgänglig?",
"whyUnavailable": "Vad som krävs",
"sectionReady": "Redo att använda",
"sectionMore": "Lägg till fler motorer",
"lastError": "Senaste fel: {{error}}",
"installedAndReady": "Installerad och klar",
"notInstalled": "Ej installerad",
+3 -1
View File
@@ -677,7 +677,9 @@
"activeEngine": "ใช้งาน {{family}}: {{engine}}",
"engineCompatLabel": "{{family}} ความเข้ากันได้ของเครื่องยนต์",
"active": "ใช้งานอยู่",
"whyUnavailable": "ทำไมไม่พร้อมใช้งาน?",
"whyUnavailable": "สิ่งที่ต้องมี",
"sectionReady": "พร้อมใช้งาน",
"sectionMore": "เพิ่มเครื่องยนต์อื่น ๆ",
"lastError": "ข้อผิดพลาดครั้งล่าสุด: {{error}}",
"installedAndReady": "ติดตั้งแล้วพร้อม",
"notInstalled": "ไม่ได้ติดตั้ง",
+3 -1
View File
@@ -677,7 +677,9 @@
"activeEngine": "Etkin {{family}}: {{engine}}",
"engineCompatLabel": "{{family}} motor uyumluluğu",
"active": "aktif",
"whyUnavailable": "Neden kullanılamıyor?",
"whyUnavailable": "Neye ihtiyacı var",
"sectionReady": "Kullanıma hazır",
"sectionMore": "Daha fazla motor ekle",
"lastError": "Son hata: {{error}}",
"installedAndReady": "Kurulu ve hazır",
"notInstalled": "Kurulu değil",
+3 -1
View File
@@ -677,7 +677,9 @@
"activeEngine": "Активний {{family}}: {{engine}}",
"engineCompatLabel": "{{family}} сумісність з двигуном",
"active": "активний",
"whyUnavailable": "Чому недоступний?",
"whyUnavailable": "Що потрібно",
"sectionReady": "Готові до використання",
"sectionMore": "Додати більше двигунів",
"lastError": "Остання помилка: {{error}}",
"installedAndReady": "Встановлено і готово",
"notInstalled": "Не встановлено",
+3 -1
View File
@@ -677,7 +677,9 @@
"activeEngine": "Đang hoạt động {{family}}: {{engine}}",
"engineCompatLabel": "{{family}} khả năng tương thích động cơ",
"active": "hoạt động",
"whyUnavailable": "Tại sao không có sẵn?",
"whyUnavailable": "Cần những gì",
"sectionReady": "Sẵn sàng sử dụng",
"sectionMore": "Thêm động cơ khác",
"lastError": "Lỗi cuối cùng: {{error}}",
"installedAndReady": "Đã cài đặt và sẵn sàng",
"notInstalled": "Chưa được cài đặt",
+3 -1
View File
@@ -634,7 +634,9 @@
"activeEngine": "当前 {{family}}{{engine}}",
"engineCompatLabel": "{{family}} 引擎兼容性",
"active": "当前",
"whyUnavailable": "为什么不可用?",
"whyUnavailable": "所需条件",
"sectionReady": "即可使用",
"sectionMore": "添加更多引擎",
"lastError": "最后一个错误:{{error}}",
"installedAndReady": "安装并准备就绪",
"notInstalled": "未安装",
+3 -1
View File
@@ -677,7 +677,9 @@
"activeEngine": "活動 {{family}}{{engine}}",
"engineCompatLabel": "{{family}} 引擎相容性",
"active": "活躍的",
"whyUnavailable": "為什麼不可用?",
"whyUnavailable": "所需條件",
"sectionReady": "隨時可用",
"sectionMore": "新增更多引擎",
"lastError": "最後一個錯誤:{{error}}",
"installedAndReady": "安裝並準備就緒",
"notInstalled": "未安裝",