best-email-builder 0.7.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +22 -0
- package/README.md +127 -735
- package/dist/ai-server.js +3 -3
- package/dist/ai.js +6 -6
- package/dist/builder.js +8 -8
- package/dist/chunk-62HBUBBI.js +3866 -0
- package/dist/chunk-62HBUBBI.js.map +1 -0
- package/dist/{chunk-QH5OI43L.js → chunk-6W3QUZR7.js} +8 -8
- package/dist/{chunk-W424KPCR.js → chunk-AXIM6E7T.js} +2 -2
- package/dist/{chunk-QRUMXCGW.js → chunk-DXWIVGHP.js} +3 -3
- package/dist/{chunk-C6WHIBGH.js → chunk-FAEVYSIF.js} +3 -3
- package/dist/{chunk-C6WHIBGH.js.map → chunk-FAEVYSIF.js.map} +1 -1
- package/dist/{chunk-4U7L2NYQ.js → chunk-G4U6PSF6.js} +2 -2
- package/dist/{chunk-3RPWH5PC.js → chunk-ITIG5NTJ.js} +4 -4
- package/dist/{chunk-CNJZLZRH.js → chunk-LUM7J5FF.js} +2 -2
- package/dist/{chunk-SAIW46IC.js → chunk-P7ABBLX6.js} +2 -2
- package/dist/{chunk-CTZ56YJG.js → chunk-SHHHYRPC.js} +834 -4
- package/dist/chunk-SHHHYRPC.js.map +1 -0
- package/dist/{chunk-UMVBT7NW.js → chunk-WM2EEV4Q.js} +4 -4
- package/dist/index.js +10 -10
- package/dist/library.js +5 -5
- package/dist/server.js +5 -5
- package/dist/types/ai/i18n/de.d.ts +2 -0
- package/dist/types/ai/i18n/es.d.ts +2 -0
- package/dist/types/ai/i18n/pt.d.ts +2 -0
- package/dist/types/ai/i18n/ru.d.ts +2 -0
- package/dist/types/ai/i18n/zh.d.ts +2 -0
- package/dist/types/core/constants.d.ts +1 -1
- package/dist/types/engine/NativeAdapter.d.ts +1 -1
- package/dist/types/i18n/de.d.ts +2 -0
- package/dist/types/i18n/es.d.ts +2 -0
- package/dist/types/i18n/pt.d.ts +2 -0
- package/dist/types/i18n/ru.d.ts +2 -0
- package/dist/types/i18n/zh.d.ts +2 -0
- package/package.json +2 -2
- package/dist/chunk-CTZ56YJG.js.map +0 -1
- package/dist/chunk-JI36FNWE.js +0 -1361
- package/dist/chunk-JI36FNWE.js.map +0 -1
- /package/dist/{chunk-QH5OI43L.js.map → chunk-6W3QUZR7.js.map} +0 -0
- /package/dist/{chunk-W424KPCR.js.map → chunk-AXIM6E7T.js.map} +0 -0
- /package/dist/{chunk-QRUMXCGW.js.map → chunk-DXWIVGHP.js.map} +0 -0
- /package/dist/{chunk-4U7L2NYQ.js.map → chunk-G4U6PSF6.js.map} +0 -0
- /package/dist/{chunk-3RPWH5PC.js.map → chunk-ITIG5NTJ.js.map} +0 -0
- /package/dist/{chunk-CNJZLZRH.js.map → chunk-LUM7J5FF.js.map} +0 -0
- /package/dist/{chunk-SAIW46IC.js.map → chunk-P7ABBLX6.js.map} +0 -0
- /package/dist/{chunk-UMVBT7NW.js.map → chunk-WM2EEV4Q.js.map} +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/i18n/de.js","../src/i18n/es.js","../src/i18n/fr.js","../src/i18n/pt.js","../src/i18n/ru.js","../src/i18n/zh.js","../src/i18n/index.js","../src/engine/model.js","../src/engine/mjml.js","../src/blocks/shared.js","../src/features/brand/brand.js","../src/features/variables/catalog.js","../src/renderer/links.js"],"sourcesContent":["// German locale. Keys are the English source strings (see src/i18n/index.js).\n// Missing keys: `node scripts/i18n-keys.mjs de`.\n\n/** @type {Record<string, string>} */\nexport const de = {\n \"1. Complete your profile\": \"1. Vervollständigen Sie Ihr Profil\",\n \"2. Explore\": \"2. Schauen Sie sich um\",\n \"3. Ask us anything\": \"3. Fragen Sie uns einfach\",\n \"30% off everything\": \"30 % auf alles\",\n \"30% off this weekend only\": \"Nur dieses Wochenende: 30 % Rabatt\",\n \"4 columns\": \"4 Spalten\",\n \"4-column section\": \"Abschnitt mit 4 Spalten\",\n \"A few words about it.\": \"Ein paar Worte dazu.\",\n \"A new feature\": \"Eine neue Funktion\",\n \"A sale with a discount code and two products\": \"Eine Aktion mit Rabattcode und zwei Produkten\",\n \"A tip\": \"Ein Tipp\",\n \"Add a block\": \"Block hinzufügen\",\n \"Add to favorites\": \"Zu Favoriten hinzufügen\",\n \"All blocks\": \"Alle Blöcke\",\n \"All capitals\": \"Alles in Großbuchstaben\",\n \"All templates\": \"Alle Vorlagen\",\n \"All your templates are in the favorites.\": \"Alle Ihre Vorlagen sind bereits in den Favoriten.\",\n \"An empty page to build from scratch\": \"Eine leere Seite, um ganz neu zu beginnen\",\n \"An evening of talks and drinks with the team and our customers.\": \"Ein Abend mit Vorträgen und Drinks, gemeinsam mit unserem Team und unseren Kunden.\",\n \"An event\": \"Eine Veranstaltung\",\n \"Apply the link\": \"Link übernehmen\",\n \"Article {n}\": \"Artikel {n}\",\n \"As typed\": \"Wie eingegeben\",\n \"Background image\": \"Hintergrundbild\",\n \"Background image with a title and a button\": \"Hintergrundbild mit Titel und Schaltfläche\",\n \"Background width\": \"Hintergrundbreite\",\n \"Base\": \"Basisvorlage\",\n \"Base — not editable: start from it to create your template.\": \"Basisvorlage — nicht bearbeitbar: Beginnen Sie damit, um Ihre Vorlage zu erstellen.\",\n \"Bases\": \"Basisvorlagen\",\n \"Blank\": \"Leere Vorlage\",\n \"Blog\": \"Blog\",\n \"Bold (Ctrl+B)\": \"Fett (Ctrl+B)\",\n \"Book my seat\": \"Jetzt Platz sichern\",\n \"Builder\": \"Editor\",\n \"Buy\": \"Kaufen\",\n \"by {name}\": \"von {name}\",\n \"Capitals\": \"Großschreibung\",\n \"Choose a template\": \"Vorlage auswählen\",\n \"Choose an image in the panel\": \"Bild im Eigenschaftenbereich auswählen\",\n \"Clear formatting\": \"Formatierung löschen\",\n \"Clear the search\": \"Suche löschen\",\n \"Contact\": \"Kontakt\",\n \"Copy HTML\": \"HTML kopieren\",\n \"Could not load the templates.\": \"Die Vorlagen konnten nicht geladen werden.\",\n \"Created\": \"Erstellt\",\n \"Date, place and a button to book a seat\": \"Datum, Ort und eine Schaltfläche zur Platzreservierung\",\n \"Default ({value})\": \"Standard ({value})\",\n \"Delete “{name}”?\": \"„{name}“ löschen?\",\n \"Direction\": \"Anordnung\",\n \"Download\": \"Herunterladen\",\n \"Drag to move\": \"Zum Verschieben ziehen\",\n \"Drop a block here\": \"Block hier ablegen\",\n \"Edit: {element}\": \"Bearbeiten: {element}\",\n \"Email canvas\": \"E-Mail-Arbeitsfläche\",\n \"Email settings\": \"E-Mail-Einstellungen\",\n \"Email template library\": \"Bibliothek mit E-Mail-Vorlagen\",\n \"Equal\": \"Gleich breit\",\n \"Facebook\": \"Facebook\",\n \"Favorites\": \"Favoriten\",\n \"Fill the section\": \"Abschnitt ausfüllen\",\n \"First letters\": \"Anfangsbuchstaben groß\",\n \"Get started\": \"Jetzt loslegen\",\n \"GitHub\": \"GitHub\",\n \"Greets a new customer and lists the first steps\": \"Begrüßt neue Kunden und zeigt die ersten Schritte\",\n \"Heading\": \"Überschrift\",\n \"Hero banner\": \"Titelbanner\",\n \"Horizontal\": \"Horizontal\",\n \"HTML copied.\": \"HTML kopiert.\",\n \"Icon background\": \"Symbolhintergrund\",\n \"Icon size\": \"Symbolgröße\",\n \"Icons linking to your profiles\": \"Symbole mit Links zu Ihren Profilen\",\n \"Image + text\": \"Bild + Text\",\n \"Image beside a title, text and button\": \"Bild neben Titel, Text und Schaltfläche\",\n \"Image position\": \"Bildposition\",\n \"Image size\": \"Bildgröße\",\n \"In brief\": \"Kurz notiert\",\n \"Instagram\": \"Instagram\",\n \"Italic (Ctrl+I)\": \"Kursiv (Ctrl+I)\",\n \"Keep its width\": \"Breite beibehalten\",\n \"Label\": \"Beschriftung\",\n \"Large bold title\": \"Großer Titel in Fettschrift\",\n \"LinkedIn\": \"LinkedIn\",\n \"Logo, headline, text and a button\": \"Logo, Schlagzeile, Text und Schaltfläche\",\n \"Menu\": \"Menü\",\n \"Menu link\": \"Menülink\",\n \"Monthly news: banner, two articles, highlights\": \"Monatliche Neuigkeiten: Banner, zwei Artikel, Kurzmeldungen\",\n \"Network\": \"Netzwerk\",\n \"No preview: this storage cannot render emails.\": \"Keine Vorschau: Dieser Speicher kann keine E-Mails rendern.\",\n \"No template yet. Start from a base, or create a new one.\": \"Noch keine Vorlage. Beginnen Sie mit einer Basisvorlage oder erstellen Sie eine neue.\",\n \"Nothing matches “{query}”.\": \"Keine Treffer für „{query}“.\",\n \"Offer valid until Sunday midnight, while stocks last.\": \"Angebot gültig bis Sonntag, 24 Uhr, solange der Vorrat reicht.\",\n \"On mobile\": \"Auf Mobilgeräten\",\n \"One sentence about it.\": \"Ein Satz dazu.\",\n \"One sentence that makes people want to read on.\": \"Ein Satz, der Lust aufs Weiterlesen macht.\",\n \"Origin\": \"Herkunft\",\n \"Original size\": \"Originalgröße\",\n \"Our offices, 1 Main Street\": \"Unsere Büroräume, Hauptstraße 1\",\n \"Picking a template replaces the email being edited.\": \"Wenn Sie eine Vorlage auswählen, wird die aktuell bearbeitete E-Mail ersetzt.\",\n \"Product one\": \"Produkt eins\",\n \"Product two\": \"Produkt zwei\",\n \"Profile URL\": \"Profil-URL\",\n \"Promotion\": \"Rabattaktion\",\n \"Read more\": \"Weiterlesen\",\n \"Ready-made templates to copy into your campaigns.\": \"Fertige Vorlagen zum Übernehmen in Ihre Kampagnen.\",\n \"Remove from favorites\": \"Aus Favoriten entfernen\",\n \"Remove the link\": \"Link entfernen\",\n \"Replace\": \"Ersetzen\",\n \"Replace the current email?\": \"Aktuelle E-Mail ersetzen?\",\n \"Reply to this email: a person reads it.\": \"Antworten Sie auf diese E-Mail: Ein Mensch aus unserem Team liest sie.\",\n \"Row of links to your site\": \"Linkleiste zu Ihrer Website\",\n \"Save the date — seats are limited.\": \"Jetzt vormerken — die Plätze sind begrenzt.\",\n \"Search templates\": \"Vorlagen durchsuchen\",\n \"Seats are limited: book yours now, it takes ten seconds.\": \"Die Plätze sind begrenzt: Sichern Sie sich jetzt Ihren Platz, das dauert nur zehn Sekunden.\",\n \"Select a template on the left.\": \"Wählen Sie links eine Vorlage aus.\",\n \"Select the parent\": \"Übergeordnetes Element auswählen\",\n \"Shop\": \"Shop\",\n \"Shop the sale\": \"Zu den Angeboten\",\n \"Simple\": \"Schlicht\",\n \"So we can tailor what we send you.\": \"Damit wir Ihnen nur das schicken, was Sie wirklich interessiert.\",\n \"Social link\": \"Social-Media-Link\",\n \"Social links\": \"Social-Media-Links\",\n \"Space around each icon\": \"Abstand um jedes Symbol\",\n \"Start from a template\": \"Mit einer Vorlage beginnen\",\n \"Start from this base\": \"Mit dieser Basisvorlage beginnen\",\n \"Strikethrough\": \"Durchgestrichen\",\n \"Take a tour of what you can do.\": \"Entdecken Sie, was alles möglich ist.\",\n \"Template deleted.\": \"Vorlage gelöscht.\",\n \"Template duplicated.\": \"Vorlage dupliziert.\",\n \"Templates\": \"Vorlagen\",\n \"Text formatting\": \"Textformatierung\",\n \"Thank you for joining us. Here is how to get the most out of your account.\": \"Schön, dass Sie dabei sind. So holen Sie das Beste aus Ihrem Konto heraus.\",\n \"The browser refused to copy.\": \"Der Browser hat das Kopieren verweigert.\",\n \"The news of the month\": \"Die Neuigkeiten des Monats\",\n \"The template and its versions will be deleted.\": \"Die Vorlage und ihre Versionen werden gelöscht.\",\n \"The template preview appears here.\": \"Hier wird die Vorschau der Vorlage angezeigt.\",\n \"This template was saved in a format this builder cannot open.\": \"Diese Vorlage wurde in einem Format gespeichert, das dieser Editor nicht öffnen kann.\",\n \"This weekend only, with the code SPRING30.\": \"Nur dieses Wochenende mit dem Code SPRING30.\",\n \"Three steps to get started.\": \"In drei Schritten startklar.\",\n \"Thursday, 7 pm\": \"Donnerstag, 19 Uhr\",\n \"Title\": \"Titel\",\n \"Two or three sentences that sum up the story and make people want the rest.\": \"Zwei oder drei Sätze, die den Artikel zusammenfassen und Lust auf mehr machen.\",\n \"Underline (Ctrl+U)\": \"Unterstrichen (Ctrl+U)\",\n \"Updated\": \"Geändert\",\n \"Vertical\": \"Vertikal\",\n \"Welcome aboard!\": \"Willkommen an Bord!\",\n \"Welcome, {name}!\": \"Willkommen, {name}!\",\n \"What changed, what is coming, and two stories worth your time.\": \"Was sich geändert hat, was als Nächstes kommt und zwei Artikel, die sich lohnen.\",\n \"When\": \"Wann\",\n \"Where\": \"Wo\",\n \"Whole image\": \"Ganzes Bild\",\n \"Whole screen\": \"Ganzer Bildschirm\",\n \"With the code SPRING30, until Sunday midnight.\": \"Mit dem Code SPRING30, gültig bis Sonntag, 24 Uhr.\",\n \"X\": \"X\",\n \"You're invited\": \"Sie sind herzlich eingeladen\",\n \"Your big announcement\": \"Ihre große Ankündigung\",\n \"YouTube\": \"YouTube\",\n \"{count} sections selected. Press Delete to remove them (Ctrl+Z brings them back).\": \"Ausgewählte Abschnitte: {count}. Drücken Sie Entf, um sie zu entfernen (Ctrl+Z stellt sie wieder her).\",\n \"{label} — {side}\": \"{label} — {side}\",\n \"{max} test addresses at most\": \"Maximale Anzahl an Testadressen: {max}\",\n \"{message} Your version can be saved as a copy.\": \"{message} Ihre Version kann als Kopie gespeichert werden.\",\n \"{name} (copy)\": \"{name} (Kopie)\",\n \"{sent} sent, {failed} failed.\": \"Gesendet: {sent}, fehlgeschlagen: {failed}.\",\n \"{sent} test(s) sent — check your inbox.\": \"Gesendete Test-E-Mails: {sent} — prüfen Sie Ihren Posteingang.\",\n \"1 column\": \"1 Spalte\",\n \"2 columns\": \"2 Spalten\",\n \"2-column section\": \"Abschnitt mit 2 Spalten\",\n \"25%\": \"25 %\",\n \"3 columns\": \"3 Spalten\",\n \"3-column section\": \"Abschnitt mit 3 Spalten\",\n \"50%\": \"50 %\",\n \"600 px (standard)\": \"600 px (Standard)\",\n \"640 px\": \"640 px\",\n \"75%\": \"75 %\",\n \"Address not allowed\": \"Adresse nicht zulässig\",\n \"Addresses\": \"Adressen\",\n \"Alignment\": \"Ausrichtung\",\n \"Alt text\": \"Alternativtext\",\n \"An https:// address is required\": \"Eine https://-Adresse ist erforderlich\",\n \"attribute {name} not allowed\": \"unzulässiges Attribut {name}\",\n \"Authentication required\": \"Authentifizierung erforderlich\",\n \"Autosave\": \"Automatisches Speichern\",\n \"Autosave paused\": \"Automatisches Speichern pausiert\",\n \"Autosaved at {time}\": \"Automatisch gespeichert um {time}\",\n \"Autosaving…\": \"Wird automatisch gespeichert…\",\n \"Available in every template.\": \"In allen Vorlagen verfügbar.\",\n \"Back\": \"Zurück\",\n \"Background\": \"Hintergrund\",\n \"base tag not allowed\": \"unzulässiges base-Tag\",\n \"Blocks\": \"Blöcke\",\n \"Bold\": \"Fett\",\n \"Bottom\": \"Unten\",\n \"Button\": \"Schaltfläche\",\n \"Button background\": \"Hintergrund der Schaltfläche\",\n \"Button padding\": \"Innenabstand der Schaltfläche\",\n \"Button without link ({count})\": \"Schaltflächen ohne Link: {count}\",\n \"Call to action\": \"Handlungsaufforderung\",\n \"Campaign\": \"Kampagne\",\n \"Campaign name\": \"Kampagnenname\",\n \"Cancel\": \"Abbrechen\",\n \"CDATA section not allowed\": \"unzulässiger CDATA-Abschnitt\",\n \"Center\": \"Mitte\",\n \"Close\": \"Schließen\",\n \"Colors\": \"Farben\",\n \"Column\": \"Spalte\",\n \"Company\": \"Unternehmen\",\n \"component script not allowed\": \"unzulässiges Komponentenskript\",\n \"conditional comment not allowed\": \"unzulässiger bedingter Kommentar\",\n \"Confirm\": \"Bestätigen\",\n \"Content\": \"Inhalt\",\n \"Content width\": \"Inhaltsbreite\",\n \"Copy saved: “{name}”.\": \"Kopie gespeichert: „{name}“.\",\n \"Corner radius\": \"Eckenradius\",\n \"Create\": \"Erstellen\",\n \"Create “{name}”\": \"„{name}“ erstellen\",\n \"current\": \"aktuell\",\n \"Custom\": \"Benutzerdefiniert\",\n \"Custom variables are not configured\": \"Benutzerdefinierte Variablen sind nicht konfiguriert\",\n \"Dashed\": \"Gestrichelt\",\n \"Default\": \"Standard\",\n \"Delete\": \"Löschen\",\n \"Delete (Del)\": \"Löschen (Entf)\",\n \"Delete the variable “{name}”?\": \"Variable „{name}“ löschen?\",\n \"Describes the image if it is blocked\": \"Beschreibt das Bild, falls es blockiert wird\",\n \"Deselect\": \"Auswahl aufheben\",\n \"Desktop\": \"Desktop\",\n \"Device\": \"Gerät\",\n \"Dismiss\": \"Ausblenden\",\n \"Divider\": \"Trennlinie\",\n \"Dotted\": \"Gepunktet\",\n \"Double-click the text to edit it.\": \"Doppelklicken Sie auf den Text, um ihn zu bearbeiten.\",\n \"Duplicate\": \"Duplizieren\",\n \"Edit\": \"Bearbeiten\",\n \"Edit “{name}”\": \"„{name}“ bearbeiten\",\n \"Edit variable\": \"Variable bearbeiten\",\n \"Element actions\": \"Elementaktionen\",\n \"Email\": \"E-Mail\",\n \"Email address\": \"E-Mail-Adresse\",\n \"Email preview\": \"E-Mail-Vorschau\",\n \"embed not allowed\": \"unzulässiges embed-Element\",\n \"Empty file\": \"Leere Datei\",\n \"Empty MJML\": \"Leeres MJML\",\n \"Empty MJML compilation\": \"Leeres Ergebnis der MJML-Kompilierung\",\n \"Empty subject\": \"Leerer Betreff\",\n \"executable content not allowed\": \"unzulässiger ausführbarer Inhalt\",\n \"external resource not allowed\": \"unzulässige externe Ressource\",\n \"File missing\": \"Datei fehlt\",\n \"Final rendering, variables filled with samples.\": \"Endgültige Darstellung, Variablen mit Beispielwerten gefüllt.\",\n \"First name\": \"Vorname\",\n \"Fit to text\": \"An Text anpassen\",\n \"Font\": \"Schriftart\",\n \"forbidden element in project: {tag}\": \"unzulässiges Element im Projekt: {tag}\",\n \"form field not allowed\": \"unzulässiges Formularfeld\",\n \"form not allowed\": \"unzulässiges Formular\",\n \"Format rejected: PNG, JPEG or GIF expected\": \"Format abgelehnt: PNG, JPEG oder GIF erwartet\",\n \"frame not allowed\": \"unzulässiges frame-Element\",\n \"Full length\": \"Volle Länge\",\n \"Full width\": \"Volle Breite\",\n \"Full-width section\": \"Abschnitt in voller Breite\",\n \"Give the template a name before saving it.\": \"Geben Sie der Vorlage vor dem Speichern einen Namen.\",\n \"Group\": \"Gruppe\",\n \"Height\": \"Höhe\",\n \"Hello {name},\": \"Hallo {name},\",\n \"Hex code\": \"Hex-Code\",\n \"Horizontal rule\": \"Horizontale Linie\",\n \"HTML button not allowed (use the Button block)\": \"unzulässige HTML-Schaltfläche (verwenden Sie den Schaltflächen-Block)\",\n \"iframe not allowed\": \"unzulässiges iframe-Element\",\n \"Ignored (invalid): {email}\": \"Ignoriert (ungültig): {email}\",\n \"Image\": \"Bild\",\n \"image rejected ({name})\": \"abgelehntes Bild ({name})\",\n \"image rejected ({name}): https only\": \"abgelehntes Bild ({name}): nur https\",\n \"Image too large: {max} MB maximum\": \"Bild zu groß: maximal {max} MB\",\n \"Image without alt text ({count})\": \"Bilder ohne Alternativtext: {count}\",\n \"Image without file ({count})\": \"Bilder ohne Datei: {count}\",\n \"Inbox\": \"Posteingang\",\n \"Indicative preview — check it with “Send test”.\": \"Ungefähre Vorschau — prüfen Sie sie mit „Test senden“.\",\n \"inline style rejected\": \"abgelehnter Inline-Stil\",\n \"Insecure http link ({count})\": \"Unsichere http-Links: {count}\",\n \"Insert a variable in the preview text\": \"Variable in den Vorschautext einfügen\",\n \"Insert a variable in the subject\": \"Variable in den Betreff einfügen\",\n \"Internal error\": \"Interner Fehler\",\n \"Invalid JSON\": \"Ungültiges JSON\",\n \"Justify\": \"Blocksatz\",\n \"Key is required\": \"Kennung erforderlich\",\n \"Last name\": \"Nachname\",\n \"Layout\": \"Layout\",\n \"Learn more\": \"Mehr erfahren\",\n \"Leave\": \"Verlassen\",\n \"Leave the builder?\": \"Editor verlassen?\",\n \"Left\": \"Links\",\n \"Length\": \"Länge\",\n \"Line color\": \"Linienfarbe\",\n \"Line height\": \"Zeilenhöhe\",\n \"Line style\": \"Linienart\",\n \"Link\": \"Link\",\n \"Link on click\": \"Link beim Anklicken\",\n \"Link URL\": \"Link-URL\",\n \"Links\": \"Links\",\n \"Loading the builder\": \"Editor wird geladen\",\n \"Loading…\": \"Wird geladen…\",\n \"Lowercase letters, digits, \\\"_\\\" and \\\".\\\" only, starting with a letter\": \"Nur Kleinbuchstaben, Ziffern, „_“ und „.“, beginnend mit einem Buchstaben\",\n \"MathML not allowed\": \"unzulässiges MathML\",\n \"Message is {size} KB: Gmail clips messages over {limit} KB\": \"Nachrichtengröße {size} KB: Gmail kürzt Nachrichten über {limit} KB\",\n \"meta tag not allowed\": \"unzulässiges meta-Tag\",\n \"Middle\": \"Mitte\",\n \"missing <mj-body>\": \"fehlendes <mj-body>\",\n \"Missing unsubscribe link\": \"Abmeldelink fehlt\",\n \"mj-font (external font) is outside the builder\": \"mj-font (externe Schriftart) liegt außerhalb des Editors\",\n \"mj-include would read a file from the server\": \"mj-include würde eine Datei vom Server lesen\",\n \"mj-raw (free HTML) is not allowed\": \"mj-raw (freies HTML) ist nicht zulässig\",\n \"mj-style (free CSS) is outside the builder\": \"mj-style (freies CSS) liegt außerhalb des Editors\",\n \"MJML too large ({size} KB, maximum {max} KB)\": \"MJML zu groß ({size} KB, maximal {max} KB)\",\n \"Mobile\": \"Mobil\",\n \"Move down\": \"Nach unten verschieben\",\n \"Move left\": \"Nach links verschieben\",\n \"Move right\": \"Nach rechts verschieben\",\n \"Move up\": \"Nach oben verschieben\",\n \"Multipart form expected\": \"Multipart-Formular erwartet\",\n \"Name\": \"Name\",\n \"Name is required\": \"Name ist erforderlich\",\n \"Name required\": \"Name erforderlich\",\n \"New template\": \"Neue Vorlage\",\n \"New variable\": \"Neue Variable\",\n \"No changes\": \"Keine Änderungen\",\n \"No preview text\": \"Kein Vorschautext\",\n \"No subject\": \"Kein Betreff\",\n \"No usable test address\": \"Keine verwendbare Testadresse\",\n \"No variable found.\": \"Keine Variable gefunden.\",\n \"No versions yet.\": \"Noch keine Versionen.\",\n \"Normal\": \"Normal\",\n \"Nothing to fix.\": \"Nichts zu beheben.\",\n \"Nothing to show yet.\": \"Noch nichts anzuzeigen.\",\n \"object not allowed\": \"unzulässiges object-Element\",\n \"Order number\": \"Bestellnummer\",\n \"Padding\": \"Innenabstand\",\n \"Page background\": \"Seitenhintergrund\",\n \"Paragraph or heading\": \"Absatz oder Überschrift\",\n \"Photo, visual or logo\": \"Foto, Grafik oder Logo\",\n \"Pick a colour\": \"Farbe auswählen\",\n \"Points to check\": \"Prüfpunkte\",\n \"Preview\": \"Vorschau\",\n \"Preview and tests\": \"Vorschau und Tests\",\n \"Preview text\": \"Vorschautext\",\n \"Project rejected: {issues}\": \"Projekt abgelehnt: {issues}\",\n \"project too deep\": \"zu tief verschachteltes Projekt\",\n \"project too large ({size} KB, maximum {max} KB)\": \"zu großes Projekt ({size} KB, maximal {max} KB)\",\n \"Properties\": \"Eigenschaften\",\n \"Recipient\": \"Empfänger\",\n \"Redo\": \"Wiederholen\",\n \"Redo (Ctrl+Y)\": \"Wiederholen (Ctrl+Y)\",\n \"Refresh\": \"Aktualisieren\",\n \"Rendering…\": \"Wird gerendert…\",\n \"Request too large\": \"Anfrage zu groß\",\n \"Restore\": \"Wiederherstellen\",\n \"Restore version {n}\": \"Version {n} wiederherstellen\",\n \"Restore version {n}?\": \"Version {n} wiederherstellen?\",\n \"Results\": \"Ergebnisse\",\n \"Resume\": \"Fortsetzen\",\n \"Resume the draft?\": \"Entwurf fortsetzen?\",\n \"Retry\": \"Erneut versuchen\",\n \"Right\": \"Rechts\",\n \"Route not found\": \"Route nicht gefunden\",\n \"Sample value\": \"Beispielwert\",\n \"Save\": \"Speichern\",\n \"Save a copy\": \"Kopie speichern\",\n \"Save the template first\": \"Speichern Sie zuerst die Vorlage\",\n \"Saved\": \"Gespeichert\",\n \"Saved — version {n}.\": \"Gespeichert — Version {n}.\",\n \"Saved at {time}\": \"Gespeichert um {time}\",\n \"Saved, with {count} MJML warning(s): {message}\": \"Gespeichert. MJML-Warnungen: {count} — {message}\",\n \"Saved. {count} image(s) have no picture yet: they are left out of the email until you add one.\": \"Gespeichert. Bilder ohne Datei: {count} — sie erscheinen erst in der E-Mail, wenn Sie eine Datei hinzufügen.\",\n \"Saving…\": \"Wird gespeichert…\",\n \"script not allowed\": \"unzulässiges Skript\",\n \"Search variables…\": \"Variablen durchsuchen…\",\n \"Section\": \"Abschnitt\",\n \"Select a text or a button first.\": \"Wählen Sie zuerst einen Text oder eine Schaltfläche aus.\",\n \"Send\": \"Senden\",\n \"Send a test\": \"Test senden\",\n \"Shown after the subject in the inbox\": \"Wird im Posteingang nach dem Betreff angezeigt\",\n \"Size\": \"Größe\",\n \"Solid\": \"Durchgezogen\",\n \"Spacer\": \"Abstandhalter\",\n \"Spacing\": \"Abstände\",\n \"Start over\": \"Neu beginnen\",\n \"style sheet not allowed\": \"unzulässiges Stylesheet\",\n \"Subject\": \"Betreff\",\n \"SVG not allowed\": \"unzulässiges SVG\",\n \"Tag\": \"Kennung\",\n \"tag not allowed: <{tag}>\": \"unzulässiges Tag: <{tag}>\",\n \"Template\": \"Vorlage\",\n \"Template changed in the meantime\": \"Vorlage wurde zwischenzeitlich geändert\",\n \"Template changed in the meantime — reload it before saving\": \"Vorlage wurde zwischenzeitlich geändert — laden Sie sie vor dem Speichern neu\",\n \"Template changed in the meantime by {user} — reload it before saving\": \"Vorlage wurde zwischenzeitlich von {user} geändert — laden Sie sie vor dem Speichern neu\",\n \"Template not found\": \"Vorlage nicht gefunden\",\n \"Template rejected: {issues}\": \"Vorlage abgelehnt: {issues}\",\n \"Template rejected: {issues} (+{more})\": \"Vorlage abgelehnt: {issues} (+{more})\",\n \"Template saved.\": \"Vorlage gespeichert.\",\n \"Templates that use it will show its “value if empty”.\": \"Vorlagen, die sie verwenden, zeigen dann ihren „Wert, falls leer“ an.\",\n \"Test\": \"Testen\",\n \"Test sending is not configured\": \"Der Testversand ist nicht konfiguriert\",\n \"Text\": \"Text\",\n \"The builder could not load.\": \"Der Editor konnte nicht geladen werden.\",\n \"The builder could not start.\": \"Der Editor konnte nicht gestartet werden.\",\n \"the document must start with <mjml>\": \"das Dokument muss mit <mjml> beginnen\",\n \"The draft will be offered again next time.\": \"Der Entwurf wird beim nächsten Öffnen erneut angeboten.\",\n \"The email on screen, to reviewers’ addresses.\": \"Die angezeigte E-Mail wird an die Adressen der Prüfer gesendet.\",\n \"The template could not be loaded.\": \"Die Vorlage konnte nicht geladen werden.\",\n \"Thickness\": \"Stärke\",\n \"This key is already used\": \"Diese Kennung wird bereits verwendet\",\n \"To check\": \"Zu prüfen\",\n \"Too many test sends — try again later\": \"Zu viele Test-E-Mails — versuchen Sie es später erneut\",\n \"Too many uploads — try again later\": \"Zu viele Uploads — versuchen Sie es später erneut\",\n \"Top\": \"Oben\",\n \"Typography\": \"Typografie\",\n \"Undo\": \"Rückgängig\",\n \"Undo (Ctrl+Z)\": \"Rückgängig (Ctrl+Z)\",\n \"Unknown variables (rendered empty): {tags}\": \"Unbekannte Variablen (leer dargestellt): {tags}\",\n \"Unsaved changes\": \"Nicht gespeicherte Änderungen\",\n \"Unsaved changes will be lost.\": \"Nicht gespeicherte Änderungen gehen verloren.\",\n \"Unsaved changes will be replaced.\": \"Nicht gespeicherte Änderungen werden ersetzt.\",\n \"Unsaved template from {when}.\": \"Nicht gespeicherte Vorlage vom {when}.\",\n \"Unsubscribe\": \"Abmelden\",\n \"Unsubscribe link\": \"Abmeldelink\",\n \"Upload\": \"Hochladen\",\n \"Upload failed\": \"Hochladen fehlgeschlagen\",\n \"URL rejected ({name})\": \"abgelehnte URL ({name})\",\n \"Value if empty\": \"Wert, falls leer\",\n \"Variable “{name}” created and inserted.\": \"Variable „{name}“ erstellt und eingefügt.\",\n \"Variable “{name}” created.\": \"Variable „{name}“ erstellt.\",\n \"Variable “{name}” saved.\": \"Variable „{name}“ gespeichert.\",\n \"Variable deleted.\": \"Variable gelöscht.\",\n \"Variable not found\": \"Variable nicht gefunden\",\n \"Variables\": \"Variablen\",\n \"Version {n}\": \"Version {n}\",\n \"Version {n} restored — save to keep it.\": \"Version {n} wiederhergestellt — speichern Sie, um sie zu behalten.\",\n \"Version not found\": \"Version nicht gefunden\",\n \"Versions\": \"Versionen\",\n \"Vertical alignment\": \"Vertikale Ausrichtung\",\n \"Vertical space\": \"Vertikaler Abstand\",\n \"Weight\": \"Schriftstärke\",\n \"When a recipient has none\": \"Falls ein Empfänger keinen Wert hat\",\n \"Width\": \"Breite\",\n \"Your company\": \"Ihr Unternehmen\",\n \"Your headline\": \"Ihre Schlagzeile\",\n \"Your text.\": \"Ihr Text.\",\n \"“{name}” template applied.\": \"Vorlage „{name}“ angewendet.\",\n \"€49 instead of €70\": \"49 € statt 70 €\",\n \"Cancelled\": \"Abgebrochen\",\n \"Email generation is not configured\": \"Die E-Mail-Generierung ist nicht konfiguriert\",\n \"Too many generated emails — try again later\": \"Zu viele generierte E-Mails — versuchen Sie es später erneut\",\n \"The AI service did not answer — try again in a moment.\": \"Der KI-Dienst hat nicht geantwortet — versuchen Sie es gleich noch einmal.\",\n \"Color scheme\": \"Farbschema\",\n \"Light mode\": \"Heller Modus\",\n \"Dark mode\": \"Dunkler Modus\",\n \"Dark mode as Gmail and Outlook apps show it: light backgrounds turn dark, dark text turns light, images stay as they are.\": \"Dunkler Modus, wie ihn die Apps von Gmail und Outlook anzeigen: Helle Hintergründe werden dunkel, dunkler Text wird hell, Bilder bleiben unverändert.\",\n \"Subject ideas are not configured\": \"Betreffideen sind nicht konfiguriert\",\n \"Too many subject ideas — try again later\": \"Zu viele Anfragen nach Betreffideen — versuchen Sie es später erneut\",\n \"Text rewriting is not configured\": \"Das Umschreiben von Texten ist nicht konfiguriert\",\n \"Too many rewrites — try again later\": \"Zu viele Anfragen zum Umschreiben — versuchen Sie es später erneut\",\n \"Brand\": \"Marke\",\n \"Your brand\": \"Ihre Marke\",\n \"Set it once: new emails, templates and blocks take your logo, colors and font.\": \"Einmal festlegen: Neue E-Mails, Vorlagen und Blöcke übernehmen Ihr Logo, Ihre Farben und Ihre Schriftart.\",\n \"Your website\": \"Ihre Website\",\n \"Get my brand\": \"Meine Marke abrufen\",\n \"Reading the website…\": \"Website wird ausgelesen…\",\n \"The logo, colors and font are read from it. You can change them before saving.\": \"Logo, Farben und Schriftart werden daraus ausgelesen. Sie können sie vor dem Speichern ändern.\",\n \"The website could not be read.\": \"Die Website konnte nicht ausgelesen werden.\",\n \"Logo\": \"Logo\",\n \"Remove\": \"Entfernen\",\n \"or an image address: https://…\": \"oder eine Bildadresse: https://…\",\n \"Company name\": \"Unternehmensname\",\n \"Main color\": \"Hauptfarbe\",\n \"Buttons, banners, links\": \"Schaltflächen, Banner, Links\",\n \"Headings color\": \"Farbe der Überschriften\",\n \"Also apply to this email\": \"Auch auf diese E-Mail anwenden\",\n \"Brand applied. Ctrl+Z brings back the previous look.\": \"Marke angewendet. Mit Ctrl+Z stellen Sie das vorherige Aussehen wieder her.\",\n \"Brand saved. New emails and blocks use it.\": \"Marke gespeichert. Neue E-Mails und Blöcke verwenden sie.\",\n \"The brand could not be saved.\": \"Die Marke konnte nicht gespeichert werden.\",\n \"Big news\": \"Große Neuigkeiten\",\n \"A short line under the title.\": \"Eine kurze Zeile unter dem Titel.\",\n \"A headline\": \"Eine Schlagzeile\",\n \"Some text, with\": \"Etwas Text mit\",\n \"a link\": \"einem Link\",\n \"The brand is not configured\": \"Die Marke ist nicht konfiguriert\",\n \"Reading a brand from a website is not configured\": \"Das Auslesen der Marke von einer Website ist nicht konfiguriert\",\n \"Too many websites read — try again later\": \"Zu viele Websites ausgelesen — versuchen Sie es später erneut\",\n \"Enter the address of a website, like acme.com\": \"Geben Sie die Adresse einer Website ein, z. B. acme.com\",\n \"This address is not a public website\": \"Diese Adresse ist keine öffentliche Website\",\n \"The website could not be reached. Check the address.\": \"Die Website ist nicht erreichbar. Prüfen Sie die Adresse.\",\n \"The website took too long to answer\": \"Die Website hat nicht rechtzeitig geantwortet\",\n \"The website does not let the builder read it. Fill in your brand below.\": \"Die Website lässt sich vom Editor nicht auslesen. Geben Sie Ihre Marke unten ein.\",\n \"This address is not a web page\": \"Diese Adresse ist keine Webseite\",\n \"The website redirects too many times\": \"Die Website leitet zu oft weiter\",\n \"The website sent too much data\": \"Die Website hat zu viele Daten gesendet\",\n \"No logo was found on the website. Upload it below.\": \"Auf der Website wurde kein Logo gefunden. Laden Sie es unten hoch.\",\n \"The logo on the website is an SVG or WebP image, which most email apps do not show. Upload a PNG or JPEG version.\": \"Das Logo auf der Website ist ein SVG- oder WebP-Bild, das die meisten E-Mail-Programme nicht anzeigen. Laden Sie eine PNG- oder JPEG-Version hoch.\",\n \"The website icon is used as the logo. Upload your full logo if you have one.\": \"Das Website-Symbol wird als Logo verwendet. Laden Sie Ihr vollständiges Logo hoch, falls Sie eines haben.\",\n \"No main color was found on the website. Pick one below.\": \"Auf der Website wurde keine Hauptfarbe gefunden. Wählen Sie unten eine aus.\",\n};\n","// Spanish locale. Keys are the English source strings (see src/i18n/index.js).\n// Missing keys: `node scripts/i18n-keys.mjs es`.\n\n/** @type {Record<string, string>} */\nexport const es = {\n \"1. Complete your profile\": \"1. Completa tu perfil\",\n \"2. Explore\": \"2. Explora\",\n \"3. Ask us anything\": \"3. Pregúntanos lo que quieras\",\n \"30% off everything\": \"30 % de descuento en todo\",\n \"30% off this weekend only\": \"30 % de descuento, solo este fin de semana\",\n \"4 columns\": \"4 columnas\",\n \"4-column section\": \"Sección de 4 columnas\",\n \"A few words about it.\": \"Unas palabras para presentarlo.\",\n \"A new feature\": \"Una nueva función\",\n \"A sale with a discount code and two products\": \"Una oferta con código de descuento y dos productos\",\n \"A tip\": \"Un consejo\",\n \"Add a block\": \"Añadir un bloque\",\n \"Add to favorites\": \"Añadir a favoritos\",\n \"All blocks\": \"Todos los bloques\",\n \"All capitals\": \"Todo en mayúsculas\",\n \"All templates\": \"Todas las plantillas\",\n \"All your templates are in the favorites.\": \"Todas tus plantillas están en favoritos.\",\n \"An empty page to build from scratch\": \"Una página en blanco para empezar desde cero\",\n \"An evening of talks and drinks with the team and our customers.\": \"Una velada de charlas y cóctel con el equipo y nuestros clientes.\",\n \"An event\": \"Un evento\",\n \"Apply the link\": \"Aplicar el enlace\",\n \"Article {n}\": \"Artículo {n}\",\n \"As typed\": \"Tal como está escrito\",\n \"Background image\": \"Imagen de fondo\",\n \"Background image with a title and a button\": \"Imagen de fondo con un título y un botón\",\n \"Background width\": \"Ancho del fondo\",\n \"Base\": \"Base\",\n \"Base — not editable: start from it to create your template.\": \"Base — no editable: empieza con ella para crear tu plantilla.\",\n \"Bases\": \"Bases\",\n \"Blank\": \"En blanco\",\n \"Blog\": \"Blog\",\n \"Bold (Ctrl+B)\": \"Negrita (Ctrl+B)\",\n \"Book my seat\": \"Reservar mi plaza\",\n \"Builder\": \"Editor\",\n \"Buy\": \"Comprar\",\n \"by {name}\": \"por {name}\",\n \"Capitals\": \"Mayúsculas\",\n \"Choose a template\": \"Elige una plantilla\",\n \"Choose an image in the panel\": \"Elige una imagen en el panel\",\n \"Clear formatting\": \"Borrar formato\",\n \"Clear the search\": \"Borrar la búsqueda\",\n \"Contact\": \"Contacto\",\n \"Copy HTML\": \"Copiar HTML\",\n \"Could not load the templates.\": \"No se pudieron cargar las plantillas.\",\n \"Created\": \"Creada\",\n \"Date, place and a button to book a seat\": \"Fecha, lugar y un botón para reservar plaza\",\n \"Default ({value})\": \"Predeterminado ({value})\",\n \"Delete “{name}”?\": \"¿Eliminar “{name}”?\",\n \"Direction\": \"Orientación\",\n \"Download\": \"Descargar\",\n \"Drag to move\": \"Arrastra para mover\",\n \"Drop a block here\": \"Suelta un bloque aquí\",\n \"Edit: {element}\": \"Editar: {element}\",\n \"Email canvas\": \"Lienzo del correo\",\n \"Email settings\": \"Configuración del correo\",\n \"Email template library\": \"Biblioteca de plantillas de correo\",\n \"Equal\": \"Iguales\",\n \"Facebook\": \"Facebook\",\n \"Favorites\": \"Favoritos\",\n \"Fill the section\": \"Cubrir la sección\",\n \"First letters\": \"Iniciales en mayúscula\",\n \"Get started\": \"Empezar\",\n \"GitHub\": \"GitHub\",\n \"Greets a new customer and lists the first steps\": \"Da la bienvenida a un nuevo cliente y enumera los primeros pasos\",\n \"Heading\": \"Título\",\n \"Hero banner\": \"Banner principal\",\n \"Horizontal\": \"Horizontal\",\n \"HTML copied.\": \"HTML copiado.\",\n \"Icon background\": \"Fondo del icono\",\n \"Icon size\": \"Tamaño de los iconos\",\n \"Icons linking to your profiles\": \"Iconos que enlazan a tus perfiles\",\n \"Image + text\": \"Imagen + texto\",\n \"Image beside a title, text and button\": \"Imagen junto a un título, un texto y un botón\",\n \"Image position\": \"Posición de la imagen\",\n \"Image size\": \"Tamaño de la imagen\",\n \"In brief\": \"Breves\",\n \"Instagram\": \"Instagram\",\n \"Italic (Ctrl+I)\": \"Cursiva (Ctrl+I)\",\n \"Keep its width\": \"Mantener su ancho\",\n \"Label\": \"Texto visible\",\n \"Large bold title\": \"Título grande en negrita\",\n \"LinkedIn\": \"LinkedIn\",\n \"Logo, headline, text and a button\": \"Logo, titular, texto y un botón\",\n \"Menu\": \"Menú\",\n \"Menu link\": \"Enlace del menú\",\n \"Monthly news: banner, two articles, highlights\": \"Noticias del mes: banner, dos artículos y destacados\",\n \"Network\": \"Red social\",\n \"No preview: this storage cannot render emails.\": \"Sin vista previa: este almacenamiento no puede renderizar correos.\",\n \"No template yet. Start from a base, or create a new one.\": \"Aún no hay plantillas. Empieza con una base o crea una nueva.\",\n \"Nothing matches “{query}”.\": \"No hay resultados para “{query}”.\",\n \"Offer valid until Sunday midnight, while stocks last.\": \"Oferta válida hasta el domingo a medianoche o hasta agotar existencias.\",\n \"On mobile\": \"En móviles\",\n \"One sentence about it.\": \"Una frase para contarlo.\",\n \"One sentence that makes people want to read on.\": \"Una frase que invite a seguir leyendo.\",\n \"Origin\": \"Origen\",\n \"Original size\": \"Tamaño original\",\n \"Our offices, 1 Main Street\": \"Nuestras oficinas, Calle Mayor 1\",\n \"Picking a template replaces the email being edited.\": \"Al elegir una plantilla, se reemplaza el correo que estás editando.\",\n \"Product one\": \"Producto uno\",\n \"Product two\": \"Producto dos\",\n \"Profile URL\": \"URL del perfil\",\n \"Promotion\": \"Promoción\",\n \"Read more\": \"Leer más\",\n \"Ready-made templates to copy into your campaigns.\": \"Plantillas listas para copiar en tus campañas.\",\n \"Remove from favorites\": \"Quitar de favoritos\",\n \"Remove the link\": \"Quitar el enlace\",\n \"Replace\": \"Reemplazar\",\n \"Replace the current email?\": \"¿Reemplazar el correo actual?\",\n \"Reply to this email: a person reads it.\": \"Responde a este correo: lo lee una persona.\",\n \"Row of links to your site\": \"Fila de enlaces a tu sitio web\",\n \"Save the date — seats are limited.\": \"Reserva la fecha — las plazas son limitadas.\",\n \"Search templates\": \"Buscar plantillas\",\n \"Seats are limited: book yours now, it takes ten seconds.\": \"Las plazas son limitadas: reserva la tuya ahora, solo te llevará diez segundos.\",\n \"Select a template on the left.\": \"Selecciona una plantilla a la izquierda.\",\n \"Select the parent\": \"Seleccionar el contenedor\",\n \"Shop\": \"Tienda\",\n \"Shop the sale\": \"Ver las ofertas\",\n \"Simple\": \"Sencilla\",\n \"So we can tailor what we send you.\": \"Así podremos adaptar lo que te enviamos.\",\n \"Social link\": \"Enlace a red social\",\n \"Social links\": \"Redes sociales\",\n \"Space around each icon\": \"Espacio alrededor de cada icono\",\n \"Start from a template\": \"Empezar con una plantilla\",\n \"Start from this base\": \"Empezar con esta base\",\n \"Strikethrough\": \"Tachado\",\n \"Take a tour of what you can do.\": \"Descubre todo lo que puedes hacer.\",\n \"Template deleted.\": \"Plantilla eliminada.\",\n \"Template duplicated.\": \"Plantilla duplicada.\",\n \"Templates\": \"Plantillas\",\n \"Text formatting\": \"Formato de texto\",\n \"Thank you for joining us. Here is how to get the most out of your account.\": \"Gracias por unirte. Te contamos cómo sacarle el máximo provecho a tu cuenta.\",\n \"The browser refused to copy.\": \"El navegador no permitió copiar.\",\n \"The news of the month\": \"Las noticias del mes\",\n \"The template and its versions will be deleted.\": \"Se eliminarán la plantilla y sus versiones.\",\n \"The template preview appears here.\": \"Aquí aparece la vista previa de la plantilla.\",\n \"This template was saved in a format this builder cannot open.\": \"Esta plantilla se guardó en un formato que este editor no puede abrir.\",\n \"This weekend only, with the code SPRING30.\": \"Solo este fin de semana, con el código SPRING30.\",\n \"Three steps to get started.\": \"Tres pasos para empezar.\",\n \"Thursday, 7 pm\": \"Jueves, 19:00\",\n \"Title\": \"Título\",\n \"Two or three sentences that sum up the story and make people want the rest.\": \"Dos o tres frases que resuman la historia y den ganas de leer el resto.\",\n \"Underline (Ctrl+U)\": \"Subrayado (Ctrl+U)\",\n \"Updated\": \"Actualizada\",\n \"Vertical\": \"Vertical\",\n \"Welcome aboard!\": \"¡Te damos la bienvenida!\",\n \"Welcome, {name}!\": \"¡Te damos la bienvenida, {name}!\",\n \"What changed, what is coming, and two stories worth your time.\": \"Lo que cambió, lo que viene y dos historias que valen la pena.\",\n \"When\": \"Cuándo\",\n \"Where\": \"Dónde\",\n \"Whole image\": \"Imagen completa\",\n \"Whole screen\": \"Toda la pantalla\",\n \"With the code SPRING30, until Sunday midnight.\": \"Con el código SPRING30, hasta el domingo a medianoche.\",\n \"X\": \"X\",\n \"You're invited\": \"Te invitamos\",\n \"Your big announcement\": \"Tu gran anuncio\",\n \"YouTube\": \"YouTube\",\n \"{count} sections selected. Press Delete to remove them (Ctrl+Z brings them back).\": \"Secciones seleccionadas: {count}. Pulsa Supr para eliminarlas (Ctrl+Z las recupera).\",\n \"{label} — {side}\": \"{label} — {side}\",\n \"{max} test addresses at most\": \"Máximo de direcciones de prueba: {max}\",\n \"{message} Your version can be saved as a copy.\": \"{message} Puedes guardar tu versión como copia.\",\n \"{name} (copy)\": \"{name} (copia)\",\n \"{sent} sent, {failed} failed.\": \"Enviados: {sent}. Con error: {failed}.\",\n \"{sent} test(s) sent — check your inbox.\": \"Pruebas enviadas: {sent} — revisa tu bandeja de entrada.\",\n \"1 column\": \"1 columna\",\n \"2 columns\": \"2 columnas\",\n \"2-column section\": \"Sección de 2 columnas\",\n \"25%\": \"25 %\",\n \"3 columns\": \"3 columnas\",\n \"3-column section\": \"Sección de 3 columnas\",\n \"50%\": \"50 %\",\n \"600 px (standard)\": \"600 px (estándar)\",\n \"640 px\": \"640 px\",\n \"75%\": \"75 %\",\n \"Address not allowed\": \"Dirección no permitida\",\n \"Addresses\": \"Direcciones\",\n \"Alignment\": \"Alineación\",\n \"Alt text\": \"Texto alternativo\",\n \"An https:// address is required\": \"Se requiere una dirección https://\",\n \"attribute {name} not allowed\": \"atributo {name} no permitido\",\n \"Authentication required\": \"Se requiere autenticación\",\n \"Autosave\": \"Guardado automático\",\n \"Autosave paused\": \"Guardado automático en pausa\",\n \"Autosaved at {time}\": \"Guardado automáticamente a las {time}\",\n \"Autosaving…\": \"Guardando automáticamente…\",\n \"Available in every template.\": \"Disponible en todas las plantillas.\",\n \"Back\": \"Volver\",\n \"Background\": \"Fondo\",\n \"base tag not allowed\": \"etiqueta base no permitida\",\n \"Blocks\": \"Bloques\",\n \"Bold\": \"Negrita\",\n \"Bottom\": \"Abajo\",\n \"Button\": \"Botón\",\n \"Button background\": \"Fondo del botón\",\n \"Button padding\": \"Relleno del botón\",\n \"Button without link ({count})\": \"Botón sin enlace ({count})\",\n \"Call to action\": \"Llamada a la acción\",\n \"Campaign\": \"Campaña\",\n \"Campaign name\": \"Nombre de la campaña\",\n \"Cancel\": \"Cancelar\",\n \"CDATA section not allowed\": \"sección CDATA no permitida\",\n \"Center\": \"Centro\",\n \"Close\": \"Cerrar\",\n \"Colors\": \"Colores\",\n \"Column\": \"Columna\",\n \"Company\": \"Empresa\",\n \"component script not allowed\": \"script de componente no permitido\",\n \"conditional comment not allowed\": \"comentario condicional no permitido\",\n \"Confirm\": \"Confirmar\",\n \"Content\": \"Contenido\",\n \"Content width\": \"Ancho del contenido\",\n \"Copy saved: “{name}”.\": \"Copia guardada: “{name}”.\",\n \"Corner radius\": \"Redondeo de esquinas\",\n \"Create\": \"Crear\",\n \"Create “{name}”\": \"Crear “{name}”\",\n \"current\": \"actual\",\n \"Custom\": \"Personalizadas\",\n \"Custom variables are not configured\": \"Las variables personalizadas no están configuradas\",\n \"Dashed\": \"Discontinua\",\n \"Default\": \"Predeterminado\",\n \"Delete\": \"Eliminar\",\n \"Delete (Del)\": \"Eliminar (Supr)\",\n \"Delete the variable “{name}”?\": \"¿Eliminar la variable “{name}”?\",\n \"Describes the image if it is blocked\": \"Describe la imagen si está bloqueada\",\n \"Deselect\": \"Anular la selección\",\n \"Desktop\": \"Escritorio\",\n \"Device\": \"Dispositivo\",\n \"Dismiss\": \"Descartar\",\n \"Divider\": \"Separador\",\n \"Dotted\": \"Punteada\",\n \"Double-click the text to edit it.\": \"Haz doble clic en el texto para editarlo.\",\n \"Duplicate\": \"Duplicar\",\n \"Edit\": \"Editar\",\n \"Edit “{name}”\": \"Editar “{name}”\",\n \"Edit variable\": \"Editar variable\",\n \"Element actions\": \"Acciones del elemento\",\n \"Email\": \"Correo\",\n \"Email address\": \"Dirección de correo\",\n \"Email preview\": \"Vista previa del correo\",\n \"embed not allowed\": \"embed no permitido\",\n \"Empty file\": \"Archivo vacío\",\n \"Empty MJML\": \"MJML vacío\",\n \"Empty MJML compilation\": \"Compilación MJML vacía\",\n \"Empty subject\": \"Asunto vacío\",\n \"executable content not allowed\": \"contenido ejecutable no permitido\",\n \"external resource not allowed\": \"recurso externo no permitido\",\n \"File missing\": \"Falta el archivo\",\n \"Final rendering, variables filled with samples.\": \"Resultado final, con valores de ejemplo en las variables.\",\n \"First name\": \"Nombre\",\n \"Fit to text\": \"Ajustado al texto\",\n \"Font\": \"Fuente\",\n \"forbidden element in project: {tag}\": \"elemento prohibido en el proyecto: {tag}\",\n \"form field not allowed\": \"campo de formulario no permitido\",\n \"form not allowed\": \"formulario no permitido\",\n \"Format rejected: PNG, JPEG or GIF expected\": \"Formato rechazado: se espera PNG, JPEG o GIF\",\n \"frame not allowed\": \"frame no permitido\",\n \"Full length\": \"Longitud completa\",\n \"Full width\": \"Ancho completo\",\n \"Full-width section\": \"Sección de ancho completo\",\n \"Give the template a name before saving it.\": \"Ponle un nombre a la plantilla antes de guardarla.\",\n \"Group\": \"Grupo\",\n \"Height\": \"Alto\",\n \"Hello {name},\": \"Hola, {name}:\",\n \"Hex code\": \"Código hexadecimal\",\n \"Horizontal rule\": \"Línea horizontal\",\n \"HTML button not allowed (use the Button block)\": \"botón HTML no permitido (usa el bloque Botón)\",\n \"iframe not allowed\": \"iframe no permitido\",\n \"Ignored (invalid): {email}\": \"Ignorada (no válida): {email}\",\n \"Image\": \"Imagen\",\n \"image rejected ({name})\": \"imagen rechazada ({name})\",\n \"image rejected ({name}): https only\": \"imagen rechazada ({name}): solo https\",\n \"Image too large: {max} MB maximum\": \"Imagen demasiado grande: máximo {max} MB\",\n \"Image without alt text ({count})\": \"Imagen sin texto alternativo ({count})\",\n \"Image without file ({count})\": \"Imagen sin archivo ({count})\",\n \"Inbox\": \"Bandeja de entrada\",\n \"Indicative preview — check it with “Send test”.\": \"Vista previa orientativa — compruébala con “Enviar una prueba”.\",\n \"inline style rejected\": \"estilo en línea rechazado\",\n \"Insecure http link ({count})\": \"Enlace http no seguro ({count})\",\n \"Insert a variable in the preview text\": \"Insertar una variable en el texto de vista previa\",\n \"Insert a variable in the subject\": \"Insertar una variable en el asunto\",\n \"Internal error\": \"Error interno\",\n \"Invalid JSON\": \"JSON no válido\",\n \"Justify\": \"Justificado\",\n \"Key is required\": \"La etiqueta es obligatoria\",\n \"Last name\": \"Apellido\",\n \"Layout\": \"Diseño\",\n \"Learn more\": \"Más información\",\n \"Leave\": \"Salir\",\n \"Leave the builder?\": \"¿Salir del editor?\",\n \"Left\": \"Izquierda\",\n \"Length\": \"Longitud\",\n \"Line color\": \"Color de la línea\",\n \"Line height\": \"Interlineado\",\n \"Line style\": \"Estilo de línea\",\n \"Link\": \"Enlace\",\n \"Link on click\": \"Enlace al hacer clic\",\n \"Link URL\": \"URL del enlace\",\n \"Links\": \"Enlaces\",\n \"Loading the builder\": \"Cargando el editor\",\n \"Loading…\": \"Cargando…\",\n \"Lowercase letters, digits, \\\"_\\\" and \\\".\\\" only, starting with a letter\": \"Solo minúsculas, cifras, \\\"_\\\" y \\\".\\\", y debe empezar por una letra\",\n \"MathML not allowed\": \"MathML no permitido\",\n \"Message is {size} KB: Gmail clips messages over {limit} KB\": \"El mensaje pesa {size} KB: Gmail recorta los mensajes de más de {limit} KB\",\n \"meta tag not allowed\": \"etiqueta meta no permitida\",\n \"Middle\": \"En medio\",\n \"missing <mj-body>\": \"falta <mj-body>\",\n \"Missing unsubscribe link\": \"Falta el enlace para darse de baja\",\n \"mj-font (external font) is outside the builder\": \"mj-font (fuente externa) queda fuera del editor\",\n \"mj-include would read a file from the server\": \"mj-include leería un archivo del servidor\",\n \"mj-raw (free HTML) is not allowed\": \"mj-raw (HTML libre) no está permitido\",\n \"mj-style (free CSS) is outside the builder\": \"mj-style (CSS libre) queda fuera del editor\",\n \"MJML too large ({size} KB, maximum {max} KB)\": \"MJML demasiado grande ({size} KB, máximo {max} KB)\",\n \"Mobile\": \"Móvil\",\n \"Move down\": \"Mover hacia abajo\",\n \"Move left\": \"Mover a la izquierda\",\n \"Move right\": \"Mover a la derecha\",\n \"Move up\": \"Mover hacia arriba\",\n \"Multipart form expected\": \"Se esperaba un formulario multipart\",\n \"Name\": \"Nombre\",\n \"Name is required\": \"El nombre es obligatorio\",\n \"Name required\": \"Nombre obligatorio\",\n \"New template\": \"Nueva plantilla\",\n \"New variable\": \"Nueva variable\",\n \"No changes\": \"Sin cambios\",\n \"No preview text\": \"Sin texto de vista previa\",\n \"No subject\": \"Sin asunto\",\n \"No usable test address\": \"No hay ninguna dirección de prueba válida\",\n \"No variable found.\": \"No se encontró ninguna variable.\",\n \"No versions yet.\": \"Aún no hay versiones.\",\n \"Normal\": \"Normal\",\n \"Nothing to fix.\": \"No hay nada que corregir.\",\n \"Nothing to show yet.\": \"Aún no hay nada que mostrar.\",\n \"object not allowed\": \"object no permitido\",\n \"Order number\": \"Número de pedido\",\n \"Padding\": \"Relleno\",\n \"Page background\": \"Fondo de la página\",\n \"Paragraph or heading\": \"Párrafo o título\",\n \"Photo, visual or logo\": \"Foto, ilustración o logo\",\n \"Pick a colour\": \"Elige un color\",\n \"Points to check\": \"Puntos que revisar\",\n \"Preview\": \"Vista previa\",\n \"Preview and tests\": \"Vista previa y pruebas\",\n \"Preview text\": \"Texto de vista previa\",\n \"Project rejected: {issues}\": \"Proyecto rechazado: {issues}\",\n \"project too deep\": \"proyecto demasiado anidado\",\n \"project too large ({size} KB, maximum {max} KB)\": \"proyecto demasiado grande ({size} KB, máximo {max} KB)\",\n \"Properties\": \"Propiedades\",\n \"Recipient\": \"Destinatario\",\n \"Redo\": \"Rehacer\",\n \"Redo (Ctrl+Y)\": \"Rehacer (Ctrl+Y)\",\n \"Refresh\": \"Actualizar\",\n \"Rendering…\": \"Renderizando…\",\n \"Request too large\": \"Solicitud demasiado grande\",\n \"Restore\": \"Restaurar\",\n \"Restore version {n}\": \"Restaurar la versión {n}\",\n \"Restore version {n}?\": \"¿Restaurar la versión {n}?\",\n \"Results\": \"Resultados\",\n \"Resume\": \"Retomar\",\n \"Resume the draft?\": \"¿Retomar el borrador?\",\n \"Retry\": \"Reintentar\",\n \"Right\": \"Derecha\",\n \"Route not found\": \"Ruta no encontrada\",\n \"Sample value\": \"Valor de ejemplo\",\n \"Save\": \"Guardar\",\n \"Save a copy\": \"Guardar una copia\",\n \"Save the template first\": \"Guarda primero la plantilla\",\n \"Saved\": \"Guardado\",\n \"Saved — version {n}.\": \"Guardado — versión {n}.\",\n \"Saved at {time}\": \"Guardado a las {time}\",\n \"Saved, with {count} MJML warning(s): {message}\": \"Guardado. Advertencias de MJML: {count} — {message}\",\n \"Saved. {count} image(s) have no picture yet: they are left out of the email until you add one.\": \"Guardado. Imágenes todavía vacías: {count}. No aparecerán en el correo hasta que les añadas un archivo.\",\n \"Saving…\": \"Guardando…\",\n \"script not allowed\": \"script no permitido\",\n \"Search variables…\": \"Buscar variables…\",\n \"Section\": \"Sección\",\n \"Select a text or a button first.\": \"Selecciona primero un texto o un botón.\",\n \"Send\": \"Enviar\",\n \"Send a test\": \"Enviar una prueba\",\n \"Shown after the subject in the inbox\": \"Se muestra después del asunto en la bandeja de entrada\",\n \"Size\": \"Tamaño\",\n \"Solid\": \"Continua\",\n \"Spacer\": \"Espaciador\",\n \"Spacing\": \"Espaciado\",\n \"Start over\": \"Empezar de cero\",\n \"style sheet not allowed\": \"hoja de estilo no permitida\",\n \"Subject\": \"Asunto\",\n \"SVG not allowed\": \"SVG no permitido\",\n \"Tag\": \"Etiqueta\",\n \"tag not allowed: <{tag}>\": \"etiqueta no permitida: <{tag}>\",\n \"Template\": \"Plantilla\",\n \"Template changed in the meantime\": \"Plantilla modificada mientras tanto\",\n \"Template changed in the meantime — reload it before saving\": \"Plantilla modificada mientras tanto — vuelve a cargarla antes de guardar\",\n \"Template changed in the meantime by {user} — reload it before saving\": \"Plantilla modificada mientras tanto por {user} — vuelve a cargarla antes de guardar\",\n \"Template not found\": \"Plantilla no encontrada\",\n \"Template rejected: {issues}\": \"Plantilla rechazada: {issues}\",\n \"Template rejected: {issues} (+{more})\": \"Plantilla rechazada: {issues} (+{more})\",\n \"Template saved.\": \"Plantilla guardada.\",\n \"Templates that use it will show its “value if empty”.\": \"Las plantillas que la usan mostrarán su “valor si está vacía”.\",\n \"Test\": \"Probar\",\n \"Test sending is not configured\": \"El envío de pruebas no está configurado\",\n \"Text\": \"Texto\",\n \"The builder could not load.\": \"No se pudo cargar el editor.\",\n \"The builder could not start.\": \"No se pudo iniciar el editor.\",\n \"the document must start with <mjml>\": \"el documento debe empezar por <mjml>\",\n \"The draft will be offered again next time.\": \"El borrador se te volverá a ofrecer la próxima vez.\",\n \"The email on screen, to reviewers’ addresses.\": \"El correo que ves en pantalla, a las direcciones de los revisores.\",\n \"The template could not be loaded.\": \"No se pudo cargar la plantilla.\",\n \"Thickness\": \"Grosor\",\n \"This key is already used\": \"Esta etiqueta ya está en uso\",\n \"To check\": \"Por revisar\",\n \"Too many test sends — try again later\": \"Demasiados envíos de prueba — inténtalo más tarde\",\n \"Too many uploads — try again later\": \"Demasiadas subidas de archivos — inténtalo más tarde\",\n \"Top\": \"Arriba\",\n \"Typography\": \"Tipografía\",\n \"Undo\": \"Deshacer\",\n \"Undo (Ctrl+Z)\": \"Deshacer (Ctrl+Z)\",\n \"Unknown variables (rendered empty): {tags}\": \"Variables desconocidas (se muestran vacías): {tags}\",\n \"Unsaved changes\": \"Cambios sin guardar\",\n \"Unsaved changes will be lost.\": \"Se perderán los cambios sin guardar.\",\n \"Unsaved changes will be replaced.\": \"Se reemplazarán los cambios sin guardar.\",\n \"Unsaved template from {when}.\": \"Plantilla sin guardar del {when}.\",\n \"Unsubscribe\": \"Darse de baja\",\n \"Unsubscribe link\": \"Enlace para darse de baja\",\n \"Upload\": \"Subir\",\n \"Upload failed\": \"No se pudo subir el archivo\",\n \"URL rejected ({name})\": \"URL rechazada ({name})\",\n \"Value if empty\": \"Valor si está vacía\",\n \"Variable “{name}” created and inserted.\": \"Variable “{name}” creada e insertada.\",\n \"Variable “{name}” created.\": \"Variable “{name}” creada.\",\n \"Variable “{name}” saved.\": \"Variable “{name}” guardada.\",\n \"Variable deleted.\": \"Variable eliminada.\",\n \"Variable not found\": \"Variable no encontrada\",\n \"Variables\": \"Variables\",\n \"Version {n}\": \"Versión {n}\",\n \"Version {n} restored — save to keep it.\": \"Versión {n} restaurada — guarda para conservarla.\",\n \"Version not found\": \"Versión no encontrada\",\n \"Versions\": \"Versiones\",\n \"Vertical alignment\": \"Alineación vertical\",\n \"Vertical space\": \"Espacio vertical\",\n \"Weight\": \"Peso\",\n \"When a recipient has none\": \"Cuando un destinatario no tiene valor\",\n \"Width\": \"Ancho\",\n \"Your company\": \"Tu empresa\",\n \"Your headline\": \"Tu titular\",\n \"Your text.\": \"Tu texto.\",\n \"“{name}” template applied.\": \"Plantilla “{name}” aplicada.\",\n \"€49 instead of €70\": \"49 € en lugar de 70 €\",\n \"Cancelled\": \"Cancelado\",\n \"Email generation is not configured\": \"La generación de correos no está configurada\",\n \"Too many generated emails — try again later\": \"Demasiados correos generados — inténtalo más tarde\",\n \"The AI service did not answer — try again in a moment.\": \"El servicio de IA no respondió — inténtalo de nuevo en un momento.\",\n \"Color scheme\": \"Esquema de color\",\n \"Light mode\": \"Modo claro\",\n \"Dark mode\": \"Modo oscuro\",\n \"Dark mode as Gmail and Outlook apps show it: light backgrounds turn dark, dark text turns light, images stay as they are.\": \"Modo oscuro tal como lo muestran las aplicaciones de Gmail y Outlook: los fondos claros se oscurecen, el texto oscuro se aclara y las imágenes no cambian.\",\n \"Subject ideas are not configured\": \"Las ideas de asunto no están configuradas\",\n \"Too many subject ideas — try again later\": \"Demasiadas solicitudes de ideas de asunto — inténtalo más tarde\",\n \"Text rewriting is not configured\": \"La reescritura de texto no está configurada\",\n \"Too many rewrites — try again later\": \"Demasiadas reescrituras — inténtalo más tarde\",\n \"Brand\": \"Marca\",\n \"Your brand\": \"Tu marca\",\n \"Set it once: new emails, templates and blocks take your logo, colors and font.\": \"Configúrala una sola vez: los correos, plantillas y bloques nuevos usarán tu logo, tus colores y tu fuente.\",\n \"Your website\": \"Tu sitio web\",\n \"Get my brand\": \"Obtener mi marca\",\n \"Reading the website…\": \"Leyendo el sitio web…\",\n \"The logo, colors and font are read from it. You can change them before saving.\": \"De ahí se toman el logo, los colores y la fuente. Puedes cambiarlos antes de guardar.\",\n \"The website could not be read.\": \"No se pudo leer el sitio web.\",\n \"Logo\": \"Logo\",\n \"Remove\": \"Quitar\",\n \"or an image address: https://…\": \"o la dirección de una imagen: https://…\",\n \"Company name\": \"Nombre de la empresa\",\n \"Main color\": \"Color principal\",\n \"Buttons, banners, links\": \"Botones, banners, enlaces\",\n \"Headings color\": \"Color de los títulos\",\n \"Also apply to this email\": \"Aplicar también a este correo\",\n \"Brand applied. Ctrl+Z brings back the previous look.\": \"Marca aplicada. Ctrl+Z recupera el aspecto anterior.\",\n \"Brand saved. New emails and blocks use it.\": \"Marca guardada. Los correos y bloques nuevos la usan.\",\n \"The brand could not be saved.\": \"No se pudo guardar la marca.\",\n \"Big news\": \"Gran noticia\",\n \"A short line under the title.\": \"Una línea breve bajo el título.\",\n \"A headline\": \"Un titular\",\n \"Some text, with\": \"Un poco de texto, con\",\n \"a link\": \"un enlace\",\n \"The brand is not configured\": \"La marca no está configurada\",\n \"Reading a brand from a website is not configured\": \"La lectura de la marca desde un sitio web no está configurada\",\n \"Too many websites read — try again later\": \"Demasiados sitios web leídos — inténtalo más tarde\",\n \"Enter the address of a website, like acme.com\": \"Escribe la dirección de un sitio web, por ejemplo acme.com\",\n \"This address is not a public website\": \"Esta dirección no es un sitio web público\",\n \"The website could not be reached. Check the address.\": \"No se pudo acceder al sitio web. Comprueba la dirección.\",\n \"The website took too long to answer\": \"El sitio web tardó demasiado en responder\",\n \"The website does not let the builder read it. Fill in your brand below.\": \"El sitio web no permite que el editor lo lea. Completa tu marca a continuación.\",\n \"This address is not a web page\": \"Esta dirección no es una página web\",\n \"The website redirects too many times\": \"El sitio web redirige demasiadas veces\",\n \"The website sent too much data\": \"El sitio web envió demasiados datos\",\n \"No logo was found on the website. Upload it below.\": \"No se encontró ningún logo en el sitio web. Súbelo a continuación.\",\n \"The logo on the website is an SVG or WebP image, which most email apps do not show. Upload a PNG or JPEG version.\": \"El logo del sitio web es una imagen SVG o WebP, que la mayoría de las aplicaciones de correo no muestran. Sube una versión PNG o JPEG.\",\n \"The website icon is used as the logo. Upload your full logo if you have one.\": \"Se usa el icono del sitio web como logo. Sube tu logo completo si lo tienes.\",\n \"No main color was found on the website. Pick one below.\": \"No se encontró ningún color principal en el sitio web. Elige uno a continuación.\",\n};\n","// French locale. Keys are the English source strings (see src/i18n/index.js).\n// Missing keys: `node scripts/i18n-keys.mjs fr`.\n\n/** @type {Record<string, string>} */\nexport const fr = {\n \"1. Complete your profile\": \"1. Complétez votre profil\",\n \"2. Explore\": \"2. Explorez\",\n \"3. Ask us anything\": \"3. Posez-nous vos questions\",\n \"30% off everything\": \"-30 % sur tout\",\n \"30% off this weekend only\": \"-30 % ce week-end seulement\",\n \"4 columns\": \"4 colonnes\",\n \"4-column section\": \"Section en 4 colonnes\",\n \"A few words about it.\": \"Quelques mots pour le présenter.\",\n \"A new feature\": \"Une nouveauté\",\n \"A sale with a discount code and two products\": \"Une vente avec un code promo et deux produits\",\n \"A tip\": \"Une astuce\",\n \"Add a block\": \"Ajouter un bloc\",\n \"Add to favorites\": \"Ajouter aux favoris\",\n \"All blocks\": \"Tous les blocs\",\n \"All capitals\": \"Tout en majuscules\",\n \"All templates\": \"Tous les modèles\",\n \"All your templates are in the favorites.\": \"Tous vos modèles sont dans les favoris.\",\n \"An empty page to build from scratch\": \"Une page vide pour partir de zéro\",\n \"An evening of talks and drinks with the team and our customers.\": \"Une soirée de rencontres autour d'un verre avec l'équipe et nos clients.\",\n \"An event\": \"Un événement\",\n \"Apply the link\": \"Appliquer le lien\",\n \"Article {n}\": \"Article {n}\",\n \"As typed\": \"Comme saisi\",\n \"Background image\": \"Image de fond\",\n \"Background image with a title and a button\": \"Image de fond avec un titre et un bouton\",\n \"Background width\": \"Largeur du fond\",\n \"Base\": \"Base\",\n \"Base — not editable: start from it to create your template.\": \"Base non modifiable — partez-en pour créer votre modèle.\",\n \"Bases\": \"Bases\",\n \"Blank\": \"Vierge\",\n \"Blog\": \"Blog\",\n \"Bold (Ctrl+B)\": \"Gras (Ctrl+B)\",\n \"Book my seat\": \"Je réserve ma place\",\n \"Builder\": \"Constructeur\",\n \"Buy\": \"Acheter\",\n \"by {name}\": \"par {name}\",\n \"Capitals\": \"Majuscules\",\n \"Choose a template\": \"Choisissez un modèle\",\n \"Choose an image in the panel\": \"Choisissez une image dans le panneau\",\n \"Clear formatting\": \"Effacer la mise en forme\",\n \"Clear the search\": \"Effacer la recherche\",\n \"Contact\": \"Contact\",\n \"Copy HTML\": \"Copier le HTML\",\n \"Could not load the templates.\": \"Impossible de charger les modèles.\",\n \"Created\": \"Créé\",\n \"Date, place and a button to book a seat\": \"Date, lieu et un bouton pour réserver\",\n \"Default ({value})\": \"Par défaut ({value})\",\n \"Delete “{name}”?\": \"Supprimer « {name} » ?\",\n \"Direction\": \"Disposition\",\n \"Download\": \"Télécharger\",\n \"Drag to move\": \"Glisser pour déplacer\",\n \"Drop a block here\": \"Déposez un bloc ici\",\n \"Edit: {element}\": \"Modifier : {element}\",\n \"Email canvas\": \"Aperçu modifiable de l’e-mail\",\n \"Email settings\": \"Réglages de l'e-mail\",\n \"Email template library\": \"Bibliothèque de modèles e-mail\",\n \"Equal\": \"Égales\",\n \"Facebook\": \"Facebook\",\n \"Favorites\": \"Favoris\",\n \"Fill the section\": \"Remplir la section\",\n \"First letters\": \"Premières lettres\",\n \"Get started\": \"Commencer\",\n \"GitHub\": \"GitHub\",\n \"Greets a new customer and lists the first steps\": \"Accueille un nouveau client et liste les premières étapes\",\n \"Heading\": \"Titre\",\n \"Hero banner\": \"Bannière\",\n \"Horizontal\": \"Horizontale\",\n \"HTML copied.\": \"HTML copié.\",\n \"Icon background\": \"Fond de l'icône\",\n \"Icon size\": \"Taille des icônes\",\n \"Icons linking to your profiles\": \"Icônes vers vos profils\",\n \"Image + text\": \"Image + texte\",\n \"Image beside a title, text and button\": \"Image à côté d'un titre, d'un texte et d'un bouton\",\n \"Image position\": \"Position de l'image\",\n \"Image size\": \"Taille de l'image\",\n \"In brief\": \"En bref\",\n \"Instagram\": \"Instagram\",\n \"Italic (Ctrl+I)\": \"Italique (Ctrl+I)\",\n \"Keep its width\": \"Garder sa largeur\",\n \"Label\": \"Texte affiché\",\n \"Large bold title\": \"Grand titre en gras\",\n \"LinkedIn\": \"LinkedIn\",\n \"Logo, headline, text and a button\": \"Logo, titre, texte et un bouton\",\n \"Menu\": \"Menu\",\n \"Menu link\": \"Lien du menu\",\n \"Monthly news: banner, two articles, highlights\": \"Les nouvelles du mois : bannière, deux articles, brèves\",\n \"Network\": \"Réseau\",\n \"No preview: this storage cannot render emails.\": \"Pas d'aperçu : ce stockage ne sait pas compiler les e-mails.\",\n \"No template yet. Start from a base, or create a new one.\": \"Aucun modèle pour l’instant. Partez d’une base, ou créez-en un.\",\n \"Nothing matches “{query}”.\": \"Aucun résultat pour « {query} ».\",\n \"Offer valid until Sunday midnight, while stocks last.\": \"Offre valable jusqu'à dimanche minuit, dans la limite des stocks.\",\n \"On mobile\": \"Sur mobile\",\n \"One sentence about it.\": \"Une phrase pour en parler.\",\n \"One sentence that makes people want to read on.\": \"Une phrase qui donne envie de lire la suite.\",\n \"Origin\": \"Origine\",\n \"Original size\": \"Taille d'origine\",\n \"Our offices, 1 Main Street\": \"Nos bureaux, 1 rue Principale\",\n \"Picking a template replaces the email being edited.\": \"Choisir un modèle remplace l'e-mail en cours de modification.\",\n \"Product one\": \"Produit un\",\n \"Product two\": \"Produit deux\",\n \"Profile URL\": \"Adresse du profil\",\n \"Promotion\": \"Promotion\",\n \"Read more\": \"Lire la suite\",\n \"Ready-made templates to copy into your campaigns.\": \"Modèles prêts à copier dans vos campagnes.\",\n \"Remove from favorites\": \"Retirer des favoris\",\n \"Remove the link\": \"Retirer le lien\",\n \"Replace\": \"Remplacer\",\n \"Replace the current email?\": \"Remplacer l'e-mail actuel ?\",\n \"Reply to this email: a person reads it.\": \"Répondez à cet e-mail : une personne le lit.\",\n \"Row of links to your site\": \"Rangée de liens vers votre site\",\n \"Save the date — seats are limited.\": \"Notez la date — les places sont limitées.\",\n \"Search templates\": \"Rechercher un modèle\",\n \"Seats are limited: book yours now, it takes ten seconds.\": \"Les places sont limitées : réservez la vôtre, cela prend dix secondes.\",\n \"Select a template on the left.\": \"Sélectionnez un modèle à gauche.\",\n \"Select the parent\": \"Sélectionner le bloc parent\",\n \"Shop\": \"Boutique\",\n \"Shop the sale\": \"Voir les offres\",\n \"Simple\": \"Simple\",\n \"So we can tailor what we send you.\": \"Pour adapter ce que nous vous envoyons.\",\n \"Social link\": \"Réseau social\",\n \"Social links\": \"Réseaux sociaux\",\n \"Space around each icon\": \"Espace autour de chaque icône\",\n \"Start from a template\": \"Partir d'un modèle\",\n \"Start from this base\": \"Partir de cette base\",\n \"Strikethrough\": \"Barré\",\n \"Take a tour of what you can do.\": \"Faites le tour de ce que vous pouvez faire.\",\n \"Template deleted.\": \"Modèle supprimé.\",\n \"Template duplicated.\": \"Modèle dupliqué.\",\n \"Templates\": \"Modèles\",\n \"Text formatting\": \"Mise en forme du texte\",\n \"Thank you for joining us. Here is how to get the most out of your account.\": \"Merci de nous avoir rejoints. Voici comment tirer le meilleur de votre compte.\",\n \"The browser refused to copy.\": \"Le navigateur a refusé la copie.\",\n \"The news of the month\": \"Les nouvelles du mois\",\n \"The template and its versions will be deleted.\": \"Le modèle et ses versions seront supprimés.\",\n \"The template preview appears here.\": \"L'aperçu du modèle s'affiche ici.\",\n \"This template was saved in a format this builder cannot open.\": \"Ce modèle a été enregistré dans un format que ce constructeur ne sait pas ouvrir.\",\n \"This weekend only, with the code SPRING30.\": \"Ce week-end seulement, avec le code SPRING30.\",\n \"Three steps to get started.\": \"Trois étapes pour bien commencer.\",\n \"Thursday, 7 pm\": \"Jeudi, 19 h\",\n \"Title\": \"Titre\",\n \"Two or three sentences that sum up the story and make people want the rest.\": \"Deux ou trois phrases qui résument l'article et donnent envie de lire la suite.\",\n \"Underline (Ctrl+U)\": \"Souligné (Ctrl+U)\",\n \"Updated\": \"Modifié\",\n \"Vertical\": \"Verticale\",\n \"Welcome aboard!\": \"Bienvenue à bord !\",\n \"Welcome, {name}!\": \"Bienvenue, {name} !\",\n \"What changed, what is coming, and two stories worth your time.\": \"Ce qui a changé, ce qui arrive, et deux articles qui valent le détour.\",\n \"When\": \"Quand\",\n \"Where\": \"Où\",\n \"Whole image\": \"Image entière\",\n \"Whole screen\": \"Tout l’écran\",\n \"With the code SPRING30, until Sunday midnight.\": \"Avec le code SPRING30, jusqu'à dimanche minuit.\",\n \"X\": \"X\",\n \"You're invited\": \"On vous invite !\",\n \"Your big announcement\": \"Votre grande annonce\",\n \"YouTube\": \"YouTube\",\n \"{count} sections selected. Press Delete to remove them (Ctrl+Z brings them back).\": \"{count} sections sélectionnées. Appuyez sur Suppr pour les supprimer (Ctrl+Z les rétablit).\",\n \"{label} — {side}\": \"{label} — {side}\",\n \"{max} test addresses at most\": \"{max} adresses de test au maximum\",\n \"{message} Your version can be saved as a copy.\": \"{message} Votre version peut être enregistrée comme copie.\",\n \"{name} (copy)\": \"{name} (copie)\",\n \"{sent} sent, {failed} failed.\": \"{sent} parti(s), {failed} en échec.\",\n \"{sent} test(s) sent — check your inbox.\": \"{sent} test(s) parti(s) — ouvrez votre messagerie avant de continuer.\",\n \"1 column\": \"1 colonne\",\n \"2 columns\": \"2 colonnes\",\n \"2-column section\": \"Section en 2 colonnes\",\n \"25%\": \"25 %\",\n \"3 columns\": \"3 colonnes\",\n \"3-column section\": \"Section en 3 colonnes\",\n \"50%\": \"50 %\",\n \"600 px (standard)\": \"600 px (standard)\",\n \"640 px\": \"640 px\",\n \"75%\": \"75 %\",\n \"Address not allowed\": \"Adresse refusée\",\n \"Addresses\": \"Adresses\",\n \"Alignment\": \"Alignement\",\n \"Alt text\": \"Texte alternatif\",\n \"An https:// address is required\": \"Une adresse https:// est requise\",\n \"attribute {name} not allowed\": \"attribut {name} interdit\",\n \"Authentication required\": \"Authentification requise\",\n \"Autosave\": \"Sauvegarde automatique\",\n \"Autosave paused\": \"Sauvegarde automatique suspendue\",\n \"Autosaved at {time}\": \"Enregistré automatiquement à {time}\",\n \"Autosaving…\": \"Sauvegarde automatique…\",\n \"Available in every template.\": \"Disponible dans tous les modèles.\",\n \"Back\": \"Retour\",\n \"Background\": \"Fond\",\n \"base tag not allowed\": \"balise base interdite\",\n \"Blocks\": \"Blocs\",\n \"Bold\": \"Gras\",\n \"Bottom\": \"Bas\",\n \"Button\": \"Bouton\",\n \"Button background\": \"Fond du bouton\",\n \"Button padding\": \"Marges du bouton\",\n \"Button without link ({count})\": \"Bouton sans lien ({count})\",\n \"Call to action\": \"Appel à l’action\",\n \"Campaign\": \"Campagne\",\n \"Campaign name\": \"Nom de la campagne\",\n \"Cancel\": \"Annuler\",\n \"CDATA section not allowed\": \"section CDATA interdite\",\n \"Center\": \"Centre\",\n \"Close\": \"Fermer\",\n \"Colors\": \"Couleurs\",\n \"Column\": \"Colonne\",\n \"Company\": \"Société\",\n \"component script not allowed\": \"script de composant interdit\",\n \"conditional comment not allowed\": \"commentaire conditionnel interdit\",\n \"Confirm\": \"Confirmer\",\n \"Content\": \"Contenu\",\n \"Content width\": \"Largeur du contenu\",\n \"Copy saved: “{name}”.\": \"Copie enregistrée : « {name} ».\",\n \"Corner radius\": \"Arrondi\",\n \"Create\": \"Créer\",\n \"Create “{name}”\": \"Créer « {name} »\",\n \"current\": \"actuelle\",\n \"Custom\": \"Personnalisées\",\n \"Custom variables are not configured\": \"Les variables personnalisées ne sont pas configurées\",\n \"Dashed\": \"Tirets\",\n \"Default\": \"Par défaut\",\n \"Delete\": \"Supprimer\",\n \"Delete (Del)\": \"Supprimer (Suppr)\",\n \"Delete the variable “{name}”?\": \"Supprimer la variable « {name} » ?\",\n \"Describes the image if it is blocked\": \"Décrit l’image si elle est bloquée\",\n \"Deselect\": \"Désélectionner\",\n \"Desktop\": \"Bureau\",\n \"Device\": \"Appareil\",\n \"Dismiss\": \"Masquer\",\n \"Divider\": \"Séparateur\",\n \"Dotted\": \"Pointillés\",\n \"Double-click the text to edit it.\": \"Double-cliquez sur le texte pour le modifier.\",\n \"Duplicate\": \"Dupliquer\",\n \"Edit\": \"Modifier\",\n \"Edit “{name}”\": \"Modifier « {name} »\",\n \"Edit variable\": \"Modifier la variable\",\n \"Element actions\": \"Actions sur l’élément\",\n \"Email\": \"Courriel\",\n \"Email address\": \"Adresse e-mail\",\n \"Email preview\": \"Aperçu du courriel\",\n \"embed not allowed\": \"embed interdit\",\n \"Empty file\": \"Fichier vide\",\n \"Empty MJML\": \"MJML vide\",\n \"Empty MJML compilation\": \"Compilation MJML vide\",\n \"Empty subject\": \"Objet vide\",\n \"executable content not allowed\": \"contenu exécutable interdit\",\n \"external resource not allowed\": \"ressource externe interdite\",\n \"File missing\": \"Fichier manquant\",\n \"Final rendering, variables filled with samples.\": \"Rendu final, variables remplies d’exemples.\",\n \"First name\": \"Prénom\",\n \"Fit to text\": \"Ajustée au texte\",\n \"Font\": \"Police\",\n \"forbidden element in project: {tag}\": \"élément interdit dans le projet : {tag}\",\n \"form field not allowed\": \"champ de formulaire interdit\",\n \"form not allowed\": \"formulaire interdit\",\n \"Format rejected: PNG, JPEG or GIF expected\": \"Format refusé : PNG, JPEG ou GIF attendu\",\n \"frame not allowed\": \"frame interdite\",\n \"Full length\": \"Toute la largeur\",\n \"Full width\": \"Pleine largeur\",\n \"Full-width section\": \"Section pleine largeur\",\n \"Give the template a name before saving it.\": \"Donnez un libellé au modèle avant de l’enregistrer.\",\n \"Group\": \"Groupe\",\n \"Height\": \"Hauteur\",\n \"Hello {name},\": \"Bonjour {name},\",\n \"Hex code\": \"Code hexadécimal\",\n \"Horizontal rule\": \"Filet horizontal\",\n \"HTML button not allowed (use the Button block)\": \"bouton HTML interdit (utiliser le bloc Bouton)\",\n \"iframe not allowed\": \"iframe interdite\",\n \"Ignored (invalid): {email}\": \"Ignorée (invalide) : {email}\",\n \"Image\": \"Image\",\n \"image rejected ({name})\": \"image refusée ({name})\",\n \"image rejected ({name}): https only\": \"image refusée ({name}) : https seulement\",\n \"Image too large: {max} MB maximum\": \"Image trop lourde : {max} Mo au maximum\",\n \"Image without alt text ({count})\": \"Texte alternatif manquant ({count} image(s))\",\n \"Image without file ({count})\": \"Image sans fichier ({count})\",\n \"Inbox\": \"Boîte de réception\",\n \"Indicative preview — check it with “Send test”.\": \"Aperçu indicatif — validez avec « Envoyer un test ».\",\n \"inline style rejected\": \"style en ligne refusé\",\n \"Insecure http link ({count})\": \"Lien non sécurisé en http ({count})\",\n \"Insert a variable in the preview text\": \"Insérer une variable dans le texte d’aperçu\",\n \"Insert a variable in the subject\": \"Insérer une variable dans l’objet\",\n \"Internal error\": \"Erreur interne\",\n \"Invalid JSON\": \"JSON invalide\",\n \"Justify\": \"Justifié\",\n \"Key is required\": \"Balise requise\",\n \"Last name\": \"Nom\",\n \"Layout\": \"Mise en page\",\n \"Learn more\": \"Découvrir\",\n \"Leave\": \"Quitter\",\n \"Leave the builder?\": \"Quitter le constructeur ?\",\n \"Left\": \"Gauche\",\n \"Length\": \"Longueur\",\n \"Line color\": \"Couleur du filet\",\n \"Line height\": \"Interligne\",\n \"Line style\": \"Trait\",\n \"Link\": \"Lien\",\n \"Link on click\": \"Lien au clic\",\n \"Link URL\": \"Adresse du lien\",\n \"Links\": \"Liens\",\n \"Loading the builder\": \"Chargement du constructeur\",\n \"Loading…\": \"Chargement…\",\n \"Lowercase letters, digits, \\\"_\\\" and \\\".\\\" only, starting with a letter\": \"Minuscules, chiffres, « _ » et « . » seulement, en commençant par une lettre\",\n \"MathML not allowed\": \"MathML interdit\",\n \"Message is {size} KB: Gmail clips messages over {limit} KB\": \"Message de {size} Ko : Gmail le coupe au-delà de {limit} Ko\",\n \"meta tag not allowed\": \"balise meta interdite\",\n \"Middle\": \"Milieu\",\n \"missing <mj-body>\": \"<mj-body> manquant\",\n \"Missing unsubscribe link\": \"Lien de désinscription absent\",\n \"mj-font (external font) is outside the builder\": \"mj-font (police externe) est hors du constructeur\",\n \"mj-include would read a file from the server\": \"mj-include lirait un fichier du serveur\",\n \"mj-raw (free HTML) is not allowed\": \"mj-raw (HTML libre) est refusé\",\n \"mj-style (free CSS) is outside the builder\": \"mj-style (CSS libre) est hors du constructeur\",\n \"MJML too large ({size} KB, maximum {max} KB)\": \"MJML trop volumineux ({size} ko, maximum {max} ko)\",\n \"Mobile\": \"Mobile\",\n \"Move down\": \"Descendre\",\n \"Move left\": \"Déplacer à gauche\",\n \"Move right\": \"Déplacer à droite\",\n \"Move up\": \"Monter\",\n \"Multipart form expected\": \"Formulaire multipart attendu\",\n \"Name\": \"Libellé\",\n \"Name is required\": \"Libellé requis\",\n \"Name required\": \"Libellé requis\",\n \"New template\": \"Nouveau modèle\",\n \"New variable\": \"Nouvelle variable\",\n \"No changes\": \"Aucune modification\",\n \"No preview text\": \"Aucun texte d’aperçu\",\n \"No subject\": \"Sans objet\",\n \"No usable test address\": \"Aucune adresse de test exploitable\",\n \"No variable found.\": \"Aucune variable trouvée.\",\n \"No versions yet.\": \"Aucune version.\",\n \"Normal\": \"Normale\",\n \"Nothing to fix.\": \"Aucun point à corriger.\",\n \"Nothing to show yet.\": \"Rien à afficher pour l’instant.\",\n \"object not allowed\": \"object interdit\",\n \"Order number\": \"Numéro de commande\",\n \"Padding\": \"Marges\",\n \"Page background\": \"Fond de page\",\n \"Paragraph or heading\": \"Paragraphe ou titre\",\n \"Photo, visual or logo\": \"Photo, visuel ou logo\",\n \"Pick a colour\": \"Choisir une couleur\",\n \"Points to check\": \"Points à vérifier\",\n \"Preview\": \"Aperçu\",\n \"Preview and tests\": \"Aperçu et tests\",\n \"Preview text\": \"Texte d’aperçu\",\n \"Project rejected: {issues}\": \"Projet refusé : {issues}\",\n \"project too deep\": \"projet trop profond\",\n \"project too large ({size} KB, maximum {max} KB)\": \"projet trop volumineux ({size} ko, maximum {max} ko)\",\n \"Properties\": \"Propriétés\",\n \"Recipient\": \"Destinataire\",\n \"Redo\": \"Rétablir\",\n \"Redo (Ctrl+Y)\": \"Rétablir (Ctrl+Y)\",\n \"Refresh\": \"Rafraîchir\",\n \"Rendering…\": \"Rendu en cours…\",\n \"Request too large\": \"Requête trop volumineuse\",\n \"Restore\": \"Recharger\",\n \"Restore version {n}\": \"Recharger la version {n}\",\n \"Restore version {n}?\": \"Recharger la version {n} ?\",\n \"Results\": \"Résultats\",\n \"Resume\": \"Reprendre\",\n \"Resume the draft?\": \"Reprendre le brouillon ?\",\n \"Retry\": \"Réessayer\",\n \"Right\": \"Droite\",\n \"Route not found\": \"Route introuvable\",\n \"Sample value\": \"Valeur d’exemple\",\n \"Save\": \"Enregistrer\",\n \"Save a copy\": \"Enregistrer une copie\",\n \"Save the template first\": \"Enregistrez d’abord le modèle\",\n \"Saved\": \"Enregistré\",\n \"Saved — version {n}.\": \"Enregistré — version {n}.\",\n \"Saved at {time}\": \"Enregistré à {time}\",\n \"Saved, with {count} MJML warning(s): {message}\": \"Enregistré, avec {count} avertissement(s) MJML : {message}\",\n \"Saved. {count} image(s) have no picture yet: they are left out of the email until you add one.\": \"Enregistré. {count} image(s) sans visuel pour l’instant : elles restent hors de l’e-mail tant que vous n’en ajoutez pas.\",\n \"Saving…\": \"Enregistrement…\",\n \"script not allowed\": \"script interdit\",\n \"Search variables…\": \"Rechercher une variable…\",\n \"Section\": \"Section\",\n \"Select a text or a button first.\": \"Sélectionnez d’abord un texte ou un bouton.\",\n \"Send\": \"Envoyer\",\n \"Send a test\": \"Envoyer un test\",\n \"Shown after the subject in the inbox\": \"Affiché après l’objet dans la boîte de réception\",\n \"Size\": \"Taille\",\n \"Solid\": \"Plein\",\n \"Spacer\": \"Espace\",\n \"Spacing\": \"Espacement\",\n \"Start over\": \"Partir de zéro\",\n \"style sheet not allowed\": \"feuille de style interdite\",\n \"Subject\": \"Objet\",\n \"SVG not allowed\": \"SVG interdit\",\n \"Tag\": \"Balise\",\n \"tag not allowed: <{tag}>\": \"balise non admise : <{tag}>\",\n \"Template\": \"Modèle\",\n \"Template changed in the meantime\": \"Modèle modifié entre-temps\",\n \"Template changed in the meantime — reload it before saving\": \"Modèle modifié entre-temps — rechargez-le avant d’enregistrer\",\n \"Template changed in the meantime by {user} — reload it before saving\": \"Modèle modifié entre-temps par {user} — rechargez-le avant d’enregistrer\",\n \"Template not found\": \"Modèle introuvable\",\n \"Template rejected: {issues}\": \"Modèle refusé : {issues}\",\n \"Template rejected: {issues} (+{more})\": \"Modèle refusé : {issues} (+{more})\",\n \"Template saved.\": \"Modèle enregistré.\",\n \"Templates that use it will show its “value if empty”.\": \"Les modèles qui l’utilisent afficheront sa « valeur si vide ».\",\n \"Test\": \"Tester\",\n \"Test sending is not configured\": \"L’envoi de test n’est pas configuré\",\n \"Text\": \"Texte\",\n \"The builder could not load.\": \"Le constructeur n’a pas pu se charger.\",\n \"The builder could not start.\": \"Le constructeur n’a pas pu démarrer.\",\n \"the document must start with <mjml>\": \"le document doit commencer par <mjml>\",\n \"The draft will be offered again next time.\": \"Le brouillon reste proposé à la prochaine ouverture.\",\n \"The email on screen, to reviewers’ addresses.\": \"Le courriel à l’écran, aux adresses de relecture.\",\n \"The template could not be loaded.\": \"Le modèle n’a pas pu être chargé.\",\n \"Thickness\": \"Épaisseur\",\n \"This key is already used\": \"Cette balise existe déjà\",\n \"To check\": \"À vérifier\",\n \"Too many test sends — try again later\": \"Trop d’envois de test — réessayez plus tard\",\n \"Too many uploads — try again later\": \"Trop de dépôts d’images — réessayez plus tard\",\n \"Top\": \"Haut\",\n \"Typography\": \"Typographie\",\n \"Undo\": \"Annuler\",\n \"Undo (Ctrl+Z)\": \"Annuler (Ctrl+Z)\",\n \"Unknown variables (rendered empty): {tags}\": \"Variables inconnues (affichées vides) : {tags}\",\n \"Unsaved changes\": \"Modifications non enregistrées\",\n \"Unsaved changes will be lost.\": \"Les modifications non enregistrées seront perdues.\",\n \"Unsaved changes will be replaced.\": \"Les modifications non enregistrées seront remplacées.\",\n \"Unsaved template from {when}.\": \"Modèle non enregistré du {when}.\",\n \"Unsubscribe\": \"Se désinscrire\",\n \"Unsubscribe link\": \"Lien de désinscription\",\n \"Upload\": \"Déposer\",\n \"Upload failed\": \"Dépôt impossible\",\n \"URL rejected ({name})\": \"adresse refusée ({name})\",\n \"Value if empty\": \"Valeur si vide\",\n \"Variable “{name}” created and inserted.\": \"Variable « {name} » créée et insérée.\",\n \"Variable “{name}” created.\": \"Variable « {name} » créée.\",\n \"Variable “{name}” saved.\": \"Variable « {name} » enregistrée.\",\n \"Variable deleted.\": \"Variable supprimée.\",\n \"Variable not found\": \"Variable introuvable\",\n \"Variables\": \"Variables\",\n \"Version {n}\": \"Version {n}\",\n \"Version {n} restored — save to keep it.\": \"Version {n} rechargée — enregistrez pour la garder.\",\n \"Version not found\": \"Version introuvable\",\n \"Versions\": \"Versions\",\n \"Vertical alignment\": \"Alignement vertical\",\n \"Vertical space\": \"Vide vertical\",\n \"Weight\": \"Graisse\",\n \"When a recipient has none\": \"Quand un destinataire n’en a pas\",\n \"Width\": \"Largeur\",\n \"Your company\": \"Votre société\",\n \"Your headline\": \"Titre du message\",\n \"Your text.\": \"Votre texte.\",\n \"“{name}” template applied.\": \"Modèle « {name} » appliqué.\",\n \"€49 instead of €70\": \"49 € au lieu de 70 €\",\n \"Cancelled\": \"Annulé\",\n \"Email generation is not configured\": \"La génération d'e-mails n'est pas configurée\",\n \"Too many generated emails — try again later\": \"Trop d'e-mails générés — réessayez plus tard\",\n \"The AI service did not answer — try again in a moment.\": \"Le service d'IA n'a pas répondu — réessayez dans un instant.\",\n \"Color scheme\": \"Thème de couleurs\",\n \"Light mode\": \"Mode clair\",\n \"Dark mode\": \"Mode sombre\",\n \"Dark mode as Gmail and Outlook apps show it: light backgrounds turn dark, dark text turns light, images stay as they are.\": \"Mode sombre tel que l'affichent les applis Gmail et Outlook : les fonds clairs deviennent sombres, le texte foncé devient clair, les images restent telles quelles.\",\n \"Subject ideas are not configured\": \"Les idées d'objet ne sont pas configurées\",\n \"Too many subject ideas — try again later\": \"Trop de demandes d'idées d'objet — réessayez plus tard\",\n \"Text rewriting is not configured\": \"La réécriture de texte n'est pas configurée\",\n \"Too many rewrites — try again later\": \"Trop de réécritures — réessayez plus tard\",\n \"Brand\": \"Marque\",\n \"Your brand\": \"Votre marque\",\n \"Set it once: new emails, templates and blocks take your logo, colors and font.\": \"À définir une fois : les nouveaux e-mails, modèles et blocs prennent votre logo, vos couleurs et votre police.\",\n \"Your website\": \"Votre site web\",\n \"Get my brand\": \"Récupérer ma marque\",\n \"Reading the website…\": \"Lecture du site…\",\n \"The logo, colors and font are read from it. You can change them before saving.\": \"Le logo, les couleurs et la police y sont lus. Vous pourrez les modifier avant d'enregistrer.\",\n \"The website could not be read.\": \"Le site n'a pas pu être lu.\",\n \"Logo\": \"Logo\",\n \"Remove\": \"Retirer\",\n \"or an image address: https://…\": \"ou l'adresse d'une image : https://…\",\n \"Company name\": \"Nom de l'entreprise\",\n \"Main color\": \"Couleur principale\",\n \"Buttons, banners, links\": \"Boutons, bandeaux, liens\",\n \"Headings color\": \"Couleur des titres\",\n \"Also apply to this email\": \"Appliquer aussi à cet e-mail\",\n \"Brand applied. Ctrl+Z brings back the previous look.\": \"Marque appliquée. Ctrl+Z rétablit l'apparence précédente.\",\n \"Brand saved. New emails and blocks use it.\": \"Marque enregistrée. Les nouveaux e-mails et blocs l'utilisent.\",\n \"The brand could not be saved.\": \"La marque n'a pas pu être enregistrée.\",\n \"Big news\": \"Grande nouvelle\",\n \"A short line under the title.\": \"Une courte ligne sous le titre.\",\n \"A headline\": \"Un titre\",\n \"Some text, with\": \"Un peu de texte, avec\",\n \"a link\": \"un lien\",\n \"The brand is not configured\": \"La marque n'est pas configurée\",\n \"Reading a brand from a website is not configured\": \"La lecture d'une marque depuis un site n'est pas configurée\",\n \"Too many websites read — try again later\": \"Trop de sites lus — réessayez plus tard\",\n \"Enter the address of a website, like acme.com\": \"Saisissez l'adresse d'un site, par exemple acme.com\",\n \"This address is not a public website\": \"Cette adresse n'est pas un site public\",\n \"The website could not be reached. Check the address.\": \"Le site est injoignable. Vérifiez l'adresse.\",\n \"The website took too long to answer\": \"Le site a mis trop de temps à répondre\",\n \"The website does not let the builder read it. Fill in your brand below.\": \"Le site ne se laisse pas lire par l'éditeur. Renseignez votre marque ci-dessous.\",\n \"This address is not a web page\": \"Cette adresse n'est pas une page web\",\n \"The website redirects too many times\": \"Le site redirige trop de fois\",\n \"The website sent too much data\": \"Le site a envoyé trop de données\",\n \"No logo was found on the website. Upload it below.\": \"Aucun logo trouvé sur le site. Importez-le ci-dessous.\",\n \"The logo on the website is an SVG or WebP image, which most email apps do not show. Upload a PNG or JPEG version.\": \"Le logo du site est une image SVG ou WebP, que la plupart des messageries n'affichent pas. Importez une version PNG ou JPEG.\",\n \"The website icon is used as the logo. Upload your full logo if you have one.\": \"L'icône du site sert de logo. Importez votre logo complet si vous en avez un.\",\n \"No main color was found on the website. Pick one below.\": \"Aucune couleur principale trouvée sur le site. Choisissez-en une ci-dessous.\",\n};\n","// Portuguese (Brazil) locale. Keys are the English source strings (see src/i18n/index.js).\n// Missing keys: `node scripts/i18n-keys.mjs pt`.\n\n/** @type {Record<string, string>} */\nexport const pt = {\n \"1. Complete your profile\": \"1. Complete seu perfil\",\n \"2. Explore\": \"2. Explore\",\n \"3. Ask us anything\": \"3. Pergunte o que quiser\",\n \"30% off everything\": \"30% de desconto em tudo\",\n \"30% off this weekend only\": \"30% de desconto só neste fim de semana\",\n \"4 columns\": \"4 colunas\",\n \"4-column section\": \"Seção de 4 colunas\",\n \"A few words about it.\": \"Algumas palavras para apresentá-lo.\",\n \"A new feature\": \"Uma novidade\",\n \"A sale with a discount code and two products\": \"Uma promoção com cupom de desconto e dois produtos\",\n \"A tip\": \"Uma dica\",\n \"Add a block\": \"Adicionar um bloco\",\n \"Add to favorites\": \"Adicionar aos favoritos\",\n \"All blocks\": \"Todos os blocos\",\n \"All capitals\": \"Tudo em maiúsculas\",\n \"All templates\": \"Todos os modelos\",\n \"All your templates are in the favorites.\": \"Todos os seus modelos estão nos favoritos.\",\n \"An empty page to build from scratch\": \"Uma página em branco para começar do zero\",\n \"An evening of talks and drinks with the team and our customers.\": \"Uma noite de bate-papo e drinks com a equipe e nossos clientes.\",\n \"An event\": \"Um evento\",\n \"Apply the link\": \"Aplicar o link\",\n \"Article {n}\": \"Artigo {n}\",\n \"As typed\": \"Como digitado\",\n \"Background image\": \"Imagem de fundo\",\n \"Background image with a title and a button\": \"Imagem de fundo com um título e um botão\",\n \"Background width\": \"Largura do fundo\",\n \"Base\": \"Base\",\n \"Base — not editable: start from it to create your template.\": \"Base — não editável: comece por ela para criar seu modelo.\",\n \"Bases\": \"Bases\",\n \"Blank\": \"Em branco\",\n \"Blog\": \"Blog\",\n \"Bold (Ctrl+B)\": \"Negrito (Ctrl+B)\",\n \"Book my seat\": \"Garantir minha vaga\",\n \"Builder\": \"Editor\",\n \"Buy\": \"Comprar\",\n \"by {name}\": \"por {name}\",\n \"Capitals\": \"Maiúsculas\",\n \"Choose a template\": \"Escolha um modelo\",\n \"Choose an image in the panel\": \"Escolha uma imagem no painel\",\n \"Clear formatting\": \"Limpar formatação\",\n \"Clear the search\": \"Limpar a pesquisa\",\n \"Contact\": \"Contato\",\n \"Copy HTML\": \"Copiar HTML\",\n \"Could not load the templates.\": \"Não foi possível carregar os modelos.\",\n \"Created\": \"Criado\",\n \"Date, place and a button to book a seat\": \"Data, local e um botão para garantir a vaga\",\n \"Default ({value})\": \"Padrão ({value})\",\n \"Delete “{name}”?\": \"Excluir “{name}”?\",\n \"Direction\": \"Orientação\",\n \"Download\": \"Baixar\",\n \"Drag to move\": \"Arraste para mover\",\n \"Drop a block here\": \"Solte um bloco aqui\",\n \"Edit: {element}\": \"Editar: {element}\",\n \"Email canvas\": \"Tela de edição do e-mail\",\n \"Email settings\": \"Configurações do e-mail\",\n \"Email template library\": \"Biblioteca de modelos de e-mail\",\n \"Equal\": \"Iguais\",\n \"Facebook\": \"Facebook\",\n \"Favorites\": \"Favoritos\",\n \"Fill the section\": \"Preencher a seção\",\n \"First letters\": \"Iniciais maiúsculas\",\n \"Get started\": \"Começar\",\n \"GitHub\": \"GitHub\",\n \"Greets a new customer and lists the first steps\": \"Dá as boas-vindas a um novo cliente e lista os primeiros passos\",\n \"Heading\": \"Título\",\n \"Hero banner\": \"Banner principal\",\n \"Horizontal\": \"Horizontal\",\n \"HTML copied.\": \"HTML copiado.\",\n \"Icon background\": \"Fundo do ícone\",\n \"Icon size\": \"Tamanho dos ícones\",\n \"Icons linking to your profiles\": \"Ícones com links para seus perfis\",\n \"Image + text\": \"Imagem + texto\",\n \"Image beside a title, text and button\": \"Imagem ao lado de um título, um texto e um botão\",\n \"Image position\": \"Posição da imagem\",\n \"Image size\": \"Tamanho da imagem\",\n \"In brief\": \"Em resumo\",\n \"Instagram\": \"Instagram\",\n \"Italic (Ctrl+I)\": \"Itálico (Ctrl+I)\",\n \"Keep its width\": \"Manter a largura\",\n \"Label\": \"Texto exibido\",\n \"Large bold title\": \"Título grande em negrito\",\n \"LinkedIn\": \"LinkedIn\",\n \"Logo, headline, text and a button\": \"Logo, título, texto e um botão\",\n \"Menu\": \"Menu\",\n \"Menu link\": \"Link do menu\",\n \"Monthly news: banner, two articles, highlights\": \"Novidades do mês: banner, dois artigos e destaques\",\n \"Network\": \"Rede social\",\n \"No preview: this storage cannot render emails.\": \"Sem pré-visualização: este armazenamento não consegue renderizar e-mails.\",\n \"No template yet. Start from a base, or create a new one.\": \"Ainda não há modelos. Comece por uma base ou crie um novo.\",\n \"Nothing matches “{query}”.\": \"Nenhum resultado para “{query}”.\",\n \"Offer valid until Sunday midnight, while stocks last.\": \"Oferta válida até domingo à meia-noite ou enquanto durarem os estoques.\",\n \"On mobile\": \"No celular\",\n \"One sentence about it.\": \"Uma frase sobre o assunto.\",\n \"One sentence that makes people want to read on.\": \"Uma frase que dá vontade de continuar lendo.\",\n \"Origin\": \"Origem\",\n \"Original size\": \"Tamanho original\",\n \"Our offices, 1 Main Street\": \"Nosso escritório, Rua Principal, 1\",\n \"Picking a template replaces the email being edited.\": \"Escolher um modelo substitui o e-mail em edição.\",\n \"Product one\": \"Produto um\",\n \"Product two\": \"Produto dois\",\n \"Profile URL\": \"URL do perfil\",\n \"Promotion\": \"Promoção\",\n \"Read more\": \"Leia mais\",\n \"Ready-made templates to copy into your campaigns.\": \"Modelos prontos para copiar nas suas campanhas.\",\n \"Remove from favorites\": \"Remover dos favoritos\",\n \"Remove the link\": \"Remover o link\",\n \"Replace\": \"Substituir\",\n \"Replace the current email?\": \"Substituir o e-mail atual?\",\n \"Reply to this email: a person reads it.\": \"Responda a este e-mail: uma pessoa de verdade vai ler.\",\n \"Row of links to your site\": \"Linha de links para o seu site\",\n \"Save the date — seats are limited.\": \"Reserve a data — as vagas são limitadas.\",\n \"Search templates\": \"Pesquisar modelos\",\n \"Seats are limited: book yours now, it takes ten seconds.\": \"As vagas são limitadas: garanta a sua agora, leva só dez segundos.\",\n \"Select a template on the left.\": \"Selecione um modelo à esquerda.\",\n \"Select the parent\": \"Selecionar o elemento pai\",\n \"Shop\": \"Loja\",\n \"Shop the sale\": \"Ver ofertas\",\n \"Simple\": \"Simples\",\n \"So we can tailor what we send you.\": \"Assim podemos personalizar o que enviamos para você.\",\n \"Social link\": \"Link de rede social\",\n \"Social links\": \"Redes sociais\",\n \"Space around each icon\": \"Espaço ao redor de cada ícone\",\n \"Start from a template\": \"Começar com um modelo\",\n \"Start from this base\": \"Começar com esta base\",\n \"Strikethrough\": \"Tachado\",\n \"Take a tour of what you can do.\": \"Descubra tudo o que você pode fazer.\",\n \"Template deleted.\": \"Modelo excluído.\",\n \"Template duplicated.\": \"Modelo duplicado.\",\n \"Templates\": \"Modelos\",\n \"Text formatting\": \"Formatação de texto\",\n \"Thank you for joining us. Here is how to get the most out of your account.\": \"Obrigado por se juntar a nós. Veja como aproveitar ao máximo sua conta.\",\n \"The browser refused to copy.\": \"O navegador não permitiu copiar.\",\n \"The news of the month\": \"As novidades do mês\",\n \"The template and its versions will be deleted.\": \"O modelo e as versões dele serão excluídos.\",\n \"The template preview appears here.\": \"A pré-visualização do modelo aparece aqui.\",\n \"This template was saved in a format this builder cannot open.\": \"Este modelo foi salvo em um formato que este editor não consegue abrir.\",\n \"This weekend only, with the code SPRING30.\": \"Só neste fim de semana, com o cupom SPRING30.\",\n \"Three steps to get started.\": \"Três passos para começar.\",\n \"Thursday, 7 pm\": \"Quinta-feira, 19h\",\n \"Title\": \"Título\",\n \"Two or three sentences that sum up the story and make people want the rest.\": \"Duas ou três frases que resumem a matéria e dão vontade de ler o resto.\",\n \"Underline (Ctrl+U)\": \"Sublinhado (Ctrl+U)\",\n \"Updated\": \"Atualizado\",\n \"Vertical\": \"Vertical\",\n \"Welcome aboard!\": \"Que bom ter você com a gente!\",\n \"Welcome, {name}!\": \"Boas-vindas, {name}!\",\n \"What changed, what is coming, and two stories worth your time.\": \"O que mudou, o que vem por aí e duas matérias que valem a sua leitura.\",\n \"When\": \"Quando\",\n \"Where\": \"Onde\",\n \"Whole image\": \"Imagem inteira\",\n \"Whole screen\": \"Tela inteira\",\n \"With the code SPRING30, until Sunday midnight.\": \"Com o cupom SPRING30, até domingo à meia-noite.\",\n \"X\": \"X\",\n \"You're invited\": \"Temos um convite para você\",\n \"Your big announcement\": \"Seu grande anúncio\",\n \"YouTube\": \"YouTube\",\n \"{count} sections selected. Press Delete to remove them (Ctrl+Z brings them back).\": \"Seções selecionadas: {count}. Pressione Delete para excluí-las (Ctrl+Z as traz de volta).\",\n \"{label} — {side}\": \"{label} — {side}\",\n \"{max} test addresses at most\": \"Máximo de endereços de teste: {max}\",\n \"{message} Your version can be saved as a copy.\": \"{message} Você pode salvar sua versão como cópia.\",\n \"{name} (copy)\": \"{name} (cópia)\",\n \"{sent} sent, {failed} failed.\": \"Enviados: {sent}. Com falha: {failed}.\",\n \"{sent} test(s) sent — check your inbox.\": \"Testes enviados: {sent} — confira sua caixa de entrada.\",\n \"1 column\": \"1 coluna\",\n \"2 columns\": \"2 colunas\",\n \"2-column section\": \"Seção de 2 colunas\",\n \"25%\": \"25%\",\n \"3 columns\": \"3 colunas\",\n \"3-column section\": \"Seção de 3 colunas\",\n \"50%\": \"50%\",\n \"600 px (standard)\": \"600 px (padrão)\",\n \"640 px\": \"640 px\",\n \"75%\": \"75%\",\n \"Address not allowed\": \"Endereço não permitido\",\n \"Addresses\": \"Endereços\",\n \"Alignment\": \"Alinhamento\",\n \"Alt text\": \"Texto alternativo\",\n \"An https:// address is required\": \"É necessário um endereço https://\",\n \"attribute {name} not allowed\": \"atributo {name} não permitido\",\n \"Authentication required\": \"Autenticação necessária\",\n \"Autosave\": \"Salvamento automático\",\n \"Autosave paused\": \"Salvamento automático pausado\",\n \"Autosaved at {time}\": \"Salvo automaticamente às {time}\",\n \"Autosaving…\": \"Salvando automaticamente…\",\n \"Available in every template.\": \"Disponível em todos os modelos.\",\n \"Back\": \"Voltar\",\n \"Background\": \"Fundo\",\n \"base tag not allowed\": \"tag base não permitida\",\n \"Blocks\": \"Blocos\",\n \"Bold\": \"Negrito\",\n \"Bottom\": \"Inferior\",\n \"Button\": \"Botão\",\n \"Button background\": \"Fundo do botão\",\n \"Button padding\": \"Espaçamento interno do botão\",\n \"Button without link ({count})\": \"Botões sem link: {count}\",\n \"Call to action\": \"Chamada para ação\",\n \"Campaign\": \"Campanha\",\n \"Campaign name\": \"Nome da campanha\",\n \"Cancel\": \"Cancelar\",\n \"CDATA section not allowed\": \"seção CDATA não permitida\",\n \"Center\": \"Centro\",\n \"Close\": \"Fechar\",\n \"Colors\": \"Cores\",\n \"Column\": \"Coluna\",\n \"Company\": \"Empresa\",\n \"component script not allowed\": \"script de componente não permitido\",\n \"conditional comment not allowed\": \"comentário condicional não permitido\",\n \"Confirm\": \"Confirmar\",\n \"Content\": \"Conteúdo\",\n \"Content width\": \"Largura do conteúdo\",\n \"Copy saved: “{name}”.\": \"Cópia salva: “{name}”.\",\n \"Corner radius\": \"Arredondamento dos cantos\",\n \"Create\": \"Criar\",\n \"Create “{name}”\": \"Criar “{name}”\",\n \"current\": \"atual\",\n \"Custom\": \"Personalizadas\",\n \"Custom variables are not configured\": \"As variáveis personalizadas não estão configuradas\",\n \"Dashed\": \"Tracejada\",\n \"Default\": \"Padrão\",\n \"Delete\": \"Excluir\",\n \"Delete (Del)\": \"Excluir (Del)\",\n \"Delete the variable “{name}”?\": \"Excluir a variável “{name}”?\",\n \"Describes the image if it is blocked\": \"Descreve a imagem caso ela seja bloqueada\",\n \"Deselect\": \"Desmarcar\",\n \"Desktop\": \"Computador\",\n \"Device\": \"Dispositivo\",\n \"Dismiss\": \"Dispensar\",\n \"Divider\": \"Divisor\",\n \"Dotted\": \"Pontilhada\",\n \"Double-click the text to edit it.\": \"Clique duas vezes no texto para editá-lo.\",\n \"Duplicate\": \"Duplicar\",\n \"Edit\": \"Editar\",\n \"Edit “{name}”\": \"Editar “{name}”\",\n \"Edit variable\": \"Editar variável\",\n \"Element actions\": \"Ações do elemento\",\n \"Email\": \"E-mail\",\n \"Email address\": \"Endereço de e-mail\",\n \"Email preview\": \"Pré-visualização do e-mail\",\n \"embed not allowed\": \"embed não permitido\",\n \"Empty file\": \"Arquivo vazio\",\n \"Empty MJML\": \"MJML vazio\",\n \"Empty MJML compilation\": \"Compilação MJML vazia\",\n \"Empty subject\": \"Assunto vazio\",\n \"executable content not allowed\": \"conteúdo executável não permitido\",\n \"external resource not allowed\": \"recurso externo não permitido\",\n \"File missing\": \"Arquivo ausente\",\n \"Final rendering, variables filled with samples.\": \"Resultado final, com valores de exemplo nas variáveis.\",\n \"First name\": \"Nome\",\n \"Fit to text\": \"Ajustar ao texto\",\n \"Font\": \"Fonte\",\n \"forbidden element in project: {tag}\": \"elemento proibido no projeto: {tag}\",\n \"form field not allowed\": \"campo de formulário não permitido\",\n \"form not allowed\": \"formulário não permitido\",\n \"Format rejected: PNG, JPEG or GIF expected\": \"Formato recusado: são aceitos PNG, JPEG ou GIF\",\n \"frame not allowed\": \"frame não permitido\",\n \"Full length\": \"Comprimento total\",\n \"Full width\": \"Largura total\",\n \"Full-width section\": \"Seção de largura total\",\n \"Give the template a name before saving it.\": \"Dê um nome ao modelo antes de salvá-lo.\",\n \"Group\": \"Grupo\",\n \"Height\": \"Altura\",\n \"Hello {name},\": \"Olá, {name},\",\n \"Hex code\": \"Código hexadecimal\",\n \"Horizontal rule\": \"Linha horizontal\",\n \"HTML button not allowed (use the Button block)\": \"botão HTML não permitido (use o bloco Botão)\",\n \"iframe not allowed\": \"iframe não permitido\",\n \"Ignored (invalid): {email}\": \"Ignorado (inválido): {email}\",\n \"Image\": \"Imagem\",\n \"image rejected ({name})\": \"imagem recusada ({name})\",\n \"image rejected ({name}): https only\": \"imagem recusada ({name}): somente https\",\n \"Image too large: {max} MB maximum\": \"Imagem grande demais: máximo de {max} MB\",\n \"Image without alt text ({count})\": \"Imagens sem texto alternativo: {count}\",\n \"Image without file ({count})\": \"Imagens sem arquivo: {count}\",\n \"Inbox\": \"Caixa de entrada\",\n \"Indicative preview — check it with “Send test”.\": \"Pré-visualização aproximada — confira com “Enviar um teste”.\",\n \"inline style rejected\": \"estilo inline recusado\",\n \"Insecure http link ({count})\": \"Links http não seguros: {count}\",\n \"Insert a variable in the preview text\": \"Inserir uma variável no texto de pré-visualização\",\n \"Insert a variable in the subject\": \"Inserir uma variável no assunto\",\n \"Internal error\": \"Erro interno\",\n \"Invalid JSON\": \"JSON inválido\",\n \"Justify\": \"Justificado\",\n \"Key is required\": \"A tag é obrigatória\",\n \"Last name\": \"Sobrenome\",\n \"Layout\": \"Layout\",\n \"Learn more\": \"Saiba mais\",\n \"Leave\": \"Sair\",\n \"Leave the builder?\": \"Sair do editor?\",\n \"Left\": \"Esquerda\",\n \"Length\": \"Comprimento\",\n \"Line color\": \"Cor da linha\",\n \"Line height\": \"Altura da linha\",\n \"Line style\": \"Estilo da linha\",\n \"Link\": \"Link\",\n \"Link on click\": \"Link ao clicar\",\n \"Link URL\": \"URL do link\",\n \"Links\": \"Links\",\n \"Loading the builder\": \"Carregando o editor\",\n \"Loading…\": \"Carregando…\",\n \"Lowercase letters, digits, \\\"_\\\" and \\\".\\\" only, starting with a letter\": \"Somente letras minúsculas, números, \\\"_\\\" e \\\".\\\", começando por uma letra\",\n \"MathML not allowed\": \"MathML não permitido\",\n \"Message is {size} KB: Gmail clips messages over {limit} KB\": \"A mensagem tem {size} KB: o Gmail corta mensagens acima de {limit} KB\",\n \"meta tag not allowed\": \"tag meta não permitida\",\n \"Middle\": \"Meio\",\n \"missing <mj-body>\": \"falta <mj-body>\",\n \"Missing unsubscribe link\": \"Falta o link de cancelamento de inscrição\",\n \"mj-font (external font) is outside the builder\": \"mj-font (fonte externa) fica fora do editor\",\n \"mj-include would read a file from the server\": \"mj-include leria um arquivo do servidor\",\n \"mj-raw (free HTML) is not allowed\": \"mj-raw (HTML livre) não é permitido\",\n \"mj-style (free CSS) is outside the builder\": \"mj-style (CSS livre) fica fora do editor\",\n \"MJML too large ({size} KB, maximum {max} KB)\": \"MJML grande demais ({size} KB, máximo de {max} KB)\",\n \"Mobile\": \"Celular\",\n \"Move down\": \"Mover para baixo\",\n \"Move left\": \"Mover para a esquerda\",\n \"Move right\": \"Mover para a direita\",\n \"Move up\": \"Mover para cima\",\n \"Multipart form expected\": \"Era esperado um formulário multipart\",\n \"Name\": \"Nome\",\n \"Name is required\": \"O nome é obrigatório\",\n \"Name required\": \"Nome obrigatório\",\n \"New template\": \"Novo modelo\",\n \"New variable\": \"Nova variável\",\n \"No changes\": \"Nenhuma alteração\",\n \"No preview text\": \"Sem texto de pré-visualização\",\n \"No subject\": \"Sem assunto\",\n \"No usable test address\": \"Nenhum endereço de teste válido\",\n \"No variable found.\": \"Nenhuma variável encontrada.\",\n \"No versions yet.\": \"Ainda não há versões.\",\n \"Normal\": \"Normal\",\n \"Nothing to fix.\": \"Nada para corrigir.\",\n \"Nothing to show yet.\": \"Ainda não há nada para mostrar.\",\n \"object not allowed\": \"object não permitido\",\n \"Order number\": \"Número do pedido\",\n \"Padding\": \"Espaçamento interno\",\n \"Page background\": \"Fundo da página\",\n \"Paragraph or heading\": \"Parágrafo ou título\",\n \"Photo, visual or logo\": \"Foto, ilustração ou logo\",\n \"Pick a colour\": \"Escolher uma cor\",\n \"Points to check\": \"Pontos a verificar\",\n \"Preview\": \"Pré-visualização\",\n \"Preview and tests\": \"Pré-visualização e testes\",\n \"Preview text\": \"Texto de pré-visualização\",\n \"Project rejected: {issues}\": \"Projeto recusado: {issues}\",\n \"project too deep\": \"projeto com aninhamento profundo demais\",\n \"project too large ({size} KB, maximum {max} KB)\": \"projeto grande demais ({size} KB, máximo de {max} KB)\",\n \"Properties\": \"Propriedades\",\n \"Recipient\": \"Destinatário\",\n \"Redo\": \"Refazer\",\n \"Redo (Ctrl+Y)\": \"Refazer (Ctrl+Y)\",\n \"Refresh\": \"Atualizar\",\n \"Rendering…\": \"Renderizando…\",\n \"Request too large\": \"Solicitação grande demais\",\n \"Restore\": \"Restaurar\",\n \"Restore version {n}\": \"Restaurar a versão {n}\",\n \"Restore version {n}?\": \"Restaurar a versão {n}?\",\n \"Results\": \"Resultados\",\n \"Resume\": \"Retomar\",\n \"Resume the draft?\": \"Retomar o rascunho?\",\n \"Retry\": \"Tentar novamente\",\n \"Right\": \"Direita\",\n \"Route not found\": \"Rota não encontrada\",\n \"Sample value\": \"Valor de exemplo\",\n \"Save\": \"Salvar\",\n \"Save a copy\": \"Salvar uma cópia\",\n \"Save the template first\": \"Salve o modelo primeiro\",\n \"Saved\": \"Salvo\",\n \"Saved — version {n}.\": \"Salvo — versão {n}.\",\n \"Saved at {time}\": \"Salvo às {time}\",\n \"Saved, with {count} MJML warning(s): {message}\": \"Salvo. Avisos do MJML: {count} — {message}\",\n \"Saved. {count} image(s) have no picture yet: they are left out of the email until you add one.\": \"Salvo. Blocos de imagem ainda vazios: {count}. Eles ficam fora do e-mail até você adicionar uma imagem.\",\n \"Saving…\": \"Salvando…\",\n \"script not allowed\": \"script não permitido\",\n \"Search variables…\": \"Pesquisar variáveis…\",\n \"Section\": \"Seção\",\n \"Select a text or a button first.\": \"Selecione primeiro um texto ou um botão.\",\n \"Send\": \"Enviar\",\n \"Send a test\": \"Enviar um teste\",\n \"Shown after the subject in the inbox\": \"Aparece depois do assunto na caixa de entrada\",\n \"Size\": \"Tamanho\",\n \"Solid\": \"Contínua\",\n \"Spacer\": \"Espaçador\",\n \"Spacing\": \"Espaçamento\",\n \"Start over\": \"Começar do zero\",\n \"style sheet not allowed\": \"folha de estilo não permitida\",\n \"Subject\": \"Assunto\",\n \"SVG not allowed\": \"SVG não permitido\",\n \"Tag\": \"Tag\",\n \"tag not allowed: <{tag}>\": \"tag não permitida: <{tag}>\",\n \"Template\": \"Modelo\",\n \"Template changed in the meantime\": \"Modelo alterado nesse meio-tempo\",\n \"Template changed in the meantime — reload it before saving\": \"Modelo alterado nesse meio-tempo — recarregue-o antes de salvar\",\n \"Template changed in the meantime by {user} — reload it before saving\": \"Modelo alterado nesse meio-tempo por {user} — recarregue-o antes de salvar\",\n \"Template not found\": \"Modelo não encontrado\",\n \"Template rejected: {issues}\": \"Modelo recusado: {issues}\",\n \"Template rejected: {issues} (+{more})\": \"Modelo recusado: {issues} (+{more})\",\n \"Template saved.\": \"Modelo salvo.\",\n \"Templates that use it will show its “value if empty”.\": \"Os modelos que a usam vão mostrar o “valor se estiver vazia”.\",\n \"Test\": \"Testar\",\n \"Test sending is not configured\": \"O envio de testes não está configurado\",\n \"Text\": \"Texto\",\n \"The builder could not load.\": \"Não foi possível carregar o editor.\",\n \"The builder could not start.\": \"Não foi possível iniciar o editor.\",\n \"the document must start with <mjml>\": \"o documento deve começar com <mjml>\",\n \"The draft will be offered again next time.\": \"O rascunho será oferecido de novo na próxima vez.\",\n \"The email on screen, to reviewers’ addresses.\": \"O e-mail que está na tela, para os endereços dos revisores.\",\n \"The template could not be loaded.\": \"Não foi possível carregar o modelo.\",\n \"Thickness\": \"Espessura\",\n \"This key is already used\": \"Esta tag já está em uso\",\n \"To check\": \"A verificar\",\n \"Too many test sends — try again later\": \"Muitos envios de teste — tente novamente mais tarde\",\n \"Too many uploads — try again later\": \"Muitos uploads — tente novamente mais tarde\",\n \"Top\": \"Superior\",\n \"Typography\": \"Tipografia\",\n \"Undo\": \"Desfazer\",\n \"Undo (Ctrl+Z)\": \"Desfazer (Ctrl+Z)\",\n \"Unknown variables (rendered empty): {tags}\": \"Variáveis desconhecidas (exibidas vazias): {tags}\",\n \"Unsaved changes\": \"Alterações não salvas\",\n \"Unsaved changes will be lost.\": \"As alterações não salvas serão perdidas.\",\n \"Unsaved changes will be replaced.\": \"As alterações não salvas serão substituídas.\",\n \"Unsaved template from {when}.\": \"Modelo não salvo de {when}.\",\n \"Unsubscribe\": \"Cancelar inscrição\",\n \"Unsubscribe link\": \"Link de cancelamento de inscrição\",\n \"Upload\": \"Fazer upload\",\n \"Upload failed\": \"Falha no upload\",\n \"URL rejected ({name})\": \"URL recusada ({name})\",\n \"Value if empty\": \"Valor se estiver vazia\",\n \"Variable “{name}” created and inserted.\": \"Variável “{name}” criada e inserida.\",\n \"Variable “{name}” created.\": \"Variável “{name}” criada.\",\n \"Variable “{name}” saved.\": \"Variável “{name}” salva.\",\n \"Variable deleted.\": \"Variável excluída.\",\n \"Variable not found\": \"Variável não encontrada\",\n \"Variables\": \"Variáveis\",\n \"Version {n}\": \"Versão {n}\",\n \"Version {n} restored — save to keep it.\": \"Versão {n} restaurada — salve para mantê-la.\",\n \"Version not found\": \"Versão não encontrada\",\n \"Versions\": \"Versões\",\n \"Vertical alignment\": \"Alinhamento vertical\",\n \"Vertical space\": \"Espaço vertical\",\n \"Weight\": \"Peso\",\n \"When a recipient has none\": \"Quando o destinatário não tem um valor\",\n \"Width\": \"Largura\",\n \"Your company\": \"Sua empresa\",\n \"Your headline\": \"Seu título\",\n \"Your text.\": \"Seu texto.\",\n \"“{name}” template applied.\": \"Modelo “{name}” aplicado.\",\n \"€49 instead of €70\": \"De € 70 por € 49\",\n \"Cancelled\": \"Cancelado\",\n \"Email generation is not configured\": \"A geração de e-mails não está configurada\",\n \"Too many generated emails — try again later\": \"Muitos e-mails gerados — tente novamente mais tarde\",\n \"The AI service did not answer — try again in a moment.\": \"O serviço de IA não respondeu — tente novamente daqui a pouco.\",\n \"Color scheme\": \"Esquema de cores\",\n \"Light mode\": \"Modo claro\",\n \"Dark mode\": \"Modo escuro\",\n \"Dark mode as Gmail and Outlook apps show it: light backgrounds turn dark, dark text turns light, images stay as they are.\": \"Modo escuro como aparece nos apps do Gmail e do Outlook: fundos claros ficam escuros, texto escuro fica claro e as imagens continuam iguais.\",\n \"Subject ideas are not configured\": \"As ideias de assunto não estão configuradas\",\n \"Too many subject ideas — try again later\": \"Muitos pedidos de ideias de assunto — tente novamente mais tarde\",\n \"Text rewriting is not configured\": \"A reescrita de texto não está configurada\",\n \"Too many rewrites — try again later\": \"Muitas reescritas — tente novamente mais tarde\",\n \"Brand\": \"Marca\",\n \"Your brand\": \"Sua marca\",\n \"Set it once: new emails, templates and blocks take your logo, colors and font.\": \"Configure uma vez: novos e-mails, modelos e blocos usam seu logo, suas cores e sua fonte.\",\n \"Your website\": \"Seu site\",\n \"Get my brand\": \"Obter minha marca\",\n \"Reading the website…\": \"Lendo o site…\",\n \"The logo, colors and font are read from it. You can change them before saving.\": \"O logo, as cores e a fonte são obtidos dele. Você pode alterá-los antes de salvar.\",\n \"The website could not be read.\": \"Não foi possível ler o site.\",\n \"Logo\": \"Logo\",\n \"Remove\": \"Remover\",\n \"or an image address: https://…\": \"ou o endereço de uma imagem: https://…\",\n \"Company name\": \"Nome da empresa\",\n \"Main color\": \"Cor principal\",\n \"Buttons, banners, links\": \"Botões, banners, links\",\n \"Headings color\": \"Cor dos títulos\",\n \"Also apply to this email\": \"Aplicar também a este e-mail\",\n \"Brand applied. Ctrl+Z brings back the previous look.\": \"Marca aplicada. Ctrl+Z traz de volta o visual anterior.\",\n \"Brand saved. New emails and blocks use it.\": \"Marca salva. Novos e-mails e blocos vão usá-la.\",\n \"The brand could not be saved.\": \"Não foi possível salvar a marca.\",\n \"Big news\": \"Grande novidade\",\n \"A short line under the title.\": \"Uma linha curta abaixo do título.\",\n \"A headline\": \"Um título\",\n \"Some text, with\": \"Um pouco de texto, com\",\n \"a link\": \"um link\",\n \"The brand is not configured\": \"A marca não está configurada\",\n \"Reading a brand from a website is not configured\": \"A leitura da marca a partir de um site não está configurada\",\n \"Too many websites read — try again later\": \"Muitos sites lidos — tente novamente mais tarde\",\n \"Enter the address of a website, like acme.com\": \"Digite o endereço de um site, como acme.com\",\n \"This address is not a public website\": \"Este endereço não é um site público\",\n \"The website could not be reached. Check the address.\": \"Não foi possível acessar o site. Verifique o endereço.\",\n \"The website took too long to answer\": \"O site demorou demais para responder\",\n \"The website does not let the builder read it. Fill in your brand below.\": \"O site não permite que o editor o leia. Preencha sua marca abaixo.\",\n \"This address is not a web page\": \"Este endereço não é uma página da web\",\n \"The website redirects too many times\": \"O site redireciona vezes demais\",\n \"The website sent too much data\": \"O site enviou dados demais\",\n \"No logo was found on the website. Upload it below.\": \"Nenhum logo foi encontrado no site. Faça o upload abaixo.\",\n \"The logo on the website is an SVG or WebP image, which most email apps do not show. Upload a PNG or JPEG version.\": \"O logo do site é uma imagem SVG ou WebP, que a maioria dos apps de e-mail não exibe. Faça o upload de uma versão PNG ou JPEG.\",\n \"The website icon is used as the logo. Upload your full logo if you have one.\": \"O ícone do site está sendo usado como logo. Faça o upload do seu logo completo, se tiver.\",\n \"No main color was found on the website. Pick one below.\": \"Nenhuma cor principal foi encontrada no site. Escolha uma abaixo.\",\n};\n","// Russian locale. Keys are the English source strings (see src/i18n/index.js).\n// Missing keys: `node scripts/i18n-keys.mjs ru`.\n\n/** @type {Record<string, string>} */\nexport const ru = {\n \"1. Complete your profile\": \"1. Заполните профиль\",\n \"2. Explore\": \"2. Осмотритесь\",\n \"3. Ask us anything\": \"3. Задавайте любые вопросы\",\n \"30% off everything\": \"Скидка 30% на всё\",\n \"30% off this weekend only\": \"Скидка 30% — только в эти выходные\",\n \"4 columns\": \"4 колонки\",\n \"4-column section\": \"Секция в 4 колонки\",\n \"A few words about it.\": \"Несколько слов о главном.\",\n \"A new feature\": \"Новая функция\",\n \"A sale with a discount code and two products\": \"Распродажа с промокодом и двумя товарами\",\n \"A tip\": \"Полезный совет\",\n \"Add a block\": \"Добавить блок\",\n \"Add to favorites\": \"Добавить в избранное\",\n \"All blocks\": \"Все блоки\",\n \"All capitals\": \"Все прописные\",\n \"All templates\": \"Все шаблоны\",\n \"All your templates are in the favorites.\": \"Все ваши шаблоны уже в избранном.\",\n \"An empty page to build from scratch\": \"Пустая страница, чтобы начать с нуля\",\n \"An evening of talks and drinks with the team and our customers.\": \"Вечер докладов и неформального общения с нашей командой и клиентами.\",\n \"An event\": \"Мероприятие\",\n \"Apply the link\": \"Применить ссылку\",\n \"Article {n}\": \"Статья {n}\",\n \"As typed\": \"Как введено\",\n \"Background image\": \"Фоновое изображение\",\n \"Background image with a title and a button\": \"Фоновое изображение с заголовком и кнопкой\",\n \"Background width\": \"Ширина фона\",\n \"Base\": \"Заготовка\",\n \"Base — not editable: start from it to create your template.\": \"Заготовку нельзя изменить — создайте на её основе свой шаблон.\",\n \"Bases\": \"Заготовки\",\n \"Blank\": \"Пустое письмо\",\n \"Blog\": \"Блог\",\n \"Bold (Ctrl+B)\": \"Полужирный (Ctrl+B)\",\n \"Book my seat\": \"Забронировать место\",\n \"Builder\": \"Конструктор\",\n \"Buy\": \"Купить\",\n \"by {name}\": \"пользователем {name}\",\n \"Capitals\": \"Регистр\",\n \"Choose a template\": \"Выберите шаблон\",\n \"Choose an image in the panel\": \"Выберите изображение на панели\",\n \"Clear formatting\": \"Очистить форматирование\",\n \"Clear the search\": \"Очистить поиск\",\n \"Contact\": \"Контакты\",\n \"Copy HTML\": \"Копировать HTML\",\n \"Could not load the templates.\": \"Не удалось загрузить шаблоны.\",\n \"Created\": \"Создан\",\n \"Date, place and a button to book a seat\": \"Дата, место и кнопка бронирования\",\n \"Default ({value})\": \"По умолчанию ({value})\",\n \"Delete “{name}”?\": \"Удалить «{name}»?\",\n \"Direction\": \"Расположение\",\n \"Download\": \"Скачать\",\n \"Drag to move\": \"Перетащите, чтобы переместить\",\n \"Drop a block here\": \"Перетащите блок сюда\",\n \"Edit: {element}\": \"Редактирование: {element}\",\n \"Email canvas\": \"Холст письма\",\n \"Email settings\": \"Настройки письма\",\n \"Email template library\": \"Библиотека шаблонов писем\",\n \"Equal\": \"Равные\",\n \"Facebook\": \"Facebook\",\n \"Favorites\": \"Избранное\",\n \"Fill the section\": \"Заполнить секцию\",\n \"First letters\": \"Начинать с прописных\",\n \"Get started\": \"Начать\",\n \"GitHub\": \"GitHub\",\n \"Greets a new customer and lists the first steps\": \"Приветствует нового клиента и описывает первые шаги\",\n \"Heading\": \"Заголовок\",\n \"Hero banner\": \"Баннер\",\n \"Horizontal\": \"Горизонтально\",\n \"HTML copied.\": \"HTML скопирован.\",\n \"Icon background\": \"Фон значков\",\n \"Icon size\": \"Размер значков\",\n \"Icons linking to your profiles\": \"Значки со ссылками на ваши профили\",\n \"Image + text\": \"Изображение + текст\",\n \"Image beside a title, text and button\": \"Изображение рядом с заголовком, текстом и кнопкой\",\n \"Image position\": \"Положение изображения\",\n \"Image size\": \"Размер изображения\",\n \"In brief\": \"Коротко\",\n \"Instagram\": \"Instagram\",\n \"Italic (Ctrl+I)\": \"Курсив (Ctrl+I)\",\n \"Keep its width\": \"Сохранять ширину\",\n \"Label\": \"Надпись\",\n \"Large bold title\": \"Крупный жирный заголовок\",\n \"LinkedIn\": \"LinkedIn\",\n \"Logo, headline, text and a button\": \"Логотип, заголовок, текст и кнопка\",\n \"Menu\": \"Меню\",\n \"Menu link\": \"Пункт меню\",\n \"Monthly news: banner, two articles, highlights\": \"Новости месяца: баннер, две статьи, коротко о главном\",\n \"Network\": \"Соцсеть\",\n \"No preview: this storage cannot render emails.\": \"Предпросмотр недоступен: это хранилище не умеет отрисовывать письма.\",\n \"No template yet. Start from a base, or create a new one.\": \"Шаблонов пока нет. Начните с заготовки или создайте новый.\",\n \"Nothing matches “{query}”.\": \"По запросу «{query}» ничего не найдено.\",\n \"Offer valid until Sunday midnight, while stocks last.\": \"Предложение действует до конца воскресенья, пока товар есть в наличии.\",\n \"On mobile\": \"На телефоне\",\n \"One sentence about it.\": \"Одно предложение о главном.\",\n \"One sentence that makes people want to read on.\": \"Одна фраза, после которой хочется читать дальше.\",\n \"Origin\": \"Источник\",\n \"Original size\": \"Исходный размер\",\n \"Our offices, 1 Main Street\": \"Наш офис, ул. Центральная, 1\",\n \"Picking a template replaces the email being edited.\": \"Выбранный шаблон заменит письмо, которое вы сейчас редактируете.\",\n \"Product one\": \"Первый товар\",\n \"Product two\": \"Второй товар\",\n \"Profile URL\": \"Ссылка на профиль\",\n \"Promotion\": \"Акция\",\n \"Read more\": \"Читать далее\",\n \"Ready-made templates to copy into your campaigns.\": \"Готовые шаблоны, которые можно скопировать в ваши кампании.\",\n \"Remove from favorites\": \"Удалить из избранного\",\n \"Remove the link\": \"Удалить ссылку\",\n \"Replace\": \"Заменить\",\n \"Replace the current email?\": \"Заменить текущее письмо?\",\n \"Reply to this email: a person reads it.\": \"Просто ответьте на это письмо — его прочитает живой человек.\",\n \"Row of links to your site\": \"Ряд ссылок на ваш сайт\",\n \"Save the date — seats are limited.\": \"Запомните дату — количество мест ограничено.\",\n \"Search templates\": \"Поиск шаблонов\",\n \"Seats are limited: book yours now, it takes ten seconds.\": \"Количество мест ограничено: забронируйте своё прямо сейчас — это займёт десять секунд.\",\n \"Select a template on the left.\": \"Выберите шаблон слева.\",\n \"Select the parent\": \"Выбрать родительский элемент\",\n \"Shop\": \"Магазин\",\n \"Shop the sale\": \"Выбрать со скидкой\",\n \"Simple\": \"Простое письмо\",\n \"So we can tailor what we send you.\": \"Так мы будем присылать только то, что вам интересно.\",\n \"Social link\": \"Ссылка на соцсеть\",\n \"Social links\": \"Соцсети\",\n \"Space around each icon\": \"Отступ вокруг каждого значка\",\n \"Start from a template\": \"Начать с шаблона\",\n \"Start from this base\": \"Начать с этой заготовки\",\n \"Strikethrough\": \"Зачёркнутый\",\n \"Take a tour of what you can do.\": \"Посмотрите, что вам доступно.\",\n \"Template deleted.\": \"Шаблон удалён.\",\n \"Template duplicated.\": \"Копия шаблона создана.\",\n \"Templates\": \"Шаблоны\",\n \"Text formatting\": \"Форматирование текста\",\n \"Thank you for joining us. Here is how to get the most out of your account.\": \"Спасибо, что вы с нами. Вот как получить от аккаунта максимум.\",\n \"The browser refused to copy.\": \"Браузер запретил копирование.\",\n \"The news of the month\": \"Новости месяца\",\n \"The template and its versions will be deleted.\": \"Шаблон и все его версии будут удалены.\",\n \"The template preview appears here.\": \"Здесь появится предпросмотр шаблона.\",\n \"This template was saved in a format this builder cannot open.\": \"Этот шаблон сохранён в формате, который этот конструктор не может открыть.\",\n \"This weekend only, with the code SPRING30.\": \"Только в эти выходные, по промокоду SPRING30.\",\n \"Three steps to get started.\": \"Три простых шага для начала.\",\n \"Thursday, 7 pm\": \"Четверг, 19:00\",\n \"Title\": \"Заголовок\",\n \"Two or three sentences that sum up the story and make people want the rest.\": \"Два-три предложения, которые передают суть статьи и вызывают желание прочитать продолжение.\",\n \"Underline (Ctrl+U)\": \"Подчёркнутый (Ctrl+U)\",\n \"Updated\": \"Изменён\",\n \"Vertical\": \"Вертикально\",\n \"Welcome aboard!\": \"Добро пожаловать!\",\n \"Welcome, {name}!\": \"Добро пожаловать, {name}!\",\n \"What changed, what is coming, and two stories worth your time.\": \"Что изменилось, что впереди и две статьи, которые стоит прочитать.\",\n \"When\": \"Когда\",\n \"Where\": \"Где\",\n \"Whole image\": \"Изображение целиком\",\n \"Whole screen\": \"На весь экран\",\n \"With the code SPRING30, until Sunday midnight.\": \"По промокоду SPRING30 до конца воскресенья.\",\n \"X\": \"X\",\n \"You're invited\": \"Приглашаем вас!\",\n \"Your big announcement\": \"Ваша главная новость\",\n \"YouTube\": \"YouTube\",\n \"{count} sections selected. Press Delete to remove them (Ctrl+Z brings them back).\": \"Выбрано секций: {count}. Нажмите Delete, чтобы удалить их (Ctrl+Z вернёт их обратно).\",\n \"{label} — {side}\": \"{label} — {side}\",\n \"{max} test addresses at most\": \"Максимум тестовых адресов: {max}\",\n \"{message} Your version can be saved as a copy.\": \"{message} Вашу версию можно сохранить как копию.\",\n \"{name} (copy)\": \"{name} (копия)\",\n \"{sent} sent, {failed} failed.\": \"Отправлено: {sent}, с ошибкой: {failed}.\",\n \"{sent} test(s) sent — check your inbox.\": \"Отправлено тестовых писем: {sent} — проверьте почту.\",\n \"1 column\": \"1 колонка\",\n \"2 columns\": \"2 колонки\",\n \"2-column section\": \"Секция в 2 колонки\",\n \"25%\": \"25%\",\n \"3 columns\": \"3 колонки\",\n \"3-column section\": \"Секция в 3 колонки\",\n \"50%\": \"50%\",\n \"600 px (standard)\": \"600 px (стандарт)\",\n \"640 px\": \"640 px\",\n \"75%\": \"75%\",\n \"Address not allowed\": \"Адрес не разрешён\",\n \"Addresses\": \"Адреса\",\n \"Alignment\": \"Выравнивание\",\n \"Alt text\": \"Альтернативный текст\",\n \"An https:// address is required\": \"Нужен адрес, начинающийся с https://\",\n \"attribute {name} not allowed\": \"атрибут {name} запрещён\",\n \"Authentication required\": \"Требуется аутентификация\",\n \"Autosave\": \"Автосохранение\",\n \"Autosave paused\": \"Автосохранение приостановлено\",\n \"Autosaved at {time}\": \"Автосохранено в {time}\",\n \"Autosaving…\": \"Автосохранение…\",\n \"Available in every template.\": \"Доступна во всех шаблонах.\",\n \"Back\": \"Назад\",\n \"Background\": \"Фон\",\n \"base tag not allowed\": \"тег base запрещён\",\n \"Blocks\": \"Блоки\",\n \"Bold\": \"Полужирный\",\n \"Bottom\": \"Снизу\",\n \"Button\": \"Кнопка\",\n \"Button background\": \"Фон кнопки\",\n \"Button padding\": \"Внутренние отступы кнопки\",\n \"Button without link ({count})\": \"Кнопки без ссылки: {count}\",\n \"Call to action\": \"Призыв к действию\",\n \"Campaign\": \"Кампания\",\n \"Campaign name\": \"Название кампании\",\n \"Cancel\": \"Отмена\",\n \"CDATA section not allowed\": \"раздел CDATA запрещён\",\n \"Center\": \"По центру\",\n \"Close\": \"Закрыть\",\n \"Colors\": \"Цвета\",\n \"Column\": \"Колонка\",\n \"Company\": \"Компания\",\n \"component script not allowed\": \"скрипт компонента запрещён\",\n \"conditional comment not allowed\": \"условный комментарий запрещён\",\n \"Confirm\": \"Подтвердить\",\n \"Content\": \"Содержимое\",\n \"Content width\": \"Ширина содержимого\",\n \"Copy saved: “{name}”.\": \"Копия сохранена: «{name}».\",\n \"Corner radius\": \"Скругление углов\",\n \"Create\": \"Создать\",\n \"Create “{name}”\": \"Создать «{name}»\",\n \"current\": \"текущая\",\n \"Custom\": \"Пользовательские\",\n \"Custom variables are not configured\": \"Пользовательские переменные не настроены\",\n \"Dashed\": \"Штриховая\",\n \"Default\": \"По умолчанию\",\n \"Delete\": \"Удалить\",\n \"Delete (Del)\": \"Удалить (Del)\",\n \"Delete the variable “{name}”?\": \"Удалить переменную «{name}»?\",\n \"Describes the image if it is blocked\": \"Описывает изображение, если оно заблокировано\",\n \"Deselect\": \"Снять выделение\",\n \"Desktop\": \"Компьютер\",\n \"Device\": \"Устройство\",\n \"Dismiss\": \"Скрыть\",\n \"Divider\": \"Разделитель\",\n \"Dotted\": \"Точечная\",\n \"Double-click the text to edit it.\": \"Дважды щёлкните текст, чтобы изменить его.\",\n \"Duplicate\": \"Дублировать\",\n \"Edit\": \"Изменить\",\n \"Edit “{name}”\": \"Изменить «{name}»\",\n \"Edit variable\": \"Изменить переменную\",\n \"Element actions\": \"Действия с элементом\",\n \"Email\": \"Письмо\",\n \"Email address\": \"Адрес электронной почты\",\n \"Email preview\": \"Предпросмотр письма\",\n \"embed not allowed\": \"элемент embed запрещён\",\n \"Empty file\": \"Пустой файл\",\n \"Empty MJML\": \"Пустой MJML\",\n \"Empty MJML compilation\": \"Компиляция MJML дала пустой результат\",\n \"Empty subject\": \"Пустая тема\",\n \"executable content not allowed\": \"исполняемое содержимое запрещено\",\n \"external resource not allowed\": \"внешние ресурсы запрещены\",\n \"File missing\": \"Файл отсутствует\",\n \"Final rendering, variables filled with samples.\": \"Итоговый вид, переменные заполнены примерами.\",\n \"First name\": \"Имя\",\n \"Fit to text\": \"По ширине текста\",\n \"Font\": \"Шрифт\",\n \"forbidden element in project: {tag}\": \"запрещённый элемент в проекте: {tag}\",\n \"form field not allowed\": \"поля форм запрещены\",\n \"form not allowed\": \"формы запрещены\",\n \"Format rejected: PNG, JPEG or GIF expected\": \"Формат не подходит: нужен PNG, JPEG или GIF\",\n \"frame not allowed\": \"элемент frame запрещён\",\n \"Full length\": \"На всю длину\",\n \"Full width\": \"На всю ширину\",\n \"Full-width section\": \"Секция на всю ширину\",\n \"Give the template a name before saving it.\": \"Перед сохранением дайте шаблону название.\",\n \"Group\": \"Группа\",\n \"Height\": \"Высота\",\n \"Hello {name},\": \"Здравствуйте, {name}!\",\n \"Hex code\": \"HEX-код\",\n \"Horizontal rule\": \"Горизонтальная линия\",\n \"HTML button not allowed (use the Button block)\": \"HTML-кнопка запрещена (используйте блок «Кнопка»)\",\n \"iframe not allowed\": \"элемент iframe запрещён\",\n \"Ignored (invalid): {email}\": \"Пропущен некорректный адрес: {email}\",\n \"Image\": \"Изображение\",\n \"image rejected ({name})\": \"изображение отклонено ({name})\",\n \"image rejected ({name}): https only\": \"изображение отклонено ({name}): только https\",\n \"Image too large: {max} MB maximum\": \"Изображение слишком большое: максимум {max} МБ\",\n \"Image without alt text ({count})\": \"Изображения без альтернативного текста: {count}\",\n \"Image without file ({count})\": \"Изображения без файла: {count}\",\n \"Inbox\": \"Входящие\",\n \"Indicative preview — check it with “Send test”.\": \"Примерный вид — проверьте письмо через «Отправить тест».\",\n \"inline style rejected\": \"встроенный стиль отклонён\",\n \"Insecure http link ({count})\": \"Небезопасные ссылки http: {count}\",\n \"Insert a variable in the preview text\": \"Вставить переменную в прехедер\",\n \"Insert a variable in the subject\": \"Вставить переменную в тему\",\n \"Internal error\": \"Внутренняя ошибка\",\n \"Invalid JSON\": \"Некорректный JSON\",\n \"Justify\": \"По ширине\",\n \"Key is required\": \"Укажите тег\",\n \"Last name\": \"Фамилия\",\n \"Layout\": \"Макет\",\n \"Learn more\": \"Подробнее\",\n \"Leave\": \"Выйти\",\n \"Leave the builder?\": \"Выйти из конструктора?\",\n \"Left\": \"Слева\",\n \"Length\": \"Длина\",\n \"Line color\": \"Цвет линии\",\n \"Line height\": \"Межстрочный интервал\",\n \"Line style\": \"Тип линии\",\n \"Link\": \"Ссылка\",\n \"Link on click\": \"Ссылка при нажатии\",\n \"Link URL\": \"Адрес ссылки\",\n \"Links\": \"Ссылки\",\n \"Loading the builder\": \"Загрузка конструктора\",\n \"Loading…\": \"Загрузка…\",\n \"Lowercase letters, digits, \\\"_\\\" and \\\".\\\" only, starting with a letter\": \"Только строчные латинские буквы, цифры, «_» и «.»; первый символ — буква\",\n \"MathML not allowed\": \"MathML запрещён\",\n \"Message is {size} KB: Gmail clips messages over {limit} KB\": \"Размер письма — {size} КБ: Gmail обрезает письма больше {limit} КБ\",\n \"meta tag not allowed\": \"тег meta запрещён\",\n \"Middle\": \"Посередине\",\n \"missing <mj-body>\": \"отсутствует <mj-body>\",\n \"Missing unsubscribe link\": \"Нет ссылки для отписки\",\n \"mj-font (external font) is outside the builder\": \"mj-font (внешний шрифт) вне возможностей конструктора\",\n \"mj-include would read a file from the server\": \"mj-include прочитал бы файл с сервера\",\n \"mj-raw (free HTML) is not allowed\": \"mj-raw (произвольный HTML) запрещён\",\n \"mj-style (free CSS) is outside the builder\": \"mj-style (произвольный CSS) вне возможностей конструктора\",\n \"MJML too large ({size} KB, maximum {max} KB)\": \"MJML слишком большой ({size} КБ, максимум {max} КБ)\",\n \"Mobile\": \"Телефон\",\n \"Move down\": \"Переместить вниз\",\n \"Move left\": \"Переместить влево\",\n \"Move right\": \"Переместить вправо\",\n \"Move up\": \"Переместить вверх\",\n \"Multipart form expected\": \"Ожидается форма multipart\",\n \"Name\": \"Название\",\n \"Name is required\": \"Укажите название\",\n \"Name required\": \"Укажите название\",\n \"New template\": \"Новый шаблон\",\n \"New variable\": \"Новая переменная\",\n \"No changes\": \"Нет изменений\",\n \"No preview text\": \"Без прехедера\",\n \"No subject\": \"Без темы\",\n \"No usable test address\": \"Нет ни одного подходящего тестового адреса\",\n \"No variable found.\": \"Переменные не найдены.\",\n \"No versions yet.\": \"Версий пока нет.\",\n \"Normal\": \"Обычный\",\n \"Nothing to fix.\": \"Исправлять нечего.\",\n \"Nothing to show yet.\": \"Пока нечего показать.\",\n \"object not allowed\": \"элемент object запрещён\",\n \"Order number\": \"Номер заказа\",\n \"Padding\": \"Внутренние отступы\",\n \"Page background\": \"Фон страницы\",\n \"Paragraph or heading\": \"Абзац или заголовок\",\n \"Photo, visual or logo\": \"Фото, иллюстрация или логотип\",\n \"Pick a colour\": \"Выбрать цвет\",\n \"Points to check\": \"Что проверить\",\n \"Preview\": \"Предпросмотр\",\n \"Preview and tests\": \"Для предпросмотра и тестов\",\n \"Preview text\": \"Прехедер\",\n \"Project rejected: {issues}\": \"Проект отклонён: {issues}\",\n \"project too deep\": \"слишком глубокая вложенность проекта\",\n \"project too large ({size} KB, maximum {max} KB)\": \"проект слишком большой ({size} КБ, максимум {max} КБ)\",\n \"Properties\": \"Свойства\",\n \"Recipient\": \"Получатель\",\n \"Redo\": \"Повторить\",\n \"Redo (Ctrl+Y)\": \"Повторить (Ctrl+Y)\",\n \"Refresh\": \"Обновить\",\n \"Rendering…\": \"Отрисовка…\",\n \"Request too large\": \"Слишком большой запрос\",\n \"Restore\": \"Восстановить\",\n \"Restore version {n}\": \"Восстановить версию {n}\",\n \"Restore version {n}?\": \"Восстановить версию {n}?\",\n \"Results\": \"Результаты\",\n \"Resume\": \"Продолжить\",\n \"Resume the draft?\": \"Вернуться к черновику?\",\n \"Retry\": \"Попробовать снова\",\n \"Right\": \"Справа\",\n \"Route not found\": \"Маршрут не найден\",\n \"Sample value\": \"Пример значения\",\n \"Save\": \"Сохранить\",\n \"Save a copy\": \"Сохранить копию\",\n \"Save the template first\": \"Сначала сохраните шаблон\",\n \"Saved\": \"Сохранено\",\n \"Saved — version {n}.\": \"Сохранено — версия {n}.\",\n \"Saved at {time}\": \"Сохранено в {time}\",\n \"Saved, with {count} MJML warning(s): {message}\": \"Сохранено. Предупреждений MJML: {count} — {message}\",\n \"Saved. {count} image(s) have no picture yet: they are left out of the email until you add one.\": \"Сохранено. Изображений без файла: {count} — они не попадут в письмо, пока вы не добавите файл.\",\n \"Saving…\": \"Сохранение…\",\n \"script not allowed\": \"скрипты запрещены\",\n \"Search variables…\": \"Поиск переменных…\",\n \"Section\": \"Секция\",\n \"Select a text or a button first.\": \"Сначала выберите текст или кнопку.\",\n \"Send\": \"Отправить\",\n \"Send a test\": \"Отправить тест\",\n \"Shown after the subject in the inbox\": \"Показывается после темы в списке входящих\",\n \"Size\": \"Размер\",\n \"Solid\": \"Сплошная\",\n \"Spacer\": \"Отступ\",\n \"Spacing\": \"Отступы\",\n \"Start over\": \"Начать заново\",\n \"style sheet not allowed\": \"таблицы стилей запрещены\",\n \"Subject\": \"Тема\",\n \"SVG not allowed\": \"SVG запрещён\",\n \"Tag\": \"Тег\",\n \"tag not allowed: <{tag}>\": \"тег запрещён: <{tag}>\",\n \"Template\": \"Шаблон\",\n \"Template changed in the meantime\": \"Шаблон был изменён за это время\",\n \"Template changed in the meantime — reload it before saving\": \"Шаблон был изменён за это время — перезагрузите его перед сохранением\",\n \"Template changed in the meantime by {user} — reload it before saving\": \"Шаблон был изменён за это время пользователем {user} — перезагрузите его перед сохранением\",\n \"Template not found\": \"Шаблон не найден\",\n \"Template rejected: {issues}\": \"Шаблон отклонён: {issues}\",\n \"Template rejected: {issues} (+{more})\": \"Шаблон отклонён: {issues} (+{more})\",\n \"Template saved.\": \"Шаблон сохранён.\",\n \"Templates that use it will show its “value if empty”.\": \"В шаблонах, где она используется, будет выводиться её «запасное значение».\",\n \"Test\": \"Тест\",\n \"Test sending is not configured\": \"Отправка тестовых писем не настроена\",\n \"Text\": \"Текст\",\n \"The builder could not load.\": \"Не удалось загрузить конструктор.\",\n \"The builder could not start.\": \"Не удалось запустить конструктор.\",\n \"the document must start with <mjml>\": \"документ должен начинаться с <mjml>\",\n \"The draft will be offered again next time.\": \"Черновик будет предложен снова в следующий раз.\",\n \"The email on screen, to reviewers’ addresses.\": \"Письмо с экрана — на адреса проверяющих.\",\n \"The template could not be loaded.\": \"Не удалось загрузить шаблон.\",\n \"Thickness\": \"Толщина\",\n \"This key is already used\": \"Такой тег уже используется\",\n \"To check\": \"Проверка\",\n \"Too many test sends — try again later\": \"Слишком много тестовых отправок — попробуйте позже\",\n \"Too many uploads — try again later\": \"Слишком много загрузок — попробуйте позже\",\n \"Top\": \"Сверху\",\n \"Typography\": \"Типографика\",\n \"Undo\": \"Отменить\",\n \"Undo (Ctrl+Z)\": \"Отменить (Ctrl+Z)\",\n \"Unknown variables (rendered empty): {tags}\": \"Неизвестные переменные (будут пустыми): {tags}\",\n \"Unsaved changes\": \"Несохранённые изменения\",\n \"Unsaved changes will be lost.\": \"Несохранённые изменения будут потеряны.\",\n \"Unsaved changes will be replaced.\": \"Несохранённые изменения будут заменены.\",\n \"Unsaved template from {when}.\": \"Несохранённый шаблон от {when}.\",\n \"Unsubscribe\": \"Отписаться\",\n \"Unsubscribe link\": \"Ссылка для отписки\",\n \"Upload\": \"Загрузить\",\n \"Upload failed\": \"Не удалось загрузить\",\n \"URL rejected ({name})\": \"URL отклонён ({name})\",\n \"Value if empty\": \"Запасное значение\",\n \"Variable “{name}” created and inserted.\": \"Переменная «{name}» создана и вставлена.\",\n \"Variable “{name}” created.\": \"Переменная «{name}» создана.\",\n \"Variable “{name}” saved.\": \"Переменная «{name}» сохранена.\",\n \"Variable deleted.\": \"Переменная удалена.\",\n \"Variable not found\": \"Переменная не найдена\",\n \"Variables\": \"Переменные\",\n \"Version {n}\": \"Версия {n}\",\n \"Version {n} restored — save to keep it.\": \"Версия {n} восстановлена — сохраните, чтобы её оставить.\",\n \"Version not found\": \"Версия не найдена\",\n \"Versions\": \"Версии\",\n \"Vertical alignment\": \"Выравнивание по вертикали\",\n \"Vertical space\": \"Пустое место по вертикали\",\n \"Weight\": \"Начертание\",\n \"When a recipient has none\": \"Если у получателя нет значения\",\n \"Width\": \"Ширина\",\n \"Your company\": \"Ваша компания\",\n \"Your headline\": \"Ваш заголовок\",\n \"Your text.\": \"Ваш текст.\",\n \"“{name}” template applied.\": \"Шаблон «{name}» применён.\",\n \"€49 instead of €70\": \"4900 ₽ вместо 7000 ₽\",\n \"Cancelled\": \"Отменено\",\n \"Email generation is not configured\": \"Генерация писем не настроена\",\n \"Too many generated emails — try again later\": \"Слишком много сгенерированных писем — попробуйте позже\",\n \"The AI service did not answer — try again in a moment.\": \"Сервис ИИ не ответил — попробуйте ещё раз чуть позже.\",\n \"Color scheme\": \"Цветовая схема\",\n \"Light mode\": \"Светлая тема\",\n \"Dark mode\": \"Тёмная тема\",\n \"Dark mode as Gmail and Outlook apps show it: light backgrounds turn dark, dark text turns light, images stay as they are.\": \"Тёмная тема в том виде, в каком её показывают приложения Gmail и Outlook: светлый фон становится тёмным, тёмный текст — светлым, изображения не меняются.\",\n \"Subject ideas are not configured\": \"Идеи для темы не настроены\",\n \"Too many subject ideas — try again later\": \"Слишком много запросов идей для темы — попробуйте позже\",\n \"Text rewriting is not configured\": \"Переписывание текста не настроено\",\n \"Too many rewrites — try again later\": \"Слишком много запросов на переписывание — попробуйте позже\",\n \"Brand\": \"Бренд\",\n \"Your brand\": \"Ваш бренд\",\n \"Set it once: new emails, templates and blocks take your logo, colors and font.\": \"Настройте один раз: новые письма, шаблоны и блоки будут использовать ваш логотип, цвета и шрифт.\",\n \"Your website\": \"Ваш сайт\",\n \"Get my brand\": \"Получить бренд\",\n \"Reading the website…\": \"Чтение сайта…\",\n \"The logo, colors and font are read from it. You can change them before saving.\": \"Логотип, цвета и шрифт будут взяты с сайта. Их можно изменить перед сохранением.\",\n \"The website could not be read.\": \"Не удалось прочитать сайт.\",\n \"Logo\": \"Логотип\",\n \"Remove\": \"Убрать\",\n \"or an image address: https://…\": \"или адрес изображения: https://…\",\n \"Company name\": \"Название компании\",\n \"Main color\": \"Основной цвет\",\n \"Buttons, banners, links\": \"Кнопки, баннеры, ссылки\",\n \"Headings color\": \"Цвет заголовков\",\n \"Also apply to this email\": \"Применить и к этому письму\",\n \"Brand applied. Ctrl+Z brings back the previous look.\": \"Бренд применён. Ctrl+Z вернёт прежний вид.\",\n \"Brand saved. New emails and blocks use it.\": \"Бренд сохранён. Он будет применяться к новым письмам и блокам.\",\n \"The brand could not be saved.\": \"Не удалось сохранить бренд.\",\n \"Big news\": \"Важная новость\",\n \"A short line under the title.\": \"Короткая строка под заголовком.\",\n \"A headline\": \"Заголовок\",\n \"Some text, with\": \"Немного текста со\",\n \"a link\": \"ссылкой\",\n \"The brand is not configured\": \"Бренд не настроен\",\n \"Reading a brand from a website is not configured\": \"Получение бренда с сайта не настроено\",\n \"Too many websites read — try again later\": \"Слишком много запросов на чтение сайтов — попробуйте позже\",\n \"Enter the address of a website, like acme.com\": \"Введите адрес сайта, например acme.com\",\n \"This address is not a public website\": \"Этот адрес не ведёт на общедоступный сайт\",\n \"The website could not be reached. Check the address.\": \"Сайт недоступен. Проверьте адрес.\",\n \"The website took too long to answer\": \"Сайт слишком долго не отвечал\",\n \"The website does not let the builder read it. Fill in your brand below.\": \"Сайт не позволяет конструктору прочитать себя. Заполните данные бренда ниже.\",\n \"This address is not a web page\": \"Этот адрес не ведёт на веб-страницу\",\n \"The website redirects too many times\": \"Сайт перенаправляет слишком много раз\",\n \"The website sent too much data\": \"Сайт прислал слишком много данных\",\n \"No logo was found on the website. Upload it below.\": \"На сайте не найден логотип. Загрузите его ниже.\",\n \"The logo on the website is an SVG or WebP image, which most email apps do not show. Upload a PNG or JPEG version.\": \"Логотип на сайте — изображение SVG или WebP, а большинство почтовых приложений такие не показывают. Загрузите версию в PNG или JPEG.\",\n \"The website icon is used as the logo. Upload your full logo if you have one.\": \"В качестве логотипа используется значок сайта. Если у вас есть полный логотип, загрузите его.\",\n \"No main color was found on the website. Pick one below.\": \"На сайте не найден основной цвет. Выберите его ниже.\",\n};\n","// Chinese (Simplified) locale. Keys are the English source strings (see src/i18n/index.js).\n// Missing keys: `node scripts/i18n-keys.mjs zh`.\n\n/** @type {Record<string, string>} */\nexport const zh = {\n \"1. Complete your profile\": \"1. 完善个人资料\",\n \"2. Explore\": \"2. 探索功能\",\n \"3. Ask us anything\": \"3. 有问题随时问我们\",\n \"30% off everything\": \"全场 7 折\",\n \"30% off this weekend only\": \"仅限本周末,全场 7 折\",\n \"4 columns\": \"4 栏\",\n \"4-column section\": \"4 栏版块\",\n \"A few words about it.\": \"简单介绍几句。\",\n \"A new feature\": \"新功能上线\",\n \"A sale with a discount code and two products\": \"含优惠码和两款产品的促销邮件\",\n \"A tip\": \"实用技巧\",\n \"Add a block\": \"添加区块\",\n \"Add to favorites\": \"添加到收藏\",\n \"All blocks\": \"全部区块\",\n \"All capitals\": \"全部大写\",\n \"All templates\": \"全部模板\",\n \"All your templates are in the favorites.\": \"您的所有模板都已收藏。\",\n \"An empty page to build from scratch\": \"空白页面,从零开始搭建\",\n \"An evening of talks and drinks with the team and our customers.\": \"与我们的团队和客户共度一晚,畅聊交流,小酌一杯。\",\n \"An event\": \"活动预告\",\n \"Apply the link\": \"应用链接\",\n \"Article {n}\": \"文章 {n}\",\n \"As typed\": \"保持原样\",\n \"Background image\": \"背景图片\",\n \"Background image with a title and a button\": \"带标题和按钮的背景图片\",\n \"Background width\": \"背景宽度\",\n \"Base\": \"基础模板\",\n \"Base — not editable: start from it to create your template.\": \"基础模板不可编辑:请以它为起点创建您的模板。\",\n \"Bases\": \"基础模板\",\n \"Blank\": \"空白\",\n \"Blog\": \"博客\",\n \"Bold (Ctrl+B)\": \"加粗 (Ctrl+B)\",\n \"Book my seat\": \"立即报名\",\n \"Builder\": \"编辑器\",\n \"Buy\": \"立即购买\",\n \"by {name}\": \"· {name}\",\n \"Capitals\": \"大小写\",\n \"Choose a template\": \"选择模板\",\n \"Choose an image in the panel\": \"请在面板中选择图片\",\n \"Clear formatting\": \"清除格式\",\n \"Clear the search\": \"清除搜索\",\n \"Contact\": \"联系我们\",\n \"Copy HTML\": \"复制 HTML\",\n \"Could not load the templates.\": \"无法加载模板列表。\",\n \"Created\": \"创建时间\",\n \"Date, place and a button to book a seat\": \"日期、地点和报名按钮\",\n \"Default ({value})\": \"默认({value})\",\n \"Delete “{name}”?\": \"删除“{name}”?\",\n \"Direction\": \"排列方向\",\n \"Download\": \"下载\",\n \"Drag to move\": \"拖动以移动\",\n \"Drop a block here\": \"将区块拖放到此处\",\n \"Edit: {element}\": \"编辑:{element}\",\n \"Email canvas\": \"邮件编辑画布\",\n \"Email settings\": \"邮件设置\",\n \"Email template library\": \"邮件模板库\",\n \"Equal\": \"等宽\",\n \"Facebook\": \"Facebook\",\n \"Favorites\": \"收藏\",\n \"Fill the section\": \"铺满版块\",\n \"First letters\": \"首字母大写\",\n \"Get started\": \"开始使用\",\n \"GitHub\": \"GitHub\",\n \"Greets a new customer and lists the first steps\": \"欢迎新客户并列出入门步骤\",\n \"Heading\": \"标题\",\n \"Hero banner\": \"主视觉横幅\",\n \"Horizontal\": \"水平\",\n \"HTML copied.\": \"HTML 已复制。\",\n \"Icon background\": \"图标背景\",\n \"Icon size\": \"图标大小\",\n \"Icons linking to your profiles\": \"链接到您社交主页的图标\",\n \"Image + text\": \"图文\",\n \"Image beside a title, text and button\": \"图片与标题、正文和按钮并排\",\n \"Image position\": \"图片位置\",\n \"Image size\": \"图片尺寸\",\n \"In brief\": \"简讯\",\n \"Instagram\": \"Instagram\",\n \"Italic (Ctrl+I)\": \"斜体 (Ctrl+I)\",\n \"Keep its width\": \"保持原宽度\",\n \"Label\": \"显示文字\",\n \"Large bold title\": \"加粗大标题\",\n \"LinkedIn\": \"LinkedIn\",\n \"Logo, headline, text and a button\": \"Logo、标题、正文和按钮\",\n \"Menu\": \"菜单\",\n \"Menu link\": \"菜单链接\",\n \"Monthly news: banner, two articles, highlights\": \"月度资讯:横幅、两篇文章和简讯\",\n \"Network\": \"社交平台\",\n \"No preview: this storage cannot render emails.\": \"无法预览:此存储不支持渲染邮件。\",\n \"No template yet. Start from a base, or create a new one.\": \"暂无模板。可从基础模板开始,或新建一个模板。\",\n \"Nothing matches “{query}”.\": \"没有与“{query}”匹配的结果。\",\n \"Offer valid until Sunday midnight, while stocks last.\": \"优惠截至周日 24 点,售完即止。\",\n \"On mobile\": \"移动端\",\n \"One sentence about it.\": \"用一句话简单介绍。\",\n \"One sentence that makes people want to read on.\": \"一句吸引读者继续阅读的话。\",\n \"Origin\": \"来源\",\n \"Original size\": \"原始尺寸\",\n \"Our offices, 1 Main Street\": \"我们的办公室(主街 1 号)\",\n \"Picking a template replaces the email being edited.\": \"选择模板会替换当前正在编辑的邮件。\",\n \"Product one\": \"产品一\",\n \"Product two\": \"产品二\",\n \"Profile URL\": \"主页链接\",\n \"Promotion\": \"促销\",\n \"Read more\": \"阅读全文\",\n \"Ready-made templates to copy into your campaigns.\": \"现成模板,可直接复制到您的营销活动中使用。\",\n \"Remove from favorites\": \"取消收藏\",\n \"Remove the link\": \"移除链接\",\n \"Replace\": \"替换\",\n \"Replace the current email?\": \"替换当前邮件?\",\n \"Reply to this email: a person reads it.\": \"直接回复这封邮件,会有专人为您解答。\",\n \"Row of links to your site\": \"一排指向您网站的链接\",\n \"Save the date — seats are limited.\": \"请预留时间,名额有限。\",\n \"Search templates\": \"搜索模板\",\n \"Seats are limited: book yours now, it takes ten seconds.\": \"名额有限,立即报名,只需十秒钟。\",\n \"Select a template on the left.\": \"请在左侧选择模板。\",\n \"Select the parent\": \"选择父级\",\n \"Shop\": \"商店\",\n \"Shop the sale\": \"立即抢购\",\n \"Simple\": \"简洁\",\n \"So we can tailor what we send you.\": \"以便我们为您推送更合适的内容。\",\n \"Social link\": \"社交链接\",\n \"Social links\": \"社交媒体\",\n \"Space around each icon\": \"图标四周间距\",\n \"Start from a template\": \"从模板开始\",\n \"Start from this base\": \"从此基础模板开始\",\n \"Strikethrough\": \"删除线\",\n \"Take a tour of what you can do.\": \"看看您可以用它做些什么。\",\n \"Template deleted.\": \"模板已删除。\",\n \"Template duplicated.\": \"模板已复制。\",\n \"Templates\": \"模板\",\n \"Text formatting\": \"文本格式\",\n \"Thank you for joining us. Here is how to get the most out of your account.\": \"感谢您的加入。只需以下几步,即可充分用好您的账户。\",\n \"The browser refused to copy.\": \"浏览器拒绝了复制操作。\",\n \"The news of the month\": \"本月资讯\",\n \"The template and its versions will be deleted.\": \"该模板及其所有版本都将被删除。\",\n \"The template preview appears here.\": \"模板预览将显示在这里。\",\n \"This template was saved in a format this builder cannot open.\": \"此模板的保存格式无法在本编辑器中打开。\",\n \"This weekend only, with the code SPRING30.\": \"仅限本周末,使用优惠码 SPRING30 即可享受。\",\n \"Three steps to get started.\": \"三步轻松上手。\",\n \"Thursday, 7 pm\": \"周四晚上 7 点\",\n \"Title\": \"标题\",\n \"Two or three sentences that sum up the story and make people want the rest.\": \"用两三句话概括文章内容,激发读者的阅读兴趣。\",\n \"Underline (Ctrl+U)\": \"下划线 (Ctrl+U)\",\n \"Updated\": \"更新时间\",\n \"Vertical\": \"垂直\",\n \"Welcome aboard!\": \"欢迎加入!\",\n \"Welcome, {name}!\": \"欢迎您,{name}!\",\n \"What changed, what is coming, and two stories worth your time.\": \"近期更新、即将上线的内容,以及两篇值得一读的文章。\",\n \"When\": \"时间\",\n \"Where\": \"地点\",\n \"Whole image\": \"完整显示图片\",\n \"Whole screen\": \"全屏\",\n \"With the code SPRING30, until Sunday midnight.\": \"使用优惠码 SPRING30,优惠截至周日 24 点。\",\n \"X\": \"X\",\n \"You're invited\": \"诚邀您参加\",\n \"Your big announcement\": \"您的重要公告\",\n \"YouTube\": \"YouTube\",\n \"{count} sections selected. Press Delete to remove them (Ctrl+Z brings them back).\": \"已选择 {count} 个版块。按 Delete 键可删除(按 Ctrl+Z 可恢复)。\",\n \"{label} — {side}\": \"{label}({side})\",\n \"{max} test addresses at most\": \"最多 {max} 个测试地址\",\n \"{message} Your version can be saved as a copy.\": \"{message} 您的版本可另存为副本。\",\n \"{name} (copy)\": \"{name}(副本)\",\n \"{sent} sent, {failed} failed.\": \"{sent} 封已发送,{failed} 封失败。\",\n \"{sent} test(s) sent — check your inbox.\": \"已发送 {sent} 封测试邮件,请查收。\",\n \"1 column\": \"1 栏\",\n \"2 columns\": \"2 栏\",\n \"2-column section\": \"2 栏版块\",\n \"25%\": \"25%\",\n \"3 columns\": \"3 栏\",\n \"3-column section\": \"3 栏版块\",\n \"50%\": \"50%\",\n \"600 px (standard)\": \"600 px(标准)\",\n \"640 px\": \"640 px\",\n \"75%\": \"75%\",\n \"Address not allowed\": \"不允许使用该地址\",\n \"Addresses\": \"地址\",\n \"Alignment\": \"对齐\",\n \"Alt text\": \"替代文本\",\n \"An https:// address is required\": \"必须使用 https:// 地址\",\n \"attribute {name} not allowed\": \"不允许使用属性 {name}\",\n \"Authentication required\": \"需要身份验证\",\n \"Autosave\": \"自动保存\",\n \"Autosave paused\": \"自动保存已暂停\",\n \"Autosaved at {time}\": \"已于 {time} 自动保存\",\n \"Autosaving…\": \"正在自动保存……\",\n \"Available in every template.\": \"可在所有模板中使用。\",\n \"Back\": \"返回\",\n \"Background\": \"背景\",\n \"base tag not allowed\": \"不允许使用 base 标签\",\n \"Blocks\": \"区块\",\n \"Bold\": \"加粗\",\n \"Bottom\": \"底部\",\n \"Button\": \"按钮\",\n \"Button background\": \"按钮背景\",\n \"Button padding\": \"按钮内边距\",\n \"Button without link ({count})\": \"按钮缺少链接({count})\",\n \"Call to action\": \"行动号召\",\n \"Campaign\": \"营销活动\",\n \"Campaign name\": \"营销活动名称\",\n \"Cancel\": \"取消\",\n \"CDATA section not allowed\": \"不允许使用 CDATA 节\",\n \"Center\": \"居中\",\n \"Close\": \"关闭\",\n \"Colors\": \"颜色\",\n \"Column\": \"栏\",\n \"Company\": \"公司\",\n \"component script not allowed\": \"不允许使用组件脚本\",\n \"conditional comment not allowed\": \"不允许使用条件注释\",\n \"Confirm\": \"确认\",\n \"Content\": \"内容\",\n \"Content width\": \"内容宽度\",\n \"Copy saved: “{name}”.\": \"副本已保存:“{name}”。\",\n \"Corner radius\": \"圆角\",\n \"Create\": \"创建\",\n \"Create “{name}”\": \"创建“{name}”\",\n \"current\": \"当前\",\n \"Custom\": \"自定义\",\n \"Custom variables are not configured\": \"未配置自定义变量功能\",\n \"Dashed\": \"虚线\",\n \"Default\": \"默认\",\n \"Delete\": \"删除\",\n \"Delete (Del)\": \"删除 (Del)\",\n \"Delete the variable “{name}”?\": \"删除变量“{name}”?\",\n \"Describes the image if it is blocked\": \"图片被屏蔽时显示的描述\",\n \"Deselect\": \"取消选择\",\n \"Desktop\": \"桌面端\",\n \"Device\": \"设备\",\n \"Dismiss\": \"关闭\",\n \"Divider\": \"分隔线\",\n \"Dotted\": \"点线\",\n \"Double-click the text to edit it.\": \"双击文本即可编辑。\",\n \"Duplicate\": \"复制\",\n \"Edit\": \"编辑\",\n \"Edit “{name}”\": \"编辑“{name}”\",\n \"Edit variable\": \"编辑变量\",\n \"Element actions\": \"元素操作\",\n \"Email\": \"邮件\",\n \"Email address\": \"邮箱地址\",\n \"Email preview\": \"邮件预览\",\n \"embed not allowed\": \"不允许使用 embed\",\n \"Empty file\": \"文件为空\",\n \"Empty MJML\": \"MJML 为空\",\n \"Empty MJML compilation\": \"MJML 编译结果为空\",\n \"Empty subject\": \"主题为空\",\n \"executable content not allowed\": \"不允许包含可执行内容\",\n \"external resource not allowed\": \"不允许引用外部资源\",\n \"File missing\": \"缺少文件\",\n \"Final rendering, variables filled with samples.\": \"最终渲染效果,变量已填入示例值。\",\n \"First name\": \"名字\",\n \"Fit to text\": \"适应文字\",\n \"Font\": \"字体\",\n \"forbidden element in project: {tag}\": \"项目中包含禁止使用的元素:{tag}\",\n \"form field not allowed\": \"不允许使用表单字段\",\n \"form not allowed\": \"不允许使用表单\",\n \"Format rejected: PNG, JPEG or GIF expected\": \"格式不受支持:请使用 PNG、JPEG 或 GIF\",\n \"frame not allowed\": \"不允许使用 frame\",\n \"Full length\": \"全长\",\n \"Full width\": \"全宽\",\n \"Full-width section\": \"通栏版块\",\n \"Give the template a name before saving it.\": \"保存前请先为模板命名。\",\n \"Group\": \"分组\",\n \"Height\": \"高度\",\n \"Hello {name},\": \"{name},您好:\",\n \"Hex code\": \"十六进制色值\",\n \"Horizontal rule\": \"水平分隔线\",\n \"HTML button not allowed (use the Button block)\": \"不允许使用 HTML 按钮(请使用“按钮”区块)\",\n \"iframe not allowed\": \"不允许使用 iframe\",\n \"Ignored (invalid): {email}\": \"已忽略(无效):{email}\",\n \"Image\": \"图片\",\n \"image rejected ({name})\": \"图片被拒绝({name})\",\n \"image rejected ({name}): https only\": \"图片被拒绝({name}):仅支持 https\",\n \"Image too large: {max} MB maximum\": \"图片过大:不能超过 {max} MB\",\n \"Image without alt text ({count})\": \"图片缺少替代文本({count})\",\n \"Image without file ({count})\": \"图片缺少文件({count})\",\n \"Inbox\": \"收件箱\",\n \"Indicative preview — check it with “Send test”.\": \"此预览仅供参考,请通过“发送测试邮件”核实效果。\",\n \"inline style rejected\": \"内联样式被拒绝\",\n \"Insecure http link ({count})\": \"不安全的 http 链接({count})\",\n \"Insert a variable in the preview text\": \"在预览文本中插入变量\",\n \"Insert a variable in the subject\": \"在主题中插入变量\",\n \"Internal error\": \"内部错误\",\n \"Invalid JSON\": \"JSON 无效\",\n \"Justify\": \"两端对齐\",\n \"Key is required\": \"请填写标签\",\n \"Last name\": \"姓氏\",\n \"Layout\": \"布局\",\n \"Learn more\": \"了解更多\",\n \"Leave\": \"离开\",\n \"Leave the builder?\": \"离开编辑器?\",\n \"Left\": \"左侧\",\n \"Length\": \"长度\",\n \"Line color\": \"线条颜色\",\n \"Line height\": \"行高\",\n \"Line style\": \"线条样式\",\n \"Link\": \"链接\",\n \"Link on click\": \"点击跳转链接\",\n \"Link URL\": \"链接地址\",\n \"Links\": \"链接\",\n \"Loading the builder\": \"正在加载编辑器\",\n \"Loading…\": \"正在加载……\",\n \"Lowercase letters, digits, \\\"_\\\" and \\\".\\\" only, starting with a letter\": \"只能包含小写字母、数字、“_”和“.”,且必须以字母开头\",\n \"MathML not allowed\": \"不允许使用 MathML\",\n \"Message is {size} KB: Gmail clips messages over {limit} KB\": \"邮件大小为 {size} KB:Gmail 会截断超过 {limit} KB 的邮件\",\n \"meta tag not allowed\": \"不允许使用 meta 标签\",\n \"Middle\": \"中间\",\n \"missing <mj-body>\": \"缺少 <mj-body>\",\n \"Missing unsubscribe link\": \"缺少退订链接\",\n \"mj-font (external font) is outside the builder\": \"mj-font(外部字体)不在编辑器支持范围内\",\n \"mj-include would read a file from the server\": \"mj-include 会读取服务器上的文件\",\n \"mj-raw (free HTML) is not allowed\": \"不允许使用 mj-raw(自定义 HTML)\",\n \"mj-style (free CSS) is outside the builder\": \"mj-style(自定义 CSS)不在编辑器支持范围内\",\n \"MJML too large ({size} KB, maximum {max} KB)\": \"MJML 过大({size} KB,上限 {max} KB)\",\n \"Mobile\": \"移动端\",\n \"Move down\": \"下移\",\n \"Move left\": \"左移\",\n \"Move right\": \"右移\",\n \"Move up\": \"上移\",\n \"Multipart form expected\": \"需要 multipart 表单\",\n \"Name\": \"名称\",\n \"Name is required\": \"请填写名称\",\n \"Name required\": \"请填写名称\",\n \"New template\": \"新建模板\",\n \"New variable\": \"新建变量\",\n \"No changes\": \"无更改\",\n \"No preview text\": \"无预览文本\",\n \"No subject\": \"无主题\",\n \"No usable test address\": \"没有可用的测试地址\",\n \"No variable found.\": \"未找到变量。\",\n \"No versions yet.\": \"暂无版本。\",\n \"Normal\": \"常规\",\n \"Nothing to fix.\": \"没有需要修正的问题。\",\n \"Nothing to show yet.\": \"暂无内容。\",\n \"object not allowed\": \"不允许使用 object\",\n \"Order number\": \"订单号\",\n \"Padding\": \"内边距\",\n \"Page background\": \"页面背景\",\n \"Paragraph or heading\": \"段落或标题\",\n \"Photo, visual or logo\": \"照片、配图或 Logo\",\n \"Pick a colour\": \"选择颜色\",\n \"Points to check\": \"检查项\",\n \"Preview\": \"预览\",\n \"Preview and tests\": \"预览与测试\",\n \"Preview text\": \"预览文本\",\n \"Project rejected: {issues}\": \"项目被拒绝:{issues}\",\n \"project too deep\": \"项目嵌套层级过深\",\n \"project too large ({size} KB, maximum {max} KB)\": \"项目过大({size} KB,上限 {max} KB)\",\n \"Properties\": \"属性\",\n \"Recipient\": \"收件人\",\n \"Redo\": \"重做\",\n \"Redo (Ctrl+Y)\": \"重做 (Ctrl+Y)\",\n \"Refresh\": \"刷新\",\n \"Rendering…\": \"正在渲染……\",\n \"Request too large\": \"请求过大\",\n \"Restore\": \"恢复\",\n \"Restore version {n}\": \"恢复版本 {n}\",\n \"Restore version {n}?\": \"恢复版本 {n}?\",\n \"Results\": \"结果\",\n \"Resume\": \"继续编辑\",\n \"Resume the draft?\": \"继续编辑草稿?\",\n \"Retry\": \"重试\",\n \"Right\": \"右侧\",\n \"Route not found\": \"未找到路由\",\n \"Sample value\": \"示例值\",\n \"Save\": \"保存\",\n \"Save a copy\": \"另存为副本\",\n \"Save the template first\": \"请先保存模板\",\n \"Saved\": \"已保存\",\n \"Saved — version {n}.\": \"已保存为版本 {n}。\",\n \"Saved at {time}\": \"已于 {time} 保存\",\n \"Saved, with {count} MJML warning(s): {message}\": \"已保存,但有 {count} 条 MJML 警告:{message}\",\n \"Saved. {count} image(s) have no picture yet: they are left out of the email until you add one.\": \"已保存。{count} 个图片区块尚未添加图片,添加之前不会出现在邮件中。\",\n \"Saving…\": \"正在保存……\",\n \"script not allowed\": \"不允许使用脚本\",\n \"Search variables…\": \"搜索变量……\",\n \"Section\": \"版块\",\n \"Select a text or a button first.\": \"请先选择文本或按钮。\",\n \"Send\": \"发送\",\n \"Send a test\": \"发送测试邮件\",\n \"Shown after the subject in the inbox\": \"在收件箱中显示在主题之后\",\n \"Size\": \"大小\",\n \"Solid\": \"实线\",\n \"Spacer\": \"间隔\",\n \"Spacing\": \"间距\",\n \"Start over\": \"重新开始\",\n \"style sheet not allowed\": \"不允许使用样式表\",\n \"Subject\": \"主题\",\n \"SVG not allowed\": \"不允许使用 SVG\",\n \"Tag\": \"标签\",\n \"tag not allowed: <{tag}>\": \"不允许使用标签:<{tag}>\",\n \"Template\": \"模板\",\n \"Template changed in the meantime\": \"模板已在此期间被修改\",\n \"Template changed in the meantime — reload it before saving\": \"模板已在此期间被修改,请重新加载后再保存\",\n \"Template changed in the meantime by {user} — reload it before saving\": \"{user} 已在此期间修改了模板,请重新加载后再保存\",\n \"Template not found\": \"未找到模板\",\n \"Template rejected: {issues}\": \"模板被拒绝:{issues}\",\n \"Template rejected: {issues} (+{more})\": \"模板被拒绝:{issues}(另有 {more} 项)\",\n \"Template saved.\": \"模板已保存。\",\n \"Templates that use it will show its “value if empty”.\": \"使用此变量的模板将改为显示其“为空时的值”。\",\n \"Test\": \"测试\",\n \"Test sending is not configured\": \"未配置测试发送功能\",\n \"Text\": \"文本\",\n \"The builder could not load.\": \"编辑器加载失败。\",\n \"The builder could not start.\": \"编辑器启动失败。\",\n \"the document must start with <mjml>\": \"文档必须以 <mjml> 开头\",\n \"The draft will be offered again next time.\": \"下次打开时会再次提示恢复此草稿。\",\n \"The email on screen, to reviewers’ addresses.\": \"将当前邮件发送至审阅人的邮箱。\",\n \"The template could not be loaded.\": \"无法加载该模板。\",\n \"Thickness\": \"粗细\",\n \"This key is already used\": \"此标签已被使用\",\n \"To check\": \"待检查\",\n \"Too many test sends — try again later\": \"测试发送过于频繁,请稍后重试\",\n \"Too many uploads — try again later\": \"上传过于频繁,请稍后重试\",\n \"Top\": \"顶部\",\n \"Typography\": \"排版\",\n \"Undo\": \"撤销\",\n \"Undo (Ctrl+Z)\": \"撤销 (Ctrl+Z)\",\n \"Unknown variables (rendered empty): {tags}\": \"未知变量(显示为空):{tags}\",\n \"Unsaved changes\": \"未保存的更改\",\n \"Unsaved changes will be lost.\": \"未保存的更改将会丢失。\",\n \"Unsaved changes will be replaced.\": \"未保存的更改将被替换。\",\n \"Unsaved template from {when}.\": \"发现 {when} 未保存的模板。\",\n \"Unsubscribe\": \"退订\",\n \"Unsubscribe link\": \"退订链接\",\n \"Upload\": \"上传\",\n \"Upload failed\": \"上传失败\",\n \"URL rejected ({name})\": \"网址被拒绝({name})\",\n \"Value if empty\": \"为空时的值\",\n \"Variable “{name}” created and inserted.\": \"已创建并插入变量“{name}”。\",\n \"Variable “{name}” created.\": \"已创建变量“{name}”。\",\n \"Variable “{name}” saved.\": \"已保存变量“{name}”。\",\n \"Variable deleted.\": \"变量已删除。\",\n \"Variable not found\": \"未找到变量\",\n \"Variables\": \"变量\",\n \"Version {n}\": \"版本 {n}\",\n \"Version {n} restored — save to keep it.\": \"已恢复版本 {n},保存后方可保留。\",\n \"Version not found\": \"未找到版本\",\n \"Versions\": \"版本\",\n \"Vertical alignment\": \"垂直对齐\",\n \"Vertical space\": \"垂直留白\",\n \"Weight\": \"字重\",\n \"When a recipient has none\": \"收件人无此信息时显示\",\n \"Width\": \"宽度\",\n \"Your company\": \"您的公司\",\n \"Your headline\": \"在此输入标题\",\n \"Your text.\": \"在此输入正文。\",\n \"“{name}” template applied.\": \"已应用模板“{name}”。\",\n \"€49 instead of €70\": \"¥49(原价 ¥70)\",\n \"Cancelled\": \"已取消\",\n \"Email generation is not configured\": \"未配置邮件生成功能\",\n \"Too many generated emails — try again later\": \"生成邮件过于频繁,请稍后重试\",\n \"The AI service did not answer — try again in a moment.\": \"AI 服务未响应,请稍后重试。\",\n \"Color scheme\": \"配色模式\",\n \"Light mode\": \"浅色模式\",\n \"Dark mode\": \"深色模式\",\n \"Dark mode as Gmail and Outlook apps show it: light backgrounds turn dark, dark text turns light, images stay as they are.\": \"模拟 Gmail 和 Outlook 应用中的深色模式:浅色背景变深,深色文字变浅,图片保持不变。\",\n \"Subject ideas are not configured\": \"未配置主题建议功能\",\n \"Too many subject ideas — try again later\": \"主题建议请求过于频繁,请稍后重试\",\n \"Text rewriting is not configured\": \"未配置文本改写功能\",\n \"Too many rewrites — try again later\": \"改写过于频繁,请稍后重试\",\n \"Brand\": \"品牌\",\n \"Your brand\": \"您的品牌\",\n \"Set it once: new emails, templates and blocks take your logo, colors and font.\": \"只需设置一次:新建的邮件、模板和区块都会使用您的 Logo、颜色和字体。\",\n \"Your website\": \"您的网站\",\n \"Get my brand\": \"获取品牌信息\",\n \"Reading the website…\": \"正在读取网站……\",\n \"The logo, colors and font are read from it. You can change them before saving.\": \"将从网站读取 Logo、颜色和字体,保存前可以修改。\",\n \"The website could not be read.\": \"无法读取该网站。\",\n \"Logo\": \"Logo\",\n \"Remove\": \"移除\",\n \"or an image address: https://…\": \"或输入图片地址:https://…\",\n \"Company name\": \"公司名称\",\n \"Main color\": \"主色\",\n \"Buttons, banners, links\": \"按钮、横幅、链接\",\n \"Headings color\": \"标题颜色\",\n \"Also apply to this email\": \"同时应用到当前邮件\",\n \"Brand applied. Ctrl+Z brings back the previous look.\": \"已应用品牌。按 Ctrl+Z 可恢复之前的外观。\",\n \"Brand saved. New emails and blocks use it.\": \"品牌已保存。新建的邮件和区块将使用此品牌。\",\n \"The brand could not be saved.\": \"无法保存品牌。\",\n \"Big news\": \"重磅消息\",\n \"A short line under the title.\": \"标题下方的一行简短说明。\",\n \"A headline\": \"示例标题\",\n \"Some text, with\": \"一段正文,带有\",\n \"a link\": \"一个链接\",\n \"The brand is not configured\": \"未配置品牌功能\",\n \"Reading a brand from a website is not configured\": \"未配置从网站读取品牌的功能\",\n \"Too many websites read — try again later\": \"读取网站过于频繁,请稍后重试\",\n \"Enter the address of a website, like acme.com\": \"请输入网站地址,例如 acme.com\",\n \"This address is not a public website\": \"该地址不是公开网站\",\n \"The website could not be reached. Check the address.\": \"无法访问该网站,请检查地址。\",\n \"The website took too long to answer\": \"网站响应超时\",\n \"The website does not let the builder read it. Fill in your brand below.\": \"该网站不允许编辑器读取,请在下方手动填写品牌信息。\",\n \"This address is not a web page\": \"该地址不是网页\",\n \"The website redirects too many times\": \"网站重定向次数过多\",\n \"The website sent too much data\": \"网站返回的数据过多\",\n \"No logo was found on the website. Upload it below.\": \"未在网站上找到 Logo,请在下方上传。\",\n \"The logo on the website is an SVG or WebP image, which most email apps do not show. Upload a PNG or JPEG version.\": \"网站上的 Logo 是 SVG 或 WebP 格式,大多数邮件客户端无法显示。请上传 PNG 或 JPEG 版本。\",\n \"The website icon is used as the logo. Upload your full logo if you have one.\": \"已将网站图标用作 Logo。如有完整 Logo,请上传。\",\n \"No main color was found on the website. Pick one below.\": \"未在网站上找到主色,请在下方选择。\",\n};\n","// @ts-check\n/**\n * Translations.\n *\n * Source strings are written in English directly in the code and double as\n * translation keys (`t('Save')`). A locale is a plain object mapping those\n * English strings to translated ones; a missing entry falls back to English.\n * Placeholders use `{name}`: `t('Saved — version {n}.', { n: 3 })`.\n *\n * The same translator serves the browser (builder interface) and the server\n * (validation and API error messages).\n */\n\nimport { de } from './de.js';\nimport { es } from './es.js';\nimport { fr } from './fr.js';\nimport { pt } from './pt.js';\nimport { ru } from './ru.js';\nimport { zh } from './zh.js';\n\n/** @typedef {Record<string, string>} Messages */\n/** @typedef {(text: string, params?: Record<string, string|number|null|undefined>) => string} Translate */\n\n/** Built-in locales. English is the source language: an empty dictionary. */\nexport const LOCALES = /** @type {Record<string, Messages>} */ ({ en: {}, fr, de, es, pt, ru, zh });\n\n/**\n * @param {Messages} [messages]\n * @returns {Translate}\n */\nexport function createTranslator(messages = {}) {\n return (text, params) => {\n const template = Object.prototype.hasOwnProperty.call(messages, text) ? messages[text] : text;\n if (!params) return template;\n return template.replace(/\\{(\\w+)\\}/g, (match, key) =>\n params[key] === undefined || params[key] === null ? match : String(params[key])\n );\n };\n}\n\n/**\n * Translator for a locale code (`'fr'`, `'fr-FR'`, `'en'`…), optionally\n * extended with application-specific strings.\n *\n * @param {string} [locale]\n * @param {Messages} [overrides]\n * @returns {Translate}\n */\nexport function translatorFor(locale = 'en', overrides = {}) {\n return createTranslator({ ...messagesOf(LOCALES, locale), ...overrides });\n}\n\n/**\n * The dictionary of a locale among several (`'fr-FR'` finds `fr`); an empty\n * one when there is none.\n * @param {Record<string, Messages>|null|undefined} dictionaries\n * @param {string} [locale]\n * @returns {Messages}\n */\nexport function messagesOf(dictionaries, locale = 'en') {\n if (!dictionaries) return {};\n const code = String(locale).toLowerCase();\n const own = (/** @type {string} */ key) => (Object.prototype.hasOwnProperty.call(dictionaries, key) ? dictionaries[key] : null);\n return own(code) || own(code.slice(0, 2)) || {};\n}\n\n/** English, untouched: the default everywhere a translator is optional. */\nexport const identity = createTranslator();\n","// @ts-check\n/**\n * THE EMAIL MODEL — the builder's own document, an MJML tree with ids.\n *\n * { id, tag: 'mj-text', attributes: { color: '#2b3038' }, children: [], content: 'Hello' }\n *\n * One node per MJML element. \"Ending\" elements (`mj-text`, `mj-button`…)\n * keep their inner HTML in `content`; the others hold `children`. Ids are\n * opaque, unique within a tree, made of `[a-z0-9]` so they can live in a CSS\n * class (the canvas finds an element by them, see `canvasMjml.js`).\n *\n * Every operation is PURE: it returns a new tree and never changes the one it\n * got, sharing the untouched branches. The undo history is then just a list\n * of trees.\n *\n * Dependency-free: runs in the browser, on the server and in unit tests.\n */\n\n/**\n * @typedef {{\n * id: string,\n * tag: string,\n * attributes: Record<string, string>,\n * children: EmailNode[],\n * content: string|null,\n * }} EmailNode\n */\n\n/** MJML elements whose inner content is HTML (MJML calls them \"ending tags\"). */\nexport const ENDING_TAGS = new Set([\n 'mj-text',\n 'mj-button',\n 'mj-navbar-link',\n 'mj-social-element',\n 'mj-table',\n 'mj-raw',\n 'mj-title',\n 'mj-preview',\n 'mj-style',\n 'mj-accordion-title',\n 'mj-accordion-text',\n]);\n\n/** Elements that hold a whole section's place in the body. */\nexport const SECTION_TAGS = new Set(['mj-section', 'mj-wrapper', 'mj-hero']);\n\n/** Elements that are never removed, moved or duplicated. */\nexport const LOCKED_TAGS = new Set(['mjml', 'mj-head', 'mj-body']);\n\nlet counter = 0;\n\n/** A fresh id: short, unique for the page's lifetime, `[a-z0-9]` only. */\nexport function createId() {\n counter = (counter + 1) % 1679616; // 36^4\n return `n${Date.now().toString(36).slice(-5)}${counter.toString(36).padStart(4, '0')}${Math.floor(Math.random() * 1296)\n .toString(36)\n .padStart(2, '0')}`;\n}\n\n/**\n * @param {string} tag\n * @param {{attributes?: Record<string, string>, children?: EmailNode[], content?: string|null, id?: string}} [parts]\n * @returns {EmailNode}\n */\nexport function createNode(tag, { attributes = {}, children = [], content = null, id = createId() } = {}) {\n return { id, tag, attributes: { ...attributes }, children: [...children], content: ENDING_TAGS.has(tag) ? String(content ?? '') : null };\n}\n\n/**\n * Deep copy with NEW ids everywhere (duplicate, paste, insert a block twice).\n * @param {EmailNode} node\n * @returns {EmailNode}\n */\nexport function cloneWithNewIds(node) {\n return {\n id: createId(),\n tag: node.tag,\n attributes: { ...node.attributes },\n children: node.children.map(cloneWithNewIds),\n content: node.content,\n };\n}\n\n/* ── Reading ─────────────────────────────────────────────────────────────── */\n\n/**\n * The node with this id and its ancestors (root first), or null.\n * @param {EmailNode} root @param {string} id\n * @returns {EmailNode[]|null}\n */\nexport function pathTo(root, id) {\n if (root.id === id) return [root];\n for (const child of root.children) {\n const path = pathTo(child, id);\n if (path) return [root, ...path];\n }\n return null;\n}\n\n/** @param {EmailNode} root @param {string|null|undefined} id */\nexport function findNode(root, id) {\n if (!id) return null;\n const path = pathTo(root, id);\n return path ? path[path.length - 1] : null;\n}\n\n/** @param {EmailNode} root @param {string} id */\nexport function parentOf(root, id) {\n const path = pathTo(root, id);\n return path && path.length > 1 ? path[path.length - 2] : null;\n}\n\n/**\n * Closest node (itself included) whose tag is one of `tags`.\n * @param {EmailNode} root @param {string} id @param {Set<string>|string[]} tags\n */\nexport function closestOfTags(root, id, tags) {\n const set = tags instanceof Set ? tags : new Set(tags);\n const path = pathTo(root, id);\n if (!path) return null;\n for (let i = path.length - 1; i >= 0; i -= 1) if (set.has(path[i].tag)) return path[i];\n return null;\n}\n\n/** First node of a tag, depth first. @param {EmailNode} root @param {string} tag @returns {EmailNode|null} */\nexport function findFirst(root, tag) {\n if (root.tag === tag) return root;\n for (const child of root.children) {\n const found = findFirst(child, tag);\n if (found) return found;\n }\n return null;\n}\n\n/** Every node, depth first. @param {EmailNode} root @param {(node: EmailNode) => void} visit */\nexport function walk(root, visit) {\n visit(root);\n for (const child of root.children) walk(child, visit);\n}\n\n/* ── Writing (pure) ──────────────────────────────────────────────────────── */\n\n/**\n * The tree with the node `id` replaced by `update(node)`.\n * @param {EmailNode} root @param {string} id @param {(node: EmailNode) => EmailNode} update\n * @returns {EmailNode}\n */\nexport function updateNode(root, id, update) {\n if (root.id === id) return update(root);\n let changed = false;\n const children = root.children.map((child) => {\n const next = updateNode(child, id, update);\n if (next !== child) changed = true;\n return next;\n });\n return changed ? { ...root, children } : root;\n}\n\n/**\n * Sets (string) or removes (null, '') attributes.\n * @param {EmailNode} root @param {string} id @param {Record<string, string|null|undefined>} attributes\n */\nexport function setAttributes(root, id, attributes) {\n return updateNode(root, id, (node) => {\n const next = { ...node.attributes };\n for (const [key, value] of Object.entries(attributes)) {\n if (value === null || value === undefined || value === '') delete next[key];\n else next[key] = String(value);\n }\n return { ...node, attributes: next };\n });\n}\n\n/** @param {EmailNode} root @param {string} id @param {string} content */\nexport function setContent(root, id, content) {\n return updateNode(root, id, (node) => (node.content === null ? node : { ...node, content: String(content ?? '') }));\n}\n\n/**\n * Inserts nodes into `parentId` at `index` (clamped).\n * @param {EmailNode} root @param {string} parentId @param {number} index @param {EmailNode[]} nodes\n */\nexport function insertNodes(root, parentId, index, nodes) {\n return updateNode(root, parentId, (parent) => {\n const at = Math.max(0, Math.min(index, parent.children.length));\n const children = [...parent.children];\n children.splice(at, 0, ...nodes);\n return { ...parent, children };\n });\n}\n\n/** @param {EmailNode} root @param {string} id */\nexport function removeNode(root, id) {\n const parent = parentOf(root, id);\n if (!parent) return root;\n return updateNode(root, parent.id, (p) => ({ ...p, children: p.children.filter((c) => c.id !== id) }));\n}\n\n/**\n * Moves a node under `parentId` at `index`, where `index` counts the target's\n * children BEFORE the node leaves its place (what a drop indicator shows).\n * @param {EmailNode} root @param {string} id @param {string} parentId @param {number} index\n */\nexport function moveNode(root, id, parentId, index) {\n const node = findNode(root, id);\n const from = parentOf(root, id);\n if (!node || !from) return root;\n // A node cannot go inside itself.\n if (pathTo(node, parentId)) return root;\n let at = index;\n if (from.id === parentId) {\n const current = from.children.findIndex((c) => c.id === id);\n if (current < at) at -= 1;\n if (current === at) return root;\n }\n return insertNodes(removeNode(root, id), parentId, at, [node]);\n}\n\n/**\n * Index of a node among its siblings, and their count.\n * @param {EmailNode} root @param {string} id\n */\nexport function positionOf(root, id) {\n const parent = parentOf(root, id);\n if (!parent) return { parent: null, index: -1, count: 0 };\n return { parent, index: parent.children.findIndex((c) => c.id === id), count: parent.children.length };\n}\n\n/* ── Snapshot (the stored project) ───────────────────────────────────────── */\n\n/** Shape version of the stored project (`{ format, root }`). */\nexport const PROJECT_FORMAT = 1;\n\n/** @param {EmailNode} root */\nexport function toProject(root) {\n return { format: PROJECT_FORMAT, root: strip(root) };\n}\n\n/** @param {EmailNode} node @returns {any} */\nfunction strip(node) {\n /** @type {any} */\n const out = { id: node.id, tag: node.tag };\n if (Object.keys(node.attributes).length) out.attributes = { ...node.attributes };\n if (node.content !== null) out.content = node.content;\n if (node.children.length) out.children = node.children.map(strip);\n return out;\n}\n\n/**\n * Reads a stored project back into a tree. Ids are kept when they are valid\n * and unique, replaced otherwise. Throws on anything that is not a project of\n * this format.\n * @param {unknown} project\n * @returns {EmailNode}\n */\nexport function fromProject(project) {\n const value = /** @type {any} */ (project);\n if (!value || typeof value !== 'object' || value.format !== PROJECT_FORMAT || !value.root) {\n throw new Error('Not a project of this builder');\n }\n const seen = new Set();\n /** @param {any} raw @returns {EmailNode} */\n const read = (raw) => {\n if (!raw || typeof raw !== 'object' || typeof raw.tag !== 'string' || !/^(mjml|mj-[a-z-]+)$/.test(raw.tag)) {\n throw new Error('Invalid element in the project');\n }\n let id = typeof raw.id === 'string' && /^[a-z0-9]{1,40}$/.test(raw.id) ? raw.id : createId();\n if (seen.has(id)) id = createId();\n seen.add(id);\n /** @type {Record<string, string>} */\n const attributes = {};\n for (const [k, v] of Object.entries(raw.attributes || {})) {\n if (/^[a-z][a-z0-9-]*$/i.test(k) && v !== null && v !== undefined) attributes[k] = String(v);\n }\n return createNode(raw.tag, {\n id,\n attributes,\n content: ENDING_TAGS.has(raw.tag) ? String(raw.content ?? '') : null,\n children: ENDING_TAGS.has(raw.tag) ? [] : (Array.isArray(raw.children) ? raw.children : []).map(read),\n });\n };\n const root = read(value.root);\n if (root.tag !== 'mjml' || !findFirst(root, 'mj-body')) throw new Error('The project has no email body');\n return root;\n}\n","// @ts-check\n/**\n * MJML ⇄ MODEL — reading MJML into the builder's tree, writing it back.\n *\n * MJML is close enough to XML to be read by a small scanner, and only two\n * kinds of element exist:\n * - containers (`mj-section`, `mj-column`…), made of other MJML elements;\n * - \"ending\" elements (`mj-text`, `mj-button`…), whose inside is HTML kept\n * as is, up to the matching closing tag.\n * Anything else between containers (stray text, comments, HTML outside an\n * ending element) is not MJML and is dropped.\n *\n * Attribute values are DECODED in the model (`&` → `&`) and encoded again\n * on write: the model holds what the attribute means, the MJML how to write\n * it.\n *\n * Dependency-free: runs in the browser, on the server and in unit tests.\n */\n\nimport { ENDING_TAGS, createNode, findFirst } from './model.js';\n\n/** @typedef {import('./model.js').EmailNode} EmailNode */\n\nconst NAMED_ENTITIES = { amp: '&', lt: '<', gt: '>', quot: '\"', apos: \"'\", nbsp: ' ' };\n\n/** @param {string} value */\nexport function decodeAttribute(value) {\n return value.replace(/&(#x[0-9a-f]+|#[0-9]+|[a-z]+);/gi, (match, entity) => {\n if (entity[0] === '#') {\n const code = entity[1] === 'x' || entity[1] === 'X' ? parseInt(entity.slice(2), 16) : parseInt(entity.slice(1), 10);\n return Number.isFinite(code) && code > 0 && code < 0x110000 ? String.fromCodePoint(code) : match;\n }\n const named = /** @type {Record<string, string>} */ (NAMED_ENTITIES)[entity.toLowerCase()];\n return named ?? match;\n });\n}\n\n/** @param {string} value */\nexport function encodeAttribute(value) {\n return String(value).replace(/&/g, '&').replace(/\"/g, '"').replace(/</g, '<').replace(/>/g, '>');\n}\n\n/**\n * Reads the attributes of an opening tag, from `start` (just after the name)\n * to its `>`. Quotes may contain `>`.\n * @param {string} source @param {number} start\n * @returns {{attributes: Record<string, string>, end: number, selfClosing: boolean}}\n */\nfunction readAttributes(source, start) {\n /** @type {Record<string, string>} */\n const attributes = {};\n let i = start;\n const n = source.length;\n while (i < n) {\n while (i < n && /\\s/.test(source[i])) i += 1;\n if (source[i] === '>') return { attributes, end: i + 1, selfClosing: false };\n if (source[i] === '/' && source[i + 1] === '>') return { attributes, end: i + 2, selfClosing: true };\n if (i >= n) break;\n const nameMatch = /^[^\\s=/>\"']+/.exec(source.slice(i, i + 200));\n if (!nameMatch) {\n i += 1;\n continue;\n }\n const name = nameMatch[0].toLowerCase();\n i += nameMatch[0].length;\n while (i < n && /\\s/.test(source[i])) i += 1;\n let value = '';\n if (source[i] === '=') {\n i += 1;\n while (i < n && /\\s/.test(source[i])) i += 1;\n const quote = source[i];\n if (quote === '\"' || quote === \"'\") {\n const close = source.indexOf(quote, i + 1);\n const stop = close === -1 ? n : close;\n value = source.slice(i + 1, stop);\n i = stop + 1;\n } else {\n let bare = /^[^\\s>]*/.exec(source.slice(i))?.[0] || '';\n // `width=100/>`: the slash closes the tag, it is not in the value.\n if (bare.endsWith('/') && source[i + bare.length] === '>') bare = bare.slice(0, -1);\n value = bare;\n i += bare.length;\n }\n }\n attributes[name] = decodeAttribute(value);\n }\n return { attributes, end: n, selfClosing: false };\n}\n\n/**\n * MJML elements of a fragment (no `<mjml>` needed): `<mj-section>…</mj-section><mj-section>…`.\n * @param {string} source\n * @returns {EmailNode[]}\n */\nexport function parseMjmlFragment(source) {\n const text = String(source || '').replace(/^\\uFEFF/, '');\n /** @type {EmailNode} */\n const top = createNode('mj-fragment');\n /** @type {EmailNode[]} */\n const stack = [top];\n let i = 0;\n const n = text.length;\n\n while (i < n) {\n const lt = text.indexOf('<', i);\n if (lt === -1) break;\n i = lt;\n if (text.startsWith('<!--', i)) {\n const close = text.indexOf('-->', i + 4);\n i = close === -1 ? n : close + 3;\n continue;\n }\n if (text.startsWith('<?', i) || text.startsWith('<!', i)) {\n const close = text.indexOf('>', i);\n i = close === -1 ? n : close + 1;\n continue;\n }\n const closing = text[i + 1] === '/';\n const nameMatch = /^[a-z][a-z0-9-]*/i.exec(text.slice(i + (closing ? 2 : 1), i + 60));\n if (!nameMatch) {\n i += 1;\n continue;\n }\n const tag = nameMatch[0].toLowerCase();\n const afterName = i + (closing ? 2 : 1) + nameMatch[0].length;\n const isMjml = tag === 'mjml' || tag.startsWith('mj-');\n\n if (closing) {\n const close = text.indexOf('>', afterName);\n i = close === -1 ? n : close + 1;\n if (!isMjml) continue;\n // Close up to the matching element (tolerates a forgotten closing tag).\n for (let depth = stack.length - 1; depth > 0; depth -= 1) {\n if (stack[depth].tag === tag) {\n stack.length = depth;\n break;\n }\n }\n continue;\n }\n\n const { attributes, end, selfClosing } = readAttributes(text, afterName);\n i = end;\n if (!isMjml) continue;\n\n const parent = stack[stack.length - 1];\n if (ENDING_TAGS.has(tag)) {\n let content = '';\n if (!selfClosing) {\n const closeRe = new RegExp(`</${tag}\\\\s*>`, 'ig');\n closeRe.lastIndex = i;\n const close = closeRe.exec(text);\n const stop = close ? close.index : n;\n content = text.slice(i, stop).trim();\n i = close ? close.index + close[0].length : n;\n }\n parent.children.push(createNode(tag, { attributes, content }));\n continue;\n }\n const node = createNode(tag, { attributes });\n parent.children.push(node);\n if (!selfClosing) stack.push(node);\n }\n return top.children;\n}\n\n/**\n * A whole email. Always returns an `mjml` root holding an `mj-body`: a bare\n * fragment is wrapped, a missing body is added.\n * @param {string} source\n * @returns {EmailNode}\n */\nexport function parseMjml(source) {\n const nodes = parseMjmlFragment(source);\n let root = nodes.find((node) => node.tag === 'mjml') || null;\n if (!root) {\n const body = nodes.find((node) => node.tag === 'mj-body');\n const head = nodes.find((node) => node.tag === 'mj-head');\n root = createNode('mjml', {\n children: [\n ...(head ? [head] : []),\n body || createNode('mj-body', { children: nodes.filter((node) => node.tag !== 'mj-head') }),\n ],\n });\n }\n if (!findFirst(root, 'mj-body')) root.children.push(createNode('mj-body'));\n return root;\n}\n\n/**\n * The MJML of a tree. `pretty`: one element per line, indented (what is\n * stored and downloaded); otherwise on one line.\n * @param {EmailNode} node\n * @param {{pretty?: boolean, attributes?: (node: EmailNode) => Record<string, string>, extraChildren?: (node: EmailNode) => string}} [options]\n * `attributes`: replaces a node's attributes on write (the canvas adds its\n * markers there); `extraChildren`: MJML appended inside a container.\n */\nexport function serializeMjml(node, options = {}) {\n const { pretty = true } = options;\n /** @param {EmailNode} current @param {number} depth @returns {string} */\n const write = (current, depth) => {\n const indent = pretty ? ' '.repeat(depth) : '';\n const attributes = options.attributes ? options.attributes(current) : current.attributes;\n const attrs = Object.entries(attributes)\n .map(([key, value]) => ` ${key}=\"${encodeAttribute(value)}\"`)\n .join('');\n if (current.content !== null) {\n return `${indent}<${current.tag}${attrs}>${current.content}</${current.tag}>`;\n }\n const inner = current.children.map((child) => write(child, depth + 1));\n const extra = options.extraChildren ? options.extraChildren(current) : '';\n if (extra) inner.push(pretty ? `${' '.repeat(depth + 1)}${extra}` : extra);\n if (!inner.length) return `${indent}<${current.tag}${attrs} />`;\n return pretty\n ? `${indent}<${current.tag}${attrs}>\\n${inner.join('\\n')}\\n${indent}</${current.tag}>`\n : `<${current.tag}${attrs}>${inner.join('')}</${current.tag}>`;\n };\n return write(node, 0);\n}\n","// @ts-check\n/**\n * Building blocks shared by all blocks: palette, fonts, recurring properties.\n *\n * -- DEFAULT PALETTE ---------------------------------------------------------\n * Plain hex values: email clients load no stylesheet and understand neither\n * `var()` nor modern color functions, so every value ends up inline in a\n * `style=\"\"` attribute.\n *\n * -- EVERY BLOCK SETS ITS OWN TEXT ATTRIBUTES --------------------------------\n * Font, size, line height and color are written on the element itself, never\n * left to MJML defaults (the \"Ubuntu\" font loaded from Google, line height 1):\n * the canvas and the sent email then render the same thing, and Outlook gets\n * explicit values.\n *\n * Fonts: only web-safe stacks, installed everywhere and understood by\n * Outlook - a web font only renders in a minority of email clients.\n */\n\n/** @typedef {import('../core/EmailEditor.js').BlockProperty} BlockProperty */\n\n/** Text for an MJML attribute or element. @param {string} text */\nexport function escapeXml(text) {\n return String(text ?? '')\n .replace(/&/g, '&')\n .replace(/</g, '<')\n .replace(/>/g, '>')\n .replace(/\"/g, '"');\n}\n\n/** The default palette. */\nexport const PALETTE = {\n ink: '#2b3038',\n inkSoft: '#41506b',\n navy: '#212e5a',\n brand: '#2977bc',\n border: '#dfe6f0',\n canvas: '#eceff4',\n surface: '#ffffff',\n white: '#ffffff',\n};\n\n/** Default link of a new button. */\nexport const DEFAULT_BUTTON_URL = 'https://example.com';\n\nexport const FONT_STACK = 'Arial, Helvetica, sans-serif';\n\n/** @type {{value: string, label: string}[]} */\nexport const FONT_OPTIONS = [\n { value: 'Arial, Helvetica, sans-serif', label: 'Arial' },\n { value: 'Verdana, Geneva, sans-serif', label: 'Verdana' },\n { value: 'Tahoma, Geneva, sans-serif', label: 'Tahoma' },\n { value: \"'Trebuchet MS', Helvetica, sans-serif\", label: 'Trebuchet' },\n { value: 'Georgia, Times, serif', label: 'Georgia' },\n { value: \"'Times New Roman', Times, serif\", label: 'Times' },\n { value: \"'Courier New', Courier, monospace\", label: 'Courier' },\n];\n\n/** @type {{value: string, label: string}[]} */\nexport const ALIGN_OPTIONS = [\n { value: 'left', label: 'Left' },\n { value: 'center', label: 'Center' },\n { value: 'right', label: 'Right' },\n];\n\n/** Properties panel groups, in display order. */\nexport const GROUPS = {\n content: 'Content',\n link: 'Link',\n typography: 'Typography',\n colors: 'Colors',\n layout: 'Layout',\n spacing: 'Spacing',\n};\n\n/** Recurring properties. */\nexport const prop = {\n /** @returns {BlockProperty} */\n fontFamily: () => ({ key: 'font-family', label: 'Font', type: 'select', group: GROUPS.typography, options: FONT_OPTIONS }),\n /** @returns {BlockProperty} */\n fontSize: (min = 10, max = 48) => ({ key: 'font-size', label: 'Size', type: 'size', group: GROUPS.typography, min, max, unit: 'px' }),\n /** @returns {BlockProperty} */\n lineHeight: () => ({ key: 'line-height', label: 'Line height', type: 'size', group: GROUPS.typography, min: 10, max: 80, unit: 'px' }),\n /** @returns {BlockProperty} */\n color: (label = 'Text') => ({ key: 'color', label, type: 'color', group: GROUPS.colors }),\n /** @returns {BlockProperty} */\n background: (key = 'background-color', label = 'Background') => ({ key, label, type: 'color', group: GROUPS.colors }),\n /** @returns {BlockProperty} */\n align: (options = ALIGN_OPTIONS) => ({ key: 'align', label: 'Alignment', type: 'align', group: GROUPS.layout, options }),\n /** @returns {BlockProperty} */\n padding: (key = 'padding', label = 'Padding') => ({ key, label, type: 'spacing', group: GROUPS.spacing }),\n /** @returns {BlockProperty} */\n href: (label = 'Link URL') => ({ key: 'href', label, type: 'url', group: GROUPS.link, placeholder: 'https://' }),\n /** @returns {BlockProperty} */\n radius: (max = 40) => ({ key: 'border-radius', label: 'Corner radius', type: 'size', group: GROUPS.layout, min: 0, max, unit: 'px' }),\n};\n\n/**\n * White one-column section: the wrapper of a content block dropped outside\n * any column (MJML does not accept text directly inside the body).\n *\n * Warning: padding in LONGHAND form, never `padding=\"...\"`. The canvas starts\n * from the longhand defaults (20 px for a section), which override the\n * shorthand, while the export omits them - the screen and the email would\n * diverge (see core/mjmlAttributes).\n *\n * @param {string} inner\n */\nexport function inWhiteSection(inner) {\n return (\n `<mj-section background-color=\"${PALETTE.surface}\" padding-top=\"0px\" padding-bottom=\"0px\">` +\n `<mj-column>${inner}</mj-column></mj-section>`\n );\n}\n","// @ts-check\n/**\n * BRAND — the look of a company's emails: its name, its logo, a main color,\n * a color for headings and a font. Set once (by hand, or read from the\n * company's website), it is used by every new email, template, block and\n * generated email, and can be applied to the email being edited.\n *\n * `applyBrand` repaints an email by ROLE, not by exact color, so it works on\n * any email — a template, a generated one, one the user built:\n *\n * buttons filled with the main color, text in the color that\n * reads on it (white or ink);\n * colored sections (banners) take the main color; their texts and\n * buttons switch to what reads on it;\n * headings (bold, 18 px and more, on white) take the headings\n * color; body text and gray footers keep theirs;\n * colored links take the main color, or the headings color when the\n * main one is too light to read on white;\n * fonts every text, button and menu link;\n * header (optional) the logo — or the name — at the top, and\n * the name in the footer.\n *\n * Dependency-free: runs in the browser, on the server and in unit tests.\n */\n\nimport { FONT_OPTIONS, PALETTE, escapeXml } from '../../blocks/shared.js';\nimport { createNode } from '../../engine/model.js';\nimport { parseMjml, parseMjmlFragment, serializeMjml } from '../../engine/mjml.js';\n\n/**\n * @typedef {{\n * name?: string,\n * logoUrl?: string,\n * logoWidth?: number,\n * primary?: string,\n * heading?: string,\n * font?: string,\n * website?: string,\n * }} Brand\n * `primary`: buttons, banners, links; `heading`: headings; colors as\n * `#rrggbb`. `font`: one of the builder's web-safe stacks (FONT_OPTIONS).\n * `website`: where it was read from, to read it again.\n *\n * @typedef {import('../../engine/model.js').EmailNode} EmailNode\n */\n\nconst HEX = /^#[0-9a-f]{6}$/;\nconst FONTS = new Set(FONT_OPTIONS.map((option) => option.value));\nexport const MAX_LOGO_WIDTH = 240;\n\n/* ── Colors ─────────────────────────────────────────────────────────────── */\n\n/**\n * A CSS color as RGB(A), or null: #rgb, #rgba, #rrggbb, #rrggbbaa, rgb(),\n * rgba(), hsl(), hsla(), and the keywords white and black.\n * @param {unknown} value\n * @returns {{r: number, g: number, b: number, a: number}|null}\n */\nexport function parseColor(value) {\n const source = String(value ?? '').trim().toLowerCase();\n if (source === 'white') return { r: 255, g: 255, b: 255, a: 1 };\n if (source === 'black') return { r: 0, g: 0, b: 0, a: 1 };\n let match = source.match(/^#([0-9a-f]{3,8})$/);\n if (match) {\n const hex = match[1];\n if (hex.length === 3 || hex.length === 4) {\n const [r, g, b, a = 'ff'] = hex.split('').map((c) => c + c);\n return { r: parseInt(r, 16), g: parseInt(g, 16), b: parseInt(b, 16), a: parseInt(a, 16) / 255 };\n }\n if (hex.length === 6 || hex.length === 8) {\n return {\n r: parseInt(hex.slice(0, 2), 16),\n g: parseInt(hex.slice(2, 4), 16),\n b: parseInt(hex.slice(4, 6), 16),\n a: hex.length === 8 ? parseInt(hex.slice(6, 8), 16) / 255 : 1,\n };\n }\n return null;\n }\n match = source.match(/^(rgba?|hsla?)\\(([^)]*)\\)$/);\n if (!match) return null;\n const parts = match[2].split(/[\\s,/]+/).filter(Boolean);\n if (parts.length < 3) return null;\n const alpha = parts[3] === undefined ? 1 : parts[3].endsWith('%') ? parseFloat(parts[3]) / 100 : parseFloat(parts[3]);\n if (match[1].startsWith('rgb')) {\n const channel = (/** @type {string} */ part) => (part.endsWith('%') ? (parseFloat(part) * 255) / 100 : parseFloat(part));\n const [r, g, b] = parts.slice(0, 3).map(channel);\n if ([r, g, b, alpha].some((n) => Number.isNaN(n))) return null;\n const clamp = (/** @type {number} */ n) => Math.max(0, Math.min(255, Math.round(n)));\n return { r: clamp(r), g: clamp(g), b: clamp(b), a: alpha };\n }\n const h = parseFloat(parts[0]);\n const s = parseFloat(parts[1]) / 100;\n const l = parseFloat(parts[2]) / 100;\n if ([h, s, l, alpha].some((n) => Number.isNaN(n))) return null;\n return { ...fromHsl(((h % 360) + 360) % 360, Math.max(0, Math.min(1, s)), Math.max(0, Math.min(1, l))), a: alpha };\n}\n\n/** @param {number} h @param {number} s @param {number} l */\nfunction fromHsl(h, s, l) {\n const c = (1 - Math.abs(2 * l - 1)) * s;\n const x = c * (1 - Math.abs(((h / 60) % 2) - 1));\n const m = l - c / 2;\n const [r, g, b] = h < 60 ? [c, x, 0] : h < 120 ? [x, c, 0] : h < 180 ? [0, c, x] : h < 240 ? [0, x, c] : h < 300 ? [x, 0, c] : [c, 0, x];\n return { r: Math.round((r + m) * 255), g: Math.round((g + m) * 255), b: Math.round((b + m) * 255) };\n}\n\n/** @param {{r: number, g: number, b: number}} color */\nexport const toHex = ({ r, g, b }) => `#${[r, g, b].map((n) => n.toString(16).padStart(2, '0')).join('')}`;\n\n/** Hue (0-360), saturation and lightness (0-1). @param {{r: number, g: number, b: number}} color */\nexport function toHsl({ r, g, b }) {\n const [R, G, B] = [r / 255, g / 255, b / 255];\n const max = Math.max(R, G, B);\n const min = Math.min(R, G, B);\n const l = (max + min) / 2;\n if (max === min) return { h: 0, s: 0, l };\n const d = max - min;\n const s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n const h = max === R ? ((G - B) / d + (G < B ? 6 : 0)) * 60 : max === G ? ((B - R) / d + 2) * 60 : ((R - G) / d + 4) * 60;\n return { h, s, l };\n}\n\n/** WCAG relative luminance. @param {{r: number, g: number, b: number}} color */\nfunction luminance({ r, g, b }) {\n const linear = (/** @type {number} */ n) => {\n const c = n / 255;\n return c <= 0.03928 ? c / 12.92 : ((c + 0.055) / 1.055) ** 2.4;\n };\n return 0.2126 * linear(r) + 0.7152 * linear(g) + 0.0722 * linear(b);\n}\n\n/** WCAG contrast ratio of two colors (1 to 21). @param {string} a @param {string} b */\nexport function contrastRatio(a, b) {\n const ca = parseColor(a);\n const cb = parseColor(b);\n if (!ca || !cb) return 1;\n const [hi, lo] = [luminance(ca), luminance(cb)].sort((x, y) => y - x);\n return (hi + 0.05) / (lo + 0.05);\n}\n\n/** The text color that reads on `background`: white or ink. @param {string} background */\nexport function readableOn(background) {\n return contrastRatio(background, PALETTE.white) >= contrastRatio(background, PALETTE.ink) ? PALETTE.white : PALETTE.ink;\n}\n\n/**\n * A color meant to be noticed (a banner, a filled button), as opposed to\n * white, light tints, grays and near-black.\n * @param {unknown} value\n */\nexport function isColored(value) {\n const color = parseColor(value);\n if (!color || color.a < 0.5) return false;\n const { s, l } = toHsl(color);\n return s >= 0.2 && l >= 0.08 && l <= 0.88;\n}\n\n/** Dark enough to carry white text (navy, charcoal…). @param {unknown} value */\nfunction isDark(value) {\n const color = parseColor(value);\n return Boolean(color && color.a >= 0.5 && luminance(color) < 0.12);\n}\n\n/** A light gray (footers, captions): left as it is. @param {unknown} value */\nfunction isMuted(value) {\n const color = parseColor(value);\n if (!color) return false;\n const { s, l } = toHsl(color);\n return s < 0.2 && l > 0.4;\n}\n\n/* ── The brand itself ───────────────────────────────────────────────────── */\n\n/** @param {unknown} value */\nconst cleanColor = (value) => {\n const color = parseColor(value);\n return color && color.a >= 0.5 ? toHex(color) : '';\n};\n\n/**\n * A brand as stored and used: unknown fields dropped, colors as #rrggbb,\n * the font one of the builder's stacks, the logo an https or site-relative\n * image. Whatever is invalid is left out (the builder's default is used).\n * @param {unknown} input\n * @returns {Brand}\n */\nexport function cleanBrand(input) {\n const source = /** @type {Record<string, unknown>} */ (input && typeof input === 'object' ? input : {});\n /** @type {Brand} */\n const brand = {};\n const name = typeof source.name === 'string' ? source.name.replace(/\\s+/g, ' ').trim().slice(0, 80) : '';\n if (name) brand.name = name;\n const logo = typeof source.logoUrl === 'string' ? source.logoUrl.trim() : '';\n if (logo && logo.length <= 2000 && (/^https:\\/\\/[^\\s\"'<>]+$/i.test(logo) || /^\\/(?!\\/)[^\\s\"'<>]*$/.test(logo))) {\n brand.logoUrl = logo;\n const width = Math.round(Number(source.logoWidth));\n if (width >= 24 && width <= MAX_LOGO_WIDTH) brand.logoWidth = width;\n }\n const primary = cleanColor(source.primary);\n if (primary && HEX.test(primary)) brand.primary = primary;\n const heading = cleanColor(source.heading);\n if (heading && HEX.test(heading)) brand.heading = heading;\n if (typeof source.font === 'string' && FONTS.has(source.font)) brand.font = source.font;\n const website = typeof source.website === 'string' ? source.website.trim() : '';\n if (/^https?:\\/\\/[^\\s\"'<>]+$/i.test(website) && website.length <= 500) brand.website = website;\n return brand;\n}\n\n/** Does the brand change anything? @param {Brand|null|undefined} brand */\nexport const hasBrand = (brand) => Boolean(brand && Object.keys(cleanBrand(brand)).some((key) => key !== 'website'));\n\n/**\n * The sender the templates use: the brand's name and logo over the host's\n * sender (whose postal address stays).\n * @param {import('../templates/starter.js').StarterSender|null|undefined} sender\n * @param {Brand|null|undefined} brand\n */\nexport function brandedSender(sender, brand) {\n const base = { ...(sender || {}) };\n if (!brand) return base;\n if (brand.name) base.name = brand.name;\n if (brand.logoUrl) {\n base.logoUrl = brand.logoUrl;\n base.logoWidth = brand.logoWidth || base.logoWidth;\n }\n return base;\n}\n\n/**\n * The colors applyBrand paints with.\n * @param {Brand} brand\n */\nfunction paletteOf(brand) {\n const primary = brand.primary || null;\n return {\n primary,\n onPrimary: primary ? readableOn(primary) : null,\n heading: brand.heading || null,\n // A link must read on white: a too-light main color gives way.\n link: primary ? (contrastRatio(primary, PALETTE.white) >= 3 ? primary : brand.heading || PALETTE.ink) : null,\n font: brand.font || null,\n };\n}\n\n/* ── Painting ───────────────────────────────────────────────────────────── */\n\nconst SECTION_LIKE = new Set(['mj-section', 'mj-wrapper', 'mj-hero', 'mj-column', 'mj-group']);\nconst FONT_TAGS = new Set(['mj-text', 'mj-button', 'mj-navbar-link', 'mj-social-element', 'mj-table']);\n\n/** @param {string|undefined} size */\nconst px = (size) => {\n const n = parseFloat(String(size ?? ''));\n return Number.isNaN(n) ? 0 : n;\n};\n\n/** @param {string|undefined} weight */\nconst isBold = (weight) => /^(bold|bolder|[6-9]00)$/.test(String(weight ?? '').trim());\n\n/**\n * The links of a text in a new color, when theirs is a color (a gray or a\n * black link is a choice, and stays).\n * @param {string} html @param {string} color\n */\nfunction recolorLinks(html, color) {\n return html.replace(/<a\\b[^>]*>/gi, (tag) =>\n tag.replace(/(style\\s*=\\s*\")([^\"]*)(\")/i, (_, open, style, close) =>\n `${open}${style.replace(/(^|;)(\\s*color\\s*:\\s*)([^;]+)/i, (whole, sep, prop, value) =>\n isColored(value) ? `${sep}${prop}${color}` : whole\n )}${close}`\n )\n );\n}\n\n/**\n * One node and what it holds, in the brand's colors.\n * @param {EmailNode} node\n * @param {ReturnType<typeof paletteOf>} palette\n * @param {boolean} onColor the node sits on a colored background\n * @returns {EmailNode}\n */\nfunction paint(node, palette, onColor) {\n const attributes = { ...node.attributes };\n let content = node.content;\n let childrenOnColor = onColor;\n const set = (/** @type {string} */ key, /** @type {string|null} */ value) => {\n if (value) attributes[key] = value;\n };\n\n if (SECTION_LIKE.has(node.tag)) {\n const background = attributes['background-color'];\n if (background && palette.primary && (isColored(background) || (isDark(background) && node.tag !== 'mj-column'))) {\n attributes['background-color'] = palette.primary;\n childrenOnColor = true;\n } else if (background && parseColor(background)) {\n childrenOnColor = false;\n }\n }\n\n if (FONT_TAGS.has(node.tag) && palette.font) set('font-family', palette.font);\n\n if (node.tag === 'mj-text' && content !== null) {\n if (onColor) {\n set('color', palette.onPrimary);\n } else {\n const heading = isBold(attributes['font-weight']) && px(attributes['font-size']) >= 18;\n if (heading && palette.heading && !isMuted(attributes.color)) attributes.color = palette.heading;\n if (palette.link) content = recolorLinks(content, palette.link);\n }\n }\n\n if (node.tag === 'mj-button') {\n const background = attributes['background-color'];\n // MJML's own default is a dark gray: a button without color is filled.\n const filled = !background || isColored(background) || isDark(background);\n if (palette.primary && filled) {\n set('background-color', onColor ? palette.onPrimary : palette.primary);\n set('color', onColor ? palette.primary : palette.onPrimary);\n } else if (palette.primary && onColor) {\n // A light button on a banner: kept light, its text in the main color.\n set('color', readableOn(background) === PALETTE.ink && contrastRatio(palette.primary, background) < 3 ? PALETTE.ink : palette.primary);\n } else if (palette.link && isColored(attributes.color)) {\n // An outlined button on white.\n attributes.color = palette.link;\n if (isColored(attributes['border-color'])) attributes['border-color'] = palette.link;\n }\n }\n\n if (node.tag === 'mj-navbar-link' && isColored(attributes.color)) {\n set('color', onColor ? palette.onPrimary : palette.link);\n }\n\n const children = node.children.map((child) => paint(child, palette, childrenOnColor));\n return { ...node, attributes, content, children };\n}\n\n/** @param {string} html */\nconst plainText = (html) =>\n html\n .replace(/<[^>]*>/g, ' ')\n .replace(/ /g, ' ')\n .replace(/&/g, '&')\n .replace(/\\s+/g, ' ')\n .trim();\n\n/** @param {EmailNode} body */\nconst sectionsOf = (body) =>\n body.children.flatMap((child) => (child.tag === 'mj-wrapper' ? child.children.filter((c) => c.tag === 'mj-section') : [child]));\n\n/**\n * The logo, or the name, at the top; the name in the footer.\n * @param {EmailNode} root\n * @param {Brand} brand\n * @param {{names: string[], logos: string[]}} previous what the email may still show\n * @returns {EmailNode}\n */\nfunction rebrandHeader(root, brand, previous) {\n const body = root.children.find((child) => child.tag === 'mj-body');\n if (!body) return root;\n const names = previous.names.map((name) => String(name || '').trim()).filter((name) => name.length >= 2);\n const known = new Set(names.map((name) => name.toLowerCase()));\n const sections = sectionsOf(body);\n /** @type {Map<string, EmailNode>} */\n const replaced = new Map();\n\n const top = sections[0];\n const column = top?.children.find((child) => child.tag === 'mj-column');\n const first = column?.children[0];\n if (first?.tag === 'mj-image') {\n const small = px(first.attributes.width) > 0 && px(first.attributes.width) <= MAX_LOGO_WIDTH;\n const wasLogo = small || previous.logos.includes(first.attributes.src) || known.has(String(first.attributes.alt || '').toLowerCase());\n if (wasLogo && brand.logoUrl) {\n replaced.set(first.id, {\n ...first,\n attributes: {\n ...first.attributes,\n src: brand.logoUrl,\n alt: brand.name || first.attributes.alt || '',\n width: `${brand.logoWidth || Math.min(px(first.attributes.width) || 140, MAX_LOGO_WIDTH)}px`,\n },\n });\n }\n } else if (first?.tag === 'mj-text' && first.content !== null && known.has(plainText(first.content).toLowerCase())) {\n if (brand.logoUrl) {\n const keep = Object.fromEntries(Object.entries(first.attributes).filter(([key]) => key.startsWith('padding') || key === 'align'));\n replaced.set(\n first.id,\n createNode('mj-image', {\n id: first.id,\n attributes: { src: brand.logoUrl, alt: brand.name || '', width: `${brand.logoWidth || 140}px`, align: 'left', ...keep },\n })\n );\n } else if (brand.name) {\n replaced.set(first.id, { ...first, content: escapeXml(brand.name) });\n }\n }\n\n // The footer: the old name in its line becomes the new one.\n const bottom = sections.length > 1 ? sections[sections.length - 1] : null;\n const newName = brand.name;\n if (bottom && newName) {\n const swap = (/** @type {EmailNode} */ node) => {\n if (node.tag === 'mj-text' && node.content !== null) {\n let html = node.content;\n for (const name of names) {\n if (name !== newName) html = html.split(escapeXml(name)).join(escapeXml(newName));\n }\n if (html !== node.content) replaced.set(node.id, { ...node, content: html });\n }\n node.children.forEach(swap);\n };\n swap(bottom);\n }\n\n if (!replaced.size) return root;\n const rebuild = (/** @type {EmailNode} */ node) => replaced.get(node.id) || { ...node, children: node.children.map(rebuild) };\n return rebuild(root);\n}\n\n/**\n * An email in the brand's look.\n * @param {string} mjml\n * @param {Brand|null|undefined} brand\n * @param {{header?: boolean, previous?: {names?: (string|undefined)[], logos?: (string|undefined)[]}}} [options]\n * `header`: also put the logo (or name) at the top and the name in the\n * footer, replacing what `previous` lists (the names and logos the email\n * may still show: the host's sender, the brand before, \"Your company\").\n * @returns {string}\n */\nexport function applyBrand(mjml, brand, { header = false, previous = {} } = {}) {\n const clean = cleanBrand(brand);\n if (!hasBrand(clean)) return mjml;\n let root = parseMjml(mjml);\n root = paint(root, paletteOf(clean), false);\n if (header) {\n root = rebrandHeader(root, clean, {\n names: /** @type {string[]} */ ((previous.names || []).filter(Boolean)),\n logos: /** @type {string[]} */ ((previous.logos || []).filter(Boolean)),\n });\n }\n return serializeMjml(root);\n}\n\n/**\n * A fragment (a block about to be inserted) in the brand's look.\n * @param {string} mjml @param {Brand|null|undefined} brand\n */\nexport function applyBrandToFragment(mjml, brand) {\n const clean = cleanBrand(brand);\n if (!mjml || !hasBrand(clean)) return mjml;\n const palette = paletteOf(clean);\n return parseMjmlFragment(mjml)\n .map((node) => serializeMjml(paint(node, palette, false), { pretty: false }))\n .join('');\n}\n\n/**\n * A ready-made email (the starter, a gallery template) in the brand's look,\n * its header and footer naming the brand rather than the host's sender or\n * the \"Your company\" placeholder.\n * @param {string} mjml\n * @param {Brand|null|undefined} brand\n * @param {{sender?: import('../templates/starter.js').StarterSender|null, t?: (key: string) => string}} [context]\n */\nexport function brandTemplate(mjml, brand, { sender = null, t = (key) => key } = {}) {\n return applyBrand(mjml, brand, {\n header: true,\n previous: { names: [sender?.name, t('Your company')], logos: [sender?.logoUrl] },\n });\n}\n","// @ts-check\n/**\n * Variables catalog — the merge tags a template can contain.\n *\n * The editor only inserts TAGS (`{{contact.firstname}}`); it never knows a\n * value. Rendering (server side) replaces them:\n *\n * preview, test → sample values (`sample`), the real address for a test;\n * sending → each recipient's values (`applyVariables`), or the merge\n * tags of an email provider (`mapVariables`).\n *\n * A missing value falls back to the tag's inline default\n * (`{{contact.firstname|there}}`), then to the variable's `fallback`, then to\n * an empty string — never to the raw tag.\n *\n * Two kinds of variables:\n * - SYSTEM variables, given by the application (`variables` prop / option),\n * read-only in the interface — this list is the default;\n * - CUSTOM variables, created by users in the builder and kept by the\n * storage (`listVariables` / `saveVariable` / `deleteVariable`), shared by\n * every template.\n *\n * The unsubscribe link is `{{ unsubscribe }}`: the sending pipeline replaces it\n * with the right link (see `applyServiceLinks`).\n *\n * Dependency-free: shared by the browser and the server.\n */\n\nimport { identity } from '../../i18n/index.js';\n\n/**\n * @typedef {{\n * key: string,\n * label: string,\n * group: string,\n * sample: string,\n * fallback?: string,\n * description?: string,\n * token?: string,\n * kind?: 'text'|'link',\n * custom?: boolean,\n * }} EmailVariable\n */\n\n/** @type {EmailVariable[]} */\nexport const DEFAULT_VARIABLES = [\n { key: 'contact.firstname', label: 'First name', group: 'Recipient', sample: 'Jane' },\n { key: 'contact.lastname', label: 'Last name', group: 'Recipient', sample: 'Doe' },\n { key: 'contact.email', label: 'Email address', group: 'Recipient', sample: 'jane.doe@example.com' },\n { key: 'company.name', label: 'Company', group: 'Recipient', sample: 'Example Inc.' },\n { key: 'campaign.name', label: 'Campaign name', group: 'Campaign', sample: 'Newsletter' },\n {\n key: 'unsubscribe',\n label: 'Unsubscribe link',\n group: 'Links',\n sample: '',\n token: '{{ unsubscribe }}',\n kind: 'link',\n },\n];\n\n/** Group of custom variables created without a group. */\nexport const CUSTOM_GROUP = 'Custom';\n\n/** Keys reserved by the sending pipeline. */\nconst RESERVED_KEYS = new Set(['unsubscribe', 'mirror']);\n\nexport const VARIABLE_LIMITS = { key: 60, label: 80, group: 40, sample: 200, fallback: 200, description: 200 };\n\nconst KEY_SHAPE = /^[a-z][a-z0-9_]*(\\.[a-z0-9_]+)*$/;\n\n/** Tag inserted by the editor. @param {EmailVariable} variable */\nexport function tokenOf(variable) {\n return variable.token || `{{${variable.key}}}`;\n}\n\n/**\n * @param {string} key\n * @param {EmailVariable[]} [variables]\n */\nexport function findVariable(key, variables = DEFAULT_VARIABLES) {\n return variables.find((v) => v.key === key) || null;\n}\n\n/**\n * A key proposed from a label: \"Order number\" → `order_number`,\n * \"Numéro de commande\" → `numero_de_commande`.\n *\n * @param {string} label\n */\nexport function keyFromLabel(label) {\n const key = String(label || '')\n .normalize('NFD')\n .replace(/[̀-ͯ]/g, '')\n .toLowerCase()\n .replace(/[^a-z0-9]+/g, '_')\n .replace(/^_+|_+$/g, '')\n .replace(/^[^a-z]+/, '')\n .slice(0, VARIABLE_LIMITS.key)\n .replace(/_+$/, '');\n return key || 'variable';\n}\n\n/**\n * Checks an application-provided catalog (keys must be unique and safe to\n * embed in a tag).\n *\n * @param {EmailVariable[]} variables\n * @returns {EmailVariable[]}\n */\nexport function defineVariables(variables) {\n const seen = new Set();\n for (const variable of variables) {\n if (!variable || !KEY_SHAPE.test(variable.key || '')) {\n throw new Error(`variables: invalid key \"${variable?.key}\"`);\n }\n if (seen.has(variable.key)) throw new Error(`variables: duplicate key \"${variable.key}\"`);\n seen.add(variable.key);\n }\n return variables;\n}\n\nconst clean = (value, max) => String(value ?? '').replace(/\\s+/g, ' ').trim().slice(0, max);\n\n/**\n * Validates and normalizes a CUSTOM variable typed by a user.\n * Returns `{ variable }` or `{ errors: { field: message } }`.\n *\n * @param {Partial<EmailVariable>} input\n * @param {{\n * existing?: EmailVariable[],\n * editing?: string|null,\n * t?: import('../../i18n/index.js').Translate,\n * }} [options] `editing`: key of the variable being edited (its key cannot change)\n */\nexport function validateCustomVariable(input, { existing = [], editing = null, t = identity } = {}) {\n /** @type {Record<string, string>} */\n const errors = {};\n const label = clean(input?.label, VARIABLE_LIMITS.label);\n const key = editing || String(input?.key || '').trim();\n if (!label) errors.label = t('Name is required');\n if (!editing) {\n if (!key) errors.key = t('Key is required');\n else if (key.length > VARIABLE_LIMITS.key || !KEY_SHAPE.test(key)) {\n errors.key = t('Lowercase letters, digits, \"_\" and \".\" only, starting with a letter');\n } else if (RESERVED_KEYS.has(key) || existing.some((v) => v.key === key)) {\n errors.key = t('This key is already used');\n }\n }\n if (Object.keys(errors).length) return { errors };\n return {\n variable: {\n key,\n label,\n group: clean(input?.group, VARIABLE_LIMITS.group) || CUSTOM_GROUP,\n sample: clean(input?.sample, VARIABLE_LIMITS.sample),\n fallback: clean(input?.fallback, VARIABLE_LIMITS.fallback),\n description: clean(input?.description, VARIABLE_LIMITS.description),\n custom: true,\n },\n };\n}\n\n/**\n * System variables first, then custom ones (a custom variable never replaces\n * a system one).\n *\n * @param {EmailVariable[]} system\n * @param {EmailVariable[]} custom\n */\nexport function mergeVariables(system, custom = []) {\n const keys = new Set(system.map((v) => v.key));\n return [...system, ...custom.filter((v) => !keys.has(v.key)).map((v) => ({ ...v, custom: true }))];\n}\n","// @ts-check\n/**\n * Service links and uploaded images in a rendered email.\n *\n * `{{ unsubscribe }}` → the unsubscribe link. For a preview or a test it is\n * an INERT link: it can be displayed and clicked but\n * unsubscribes nobody — least of all the person\n * proofreading their test;\n * `{{ mirror }}` → \"view online\" link of some providers, `#` here.\n *\n * UPLOADED IMAGES: a template keeps a RELATIVE path (`/email-assets/<key>`),\n * made absolute at render time with the public URL of the environment that\n * sends. An absolute URL frozen at save time would point to whichever\n * environment saved the template.\n *\n * An uploaded image path is any root-relative path ending with an asset key:\n * 32 hex characters of the content hash and a known extension. The prefix is\n * the application's choice (`assetsPath` option of the server handler).\n */\n\nconst UNSUBSCRIBE = /\\{\\{\\s*unsubscribe\\s*\\}\\}|\\[UNSUBSCRIBE\\]/gi;\nconst MIRROR = /\\{\\{\\s*mirror\\s*\\}\\}/gi;\n\n/** Default public path of uploaded images. */\nexport const DEFAULT_ASSETS_PATH = '/email-assets/';\n\nconst ASSET_PATH_PATTERN = /^\\/(?:[A-Za-z0-9._~-]+\\/)*[a-f0-9]{32}\\.(png|jpg|gif)$/;\nconst RELATIVE_ASSET = /(^|[\"'(=\\s])(\\/(?:[A-Za-z0-9._~-]+\\/)*[a-f0-9]{32}\\.(?:png|jpg|gif))(?=[\"')\\s>]|$)/g;\n\n/** Is this the path of an uploaded image? @param {string} value */\nexport function isAssetPath(value) {\n const path = String(value || '').trim();\n return ASSET_PATH_PATTERN.test(path) && !path.split('/').some((part) => part === '..' || part === '.');\n}\n\n/**\n * Makes uploaded image paths absolute. Without a base URL the HTML is\n * returned as is (preview inside the application, same origin).\n *\n * @param {string} html\n * @param {string|null|undefined} baseUrl\n */\nexport function absoluteAssetUrls(html, baseUrl) {\n const root = String(baseUrl || '').replace(/\\/+$/, '');\n if (!root) return String(html || '');\n return String(html || '').replace(RELATIVE_ASSET, (match, before, path) =>\n isAssetPath(path) ? `${before}${root}${path}` : match\n );\n}\n\nfunction escapeAttribute(text) {\n return String(text ?? '')\n .replace(/&/g, '&')\n .replace(/\"/g, '"')\n .replace(/</g, '<')\n .replace(/>/g, '>');\n}\n\n/**\n * @param {string} html\n * @param {{unsubscribeUrl: string}} links\n */\nexport function applyServiceLinks(html, { unsubscribeUrl }) {\n return String(html || '')\n .replace(UNSUBSCRIBE, () => escapeAttribute(unsubscribeUrl))\n .replace(MIRROR, '#');\n}\n"],"mappings":"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","names":["prop","clean"]}
|