mirror of
https://github.com/bulwarkmail/webmail.git
synced 2026-11-05 08:16:22 +00:00
fix: run the send checks before the schedule dialog and say Schedule anyway there
The composer test for the schedule arrow now waits for the dialog, since the send checks run before it opens.
This commit is contained in:
@@ -1,4 +1,4 @@
|
||||
import { act, createEvent, fireEvent, render, screen } from '@testing-library/react';
|
||||
import { act, createEvent, fireEvent, render, screen, within } from '@testing-library/react';
|
||||
import { afterEach, beforeEach, describe, expect, it, vi } from 'vitest';
|
||||
import React from 'react';
|
||||
import { EmailComposer } from '../email-composer';
|
||||
@@ -332,7 +332,7 @@ describe('composer-send-menu', () => {
|
||||
});
|
||||
|
||||
// compose-23: a menu with "Schedule send" as its only item.
|
||||
it('opens the schedule dialog straight from the arrow when it is the only entry', () => {
|
||||
it('opens the schedule dialog straight from the arrow when it is the only entry', async () => {
|
||||
useAuthStore.setState({
|
||||
client: { hasDelayedSend: () => true, getMaxDelayedSend: () => 30 * 86400, createDraft: vi.fn() } as never,
|
||||
});
|
||||
@@ -343,7 +343,24 @@ describe('composer-send-menu', () => {
|
||||
fireEvent.click(arrow);
|
||||
|
||||
expect(screen.queryByRole('menuitem', { name: /schedule_send/ })).toBeNull();
|
||||
expect(screen.getByRole('dialog')).toHaveTextContent('schedule_send_description');
|
||||
// After the send checks, which found nothing here (compose-p2-14).
|
||||
expect(await screen.findByRole('dialog')).toHaveTextContent('schedule_send_description');
|
||||
});
|
||||
|
||||
// compose-p2-14: the checks opened on top of the picked time and said
|
||||
// "Send anyway" though nothing was sent then.
|
||||
it('runs the send checks before the schedule dialog, and says "Schedule anyway"', async () => {
|
||||
useAuthStore.setState({
|
||||
client: { hasDelayedSend: () => true, getMaxDelayedSend: () => 30 * 86400, createDraft: vi.fn() } as never,
|
||||
});
|
||||
render(<EmailComposer initialData={{ ...DRAFT, subject: '' }} onClose={vi.fn()} />);
|
||||
|
||||
fireEvent.click(screen.getAllByRole('button', { name: 'schedule_send' })[0]);
|
||||
const warnings = await screen.findByRole('alertdialog');
|
||||
expect(screen.queryByText('schedule_send_description')).toBeNull();
|
||||
fireEvent.click(within(warnings).getByRole('button', { name: 'schedule_anyway' }));
|
||||
|
||||
expect(await screen.findByText('schedule_send_description')).toBeInTheDocument();
|
||||
});
|
||||
|
||||
it('keeps a plain Send button without plugin entries or scheduled send', () => {
|
||||
|
||||
@@ -1259,7 +1259,9 @@ export function EmailComposer({
|
||||
const [previewAttachment, setPreviewAttachment] = useState<ComposerAttachment | null>(null);
|
||||
// What the checks before sending found (no subject, no text, placeholders,
|
||||
// a missing attachment, open proofreading issues), asked about in one dialog.
|
||||
const [sendWarnings, setSendWarnings] = useState<{ items: SendWarning[]; delayedUntil?: string } | null>(null);
|
||||
// `schedule`: asked before the schedule dialog, which opens on "Schedule anyway".
|
||||
const [sendWarnings, setSendWarnings] = useState<{ items: SendWarning[]; delayedUntil?: string; schedule?: boolean } | null>(null);
|
||||
const checkThenScheduleRef = useRef<() => void>(() => {});
|
||||
// Open proofreading issues, once a checker asked to warn about them.
|
||||
const proofreadingConfirmedRef = useRef(false);
|
||||
const [showScheduleDialog, setShowScheduleDialog] = useState(false);
|
||||
@@ -1545,9 +1547,11 @@ export function EmailComposer({
|
||||
// eslint-disable-next-line react-hooks/exhaustive-deps
|
||||
}, [signatureIdentity?.id, signatureContent, signatureSeparatorEnabled, signaturePosition, mode, plainTextMode, pluginSignatureRevision, autoSignatureEnabled]);
|
||||
|
||||
// The send checks run first, so they don't open on top of the picked time
|
||||
// saying "Send anyway" when nothing is sent now (compose-p2-14).
|
||||
const openScheduleDialog = useCallback(() => {
|
||||
setShowScheduleDialog(true);
|
||||
closeSendMenu();
|
||||
checkThenScheduleRef.current();
|
||||
}, [closeSendMenu]);
|
||||
|
||||
// `autoSelectReplyIdentity` fused two behaviours: matching one of the user's
|
||||
@@ -3836,10 +3840,12 @@ export function EmailComposer({
|
||||
else editor.commands.focus();
|
||||
};
|
||||
|
||||
const handleSend = async ({ warningsConfirmed = false, delayedUntil }: {
|
||||
const handleSend = async ({ warningsConfirmed = false, delayedUntil, checkOnly = false }: {
|
||||
/** "Send anyway" in the warnings dialog: don't check those again. */
|
||||
warningsConfirmed?: boolean;
|
||||
delayedUntil?: string;
|
||||
/** Only the checks, then the schedule dialog instead of a send. */
|
||||
checkOnly?: boolean;
|
||||
} = {}) => {
|
||||
if (isSendingRef.current) return;
|
||||
|
||||
@@ -3986,10 +3992,14 @@ export function EmailComposer({
|
||||
}
|
||||
|
||||
if (warnings.length > 0) {
|
||||
setSendWarnings({ items: warnings, delayedUntil });
|
||||
setSendWarnings({ items: warnings, delayedUntil, ...(checkOnly ? { schedule: true } : {}) });
|
||||
return;
|
||||
}
|
||||
}
|
||||
if (checkOnly) {
|
||||
setShowScheduleDialog(true);
|
||||
return;
|
||||
}
|
||||
|
||||
// Checks other features register (lib/outgoing/send-pipeline.ts), such
|
||||
// as the external-recipient confirm. They may ask the user, so a second
|
||||
@@ -4474,6 +4484,8 @@ export function EmailComposer({
|
||||
};
|
||||
|
||||
|
||||
checkThenScheduleRef.current = () => void handleSend({ checkOnly: true });
|
||||
|
||||
// A host can hand a follow-up to requestCloseRef - "close this session, then
|
||||
// do that". It runs only once the composer really closes, never when the
|
||||
// guard dialog is cancelled, and never before onClose has had its say.
|
||||
@@ -6143,7 +6155,8 @@ export function EmailComposer({
|
||||
<ScheduleSendDialog
|
||||
isOpen={showScheduleDialog}
|
||||
onClose={() => setShowScheduleDialog(false)}
|
||||
onSchedule={(delayedUntil) => handleSend({ delayedUntil })}
|
||||
// Checked before the dialog opened (openScheduleDialog).
|
||||
onSchedule={(delayedUntil) => handleSend({ delayedUntil, warningsConfirmed: true })}
|
||||
supported={!!composerClient?.hasDelayedSend()}
|
||||
maxDelayedSend={composerClient?.getMaxDelayedSend() ?? 0}
|
||||
disabled={!canSend || isSending || isSavingAndClosing}
|
||||
@@ -6154,6 +6167,7 @@ export function EmailComposer({
|
||||
|
||||
<SendWarningsDialog
|
||||
warnings={sendWarnings?.items ?? null}
|
||||
scheduling={sendWarnings?.schedule === true}
|
||||
onBack={() => {
|
||||
const first = sendWarnings?.items[0];
|
||||
setSendWarnings(null);
|
||||
@@ -6171,7 +6185,7 @@ export function EmailComposer({
|
||||
}}
|
||||
onSendAnyway={(dontAskAgain) => {
|
||||
if (!sendWarnings) return;
|
||||
const { items, delayedUntil } = sendWarnings;
|
||||
const { items, delayedUntil, schedule } = sendWarnings;
|
||||
for (const warning of items) {
|
||||
if (warning.kind === 'subject') {
|
||||
emptySubjectConfirmedRef.current = true;
|
||||
@@ -6186,7 +6200,8 @@ export function EmailComposer({
|
||||
}
|
||||
}
|
||||
setSendWarnings(null);
|
||||
handleSend({ warningsConfirmed: true, delayedUntil });
|
||||
if (schedule) setShowScheduleDialog(true);
|
||||
else handleSend({ warningsConfirmed: true, delayedUntil });
|
||||
}}
|
||||
/>
|
||||
|
||||
|
||||
@@ -20,6 +20,8 @@ interface SendWarningsDialogProps {
|
||||
onBack: () => void;
|
||||
/** "Send anyway". `dontAskAgain`: the box under a single warning that has a setting. */
|
||||
onSendAnyway: (dontAskAgain: boolean) => void;
|
||||
/** Asked before Schedule send: the button says "Schedule anyway". */
|
||||
scheduling?: boolean;
|
||||
}
|
||||
|
||||
/** The warnings that can be switched off in Settings (subject and placeholders). */
|
||||
@@ -30,7 +32,7 @@ const HAS_SETTING = new Set<SendWarning["kind"]>(["subject", "placeholders"]);
|
||||
* own title and text, several are listed in one dialog with one "Send anyway"
|
||||
* (two dialogs in a row asked about each in turn).
|
||||
*/
|
||||
export function SendWarningsDialog({ warnings, onBack, onSendAnyway }: SendWarningsDialogProps) {
|
||||
export function SendWarningsDialog({ warnings, onBack, onSendAnyway, scheduling = false }: SendWarningsDialogProps) {
|
||||
const t = useTranslations("email_composer");
|
||||
const tSend = useTranslations("compose_send");
|
||||
const tProofreading = useTranslations("proofreading");
|
||||
@@ -89,7 +91,7 @@ export function SendWarningsDialog({ warnings, onBack, onSendAnyway }: SendWarni
|
||||
backLabel = tProofreading("send_warning.review");
|
||||
sendLabel = tProofreading("send_warning.send");
|
||||
} else {
|
||||
title = tSend("warnings_title");
|
||||
title = tSend(scheduling ? "schedule_warnings_title" : "warnings_title");
|
||||
body = (
|
||||
<ul className="mt-3 space-y-2 text-sm text-foreground" data-testid="send-warnings-list">
|
||||
{items.map((w) => (
|
||||
@@ -113,6 +115,9 @@ export function SendWarningsDialog({ warnings, onBack, onSendAnyway }: SendWarni
|
||||
);
|
||||
}
|
||||
|
||||
// Nothing goes out now: the message is scheduled (compose-p2-14).
|
||||
if (scheduling) sendLabel = tSend("schedule_anyway");
|
||||
|
||||
return (
|
||||
<Dialog
|
||||
isOpen={items.length > 0}
|
||||
|
||||
@@ -1112,7 +1112,7 @@
|
||||
"unfinished": []
|
||||
},
|
||||
"schedule_send": "جدولة الإرسال",
|
||||
"schedule_send_description": "اختر متى يجب على الخادم إرسال هذه الرسالة.",
|
||||
"schedule_send_description": "اختر متى يتم إرسالها.",
|
||||
"schedule_preset": {
|
||||
"this_morning": "هذا الصباح",
|
||||
"this_afternoon": "بعد ظهر اليوم",
|
||||
@@ -4057,6 +4057,8 @@
|
||||
"sending": "جارٍ الإرسال…",
|
||||
"sent": "تم الإرسال",
|
||||
"view": "عرض",
|
||||
"schedule_anyway": "الجدولة على أي حال",
|
||||
"schedule_warnings_title": "هل تريد جدولة هذه الرسالة على أي حال؟",
|
||||
"picker_button": "إضافة من جهات الاتصال",
|
||||
"picker_title": "إضافة مستلمين",
|
||||
"tab_contacts": "جهات الاتصال",
|
||||
|
||||
@@ -1112,7 +1112,7 @@
|
||||
"unfinished": []
|
||||
},
|
||||
"schedule_send": "Programa l'enviament",
|
||||
"schedule_send_description": "Trieu quan ha d'alliberar el servidor aquest missatge.",
|
||||
"schedule_send_description": "Tria quan s'ha d'enviar.",
|
||||
"schedule_preset": {
|
||||
"this_morning": "Aquest matí",
|
||||
"this_afternoon": "Aquesta tarda",
|
||||
@@ -4057,6 +4057,8 @@
|
||||
"sending": "S'està enviant…",
|
||||
"sent": "Enviat",
|
||||
"view": "Mostra",
|
||||
"schedule_anyway": "Programa igualment",
|
||||
"schedule_warnings_title": "Vols programar aquest missatge igualment?",
|
||||
"picker_button": "Afegeix des dels contactes",
|
||||
"picker_title": "Afegeix destinataris",
|
||||
"tab_contacts": "Contactes",
|
||||
|
||||
@@ -1112,7 +1112,7 @@
|
||||
"link_url_prompt": "Zadejte URL",
|
||||
"sending": "Odesílání...",
|
||||
"schedule_send": "Naplánovat odeslání",
|
||||
"schedule_send_description": "Vyberte, kdy má server tuto zprávu odeslat.",
|
||||
"schedule_send_description": "Vyberte, kdy se má odeslat.",
|
||||
"schedule_preset": {
|
||||
"this_morning": "Dnes ráno",
|
||||
"this_afternoon": "Dnes odpoledne",
|
||||
@@ -4057,6 +4057,8 @@
|
||||
"sending": "Odesílání…",
|
||||
"sent": "Odesláno",
|
||||
"view": "Zobrazit",
|
||||
"schedule_anyway": "Přesto naplánovat",
|
||||
"schedule_warnings_title": "Přesto tuto zprávu naplánovat?",
|
||||
"picker_button": "Přidat z kontaktů",
|
||||
"picker_title": "Přidat příjemce",
|
||||
"tab_contacts": "Kontakty",
|
||||
|
||||
@@ -1112,7 +1112,7 @@
|
||||
},
|
||||
"link_url_prompt": "Indtast URL'en",
|
||||
"schedule_send": "Planlæg afsendelse",
|
||||
"schedule_send_description": "Vælg hvornår serveren skal frigive denne besked.",
|
||||
"schedule_send_description": "Vælg hvornår den skal sendes.",
|
||||
"schedule_preset": {
|
||||
"this_morning": "I dag formiddag",
|
||||
"this_afternoon": "I eftermiddag",
|
||||
@@ -4057,6 +4057,8 @@
|
||||
"sending": "Sender…",
|
||||
"sent": "Sendt",
|
||||
"view": "Vis",
|
||||
"schedule_anyway": "Planlæg alligevel",
|
||||
"schedule_warnings_title": "Planlæg denne besked alligevel?",
|
||||
"picker_button": "Tilføj fra kontakter",
|
||||
"picker_title": "Tilføj modtagere",
|
||||
"tab_contacts": "Kontakter",
|
||||
|
||||
@@ -1112,7 +1112,7 @@
|
||||
"link_url_prompt": "URL eingeben",
|
||||
"sending": "Wird gesendet...",
|
||||
"schedule_send": "Senden planen",
|
||||
"schedule_send_description": "Wählen Sie, wann der Server diese Nachricht freigeben soll.",
|
||||
"schedule_send_description": "Wählen Sie, wann gesendet werden soll.",
|
||||
"schedule_preset": {
|
||||
"this_morning": "Heute früh",
|
||||
"this_afternoon": "Heute Nachmittag",
|
||||
@@ -4057,6 +4057,8 @@
|
||||
"sending": "Wird gesendet…",
|
||||
"sent": "Gesendet",
|
||||
"view": "Anzeigen",
|
||||
"schedule_anyway": "Trotzdem planen",
|
||||
"schedule_warnings_title": "Diese Nachricht trotzdem planen?",
|
||||
"picker_button": "Aus Kontakten hinzufügen",
|
||||
"picker_title": "Empfänger hinzufügen",
|
||||
"tab_contacts": "Kontakte",
|
||||
|
||||
@@ -1114,7 +1114,7 @@
|
||||
"unfinished": ["TODO", "TBD", "TBA", "TBC", "FIXME", "XXX"]
|
||||
},
|
||||
"schedule_send": "Schedule send",
|
||||
"schedule_send_description": "Choose when the server should release this message.",
|
||||
"schedule_send_description": "Pick when to send it.",
|
||||
"schedule_preset": {
|
||||
"this_morning": "This morning",
|
||||
"this_afternoon": "This afternoon",
|
||||
@@ -4057,6 +4057,8 @@
|
||||
"sending": "Sending…",
|
||||
"sent": "Sent",
|
||||
"view": "View",
|
||||
"schedule_anyway": "Schedule anyway",
|
||||
"schedule_warnings_title": "Schedule this message anyway?",
|
||||
"picker_button": "Add from contacts",
|
||||
"picker_title": "Add recipients",
|
||||
"tab_contacts": "Contacts",
|
||||
|
||||
@@ -1112,7 +1112,7 @@
|
||||
"link_url_prompt": "Introduce la URL",
|
||||
"sending": "Enviando...",
|
||||
"schedule_send": "Programar envío",
|
||||
"schedule_send_description": "Elige cuándo debe liberar el servidor este mensaje.",
|
||||
"schedule_send_description": "Elige cuándo enviarlo.",
|
||||
"schedule_preset": {
|
||||
"this_morning": "Esta mañana",
|
||||
"this_afternoon": "Esta tarde",
|
||||
@@ -4057,6 +4057,8 @@
|
||||
"sending": "Enviando…",
|
||||
"sent": "Enviado",
|
||||
"view": "Ver",
|
||||
"schedule_anyway": "Programar de todos modos",
|
||||
"schedule_warnings_title": "¿Programar este mensaje de todos modos?",
|
||||
"picker_button": "Añadir desde contactos",
|
||||
"picker_title": "Añadir destinatarios",
|
||||
"tab_contacts": "Contactos",
|
||||
|
||||
@@ -1112,7 +1112,7 @@
|
||||
"unfinished": []
|
||||
},
|
||||
"schedule_send": "Ajasta saatmine",
|
||||
"schedule_send_description": "Vali, millal server peaks selle sõnumi välja saatma.",
|
||||
"schedule_send_description": "Vali, millal see saata.",
|
||||
"schedule_preset": {
|
||||
"this_morning": "Täna hommikul",
|
||||
"this_afternoon": "Täna pärastlõunal",
|
||||
@@ -4057,6 +4057,8 @@
|
||||
"sending": "Saatmine…",
|
||||
"sent": "Saadetud",
|
||||
"view": "Vaata",
|
||||
"schedule_anyway": "Ajasta ikkagi",
|
||||
"schedule_warnings_title": "Kas ajastada see kiri ikkagi?",
|
||||
"picker_button": "Lisa kontaktidest",
|
||||
"picker_title": "Lisa saajaid",
|
||||
"tab_contacts": "Kontaktid",
|
||||
|
||||
@@ -1112,7 +1112,7 @@
|
||||
"unfinished": []
|
||||
},
|
||||
"schedule_send": "زمانبندی ارسال",
|
||||
"schedule_send_description": "زمان انتشار پیام توسط سرور را انتخاب کنید.",
|
||||
"schedule_send_description": "زمان ارسال را انتخاب کنید.",
|
||||
"schedule_preset": {
|
||||
"this_morning": "امروز صبح",
|
||||
"this_afternoon": "امروز بعدازظهر",
|
||||
@@ -4057,6 +4057,8 @@
|
||||
"sending": "در حال ارسال…",
|
||||
"sent": "ارسال شد",
|
||||
"view": "مشاهده",
|
||||
"schedule_anyway": "زمانبندی به هر حال",
|
||||
"schedule_warnings_title": "این پیام به هر حال زمانبندی شود؟",
|
||||
"picker_button": "افزودن از مخاطبین",
|
||||
"picker_title": "افزودن گیرندگان",
|
||||
"tab_contacts": "مخاطبین",
|
||||
|
||||
@@ -1112,7 +1112,7 @@
|
||||
"link_url_prompt": "Saisissez l'URL",
|
||||
"sending": "Envoi...",
|
||||
"schedule_send": "Planifier l’envoi",
|
||||
"schedule_send_description": "Choisissez quand le serveur doit libérer ce message.",
|
||||
"schedule_send_description": "Choisissez quand l’envoyer.",
|
||||
"schedule_preset": {
|
||||
"this_morning": "Ce matin",
|
||||
"this_afternoon": "Cet après-midi",
|
||||
@@ -4057,6 +4057,8 @@
|
||||
"sending": "Envoi…",
|
||||
"sent": "Envoyé",
|
||||
"view": "Afficher",
|
||||
"schedule_anyway": "Planifier quand même",
|
||||
"schedule_warnings_title": "Planifier ce message quand même ?",
|
||||
"picker_button": "Ajouter depuis les contacts",
|
||||
"picker_title": "Ajouter des destinataires",
|
||||
"tab_contacts": "Contacts",
|
||||
|
||||
@@ -1055,7 +1055,7 @@
|
||||
"unfinished": []
|
||||
},
|
||||
"schedule_send": "תזמן שליחה",
|
||||
"schedule_send_description": "בחר מתי השרת צריך לשחרר הודעה זו.",
|
||||
"schedule_send_description": "בחר מתי לשלוח אותה.",
|
||||
"schedule_preset": {
|
||||
"this_morning": "הבוקר",
|
||||
"this_afternoon": "היום אחר הצהריים",
|
||||
@@ -3950,6 +3950,8 @@
|
||||
"sending": "שולח…",
|
||||
"sent": "נשלח",
|
||||
"view": "הצג",
|
||||
"schedule_anyway": "תזמן בכל זאת",
|
||||
"schedule_warnings_title": "לתזמן את ההודעה בכל זאת?",
|
||||
"picker_button": "הוסף מאנשי הקשר",
|
||||
"picker_title": "הוספת נמענים",
|
||||
"tab_contacts": "אנשי קשר",
|
||||
|
||||
@@ -1112,7 +1112,7 @@
|
||||
"unfinished": []
|
||||
},
|
||||
"schedule_send": "Késleltetett küldés",
|
||||
"schedule_send_description": "Válaszd ki, mikor küldje el a szerver az üzenetet.",
|
||||
"schedule_send_description": "Válaszd ki, mikor menjen el.",
|
||||
"schedule_preset": {
|
||||
"this_morning": "Ma reggel",
|
||||
"this_afternoon": "Ma délután",
|
||||
@@ -4057,6 +4057,8 @@
|
||||
"sending": "Küldés…",
|
||||
"sent": "Elküldve",
|
||||
"view": "Megtekintés",
|
||||
"schedule_anyway": "Időzítés így is",
|
||||
"schedule_warnings_title": "Időzíti így is ezt az üzenetet?",
|
||||
"picker_button": "Hozzáadás a névjegyekből",
|
||||
"picker_title": "Címzettek hozzáadása",
|
||||
"tab_contacts": "Névjegyek",
|
||||
|
||||
@@ -1112,7 +1112,7 @@
|
||||
"link_url_prompt": "Inserisci l'URL",
|
||||
"sending": "Invio in corso...",
|
||||
"schedule_send": "Programma invio",
|
||||
"schedule_send_description": "Scegli quando il server deve rilasciare questo messaggio.",
|
||||
"schedule_send_description": "Scegli quando inviarlo.",
|
||||
"schedule_preset": {
|
||||
"this_morning": "Stamattina",
|
||||
"this_afternoon": "Oggi pomeriggio",
|
||||
@@ -4057,6 +4057,8 @@
|
||||
"sending": "Invio in corso…",
|
||||
"sent": "Inviato",
|
||||
"view": "Visualizza",
|
||||
"schedule_anyway": "Programma comunque",
|
||||
"schedule_warnings_title": "Programmare comunque questo messaggio?",
|
||||
"picker_button": "Aggiungi dai contatti",
|
||||
"picker_title": "Aggiungi destinatari",
|
||||
"tab_contacts": "Contatti",
|
||||
|
||||
@@ -1112,7 +1112,7 @@
|
||||
"link_url_prompt": "URLを入力してください",
|
||||
"sending": "送信中...",
|
||||
"schedule_send": "送信を予約",
|
||||
"schedule_send_description": "サーバーがこのメッセージを送信する日時を選択します。",
|
||||
"schedule_send_description": "送信する日時を選んでください。",
|
||||
"schedule_preset": {
|
||||
"this_morning": "今朝",
|
||||
"this_afternoon": "今日の午後",
|
||||
@@ -4057,6 +4057,8 @@
|
||||
"sending": "送信中…",
|
||||
"sent": "送信しました",
|
||||
"view": "表示",
|
||||
"schedule_anyway": "そのまま予約",
|
||||
"schedule_warnings_title": "このメッセージをそのまま予約しますか?",
|
||||
"picker_button": "連絡先から追加",
|
||||
"picker_title": "宛先を追加",
|
||||
"tab_contacts": "連絡先",
|
||||
|
||||
@@ -1112,7 +1112,7 @@
|
||||
"link_url_prompt": "URL을 입력하세요",
|
||||
"sending": "전송 중...",
|
||||
"schedule_send": "보내기 예약",
|
||||
"schedule_send_description": "서버가 이 메시지를 보낼 시간을 선택하세요.",
|
||||
"schedule_send_description": "보낼 시간을 고르세요.",
|
||||
"schedule_preset": {
|
||||
"this_morning": "오늘 아침",
|
||||
"this_afternoon": "오늘 오후",
|
||||
@@ -4057,6 +4057,8 @@
|
||||
"sending": "보내는 중…",
|
||||
"sent": "보냈어요",
|
||||
"view": "보기",
|
||||
"schedule_anyway": "그래도 예약하기",
|
||||
"schedule_warnings_title": "이 메일을 그래도 예약할까요?",
|
||||
"picker_button": "연락처에서 추가",
|
||||
"picker_title": "받는 사람 추가",
|
||||
"tab_contacts": "연락처",
|
||||
|
||||
@@ -1112,7 +1112,7 @@
|
||||
"link_url_prompt": "Ievadiet URL",
|
||||
"sending": "Sūta...",
|
||||
"schedule_send": "Ieplānot sūtīšanu",
|
||||
"schedule_send_description": "Izvēlieties, kad serverim jānosūta šis ziņojums.",
|
||||
"schedule_send_description": "Izvēlieties, kad to nosūtīt.",
|
||||
"schedule_preset": {
|
||||
"this_morning": "Šorīt",
|
||||
"this_afternoon": "Šodien pēcpusdienā",
|
||||
@@ -4057,6 +4057,8 @@
|
||||
"sending": "Sūta…",
|
||||
"sent": "Nosūtīts",
|
||||
"view": "Skatīt",
|
||||
"schedule_anyway": "Ieplānot tik un tā",
|
||||
"schedule_warnings_title": "Vai tomēr ieplānot šo vēstuli?",
|
||||
"picker_button": "Pievienot no kontaktiem",
|
||||
"picker_title": "Pievienot saņēmējus",
|
||||
"tab_contacts": "Kontakti",
|
||||
|
||||
@@ -1112,7 +1112,7 @@
|
||||
"unfinished": []
|
||||
},
|
||||
"schedule_send": "Хуваарь илгээх",
|
||||
"schedule_send_description": "Сервер энэ мессежийг хэзээ гаргахыг сонгоно уу.",
|
||||
"schedule_send_description": "Хэзээ илгээхээ сонгоно уу.",
|
||||
"schedule_preset": {
|
||||
"this_morning": "Өнөө өглөө",
|
||||
"this_afternoon": "Өнөөдөр үдээс хойш",
|
||||
@@ -4057,6 +4057,8 @@
|
||||
"sending": "Илгээж байна…",
|
||||
"sent": "Илгээгдлээ",
|
||||
"view": "Харах",
|
||||
"schedule_anyway": "Ямар ч байсан хуваарьт оруулах",
|
||||
"schedule_warnings_title": "Энэ захиаг ямар ч байсан хуваарьт оруулах уу?",
|
||||
"picker_button": "Харилцагчдаас нэмэх",
|
||||
"picker_title": "Хүлээн авагч нэмэх",
|
||||
"tab_contacts": "Харилцагчид",
|
||||
|
||||
@@ -1112,7 +1112,7 @@
|
||||
"unfinished": []
|
||||
},
|
||||
"schedule_send": "Planlegg sending",
|
||||
"schedule_send_description": "Velg når serveren skal sende denne meldingen.",
|
||||
"schedule_send_description": "Velg når den skal sendes.",
|
||||
"schedule_preset": {
|
||||
"this_morning": "I dag tidlig",
|
||||
"this_afternoon": "I ettermiddag",
|
||||
@@ -4057,6 +4057,8 @@
|
||||
"sending": "Sender…",
|
||||
"sent": "Sendt",
|
||||
"view": "Vis",
|
||||
"schedule_anyway": "Planlegg likevel",
|
||||
"schedule_warnings_title": "Planlegge denne meldingen likevel?",
|
||||
"picker_button": "Legg til fra kontakter",
|
||||
"picker_title": "Legg til mottakere",
|
||||
"tab_contacts": "Kontakter",
|
||||
|
||||
@@ -1112,7 +1112,7 @@
|
||||
"link_url_prompt": "Voer de URL in",
|
||||
"sending": "Bezig met verzenden...",
|
||||
"schedule_send": "Verzenden plannen",
|
||||
"schedule_send_description": "Kies wanneer de server dit bericht moet vrijgeven.",
|
||||
"schedule_send_description": "Kies wanneer het verzonden wordt.",
|
||||
"schedule_preset": {
|
||||
"this_morning": "Vanochtend",
|
||||
"this_afternoon": "Vanmiddag",
|
||||
@@ -4057,6 +4057,8 @@
|
||||
"sending": "Bezig met verzenden…",
|
||||
"sent": "Verzonden",
|
||||
"view": "Bekijken",
|
||||
"schedule_anyway": "Toch plannen",
|
||||
"schedule_warnings_title": "Dit bericht toch plannen?",
|
||||
"picker_button": "Toevoegen uit contacten",
|
||||
"picker_title": "Ontvangers toevoegen",
|
||||
"tab_contacts": "Contacten",
|
||||
|
||||
@@ -1112,7 +1112,7 @@
|
||||
"link_url_prompt": "Wprowadź adres URL",
|
||||
"sending": "Wysyłanie...",
|
||||
"schedule_send": "Zaplanuj wysyłkę",
|
||||
"schedule_send_description": "Wybierz, kiedy serwer ma wysłać tę wiadomość.",
|
||||
"schedule_send_description": "Wybierz, kiedy ją wysłać.",
|
||||
"schedule_preset": {
|
||||
"this_morning": "Dziś rano",
|
||||
"this_afternoon": "Dziś po południu",
|
||||
@@ -4057,6 +4057,8 @@
|
||||
"sending": "Wysyłanie…",
|
||||
"sent": "Wysłano",
|
||||
"view": "Pokaż",
|
||||
"schedule_anyway": "Zaplanuj mimo to",
|
||||
"schedule_warnings_title": "Zaplanować tę wiadomość mimo to?",
|
||||
"picker_button": "Dodaj z kontaktów",
|
||||
"picker_title": "Dodaj odbiorców",
|
||||
"tab_contacts": "Kontakty",
|
||||
|
||||
@@ -1112,7 +1112,7 @@
|
||||
"link_url_prompt": "Insira a URL",
|
||||
"sending": "Enviando...",
|
||||
"schedule_send": "Agendar envio",
|
||||
"schedule_send_description": "Escolha quando o servidor deve liberar esta mensagem.",
|
||||
"schedule_send_description": "Escolha quando enviar.",
|
||||
"schedule_preset": {
|
||||
"this_morning": "Esta manhã",
|
||||
"this_afternoon": "Esta tarde",
|
||||
@@ -4057,6 +4057,8 @@
|
||||
"sending": "Enviando…",
|
||||
"sent": "Enviado",
|
||||
"view": "Ver",
|
||||
"schedule_anyway": "Agendar mesmo assim",
|
||||
"schedule_warnings_title": "Agendar esta mensagem mesmo assim?",
|
||||
"picker_button": "Adicionar dos contatos",
|
||||
"picker_title": "Adicionar destinatários",
|
||||
"tab_contacts": "Contatos",
|
||||
|
||||
@@ -1112,7 +1112,7 @@
|
||||
"unfinished": []
|
||||
},
|
||||
"schedule_send": "Programează trimiterea",
|
||||
"schedule_send_description": "Alegeți momentul în care serverul ar trebui să transmită acest mesaj.",
|
||||
"schedule_send_description": "Alegeți când să fie trimis.",
|
||||
"schedule_preset": {
|
||||
"this_morning": "Azi dimineață",
|
||||
"this_afternoon": "Azi după-amiază",
|
||||
@@ -4057,6 +4057,8 @@
|
||||
"sending": "Se trimite…",
|
||||
"sent": "Trimis",
|
||||
"view": "Vezi",
|
||||
"schedule_anyway": "Programează oricum",
|
||||
"schedule_warnings_title": "Programați totuși acest mesaj?",
|
||||
"picker_button": "Adaugă din contacte",
|
||||
"picker_title": "Adaugă destinatari",
|
||||
"tab_contacts": "Contacte",
|
||||
|
||||
@@ -1112,7 +1112,7 @@
|
||||
"link_url_prompt": "Введите URL",
|
||||
"sending": "Отправка...",
|
||||
"schedule_send": "Запланировать отправку",
|
||||
"schedule_send_description": "Выберите, когда сервер должен отправить это сообщение.",
|
||||
"schedule_send_description": "Выберите, когда отправить.",
|
||||
"schedule_preset": {
|
||||
"this_morning": "Сегодня утром",
|
||||
"this_afternoon": "Сегодня днём",
|
||||
@@ -4057,6 +4057,8 @@
|
||||
"sending": "Отправка…",
|
||||
"sent": "Отправлено",
|
||||
"view": "Открыть",
|
||||
"schedule_anyway": "Всё равно запланировать",
|
||||
"schedule_warnings_title": "Всё равно запланировать это письмо?",
|
||||
"picker_button": "Добавить из контактов",
|
||||
"picker_title": "Добавить получателей",
|
||||
"tab_contacts": "Контакты",
|
||||
|
||||
@@ -1112,7 +1112,7 @@
|
||||
"unfinished": []
|
||||
},
|
||||
"schedule_send": "Naplánovať odoslanie",
|
||||
"schedule_send_description": "Vyberte, kedy má server túto správu odoslať.",
|
||||
"schedule_send_description": "Vyberte, kedy sa má odoslať.",
|
||||
"schedule_preset": {
|
||||
"this_morning": "Dnes ráno",
|
||||
"this_afternoon": "Dnes popoludní",
|
||||
@@ -4057,6 +4057,8 @@
|
||||
"sending": "Odosielanie…",
|
||||
"sent": "Odoslané",
|
||||
"view": "Zobraziť",
|
||||
"schedule_anyway": "Naplánovať aj tak",
|
||||
"schedule_warnings_title": "Naplánovať túto správu aj tak?",
|
||||
"picker_button": "Pridať z kontaktov",
|
||||
"picker_title": "Pridať príjemcov",
|
||||
"tab_contacts": "Kontakty",
|
||||
|
||||
@@ -1233,6 +1233,8 @@
|
||||
"sending": "กำลังส่ง…",
|
||||
"sent": "ส่งแล้ว",
|
||||
"view": "ดู",
|
||||
"schedule_anyway": "กำหนดเวลาต่อไป",
|
||||
"schedule_warnings_title": "กำหนดเวลาส่งข้อความนี้ต่อไปหรือไม่",
|
||||
"picker_button": "เพิ่มจากผู้ติดต่อ",
|
||||
"picker_title": "เพิ่มผู้รับ",
|
||||
"tab_contacts": "ผู้ติดต่อ",
|
||||
@@ -1501,7 +1503,7 @@
|
||||
"unfinished": []
|
||||
},
|
||||
"schedule_send": "กำหนดเวลาส่ง",
|
||||
"schedule_send_description": "เลือกเวลาที่ต้องการให้เซิร์ฟเวอร์ส่งข้อความนี้",
|
||||
"schedule_send_description": "เลือกเวลาที่จะส่ง",
|
||||
"schedule_preset": {
|
||||
"this_morning": "เช้านี้",
|
||||
"this_afternoon": "บ่ายนี้",
|
||||
|
||||
@@ -1112,7 +1112,7 @@
|
||||
"unfinished": []
|
||||
},
|
||||
"schedule_send": "Göndermeyi zamanla",
|
||||
"schedule_send_description": "Sunucunun bu iletiyi ne zaman göndereceğini seçin.",
|
||||
"schedule_send_description": "Ne zaman gönderileceğini seçin.",
|
||||
"schedule_preset": {
|
||||
"this_morning": "Bu sabah",
|
||||
"this_afternoon": "Bu öğleden sonra",
|
||||
@@ -4057,6 +4057,8 @@
|
||||
"sending": "Gönderiliyor…",
|
||||
"sent": "Gönderildi",
|
||||
"view": "Görüntüle",
|
||||
"schedule_anyway": "Yine de zamanla",
|
||||
"schedule_warnings_title": "Bu ileti yine de zamanlansın mı?",
|
||||
"picker_button": "Kişilerden ekle",
|
||||
"picker_title": "Alıcı ekle",
|
||||
"tab_contacts": "Kişiler",
|
||||
|
||||
@@ -1112,7 +1112,7 @@
|
||||
"link_url_prompt": "Введіть URL",
|
||||
"sending": "Надсилання...",
|
||||
"schedule_send": "Запланувати надсилання",
|
||||
"schedule_send_description": "Виберіть, коли сервер має надіслати це повідомлення.",
|
||||
"schedule_send_description": "Виберіть, коли надіслати.",
|
||||
"schedule_preset": {
|
||||
"this_morning": "Сьогодні вранці",
|
||||
"this_afternoon": "Сьогодні вдень",
|
||||
@@ -4057,6 +4057,8 @@
|
||||
"sending": "Надсилання…",
|
||||
"sent": "Надіслано",
|
||||
"view": "Переглянути",
|
||||
"schedule_anyway": "Усе одно запланувати",
|
||||
"schedule_warnings_title": "Усе одно запланувати цей лист?",
|
||||
"picker_button": "Додати з контактів",
|
||||
"picker_title": "Додати одержувачів",
|
||||
"tab_contacts": "Контакти",
|
||||
|
||||
@@ -1126,7 +1126,7 @@
|
||||
]
|
||||
},
|
||||
"schedule_send": "Lên lịch gửi",
|
||||
"schedule_send_description": "Chọn thời điểm máy chủ sẽ gửi thư này.",
|
||||
"schedule_send_description": "Chọn thời điểm gửi.",
|
||||
"schedule_preset": {
|
||||
"this_morning": "Sáng nay",
|
||||
"this_afternoon": "Chiều nay",
|
||||
@@ -4069,6 +4069,8 @@
|
||||
"sending": "Đang gửi…",
|
||||
"sent": "Đã gửi",
|
||||
"view": "Xem",
|
||||
"schedule_anyway": "Vẫn lên lịch",
|
||||
"schedule_warnings_title": "Vẫn lên lịch gửi thư này?",
|
||||
"picker_button": "Thêm từ danh bạ",
|
||||
"picker_title": "Thêm người nhận",
|
||||
"tab_contacts": "Danh bạ",
|
||||
|
||||
@@ -1112,7 +1112,7 @@
|
||||
"unfinished": []
|
||||
},
|
||||
"schedule_send": "排程寄送",
|
||||
"schedule_send_description": "選擇伺服器要在何時送出這封郵件。",
|
||||
"schedule_send_description": "選擇寄送時間。",
|
||||
"schedule_preset": {
|
||||
"this_morning": "今天早上",
|
||||
"this_afternoon": "今天下午",
|
||||
@@ -4057,6 +4057,8 @@
|
||||
"sending": "正在傳送…",
|
||||
"sent": "已傳送",
|
||||
"view": "檢視",
|
||||
"schedule_anyway": "仍然排程",
|
||||
"schedule_warnings_title": "仍然排程這封郵件?",
|
||||
"picker_button": "從聯絡人新增",
|
||||
"picker_title": "新增收件者",
|
||||
"tab_contacts": "聯絡人",
|
||||
|
||||
@@ -1112,7 +1112,7 @@
|
||||
"link_url_prompt": "输入 URL",
|
||||
"sending": "发送中...",
|
||||
"schedule_send": "计划发送",
|
||||
"schedule_send_description": "选择服务器应何时发送此邮件。",
|
||||
"schedule_send_description": "选择发送时间。",
|
||||
"schedule_preset": {
|
||||
"this_morning": "今天早上",
|
||||
"this_afternoon": "今天下午",
|
||||
@@ -4057,6 +4057,8 @@
|
||||
"sending": "正在发送…",
|
||||
"sent": "已发送",
|
||||
"view": "查看",
|
||||
"schedule_anyway": "仍然计划发送",
|
||||
"schedule_warnings_title": "仍然计划发送这封邮件?",
|
||||
"picker_button": "从联系人添加",
|
||||
"picker_title": "添加收件人",
|
||||
"tab_contacts": "联系人",
|
||||
|
||||
Reference in New Issue
Block a user