From e78e7ccdebc23eb72f2ee1df706030ef8d5f2dc2 Mon Sep 17 00:00:00 2001 From: kshitijk4poor <82637225+kshitijk4poor@users.noreply.github.com> Date: Sun, 27 Sep 2026 16:23:49 +0530 Subject: [PATCH] fix(web): translate the skipped-active toast and show one toast selectedSessionsSkippedActive is required in Translations, but only en.ts had it. Every locale typed `: Translations` failed tsc -b with TS2741, which breaks scripts/build/web.mjs. Add a translation next to selectedSessionsDeleted in each of them (ar.ts goes through defineLocale and falls back to English). useToast holds one toast and only supports success|error, so the skipped toast replaced the success toast in the same tick and the deleted count was lost. Show a single toast instead: success with the count when nothing was skipped, otherwise one error toast that carries both counts. Also drop the duplicated comment. --- web/src/i18n/af.ts | 1 + web/src/i18n/de.ts | 1 + web/src/i18n/en.ts | 2 +- web/src/i18n/es.ts | 1 + web/src/i18n/fr.ts | 1 + web/src/i18n/ga.ts | 1 + web/src/i18n/hu.ts | 1 + web/src/i18n/it.ts | 1 + web/src/i18n/ja.ts | 1 + web/src/i18n/ko.ts | 1 + web/src/i18n/pt.ts | 1 + web/src/i18n/ru.ts | 1 + web/src/i18n/tr.ts | 1 + web/src/i18n/uk.ts | 1 + web/src/i18n/zh-hant.ts | 1 + web/src/i18n/zh.ts | 1 + web/src/pages/SessionsPage.tsx | 26 +++++++++++++------------- 17 files changed, 29 insertions(+), 14 deletions(-) diff --git a/web/src/i18n/af.ts b/web/src/i18n/af.ts index 7148f9c4a8..d84e86093b 100644 --- a/web/src/i18n/af.ts +++ b/web/src/i18n/af.ts @@ -162,6 +162,7 @@ export const af: Translations = { deleteSelectedConfirmMessage: "Dit verwyder {count} gekose sessies en al hul boodskappe permanent. Dit kan nie ongedaan gemaak word nie.", selectedSessionsDeleted: "{count} sessies geskrap", + selectedSessionsSkippedActive: "{deleted} geskrap; {count} behou omdat 'n beurt nog loop", failedToDeleteSelected: "Kon nie gekose sessies skrap nie", resumeInChat: "Hervat in Klets", newChat: "Nuwe klets", diff --git a/web/src/i18n/de.ts b/web/src/i18n/de.ts index 7c0a1bd8df..1d10a98500 100644 --- a/web/src/i18n/de.ts +++ b/web/src/i18n/de.ts @@ -162,6 +162,7 @@ export const de: Translations = { deleteSelectedConfirmMessage: "Dies entfernt {count} ausgewählte Sitzungen und alle zugehörigen Nachrichten dauerhaft. Dies kann nicht rückgängig gemacht werden.", selectedSessionsDeleted: "{count} Sitzungen gelöscht", + selectedSessionsSkippedActive: "{deleted} gelöscht; {count} behalten, weil noch ein Turn läuft", failedToDeleteSelected: "Ausgewählte Sitzungen konnten nicht gelöscht werden", resumeInChat: "Im Chat fortsetzen", newChat: "Neuer Chat", diff --git a/web/src/i18n/en.ts b/web/src/i18n/en.ts index 31517e8627..1c81698330 100644 --- a/web/src/i18n/en.ts +++ b/web/src/i18n/en.ts @@ -194,7 +194,7 @@ export const en: Translations = { "This permanently removes {count} selected sessions and all their messages. This cannot be undone.", selectedSessionsDeleted: "{count} sessions deleted", selectedSessionsSkippedActive: - "{count} sessions kept: a live turn is still running in them", + "{deleted} deleted; {count} kept because a turn is running", failedToDeleteSelected: "Failed to delete selected sessions", resumeInChat: "Resume in Chat", newChat: "New chat", diff --git a/web/src/i18n/es.ts b/web/src/i18n/es.ts index e6a716a37c..86a81d0047 100644 --- a/web/src/i18n/es.ts +++ b/web/src/i18n/es.ts @@ -162,6 +162,7 @@ export const es: Translations = { deleteSelectedConfirmMessage: "Esto elimina permanentemente {count} sesiones seleccionadas y todos sus mensajes. No se puede deshacer.", selectedSessionsDeleted: "{count} sesiones eliminadas", + selectedSessionsSkippedActive: "{deleted} eliminadas; {count} conservadas porque hay un turno en curso", failedToDeleteSelected: "No se pudieron eliminar las sesiones seleccionadas", resumeInChat: "Reanudar en el chat", newChat: "Nuevo chat", diff --git a/web/src/i18n/fr.ts b/web/src/i18n/fr.ts index ce8bfadee7..b51154322f 100644 --- a/web/src/i18n/fr.ts +++ b/web/src/i18n/fr.ts @@ -162,6 +162,7 @@ export const fr: Translations = { deleteSelectedConfirmMessage: "Cela supprime définitivement {count} sessions sélectionnées et tous leurs messages. Cette action est irréversible.", selectedSessionsDeleted: "{count} sessions supprimées", + selectedSessionsSkippedActive: "{deleted} supprimées ; {count} conservées car un tour est en cours", failedToDeleteSelected: "Échec de la suppression des sessions sélectionnées", resumeInChat: "Reprendre dans le chat", newChat: "Nouveau chat", diff --git a/web/src/i18n/ga.ts b/web/src/i18n/ga.ts index 4fa2f66bc3..131970fb59 100644 --- a/web/src/i18n/ga.ts +++ b/web/src/i18n/ga.ts @@ -162,6 +162,7 @@ export const ga: Translations = { deleteSelectedConfirmMessage: "Bainfear {count} seisiún roghnaithe agus a dteachtaireachtaí go léir go buan. Ní féidir é seo a chur ar ais.", selectedSessionsDeleted: "Scriosadh {count} seisiún", + selectedSessionsSkippedActive: "Scriosadh {deleted}; coinníodh {count} mar go bhfuil seal ar siúl", failedToDeleteSelected: "Theip ar scriosadh na seisiún roghnaithe", resumeInChat: "Lean ar aghaidh sa chomhrá", newChat: "Comhrá nua", diff --git a/web/src/i18n/hu.ts b/web/src/i18n/hu.ts index f980526e2a..6259ad8d59 100644 --- a/web/src/i18n/hu.ts +++ b/web/src/i18n/hu.ts @@ -162,6 +162,7 @@ export const hu: Translations = { deleteSelectedConfirmMessage: "Ez véglegesen eltávolítja a kijelölt {count} munkamenetet és minden üzenetüket. A művelet nem vonható vissza.", selectedSessionsDeleted: "{count} munkamenet törölve", + selectedSessionsSkippedActive: "{deleted} törölve; {count} megtartva, mert egy kör még fut", failedToDeleteSelected: "Nem sikerült törölni a kijelölt munkameneteket", resumeInChat: "Folytatás a csevegésben", newChat: "Új csevegés", diff --git a/web/src/i18n/it.ts b/web/src/i18n/it.ts index a85a4c2576..c11996f5f4 100644 --- a/web/src/i18n/it.ts +++ b/web/src/i18n/it.ts @@ -162,6 +162,7 @@ export const it: Translations = { deleteSelectedConfirmMessage: "Verranno eliminate definitivamente {count} sessioni selezionate e tutti i loro messaggi. L'operazione non può essere annullata.", selectedSessionsDeleted: "{count} sessioni eliminate", + selectedSessionsSkippedActive: "{deleted} eliminate; {count} mantenute perché un turno è in corso", failedToDeleteSelected: "Impossibile eliminare le sessioni selezionate", resumeInChat: "Riprendi nella chat", newChat: "Nuova chat", diff --git a/web/src/i18n/ja.ts b/web/src/i18n/ja.ts index e93f8ae563..41d73a82fc 100644 --- a/web/src/i18n/ja.ts +++ b/web/src/i18n/ja.ts @@ -162,6 +162,7 @@ export const ja: Translations = { deleteSelectedConfirmMessage: "選択した{count}件のセッションとそのすべてのメッセージが完全に削除されます。この操作は取り消せません。", selectedSessionsDeleted: "{count}件のセッションを削除しました", + selectedSessionsSkippedActive: "{deleted}件を削除、実行中のターンがあるため{count}件を保持しました", failedToDeleteSelected: "選択したセッションの削除に失敗しました", resumeInChat: "チャットで再開", newChat: "新しいチャット", diff --git a/web/src/i18n/ko.ts b/web/src/i18n/ko.ts index 297e8493a8..d1f2a179c2 100644 --- a/web/src/i18n/ko.ts +++ b/web/src/i18n/ko.ts @@ -162,6 +162,7 @@ export const ko: Translations = { deleteSelectedConfirmMessage: "선택한 {count}개 세션과 모든 메시지가 영구적으로 제거됩니다. 이 작업은 취소할 수 없습니다.", selectedSessionsDeleted: "{count}개 세션이 삭제되었습니다", + selectedSessionsSkippedActive: "{deleted}개 삭제됨, 진행 중인 턴이 있어 {count}개 유지됨", failedToDeleteSelected: "선택한 세션 삭제에 실패했습니다", resumeInChat: "채팅에서 다시 시작", newChat: "새 채팅", diff --git a/web/src/i18n/pt.ts b/web/src/i18n/pt.ts index 711483f1e2..e88a896357 100644 --- a/web/src/i18n/pt.ts +++ b/web/src/i18n/pt.ts @@ -162,6 +162,7 @@ export const pt: Translations = { deleteSelectedConfirmMessage: "Isto remove permanentemente {count} sessões selecionadas e todas as suas mensagens. Não pode ser desfeito.", selectedSessionsDeleted: "{count} sessões eliminadas", + selectedSessionsSkippedActive: "{deleted} eliminadas; {count} mantidas porque há um turno em curso", failedToDeleteSelected: "Falha ao eliminar as sessões selecionadas", resumeInChat: "Retomar no Chat", newChat: "Novo chat", diff --git a/web/src/i18n/ru.ts b/web/src/i18n/ru.ts index e2c469fc26..67357dae06 100644 --- a/web/src/i18n/ru.ts +++ b/web/src/i18n/ru.ts @@ -162,6 +162,7 @@ export const ru: Translations = { deleteSelectedConfirmMessage: "Это безвозвратно удалит {count} выбранных сессий и все их сообщения. Это действие нельзя отменить.", selectedSessionsDeleted: "Удалено сессий: {count}", + selectedSessionsSkippedActive: "Удалено: {deleted}; сохранено: {count}, так как ход ещё выполняется", failedToDeleteSelected: "Не удалось удалить выбранные сессии", resumeInChat: "Продолжить в чате", newChat: "Новый чат", diff --git a/web/src/i18n/tr.ts b/web/src/i18n/tr.ts index edef05053e..80c2812cf2 100644 --- a/web/src/i18n/tr.ts +++ b/web/src/i18n/tr.ts @@ -162,6 +162,7 @@ export const tr: Translations = { deleteSelectedConfirmMessage: "Bu, seçilen {count} oturumu ve tüm mesajlarını kalıcı olarak siler. Bu işlem geri alınamaz.", selectedSessionsDeleted: "{count} oturum silindi", + selectedSessionsSkippedActive: "{deleted} silindi; bir tur çalıştığı için {count} tutuldu", failedToDeleteSelected: "Seçilen oturumlar silinemedi", resumeInChat: "Sohbette Devam Et", newChat: "Yeni sohbet", diff --git a/web/src/i18n/uk.ts b/web/src/i18n/uk.ts index fd6dfadb78..60cc1eae4f 100644 --- a/web/src/i18n/uk.ts +++ b/web/src/i18n/uk.ts @@ -162,6 +162,7 @@ export const uk: Translations = { deleteSelectedConfirmMessage: "Це назавжди видалить {count} вибраних сесій і всі їхні повідомлення. Цю дію неможливо скасувати.", selectedSessionsDeleted: "Видалено сесій: {count}", + selectedSessionsSkippedActive: "Видалено: {deleted}; залишено: {count}, бо хід ще виконується", failedToDeleteSelected: "Не вдалося видалити вибрані сесії", resumeInChat: "Продовжити в чаті", newChat: "Новий чат", diff --git a/web/src/i18n/zh-hant.ts b/web/src/i18n/zh-hant.ts index 57f8fab86b..3ff60ce22a 100644 --- a/web/src/i18n/zh-hant.ts +++ b/web/src/i18n/zh-hant.ts @@ -162,6 +162,7 @@ export const zhHant: Translations = { deleteSelectedConfirmMessage: "此操作將永久刪除所選的 {count} 個工作階段及其所有訊息。無法復原。", selectedSessionsDeleted: "已刪除 {count} 個工作階段", + selectedSessionsSkippedActive: "已刪除 {deleted} 個;{count} 個因仍有回合執行中而保留", failedToDeleteSelected: "刪除所選工作階段失敗", resumeInChat: "在對話中繼續", newChat: "新對話", diff --git a/web/src/i18n/zh.ts b/web/src/i18n/zh.ts index a1f934882c..a156664aa4 100644 --- a/web/src/i18n/zh.ts +++ b/web/src/i18n/zh.ts @@ -160,6 +160,7 @@ export const zh: Translations = { deleteSelectedConfirmMessage: "此操作将永久删除所选的 {count} 个会话及其所有消息。无法撤销。", selectedSessionsDeleted: "已删除 {count} 个会话", + selectedSessionsSkippedActive: "已删除 {deleted} 个;{count} 个因仍有回合运行中而保留", failedToDeleteSelected: "删除所选会话失败", resumeInChat: "在对话中继续", newChat: "新对话", diff --git a/web/src/pages/SessionsPage.tsx b/web/src/pages/SessionsPage.tsx index 93834ca7d1..3ac34204d2 100644 --- a/web/src/pages/SessionsPage.tsx +++ b/web/src/pages/SessionsPage.tsx @@ -1396,22 +1396,22 @@ export default function SessionsPage() { ids, owners.size === 1 ? [...owners][0] : undefined, ); - showToast( - t.sessions.selectedSessionsDeleted.replace( - "{count}", - String(resp.deleted), - ), - "success", - ); - if (resp.skipped_active?.length) { - // Rows a live turn owns were refused server-side; say so instead of implying all went. + const skippedCount = resp.skipped_active?.length ?? 0; + if (skippedCount) { showToast( - t.sessions.selectedSessionsSkippedActive.replace( - "{count}", - String(resp.skipped_active.length), - ), + t.sessions.selectedSessionsSkippedActive + .replace("{deleted}", String(resp.deleted)) + .replace("{count}", String(skippedCount)), "error", ); + } else { + showToast( + t.sessions.selectedSessionsDeleted.replace( + "{count}", + String(resp.deleted), + ), + "success", + ); } setDeleteSelectedOpen(false); // Drop deleted rows out of the visible list immediately rather