diff --git a/components/mail/__tests__/mail-app-return-to-list.test.tsx b/components/mail/__tests__/mail-app-return-to-list.test.tsx index 3e08c0702..e07345052 100644 --- a/components/mail/__tests__/mail-app-return-to-list.test.tsx +++ b/components/mail/__tests__/mail-app-return-to-list.test.tsx @@ -22,11 +22,19 @@ vi.mock('next/dynamic', () => ({ default: (load: () => Promise; }; } })); +type ViewerProps = { + onArchive?: () => void; onDelete?: () => void; onMoveToMailbox?: (mailboxId: string) => void; + onMarkAsSpam?: () => void; onUndoSpam?: () => void; onRemoveFromFolder?: () => void; +}; vi.mock('@/components/email/email-viewer', () => ({ - EmailViewer: ({ onArchive, onDelete }: { onArchive?: () => void; onDelete?: () => void }) => ( + EmailViewer: ({ onArchive, onDelete, onMoveToMailbox, onMarkAsSpam, onUndoSpam, onRemoveFromFolder }: ViewerProps) => ( <> + + + + {onRemoveFromFolder && } ), })); @@ -64,13 +72,21 @@ function mailbox(id: string, role: string): Mailbox { id, name: role, role, sortOrder: 0, totalEmails: 3, unreadEmails: 0, totalThreads: 3, unreadThreads: 0, isSubscribed: true, } as Mailbox; } -const folders = [mailbox('inbox', 'inbox'), mailbox('archive', 'archive'), mailbox('trash', 'trash')]; -const row = (id: string, minute: number) => ({ +const folders = [ + mailbox('inbox', 'inbox'), mailbox('archive', 'archive'), mailbox('trash', 'trash'), + mailbox('junk', 'junk'), mailbox('work', ''), +]; +const row = (id: string, minute: number, mailboxIds: Record = { inbox: true }) => ({ id, threadId: `t-${id}`, subject: id, receivedAt: new Date(Date.UTC(2026, 9, 31, 10, minute)).toISOString(), - keywords: { $seen: true }, mailboxIds: { inbox: true }, + keywords: { $seen: true }, mailboxIds, }) as unknown as Email; const inbox = () => [row('m1', 30), row('m2', 20), row('m3', 10)]; +/** Opens `rows[0]` of `folder`. */ +function showFolder(folder: string, rows: Email[]) { + useEmailStore.setState({ emails: rows, selectedEmail: rows[0], selectedMailbox: folder } as never); +} + let client: Record | (() => unknown)>; let fetchEmailContent: ReturnType; // Every message the store had open, in order. @@ -94,6 +110,9 @@ beforeEach(() => { moveEmail: vi.fn().mockResolvedValue(undefined), moveToTrash: vi.fn().mockResolvedValue(undefined), markAsRead: vi.fn().mockResolvedValue(undefined), + markAsSpam: vi.fn().mockResolvedValue(undefined), + undoSpam: vi.fn().mockResolvedValue(undefined), + removeEmailsFromMailbox: vi.fn().mockResolvedValue(undefined), }; useAuthStore.setState({ isAuthenticated: true, isLoading: false, client: client as never, activeAccountId: 'login-a', identities: [], @@ -193,6 +212,67 @@ describe.each([ }); }); +describe.each([ + ['Mountain View', { interfaceLayout: 'mountain-view' }], + ['the default layout', { interfaceLayout: 'default' }], +])('Moving the open message out of the folder in %s', (_name, layout) => { + beforeEach(() => useSettingsStore.setState(layout as never)); + + async function click(label: string) { + render(); + fireEvent.click(await screen.findByText(label, {}, { timeout: 5000 })); + } + async function expectBackInList() { + await waitFor(() => expect(useEmailStore.getState().emails.map((e) => e.id)).toEqual(['m2', 'm3'])); + expect(selectedId()).toBeNull(); + expect(opened).not.toContain('m2'); + } + + it('goes back to the list after Move to', async () => { + await click('stub move'); + await waitFor(() => expect(client.moveEmail).toHaveBeenCalledWith('m1', 'work', undefined)); + await expectBackInList(); + }); + + it('goes back to the list after Report spam', async () => { + await click('stub spam'); + await waitFor(() => expect(client.markAsSpam).toHaveBeenCalledWith('m1', undefined, false)); + await expectBackInList(); + }); + + it('goes back to the list after Not spam in Junk', async () => { + const junk = { junk: true }; + showFolder('junk', [row('m1', 30, junk), row('m2', 20, junk), row('m3', 10, junk)]); + await click('stub not spam'); + await waitFor(() => expect(client.undoSpam).toHaveBeenCalledWith('m1', 'inbox', undefined)); + await expectBackInList(); + }); + + it('goes back to the list after Remove from this folder', async () => { + showFolder('inbox', [row('m1', 30, { inbox: true, work: true }), row('m2', 20), row('m3', 10)]); + await click('stub remove from folder'); + await waitFor(() => expect(client.removeEmailsFromMailbox).toHaveBeenCalledWith(['m1'], 'inbox', undefined)); + await expectBackInList(); + }); + + it('opens the next message after Move to with the setting off', async () => { + useSettingsStore.setState({ returnToListAfterAction: false } as never); + await click('stub move'); + await waitFor(() => expect(selectedId()).toBe('m2')); + }); + + // The Unread filter drops a message once it is read; the store then finds + // the open message through the selection (#695). + it('still reports a message as spam that the list no longer holds', async () => { + const [m1, ...rest] = inbox(); + useEmailStore.setState({ emails: rest, selectedEmail: m1 } as never); + await click('stub spam'); + await waitFor(() => expect(client.markAsSpam).toHaveBeenCalledWith('m1', undefined, false)); + await waitFor(() => expect(selectedId()).toBeNull()); + expect(opened).not.toContain('m2'); + }); +}); + describe('The e shortcut in Mountain View', () => { beforeEach(() => { useSettingsStore.setState({ interfaceLayout: 'mountain-view' } as never); diff --git a/components/mail/mail-app.tsx b/components/mail/mail-app.tsx index ebeb203e8..3ab93b35b 100644 --- a/components/mail/mail-app.tsx +++ b/components/mail/mail-app.tsx @@ -2918,15 +2918,21 @@ export function MailApp({ linkSegments: routeSegments }: MailAppProps = {}) { clearSelection(); // only on success - a vetoed/no-op attempt keeps the selection }; - // Deleting or archiving the open message returns to the list (Gmail-style), - // not the next email, unless the user turned the setting off. Called once + // Taking the open message out of the folder (delete, archive, move, spam, + // not spam, remove from folder) returns to the list (Gmail-style), not the + // next email, unless the user turned the setting off. Called once // the action is confirmed and right before the store removes the row: with // nothing selected its remove-and-advance opens nothing, so the next message // is not loaded and marked read on the way. A Mountain View cursor is no - // open message and moves on to the next row. (#1458) + // open message and moves on to the next row. A message the list no longer + // holds (a quick filter dropped it) stays selected: the store finds it + // through the selection (#695), and with no row to go on from it opens + // nothing after it anyway. (#1458) const leaveIfOpen = (email: Email) => { - const open = useEmailStore.getState().selectedEmail; - if (!open || emailKeyFor(open) !== emailKeyFor(email) || (mvShell && cursorOnly)) return; + const { selectedEmail: open, emails: rows } = useEmailStore.getState(); + const key = emailKeyFor(email); + if (!open || emailKeyFor(open) !== key || (mvShell && cursorOnly)) return; + if (!rows.some((row) => emailKeyFor(row) === key)) return; if (useSettingsStore.getState().returnToListAfterAction) handleMobileBack(); }; @@ -3118,6 +3124,7 @@ export function MailApp({ linkSegments: routeSegments }: MailAppProps = {}) { const email = useEmailStore.getState().emails.find(e => (emailKey ? emailKeyFor(e) === emailKey : e.id === emailId)); const restore = email ? restoreBatchesFor([email], client) : null; const receipts: CrossAccountMoveReceipt[] = []; + if (email) leaveIfOpen(email); try { if (!(await moveToMailboxCrossAware(client, emailId, mailboxId, emailKey, receipts))) return; toastWithUndo( @@ -3150,6 +3157,7 @@ export function MailApp({ linkSegments: routeSegments }: MailAppProps = {}) { // Undo puts it back in its own folders, read state included, as every // other Undo does. const restore = restoreBatchesFor([emailToMark], client); + leaveIfOpen(emailToMark); try { if (!(await markAsSpam(client, emailToMark.id, emailKeyFor(emailToMark)))) return; toastWithUndo(t('email_viewer.spam.toast_success'), undoMoveAction(client, restore, undo)); @@ -3163,6 +3171,7 @@ export function MailApp({ linkSegments: routeSegments }: MailAppProps = {}) { if (!client || !emailToRestore) return; const restore = restoreBatchesFor([emailToRestore], client); + leaveIfOpen(emailToRestore); try { if (!(await undoSpam(client, emailToRestore.id, emailKeyFor(emailToRestore)))) return; toastWithUndo(t('email_viewer.spam.toast_not_spam_success'), undoMoveAction(client, restore, undo)); @@ -5613,10 +5622,12 @@ export function MailApp({ linkSegments: routeSegments }: MailAppProps = {}) { mailboxes={mailboxes} selectedMailbox={selectedMailbox} onMoveToMailbox={async (mailboxId) => { - if (selectedEmail) await handleMoveToMailbox(selectedEmail.id, mailboxId); + if (selectedEmail) await handleMoveToMailbox(selectedEmail.id, mailboxId, emailKeyFor(selectedEmail)); }} onRemoveFromFolder={openEmailCanLeaveFolder ? () => { - if (selectedEmail) void removeFromFolder([selectedEmail]); + if (!selectedEmail) return; + leaveIfOpen(selectedEmail); + void removeFromFolder([selectedEmail]); } : undefined} className={isMobile ? "flex-1" : undefined} /> diff --git a/locales/ar/common.json b/locales/ar/common.json index cd7a83f49..96ad8aefc 100644 --- a/locales/ar/common.json +++ b/locales/ar/common.json @@ -2016,8 +2016,8 @@ "unsupported": "الحساب الحالي لا يعلن عن دعم الإرسال المؤجل. لا يزال الإعداد محفوظًا للحسابات الأخرى." }, "return_to_list_after_action": { - "label": "العودة إلى القائمة بعد الحذف أو الأرشفة أو التمييز كغير مقروء", - "description": "بعد حذف الرسالة المفتوحة أو أرشفتها أو تمييزها كغير مقروءة، العودة إلى قائمة الرسائل بدلًا من فتح الرسالة التالية." + "label": "العودة إلى القائمة بعد الحذف أو الأرشفة أو النقل أو التمييز كغير مقروء", + "description": "بعد حذف الرسالة المفتوحة أو أرشفتها أو نقلها أو الإبلاغ عنها كبريد مزعج أو تمييزها كغير مقروءة، العودة إلى قائمة الرسائل بدلًا من فتح الرسالة التالية." }, "swipe_right_action": { "label": "إجراء السحب لليمين (الجوال)", diff --git a/locales/ca/common.json b/locales/ca/common.json index cc2935d6c..b61af665e 100644 --- a/locales/ca/common.json +++ b/locales/ca/common.json @@ -2016,8 +2016,8 @@ "unsupported": "El compte actual no indica compatibilitat amb l'enviament retardat. La configuració es continua desant per a altres comptes." }, "return_to_list_after_action": { - "label": "Torna a la llista després de suprimir, arxivar o marcar com a no llegit", - "description": "Després de suprimir, arxivar o marcar com a no llegit el missatge obert, torna a la llista de missatges en lloc d'obrir el següent." + "label": "Torna a la llista després de suprimir, arxivar, moure o marcar com a no llegit", + "description": "Després de suprimir, arxivar, moure, denunciar com a brossa o marcar com a no llegit el missatge obert, torna a la llista de missatges en lloc d'obrir el següent." }, "swipe_right_action": { "label": "Acció en lliscar a la dreta (mòbil)", diff --git a/locales/cs/common.json b/locales/cs/common.json index df1b8b335..a12b48d06 100644 --- a/locales/cs/common.json +++ b/locales/cs/common.json @@ -2013,8 +2013,8 @@ "unsupported": "Aktuální účet neoznamuje podporu odloženého odeslání. Nastavení zůstane uloženo pro jiné účty." }, "return_to_list_after_action": { - "label": "Návrat do seznamu po smazání, archivaci nebo označení jako nepřečtené", - "description": "Po smazání, archivaci nebo označení otevřené zprávy jako nepřečtené se vrátit do seznamu zpráv místo otevření následující zprávy." + "label": "Návrat do seznamu po smazání, archivaci, přesunutí nebo označení jako nepřečtené", + "description": "Po smazání, archivaci, přesunutí, nahlášení jako spam nebo označení otevřené zprávy jako nepřečtené se vrátit do seznamu zpráv místo otevření následující zprávy." }, "swipe_right_action": { "label": "Akce při přejetí doprava (mobil)", diff --git a/locales/da/common.json b/locales/da/common.json index 74d7cb70a..d46d60f9e 100644 --- a/locales/da/common.json +++ b/locales/da/common.json @@ -2016,8 +2016,8 @@ "unsupported": "Den aktuelle konto annoncerer ikke understøttelse af forsinket afsendelse. Indstillingen gemmes stadig for andre konti." }, "return_to_list_after_action": { - "label": "Vend tilbage til listen efter sletning, arkivering eller markering som ulæst", - "description": "Efter sletning, arkivering eller markering af den åbne besked som ulæst vendes der tilbage til beskedlisten i stedet for at åbne den næste besked." + "label": "Vend tilbage til listen efter sletning, arkivering, flytning eller markering som ulæst", + "description": "Efter sletning, arkivering, flytning, rapportering som spam eller markering af den åbne besked som ulæst vendes der tilbage til beskedlisten i stedet for at åbne den næste besked." }, "swipe_right_action": { "label": "Handling ved strygning til højre (mobil)", diff --git a/locales/de/common.json b/locales/de/common.json index c6de011bc..9a484997d 100644 --- a/locales/de/common.json +++ b/locales/de/common.json @@ -2013,8 +2013,8 @@ "unsupported": "Das aktuelle Konto meldet keine Unterstützung für verzögertes Senden. Die Einstellung bleibt für andere Konten gespeichert." }, "return_to_list_after_action": { - "label": "Nach Löschen, Archivieren oder Ungelesen-Markieren zur Liste zurückkehren", - "description": "Nach dem Löschen, Archivieren oder Als-ungelesen-Markieren der geöffneten E-Mail zurück zur Liste, statt die nächste E-Mail zu öffnen." + "label": "Nach Löschen, Archivieren, Verschieben oder Ungelesen-Markieren zur Liste zurückkehren", + "description": "Nach dem Löschen, Archivieren, Verschieben, Als-Spam-Melden oder Als-ungelesen-Markieren der geöffneten E-Mail zurück zur Liste, statt die nächste E-Mail zu öffnen." }, "swipe_right_action": { "label": "Aktion beim Wischen nach rechts (mobil)", diff --git a/locales/en/common.json b/locales/en/common.json index 1903f82c9..e30e2d5c8 100644 --- a/locales/en/common.json +++ b/locales/en/common.json @@ -2016,8 +2016,8 @@ "unsupported": "The current account does not advertise delayed-send support. The setting is still saved for other accounts." }, "return_to_list_after_action": { - "label": "Return to list after delete, archive or mark unread", - "description": "After deleting, archiving or marking the open message unread, go back to the message list instead of opening the next message." + "label": "Return to list after delete, archive, move or mark unread", + "description": "After deleting, archiving, moving, reporting as spam or marking the open message unread, go back to the message list instead of opening the next message." }, "swipe_right_action": { "label": "Swipe right action (mobile)", diff --git a/locales/es/common.json b/locales/es/common.json index c570c34eb..b910bc0d2 100644 --- a/locales/es/common.json +++ b/locales/es/common.json @@ -2013,8 +2013,8 @@ "unsupported": "La cuenta actual no anuncia compatibilidad con envío demorado. La opción seguirá guardada para otras cuentas." }, "return_to_list_after_action": { - "label": "Volver a la lista tras eliminar, archivar o marcar como no leído", - "description": "Después de eliminar, archivar o marcar como no leído el mensaje abierto, volver a la lista de mensajes en lugar de abrir el mensaje siguiente." + "label": "Volver a la lista tras eliminar, archivar, mover o marcar como no leído", + "description": "Después de eliminar, archivar, mover, reportar como spam o marcar como no leído el mensaje abierto, volver a la lista de mensajes en lugar de abrir el mensaje siguiente." }, "swipe_right_action": { "label": "Acción al deslizar a la derecha (móvil)", diff --git a/locales/et/common.json b/locales/et/common.json index 47cb5d1ec..4513dcc2d 100644 --- a/locales/et/common.json +++ b/locales/et/common.json @@ -2016,8 +2016,8 @@ "unsupported": "Praegune konto ei toeta viivitatud saatmist. Seade salvestatakse siiski teiste kontode jaoks." }, "return_to_list_after_action": { - "label": "Naase loendisse pärast kustutamist, arhiveerimist või lugemata märkimist", - "description": "Pärast avatud kirja kustutamist, arhiveerimist või lugemata märkimist naase kirjade loendisse, selle asemel et avada järgmine kiri." + "label": "Naase loendisse pärast kustutamist, arhiveerimist, liigutamist või lugemata märkimist", + "description": "Pärast avatud kirja kustutamist, arhiveerimist, liigutamist, rämpspostiks märkimist või lugemata märkimist naase kirjade loendisse, selle asemel et avada järgmine kiri." }, "swipe_right_action": { "label": "Paremale pühkimise toiming (mobiil)", diff --git a/locales/fa/common.json b/locales/fa/common.json index f305b0d4d..03c0d0667 100644 --- a/locales/fa/common.json +++ b/locales/fa/common.json @@ -2016,8 +2016,8 @@ "unsupported": "پشتیبانی نمی‌شود" }, "return_to_list_after_action": { - "label": "بازگشت به فهرست پس از حذف، بایگانی یا علامت‌گذاری به‌عنوان خوانده‌نشده", - "description": "پس از حذف، بایگانی یا علامت‌گذاری پیام باز به‌عنوان خوانده‌نشده، به‌جای باز کردن پیام بعدی به فهرست پیام‌ها بازگردید." + "label": "بازگشت به فهرست پس از حذف، بایگانی، انتقال یا علامت‌گذاری به‌عنوان خوانده‌نشده", + "description": "پس از حذف، بایگانی، انتقال، گزارش هرزنامه یا علامت‌گذاری پیام باز به‌عنوان خوانده‌نشده، به‌جای باز کردن پیام بعدی به فهرست پیام‌ها بازگردید." }, "swipe_right_action": { "label": "عملکرد کشیدن به راست (موبایل)", diff --git a/locales/fr/common.json b/locales/fr/common.json index a56453d8b..2f8d73ee6 100644 --- a/locales/fr/common.json +++ b/locales/fr/common.json @@ -2013,8 +2013,8 @@ "unsupported": "Le compte actuel n’annonce pas la prise en charge de l’envoi différé. Le réglage reste enregistré pour d’autres comptes." }, "return_to_list_after_action": { - "label": "Revenir à la liste après suppression, archivage ou marquage comme non lu", - "description": "Après avoir supprimé, archivé ou marqué comme non lu le message ouvert, revenir à la liste des messages au lieu d'ouvrir le message suivant." + "label": "Revenir à la liste après suppression, archivage, déplacement ou marquage comme non lu", + "description": "Après avoir supprimé, archivé, déplacé, signalé comme spam ou marqué comme non lu le message ouvert, revenir à la liste des messages au lieu d'ouvrir le message suivant." }, "swipe_right_action": { "label": "Action du balayage vers la droite (mobile)", diff --git a/locales/he/common.json b/locales/he/common.json index 98ffe93c8..0988e6910 100644 --- a/locales/he/common.json +++ b/locales/he/common.json @@ -1978,8 +1978,8 @@ "unsupported": "החשבון הנוכחי אינו פרסום תמיכה בשליחה מעוכבת. ההגדרה עדיין שמורה לחשבונות אחרים." }, "return_to_list_after_action": { - "label": "חזור לרשימה לאחר מחיקה, העברה לארכיון או סימון שלא נקראו", - "description": "לאחר מחיקה, העברה לארכיון או סימון ההודעה הפתוחה כלא קרויה, חזור לרשימת ההודעות במקום לפתוח את ההודעה הבאה." + "label": "חזור לרשימה לאחר מחיקה, העברה לארכיון, העברה לתיקייה או סימון שלא נקראו", + "description": "לאחר מחיקה, העברה לארכיון, העברה לתיקייה, דיווח כספאם או סימון ההודעה הפתוחה כלא קרויה, חזור לרשימת ההודעות במקום לפתוח את ההודעה הבאה." }, "swipe_right_action": { "label": "פעולת החלקה ימינה (נייד)", diff --git a/locales/hu/common.json b/locales/hu/common.json index 1c7d55266..12db95bfd 100644 --- a/locales/hu/common.json +++ b/locales/hu/common.json @@ -2016,8 +2016,8 @@ "unsupported": "A jelenlegi fiók nem támogatja a késleltetett küldést. A beállítás más fiókokhoz elmentésre kerül." }, "return_to_list_after_action": { - "label": "Visszatérés a listához törlés, archiválás vagy olvasatlanként jelölés után", - "description": "A megnyitott üzenet törlése, archiválása vagy olvasatlanként való megjelölése után visszatérés az üzenetlistához a következő üzenet megnyitása helyett." + "label": "Visszatérés a listához törlés, archiválás, áthelyezés vagy olvasatlanként jelölés után", + "description": "A megnyitott üzenet törlése, archiválása, áthelyezése, spamként jelentése vagy olvasatlanként való megjelölése után visszatérés az üzenetlistához a következő üzenet megnyitása helyett." }, "swipe_right_action": { "label": "Jobbra húzás művelete (mobil)", diff --git a/locales/it/common.json b/locales/it/common.json index 3cc91f5d9..446b82fe7 100644 --- a/locales/it/common.json +++ b/locales/it/common.json @@ -2013,8 +2013,8 @@ "unsupported": "L’account corrente non dichiara il supporto all’invio ritardato. L’impostazione resta salvata per altri account." }, "return_to_list_after_action": { - "label": "Torna all'elenco dopo l'eliminazione, l'archiviazione o il contrassegno come non letto", - "description": "Dopo aver eliminato, archiviato o segnato come non letto il messaggio aperto, torna all'elenco dei messaggi invece di aprire il messaggio successivo." + "label": "Torna all'elenco dopo l'eliminazione, l'archiviazione, lo spostamento o il contrassegno come non letto", + "description": "Dopo aver eliminato, archiviato, spostato, segnalato come spam o segnato come non letto il messaggio aperto, torna all'elenco dei messaggi invece di aprire il messaggio successivo." }, "swipe_right_action": { "label": "Azione per lo scorrimento a destra (mobile)", diff --git a/locales/ja/common.json b/locales/ja/common.json index ee22ea812..637a4fcc2 100644 --- a/locales/ja/common.json +++ b/locales/ja/common.json @@ -2013,8 +2013,8 @@ "unsupported": "現在のアカウントは遅延送信のサポートを通知していません。この設定は他のアカウント用に保存されます。" }, "return_to_list_after_action": { - "label": "削除、アーカイブ、または未読にした後に一覧へ戻る", - "description": "開いているメッセージを削除、アーカイブ、または未読にした後、次のメッセージを開かずにメッセージ一覧へ戻ります。" + "label": "削除、アーカイブ、移動、または未読にした後に一覧へ戻る", + "description": "開いているメッセージを削除、アーカイブ、移動、迷惑メールとして報告、または未読にした後、次のメッセージを開かずにメッセージ一覧へ戻ります。" }, "swipe_right_action": { "label": "右スワイプの操作(モバイル)", diff --git a/locales/ko/common.json b/locales/ko/common.json index a128a34da..d0cd27ff6 100644 --- a/locales/ko/common.json +++ b/locales/ko/common.json @@ -2013,8 +2013,8 @@ "unsupported": "현재 계정은 지연 보내기 지원을 알리지 않습니다. 설정은 다른 계정을 위해 계속 저장됩니다." }, "return_to_list_after_action": { - "label": "삭제, 보관 또는 읽지 않음으로 표시 후 목록으로 돌아가기", - "description": "열려 있는 메시지를 삭제하거나 보관하거나 읽지 않음으로 표시한 후 다음 메시지를 열지 않고 메시지 목록으로 돌아갑니다." + "label": "삭제, 보관, 이동 또는 읽지 않음으로 표시 후 목록으로 돌아가기", + "description": "열려 있는 메시지를 삭제하거나 보관하거나 이동하거나 스팸으로 신고하거나 읽지 않음으로 표시한 후 다음 메시지를 열지 않고 메시지 목록으로 돌아갑니다." }, "swipe_right_action": { "label": "오른쪽으로 스와이프 동작 (모바일)", diff --git a/locales/lv/common.json b/locales/lv/common.json index ca93d602d..b58366a1f 100644 --- a/locales/lv/common.json +++ b/locales/lv/common.json @@ -2013,8 +2013,8 @@ "unsupported": "Pašreizējais konts neziņo par aizturētas sūtīšanas atbalstu. Iestatījums joprojām tiks saglabāts citiem kontiem." }, "return_to_list_after_action": { - "label": "Atgriezties sarakstā pēc dzēšanas, arhivēšanas vai atzīmēšanas kā nelasītu", - "description": "Pēc atvērtā ziņojuma dzēšanas, arhivēšanas vai atzīmēšanas kā nelasīta atgriezieties ziņojumu sarakstā, nevis atveriet nākamo ziņojumu." + "label": "Atgriezties sarakstā pēc dzēšanas, arhivēšanas, pārvietošanas vai atzīmēšanas kā nelasītu", + "description": "Pēc atvērtā ziņojuma dzēšanas, arhivēšanas, pārvietošanas, atzīmēšanas kā mēstules vai atzīmēšanas kā nelasīta atgriezieties ziņojumu sarakstā, nevis atveriet nākamo ziņojumu." }, "swipe_right_action": { "label": "Darbība, velkot pa labi (mobilajā ierīcē)", diff --git a/locales/mn/common.json b/locales/mn/common.json index d01b784f0..9a8b94dc7 100644 --- a/locales/mn/common.json +++ b/locales/mn/common.json @@ -2016,8 +2016,8 @@ "unsupported": "Харин данс нь хойшлуулсан-илгээлтийн дэмжлэгийг сурталчилдаггүй. Тохиргоог бусад бүртгэлд хадгалсан хэвээр байна." }, "return_to_list_after_action": { - "label": "Устгах, архивлах эсвэл уншаагүй гэж тэмдэглэсний дараа жагсаалт руу буцах", - "description": "Нээлттэй мессежийг устгасан, архивласан эсвэл уншаагүй гэж тэмдэглэсний дараа дараагийн мессежийг нээхийн оронд мессежийн жагсаалт руу буцна уу." + "label": "Устгах, архивлах, шилжүүлэх эсвэл уншаагүй гэж тэмдэглэсний дараа жагсаалт руу буцах", + "description": "Нээлттэй мессежийг устгасан, архивласан, шилжүүлсэн, спам гэж мэдээлсэн эсвэл уншаагүй гэж тэмдэглэсний дараа дараагийн мессежийг нээхийн оронд мессежийн жагсаалт руу буцна уу." }, "swipe_right_action": { "label": "Баруун тийш шудрах үйлдэл (гар утас)", diff --git a/locales/nb/common.json b/locales/nb/common.json index d7bb1b8e7..0df5cb3bd 100644 --- a/locales/nb/common.json +++ b/locales/nb/common.json @@ -2016,8 +2016,8 @@ "unsupported": "Denne kontoen støtter ikke forsinket sending. Innstillingen lagres likevel for andre kontoer." }, "return_to_list_after_action": { - "label": "Gå tilbake til listen etter sletting, arkivering eller merking som ulest", - "description": "Gå tilbake til meldingslisten i stedet for å åpne neste melding etter at du har slettet eller arkivert den åpne meldingen eller merket den som ulest." + "label": "Gå tilbake til listen etter sletting, arkivering, flytting eller merking som ulest", + "description": "Gå tilbake til meldingslisten i stedet for å åpne neste melding etter at du har slettet, arkivert, flyttet eller rapportert den åpne meldingen som søppelpost eller merket den som ulest." }, "swipe_right_action": { "label": "Handling ved sveip mot høyre (mobil)", diff --git a/locales/nl/common.json b/locales/nl/common.json index f811bf99f..609f28101 100644 --- a/locales/nl/common.json +++ b/locales/nl/common.json @@ -2013,8 +2013,8 @@ "unsupported": "Het huidige account meldt geen ondersteuning voor vertraagd verzenden. De instelling blijft opgeslagen voor andere accounts." }, "return_to_list_after_action": { - "label": "Terug naar lijst na verwijderen, archiveren of markeren als ongelezen", - "description": "Na het verwijderen, archiveren of als ongelezen markeren van het geopende bericht terugkeren naar de berichtenlijst in plaats van het volgende bericht te openen." + "label": "Terug naar lijst na verwijderen, archiveren, verplaatsen of markeren als ongelezen", + "description": "Na het verwijderen, archiveren, verplaatsen, als spam melden of als ongelezen markeren van het geopende bericht terugkeren naar de berichtenlijst in plaats van het volgende bericht te openen." }, "swipe_right_action": { "label": "Actie bij naar rechts vegen (mobiel)", diff --git a/locales/pl/common.json b/locales/pl/common.json index d1e77598a..09942dce0 100644 --- a/locales/pl/common.json +++ b/locales/pl/common.json @@ -2013,8 +2013,8 @@ "unsupported": "Bieżące konto nie zgłasza obsługi opóźnionej wysyłki. Ustawienie pozostanie zapisane dla innych kont." }, "return_to_list_after_action": { - "label": "Powrót do listy po usunięciu, zarchiwizowaniu lub oznaczeniu jako nieprzeczytane", - "description": "Po usunięciu, zarchiwizowaniu lub oznaczeniu otwartej wiadomości jako nieprzeczytanej wróć do listy wiadomości zamiast otwierać następną." + "label": "Powrót do listy po usunięciu, zarchiwizowaniu, przeniesieniu lub oznaczeniu jako nieprzeczytane", + "description": "Po usunięciu, zarchiwizowaniu, przeniesieniu, zgłoszeniu jako spam lub oznaczeniu otwartej wiadomości jako nieprzeczytanej wróć do listy wiadomości zamiast otwierać następną." }, "swipe_right_action": { "label": "Akcja przy przesunięciu w prawo (mobilne)", diff --git a/locales/pt/common.json b/locales/pt/common.json index aec0386eb..e160a52d4 100644 --- a/locales/pt/common.json +++ b/locales/pt/common.json @@ -2013,8 +2013,8 @@ "unsupported": "A conta atual não anuncia suporte a envio atrasado. A configuração continuará salva para outras contas." }, "return_to_list_after_action": { - "label": "Voltar à lista após eliminar, arquivar ou marcar como não lido", - "description": "Depois de eliminar, arquivar ou marcar como não lida a mensagem aberta, voltar à lista de mensagens em vez de abrir a mensagem seguinte." + "label": "Voltar à lista após eliminar, arquivar, mover ou marcar como não lido", + "description": "Depois de eliminar, arquivar, mover, reportar como spam ou marcar como não lida a mensagem aberta, voltar à lista de mensagens em vez de abrir a mensagem seguinte." }, "swipe_right_action": { "label": "Ação ao deslizar para a direita (celular)", diff --git a/locales/ro/common.json b/locales/ro/common.json index eec9f2b87..1abc36a8e 100644 --- a/locales/ro/common.json +++ b/locales/ro/common.json @@ -2016,8 +2016,8 @@ "unsupported": "Contul curent nu indică faptul că acceptă trimiterea amânată. Setarea este totuși salvată pentru alte conturi." }, "return_to_list_after_action": { - "label": "Revenire la listă după ștergere, arhivare sau marcare ca necitit", - "description": "După ștergerea, arhivarea sau marcarea mesajului deschis ca necitit, reveniți la lista de mesaje în loc să deschideți mesajul următor." + "label": "Revenire la listă după ștergere, arhivare, mutare sau marcare ca necitit", + "description": "După ștergerea, arhivarea, mutarea, raportarea ca spam sau marcarea mesajului deschis ca necitit, reveniți la lista de mesaje în loc să deschideți mesajul următor." }, "swipe_right_action": { "label": "Acțiune la glisare spre dreapta (mobil)", diff --git a/locales/ru/common.json b/locales/ru/common.json index cce716aeb..cd07676b6 100644 --- a/locales/ru/common.json +++ b/locales/ru/common.json @@ -2013,8 +2013,8 @@ "unsupported": "Текущая учетная запись не заявляет поддержку отложенной отправки. Настройка сохранится для других учетных записей." }, "return_to_list_after_action": { - "label": "Возврат к списку после удаления, архивации или отметки как непрочитанного", - "description": "После удаления, архивации или отметки открытого письма как непрочитанного возвращаться к списку писем вместо открытия следующего." + "label": "Возврат к списку после удаления, архивации, перемещения или отметки как непрочитанного", + "description": "После удаления, архивации, перемещения, отметки как спама или отметки открытого письма как непрочитанного возвращаться к списку писем вместо открытия следующего." }, "swipe_right_action": { "label": "Действие при свайпе вправо (мобильные)", diff --git a/locales/sk/common.json b/locales/sk/common.json index d2a6156ae..3bfd4da76 100644 --- a/locales/sk/common.json +++ b/locales/sk/common.json @@ -2016,8 +2016,8 @@ "unsupported": "Aktuálny účet neoznamuje podporu oneskoreného odoslania." }, "return_to_list_after_action": { - "label": "Vrátiť sa na zoznam po odstránení, archivovaní alebo označení ako neprečítané", - "description": "Po odstránení, archivovaní alebo označení otvorenej správy ako neprečítanej sa vrátiť na zoznam správ." + "label": "Vrátiť sa na zoznam po odstránení, archivovaní, presunutí alebo označení ako neprečítané", + "description": "Po odstránení, archivovaní, presunutí, nahlásení ako spam alebo označení otvorenej správy ako neprečítanej sa vrátiť na zoznam správ." }, "swipe_right_action": { "label": "Akcia pri potiahnutí doprava (mobil)", diff --git a/locales/th/common.json b/locales/th/common.json index 26efbd7f8..d70543745 100644 --- a/locales/th/common.json +++ b/locales/th/common.json @@ -4453,8 +4453,8 @@ "unsupported": "บัญชีปัจจุบันไม่รองรับการส่งแบบหน่วงเวลา การตั้งค่านี้จะยังคงถูกบันทึกไว้สำหรับบัญชีอื่น" }, "return_to_list_after_action": { - "label": "กลับไปยังรายการหลังจากลบ เก็บถาวร หรือทำเครื่องหมายว่ายังไม่ได้อ่าน", - "description": "หลังจากลบ เก็บถาวร หรือทำเครื่องหมายข้อความที่เปิดอยู่ว่ายังไม่ได้อ่าน ให้กลับไปยังรายการข้อความแทนการเปิดข้อความถัดไป" + "label": "กลับไปยังรายการหลังจากลบ เก็บถาวร ย้าย หรือทำเครื่องหมายว่ายังไม่ได้อ่าน", + "description": "หลังจากลบ เก็บถาวร ย้าย รายงานเป็นจดหมายขยะ หรือทำเครื่องหมายข้อความที่เปิดอยู่ว่ายังไม่ได้อ่าน ให้กลับไปยังรายการข้อความแทนการเปิดข้อความถัดไป" }, "swipe_right_action": { "label": "การดำเนินการเมื่อปัดไปทางขวา (มือถือ)", diff --git a/locales/tr/common.json b/locales/tr/common.json index df203d414..752227bec 100644 --- a/locales/tr/common.json +++ b/locales/tr/common.json @@ -2013,8 +2013,8 @@ "unsupported": "Geçerli hesap gecikmeli gönderim desteği bildirmiyor. Ayar diğer hesaplar için kaydedilmeye devam eder." }, "return_to_list_after_action": { - "label": "Silme, arşivleme veya okunmadı olarak işaretlemeden sonra listeye dön", - "description": "Açık iletiyi sildikten, arşivledikten veya okunmadı olarak işaretledikten sonra, sonraki iletiyi açmak yerine ileti listesine dön." + "label": "Silme, arşivleme, taşıma veya okunmadı olarak işaretlemeden sonra listeye dön", + "description": "Açık iletiyi sildikten, arşivledikten, taşıdıktan, spam olarak bildirdikten veya okunmadı olarak işaretledikten sonra, sonraki iletiyi açmak yerine ileti listesine dön." }, "swipe_right_action": { "label": "Sağa kaydırma eylemi (mobil)", diff --git a/locales/uk/common.json b/locales/uk/common.json index 6190fe1a6..cc6369150 100644 --- a/locales/uk/common.json +++ b/locales/uk/common.json @@ -2013,8 +2013,8 @@ "unsupported": "Поточний обліковий запис не повідомляє про підтримку відкладеного надсилання. Налаштування залишиться збереженим для інших облікових записів." }, "return_to_list_after_action": { - "label": "Повернення до списку після видалення, архівування або позначення як непрочитане", - "description": "Після видалення, архівування або позначення відкритого листа як непрочитаного повертатися до списку листів замість відкриття наступного." + "label": "Повернення до списку після видалення, архівування, переміщення або позначення як непрочитане", + "description": "Після видалення, архівування, переміщення, позначення як спаму або позначення відкритого листа як непрочитаного повертатися до списку листів замість відкриття наступного." }, "swipe_right_action": { "label": "Дія при свайпі вправо (мобільні)", diff --git a/locales/zh-TW/common.json b/locales/zh-TW/common.json index 3450c5e47..9e1232a72 100644 --- a/locales/zh-TW/common.json +++ b/locales/zh-TW/common.json @@ -2016,8 +2016,8 @@ "unsupported": "目前帳號未宣告支援延遲傳送。該設定仍會為其他帳號儲存。" }, "return_to_list_after_action": { - "label": "刪除、封存或標示為未讀後回到清單", - "description": "刪除、封存開啟的郵件或標示為未讀後,回到郵件清單,而不是開啟下一封郵件。" + "label": "刪除、封存、移動或標示為未讀後回到清單", + "description": "刪除、封存、移動開啟的郵件、回報為垃圾郵件或標示為未讀後,回到郵件清單,而不是開啟下一封郵件。" }, "swipe_right_action": { "label": "向右滑動動作(行動裝置)", diff --git a/locales/zh/common.json b/locales/zh/common.json index 9c2d6b687..260c4c941 100644 --- a/locales/zh/common.json +++ b/locales/zh/common.json @@ -2013,8 +2013,8 @@ "unsupported": "当前账户未声明支持延迟发送。该设置仍会为其他账户保存。" }, "return_to_list_after_action": { - "label": "删除、归档或标记为未读后返回列表", - "description": "删除、归档打开的邮件或将其标记为未读后,返回邮件列表而不是打开下一封邮件。" + "label": "删除、归档、移动或标记为未读后返回列表", + "description": "删除、归档、移动打开的邮件、举报为垃圾邮件或将其标记为未读后,返回邮件列表而不是打开下一封邮件。" }, "swipe_right_action": { "label": "右滑操作(移动端)", diff --git a/stores/settings-store.ts b/stores/settings-store.ts index 5976b67fb..66dc7edcf 100644 --- a/stores/settings-store.ts +++ b/stores/settings-store.ts @@ -545,7 +545,7 @@ interface SettingsState extends AccessibilitySettings { deleteAction: DeleteAction; permanentlyDeleteJunk: boolean; // Permanently delete emails from junk/spam instead of moving to trash confirmBulkDelete: boolean; // Ask before moving several selected emails to Trash (permanent deletes always ask) - returnToListAfterAction: boolean; // After delete / archive / mark-unread in an open message, return to the list instead of opening the next message + returnToListAfterAction: boolean; // After delete / archive / move / spam / mark-unread in an open message, return to the list instead of opening the next message clearSearchOnFolderChange: boolean; // Reset the search query + advanced filters when switching folders, instead of re-running the search in the newly selected folder (#553 keeps it applied when this is off) showPreview: boolean; showVerificationCodes: boolean; // Offer the one-time code of a sign-in mail as a copy chip in the list and the reader