From 5c1e9d70e25a9cbe1257a5a32515ccff38ad168b Mon Sep 17 00:00:00 2001 From: Joe Castle Date: Sun, 16 Aug 2026 20:42:25 -0400 Subject: [PATCH 1/3] fix(a11y): announce that a reply is generating, and that one failed The assistant's turn is currently invisible to a screen reader from start to finish. There is no live region anywhere in the frontend: no aria-live, no role="status", no role="log", no role="alert" and no aria-atomic in any .jsx or .js outside node_modules, across 589 files. The pending state is the sharpest case. PromptReply renders it as a bare dot-falling animation, which is purely visual, so a user who cannot see it is told neither that the assistant is working nor, later, that it stopped. The error state has the same problem for the opposite reason: the turn ends and nothing announces that it ended badly. This is a gap rather than a position. The same codebase already carries 56 aria-label attributes plus aria-hidden, aria-checked, aria-pressed and aria-current, so the intent is clearly there. Two changes, both in PromptReply: - The pending branch gains an sr-only role="status" carrying the text, with the animation marked aria-hidden. The text sits in the status region rather than wrapping the animation so that it announces once, on appearance, instead of on every repaint. - The error branch gains role="alert". Alert rather than status because a failed reply is the one case that warrants interrupting: nothing else on the page changes to signal the turn is over. Deliberately NOT included: announcing the streamed reply text itself. Piping a token stream into a live region makes a screen reader re-read the growing partial message on every chunk, which is worse than silence. Doing it properly means announcing the completed message once, and that belongs in ChatHistory where completion is observable, not here. Happy to follow up with it if wanted. The string is added to the en locale only; i18n.js sets fallbackLng "en", so the other 31 locales fall back rather than break. --- .../ChatHistory/PromptReply/index.jsx | 27 +++++++++++++++++-- frontend/src/locales/en/common.js | 1 + 2 files changed, 26 insertions(+), 2 deletions(-) diff --git a/frontend/src/components/WorkspaceChat/ChatContainer/ChatHistory/PromptReply/index.jsx b/frontend/src/components/WorkspaceChat/ChatContainer/ChatHistory/PromptReply/index.jsx index f4847dfc41d..9c919644b04 100644 --- a/frontend/src/components/WorkspaceChat/ChatContainer/ChatHistory/PromptReply/index.jsx +++ b/frontend/src/components/WorkspaceChat/ChatContainer/ChatHistory/PromptReply/index.jsx @@ -1,5 +1,6 @@ /* eslint-disable react-hooks/refs */ import { memo, useRef, useEffect } from "react"; +import { useTranslation } from "react-i18next"; import { Warning } from "@phosphor-icons/react"; import renderMarkdown from "@/utils/chat/markdown"; import DOMPurify from "@/utils/chat/purify"; @@ -12,13 +13,27 @@ import { } from "../ThoughtContainer"; const PromptReply = ({ uuid, reply, pending, error, sources = [] }) => { + const { t } = useTranslation(); if (!reply && sources.length === 0 && !pending && !error) return null; if (pending) { return (
-
+ {/* + The animation below is the only signal that a reply is coming, and it + is purely visual. The status region gives a screen reader user the + same information. It carries the text rather than wrapping the + animation so that it announces once, on appearance, instead of on + every repaint. + */} + + {t("chat_window.generating_response")} + +
); @@ -28,7 +43,15 @@ const PromptReply = ({ uuid, reply, pending, error, sources = [] }) => { return (
- + {/* + role="alert" rather than "status": a failed reply is the one case + where the user needs interrupting, because nothing else on the page + changes to tell them the turn ended. + */} + Could not respond to message. Reason: {error || "unknown"} diff --git a/frontend/src/locales/en/common.js b/frontend/src/locales/en/common.js index 9715f52b8ab..a355a77d3cf 100644 --- a/frontend/src/locales/en/common.js +++ b/frontend/src/locales/en/common.js @@ -1524,6 +1524,7 @@ const TRANSLATIONS = { }, chat_window: { attachments_processing: "Attachments are processing. Please wait...", + generating_response: "Generating response", send_message: "Send a message", attach_file: "Attach a file to this chat", text_size: "Change text size.", From 85f3f6681aede34f6f81f7e145e54ac55a3a923d Mon Sep 17 00:00:00 2001 From: Timothy Carambat Date: Wed, 19 Aug 2026 07:09:58 -0700 Subject: [PATCH 2/3] lint and new i18n record --- .../ChatContainer/ChatHistory/PromptReply/index.jsx | 10 +++++++--- frontend/src/locales/en/common.js | 2 ++ 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/frontend/src/components/WorkspaceChat/ChatContainer/ChatHistory/PromptReply/index.jsx b/frontend/src/components/WorkspaceChat/ChatContainer/ChatHistory/PromptReply/index.jsx index 9c919644b04..d347848952b 100644 --- a/frontend/src/components/WorkspaceChat/ChatContainer/ChatHistory/PromptReply/index.jsx +++ b/frontend/src/components/WorkspaceChat/ChatContainer/ChatHistory/PromptReply/index.jsx @@ -52,9 +52,13 @@ const PromptReply = ({ uuid, reply, pending, error, sources = [] }) => { className="inline-block p-2 rounded-lg bg-red-50 text-red-500" role="alert" > - Could not respond - to message. - Reason: {error || "unknown"} + {" "} + {t("chat_window.response_failed")} + + {t("chat_window.response_failed_reason", { + reason: error || "unknown", + })} +
diff --git a/frontend/src/locales/en/common.js b/frontend/src/locales/en/common.js index a355a77d3cf..088156c6482 100644 --- a/frontend/src/locales/en/common.js +++ b/frontend/src/locales/en/common.js @@ -1525,6 +1525,8 @@ const TRANSLATIONS = { chat_window: { attachments_processing: "Attachments are processing. Please wait...", generating_response: "Generating response", + response_failed: "Could not respond to message.", + response_failed_reason: "Reason: {{reason}}", send_message: "Send a message", attach_file: "Attach a file to this chat", text_size: "Change text size.", From e73d868bb540c6098eaf642f48cf2f144082ab91 Mon Sep 17 00:00:00 2001 From: Timothy Carambat Date: Wed, 19 Aug 2026 07:14:52 -0700 Subject: [PATCH 3/3] complete translations --- frontend/src/locales/ar/common.js | 3 +++ frontend/src/locales/ca/common.js | 3 +++ frontend/src/locales/cs/common.js | 3 +++ frontend/src/locales/da/common.js | 3 +++ frontend/src/locales/de/common.js | 3 +++ frontend/src/locales/es/common.js | 3 +++ frontend/src/locales/et/common.js | 3 +++ frontend/src/locales/fa/common.js | 3 +++ frontend/src/locales/fr/common.js | 3 +++ frontend/src/locales/he/common.js | 3 +++ frontend/src/locales/hr/common.js | 3 +++ frontend/src/locales/id/common.js | 3 +++ frontend/src/locales/it/common.js | 3 +++ frontend/src/locales/ja/common.js | 3 +++ frontend/src/locales/ko/common.js | 3 +++ frontend/src/locales/lo/common.js | 3 +++ frontend/src/locales/lt/common.js | 3 +++ frontend/src/locales/lv/common.js | 3 +++ frontend/src/locales/nl/common.js | 3 +++ frontend/src/locales/pl/common.js | 3 +++ frontend/src/locales/pt_BR/common.js | 3 +++ frontend/src/locales/ro/common.js | 3 +++ frontend/src/locales/ru/common.js | 3 +++ frontend/src/locales/tr/common.js | 3 +++ frontend/src/locales/vn/common.js | 3 +++ frontend/src/locales/zh/common.js | 3 +++ frontend/src/locales/zh_TW/common.js | 3 +++ 27 files changed, 81 insertions(+) diff --git a/frontend/src/locales/ar/common.js b/frontend/src/locales/ar/common.js index f3155e5346c..52afa7b12e9 100644 --- a/frontend/src/locales/ar/common.js +++ b/frontend/src/locales/ar/common.js @@ -1278,6 +1278,9 @@ const TRANSLATIONS = { export: "تصدير المحادثة كـ...", exporting: "التصدير...", preset_img_description: "إنشاء صورة بناءً على نص معين.", + generating_response: "إنشاء رد", + response_failed: "لم أتمكن من الرد على الرسالة.", + response_failed_reason: "السبب: {{reason}}", }, profile_settings: { edit_account: "تحرير الحساب", diff --git a/frontend/src/locales/ca/common.js b/frontend/src/locales/ca/common.js index 63e054fc8e7..b43561a8d35 100644 --- a/frontend/src/locales/ca/common.js +++ b/frontend/src/locales/ca/common.js @@ -1511,6 +1511,9 @@ const TRANSLATIONS = { export: "Exporta la conversa com a...", exporting: "Exportant…", preset_img_description: "Generar una imatge a partir d'un text", + generating_response: "Generar resposta", + response_failed: "No he pogut respondre al missatge.", + response_failed_reason: "Motiu: {{reason}}", }, profile_settings: { edit_account: "Edita el compte", diff --git a/frontend/src/locales/cs/common.js b/frontend/src/locales/cs/common.js index ccbf0602a96..f064afa200a 100644 --- a/frontend/src/locales/cs/common.js +++ b/frontend/src/locales/cs/common.js @@ -1418,6 +1418,9 @@ const TRANSLATIONS = { export: "Exportujte konverzaci jako…", exporting: "Exportování...", preset_img_description: "Vytvořit obrázek na základě textového pokynu", + generating_response: "Generování odpovědi", + response_failed: "Nebyl možné odpovědět na zprávu.", + response_failed_reason: "Důvod: {{reason}}", }, profile_settings: { edit_account: "Upravit účet", diff --git a/frontend/src/locales/da/common.js b/frontend/src/locales/da/common.js index 07c2cf40add..7dd72feb96c 100644 --- a/frontend/src/locales/da/common.js +++ b/frontend/src/locales/da/common.js @@ -1293,6 +1293,9 @@ const TRANSLATIONS = { export: "Eksportér chat som...", exporting: "Eksportér...", preset_img_description: "Generer et billede ud fra en tekstbeskrivelse", + generating_response: "Generere svar", + response_failed: "Kunne ikke svare på beskeden.", + response_failed_reason: "Årsag: {{reason}}", }, profile_settings: { edit_account: "Rediger konto", diff --git a/frontend/src/locales/de/common.js b/frontend/src/locales/de/common.js index 5e7bb5073f2..fc605077192 100644 --- a/frontend/src/locales/de/common.js +++ b/frontend/src/locales/de/common.js @@ -1417,6 +1417,9 @@ const TRANSLATIONS = { exporting: "Exportieren...", preset_img_description: "Erstelle ein Bild basierend auf einer Textanfrage.", + generating_response: "Antwort generieren", + response_failed: "Ich konnte die Nachricht nicht beantworten.", + response_failed_reason: "Grund: {{reason}}", }, profile_settings: { edit_account: "Account bearbeiten", diff --git a/frontend/src/locales/es/common.js b/frontend/src/locales/es/common.js index 2ce486aff8d..2c9292ea6d1 100644 --- a/frontend/src/locales/es/common.js +++ b/frontend/src/locales/es/common.js @@ -1432,6 +1432,9 @@ const TRANSLATIONS = { exporting: "Exportando...", preset_img_description: "Generar una imagen a partir de una descripción textual.", + generating_response: "Generar respuesta", + response_failed: "No fue posible responder al mensaje.", + response_failed_reason: "Razón: {{reason}}", }, profile_settings: { edit_account: "Editar cuenta", diff --git a/frontend/src/locales/et/common.js b/frontend/src/locales/et/common.js index 86f048d420e..4dc2244f56c 100644 --- a/frontend/src/locales/et/common.js +++ b/frontend/src/locales/et/common.js @@ -1358,6 +1358,9 @@ const TRANSLATIONS = { export: "Экспорти руй чат kui...", exporting: "Экспорт", preset_img_description: "Loo pilt tekstist antud juhiste põhjal", + generating_response: "Vastus genereerimine", + response_failed: "Ei olnud võimalik vastata teatele.", + response_failed_reason: "põhjus: {{reason}}", }, profile_settings: { edit_account: "Muuda kontot", diff --git a/frontend/src/locales/fa/common.js b/frontend/src/locales/fa/common.js index 48e8647510e..4f4dfd25abc 100644 --- a/frontend/src/locales/fa/common.js +++ b/frontend/src/locales/fa/common.js @@ -1285,6 +1285,9 @@ const TRANSLATIONS = { export: "صدور چت به صورت...", exporting: "صدور به خارج", preset_img_description: "ایجاد یک تصویر بر اساس یک دستور متنی", + generating_response: "تولید پاسخ", + response_failed: "امکان پاسخ دادن به پیام وجود نداشت.", + response_failed_reason: "دلیل: {{reason}}", }, profile_settings: { edit_account: "ویرایش حساب", diff --git a/frontend/src/locales/fr/common.js b/frontend/src/locales/fr/common.js index 2dfc97dfcb9..4b46754ffab 100644 --- a/frontend/src/locales/fr/common.js +++ b/frontend/src/locales/fr/common.js @@ -1322,6 +1322,9 @@ const TRANSLATIONS = { exporting: "Exportation...", preset_img_description: "Générer une image à partir d'une requête textuelle.", + generating_response: "Générer une réponse", + response_failed: "Impossible de répondre au message.", + response_failed_reason: "Raison : {{reason}}", }, profile_settings: { edit_account: "Modifier le compte", diff --git a/frontend/src/locales/he/common.js b/frontend/src/locales/he/common.js index 2e307050d17..d00ef86ba22 100644 --- a/frontend/src/locales/he/common.js +++ b/frontend/src/locales/he/common.js @@ -1345,6 +1345,9 @@ const TRANSLATIONS = { export: "ייצוא צ'אט כ...", exporting: "ייצוא...", preset_img_description: "יצירת תמונה על סמך הנחיה טקסטואלית", + generating_response: "יצירת תגובה", + response_failed: "לא ניתן להגיב למסר.", + response_failed_reason: "סיבה: {{reason}}", }, profile_settings: { edit_account: "ערוך חשבון", diff --git a/frontend/src/locales/hr/common.js b/frontend/src/locales/hr/common.js index 5ad2791b0ad..5f497c1a682 100644 --- a/frontend/src/locales/hr/common.js +++ b/frontend/src/locales/hr/common.js @@ -1665,6 +1665,9 @@ const TRANSLATIONS = { }, }, preset_img_description: "Generiraj sliku na temelju tekstualnog uputa.", + generating_response: "Generiranje odgovora", + response_failed: "Nije moguće odgovoriti na poruku.", + response_failed_reason: "Razlog: {{reason}}", }, profile_settings: { edit_account: "Uredi račun", diff --git a/frontend/src/locales/id/common.js b/frontend/src/locales/id/common.js index 9ad3de4335a..a06ac857956 100644 --- a/frontend/src/locales/id/common.js +++ b/frontend/src/locales/id/common.js @@ -1661,6 +1661,9 @@ const TRANSLATIONS = { }, }, preset_img_description: "Hasilkan gambar berdasarkan teks yang diberikan.", + generating_response: "Menghasilkan respons", + response_failed: "Tidak dapat membalas pesan tersebut.", + response_failed_reason: "Alasan: {{reason}}", }, profile_settings: { edit_account: "Edit Akun", diff --git a/frontend/src/locales/it/common.js b/frontend/src/locales/it/common.js index 3cd118e19a3..95837a01331 100644 --- a/frontend/src/locales/it/common.js +++ b/frontend/src/locales/it/common.js @@ -1324,6 +1324,9 @@ const TRANSLATIONS = { export: "Esporta la conversazione come...", exporting: "Esportazione...", preset_img_description: "Genera un'immagine a partire da un testo", + generating_response: "Generare una risposta", + response_failed: "Non è stato possibile rispondere al messaggio.", + response_failed_reason: "Motivo: {{reason}}", }, profile_settings: { edit_account: "Modifica account", diff --git a/frontend/src/locales/ja/common.js b/frontend/src/locales/ja/common.js index 265b350602c..f3d35bca4fc 100644 --- a/frontend/src/locales/ja/common.js +++ b/frontend/src/locales/ja/common.js @@ -1276,6 +1276,9 @@ const TRANSLATIONS = { export: "チャットを以下のような形式でエクスポートする:", exporting: "輸出…", preset_img_description: "テキストプロンプトから画像を生成する。", + generating_response: "応答を生成する", + response_failed: "メッセージへの返信ができませんでした。", + response_failed_reason: "理由:{{reason}}", }, profile_settings: { edit_account: "アカウントを編集", diff --git a/frontend/src/locales/ko/common.js b/frontend/src/locales/ko/common.js index fd722a9d184..04b321a7ab3 100644 --- a/frontend/src/locales/ko/common.js +++ b/frontend/src/locales/ko/common.js @@ -1359,6 +1359,9 @@ const TRANSLATIONS = { export: "채팅 내용을 다음 형식으로 내보내기:", exporting: "수출 중…", preset_img_description: "텍스트 프롬프트에서 이미지를 생성합니다.", + generating_response: "응답 생성", + response_failed: "메시지에 응답할 수 없었습니다.", + response_failed_reason: "이유: {{reason}}", }, profile_settings: { edit_account: "계정 정보 수정", diff --git a/frontend/src/locales/lo/common.js b/frontend/src/locales/lo/common.js index dbcd91cf00b..51cd755f69a 100644 --- a/frontend/src/locales/lo/common.js +++ b/frontend/src/locales/lo/common.js @@ -1579,6 +1579,9 @@ const TRANSLATIONS = { }, }, preset_img_description: "ຈາກຂໍ້ຄວາມ ໃຫ້ສ້າງຮູບພາບ", + generating_response: "ຜົນການຕອບ", + response_failed: "ສາมาถ ප්‍රතිສະໜອງ ຂໍ້ຄວາມ ໄດ້", + response_failed_reason: "ສາเหตุ: {{reason}}", }, profile_settings: { edit_account: "ແກ້ໄຂບັນຊີ", diff --git a/frontend/src/locales/lt/common.js b/frontend/src/locales/lt/common.js index e09dc941445..aeed941c7aa 100644 --- a/frontend/src/locales/lt/common.js +++ b/frontend/src/locales/lt/common.js @@ -1422,6 +1422,9 @@ const TRANSLATIONS = { export: "Eksporteri pokalbį kaip…", exporting: "Eksporteris...", preset_img_description: "Sukurkite vaizdą iš teksto instrukcijos", + generating_response: "Sukurti atsakymą", + response_failed: "Nepavyko atsakyti į pranešimą.", + response_failed_reason: "Priežastis: {{reason}}", }, profile_settings: { edit_account: "Redaguoti paskyrą", diff --git a/frontend/src/locales/lv/common.js b/frontend/src/locales/lv/common.js index 7818c15af93..1da5214dcb1 100644 --- a/frontend/src/locales/lv/common.js +++ b/frontend/src/locales/lv/common.js @@ -1402,6 +1402,9 @@ const TRANSLATIONS = { export: "Eksportēt čatu kā...", exporting: "Eksporteris…", preset_img_description: "Izveidot attēlu no teksta norādījuma", + generating_response: "Atbildes izveide", + response_failed: "Neizdevās atbildēt uz ziņojumu.", + response_failed_reason: "Iemesls: {{reason}}", }, profile_settings: { edit_account: "Rediģēt kontu", diff --git a/frontend/src/locales/nl/common.js b/frontend/src/locales/nl/common.js index 10f48daf73a..08b53572dfc 100644 --- a/frontend/src/locales/nl/common.js +++ b/frontend/src/locales/nl/common.js @@ -1305,6 +1305,9 @@ const TRANSLATIONS = { exporting: "Exporteren...", preset_img_description: "Genereer een afbeelding op basis van een tekstuele instructie.", + generating_response: "Antwoord genereren", + response_failed: "Kon de bericht niet beantwoorden.", + response_failed_reason: "Reden: {{reason}}", }, profile_settings: { edit_account: "Account bewerken", diff --git a/frontend/src/locales/pl/common.js b/frontend/src/locales/pl/common.js index d2238e94ee6..afebd89ff3b 100644 --- a/frontend/src/locales/pl/common.js +++ b/frontend/src/locales/pl/common.js @@ -1409,6 +1409,9 @@ const TRANSLATIONS = { export: "Eksportuj czat jako…", exporting: "Eksportowanie...", preset_img_description: "Wygeneruj obraz na podstawie tekstu", + generating_response: "Generowanie odpowiedzi", + response_failed: "Nie udało się odpowiedzieć na wiadomość.", + response_failed_reason: "Powód: {{reason}}", }, profile_settings: { edit_account: "Edytuj konto", diff --git a/frontend/src/locales/pt_BR/common.js b/frontend/src/locales/pt_BR/common.js index aac8192dd62..d0276ecc272 100644 --- a/frontend/src/locales/pt_BR/common.js +++ b/frontend/src/locales/pt_BR/common.js @@ -1392,6 +1392,9 @@ const TRANSLATIONS = { export: "Exporte a conversa como...", exporting: "Exportando...", preset_img_description: "Gerar uma imagem a partir de um texto", + generating_response: "Gerando resposta", + response_failed: "Não foi possível responder à mensagem.", + response_failed_reason: "Motivo: {{reason}}", }, profile_settings: { edit_account: "Editar conta", diff --git a/frontend/src/locales/ro/common.js b/frontend/src/locales/ro/common.js index 8d6c35345e4..8144524fde1 100644 --- a/frontend/src/locales/ro/common.js +++ b/frontend/src/locales/ro/common.js @@ -668,6 +668,9 @@ const TRANSLATIONS = { export: "Exportați conversația sub forma de...", exporting: "Exportare...", preset_img_description: "Generați o imagine pe baza unui text.", + generating_response: "Generarea răspunsului", + response_failed: "Nu am putut răspunde la mesaj.", + response_failed_reason: "Motiv: {{reason}}", }, profile_settings: { edit_account: "Editează contul", diff --git a/frontend/src/locales/ru/common.js b/frontend/src/locales/ru/common.js index 1ea83372246..a2f7ddb525b 100644 --- a/frontend/src/locales/ru/common.js +++ b/frontend/src/locales/ru/common.js @@ -1313,6 +1313,9 @@ const TRANSLATIONS = { export: "Экспортировать чат в формате…", exporting: "Экспорт...", preset_img_description: "Создать изображение на основе текстового запроса", + generating_response: "Формирование ответа", + response_failed: "Не удалось ответить на сообщение.", + response_failed_reason: "Причина: {{reason}}", }, profile_settings: { edit_account: "Редактировать учётную запись", diff --git a/frontend/src/locales/tr/common.js b/frontend/src/locales/tr/common.js index 23262ec8d27..c5da3c9b54b 100644 --- a/frontend/src/locales/tr/common.js +++ b/frontend/src/locales/tr/common.js @@ -1306,6 +1306,9 @@ const TRANSLATIONS = { export: "Çat sohbetini şu şekilde dışa aktar:", exporting: "Dışarıya satışı yapma...", preset_img_description: "Bir metin isteminden bir görüntü oluşturun", + generating_response: "Yanıt üretme", + response_failed: "Mesaja cevap veremedim.", + response_failed_reason: "Nedeni: {{reason}}", }, profile_settings: { edit_account: "Hesabı Düzenle", diff --git a/frontend/src/locales/vn/common.js b/frontend/src/locales/vn/common.js index 36e00c5c046..2e5d653b859 100644 --- a/frontend/src/locales/vn/common.js +++ b/frontend/src/locales/vn/common.js @@ -1290,6 +1290,9 @@ const TRANSLATIONS = { export: "Xuất trò chuyện dưới dạng...", exporting: "Xuất khẩu...", preset_img_description: "Tạo một hình ảnh từ một đoạn mô tả bằng văn bản.", + generating_response: "Tạo ra câu trả lời", + response_failed: "Không thể phản hồi tin nhắn.", + response_failed_reason: "Lý do: {{reason}}", }, profile_settings: { edit_account: "Chỉnh sửa Tài khoản", diff --git a/frontend/src/locales/zh/common.js b/frontend/src/locales/zh/common.js index 5e83dc31123..7802bd9f043 100644 --- a/frontend/src/locales/zh/common.js +++ b/frontend/src/locales/zh/common.js @@ -1301,6 +1301,9 @@ const TRANSLATIONS = { export: "导出聊天记录为…", exporting: "出口…", preset_img_description: "根据文本提示生成图像。", + generating_response: "生成回复", + response_failed: "无法回复消息。", + response_failed_reason: "原因:{{reason}}", }, profile_settings: { edit_account: "编辑帐户", diff --git a/frontend/src/locales/zh_TW/common.js b/frontend/src/locales/zh_TW/common.js index 406790df868..e045a38dd63 100644 --- a/frontend/src/locales/zh_TW/common.js +++ b/frontend/src/locales/zh_TW/common.js @@ -1209,6 +1209,9 @@ const TRANSLATIONS = { export: "匯出對話內容為…", exporting: "出口...", preset_img_description: "根據文字提示,生成圖像。", + generating_response: "產生回應", + response_failed: "無法回覆訊息。", + response_failed_reason: "原因:{{reason}}", }, profile_settings: { edit_account: "編輯帳戶",