MJML

KI-Übersetzung für MJML-E-Mail-Templates mit Lingo.dev CLI

Was ist MJML?

MJML (Mailjet Markup Language) ist ein responsives E-Mail-Framework, das die Erstellung responsiver E-Mail-Templates vereinfacht. Es verwendet eine semantische Syntax, die die Entwicklung responsiver E-Mails vereinfacht und zu Standard-HTML kompiliert, das in allen gängigen E-Mail-Clients funktioniert.

Was ist Lingo.dev CLI?

Lingo.dev CLI ist ein kostenloses Open-Source-CLI-Tool zur Übersetzung von Apps und Inhalten mit KI. Es wurde entwickelt, um traditionelle Translation-Management-Software zu ersetzen und sich gleichzeitig in bestehende Pipelines zu integrieren.

Weitere Informationen finden Sie unter Übersicht.

Über diesen Leitfaden

Dieser Leitfaden erklärt, wie Sie MJML-E-Mail-Templates mit Lingo.dev CLI übersetzen.

Sie lernen Folgendes:

  • Ein Projekt von Grund auf erstellen
  • Eine Übersetzungs-Pipeline konfigurieren
  • Übersetzungen mit KI generieren

Voraussetzungen

Um Lingo.dev CLI zu verwenden, stellen Sie sicher, dass Node.js v18+ installiert ist:

❯ node -v
v22.17.0

Schritt 1. Ein Projekt einrichten

Erstellen Sie im Verzeichnis Ihres Projekts eine Datei i18n.json:

{
  "$schema": "https://lingo.dev/schema/i18n.json",
  "version": "1.10",
  "locale": {
    "source": "en",
    "targets": ["es"]
  },
  "buckets": {}
}

Diese Datei definiert das Verhalten der Übersetzungs-Pipeline, einschließlich der Sprachen, zwischen denen übersetzt werden soll, und wo die lokalisierbaren Inhalte im Dateisystem vorhanden sind.

Weitere Informationen zu den verfügbaren Eigenschaften finden Sie unter i18n.json.

Schritt 2. Die Quellsprache konfigurieren

Die Quellsprache ist die ursprüngliche Sprache und Region, in der Ihre Inhalte verfasst wurden. Um die Quellsprache zu konfigurieren, setzen Sie die Eigenschaft locale.source in der Datei i18n.json:

{
  "$schema": "https://lingo.dev/schema/i18n.json",
  "version": "1.10",
  "locale": {
    "source": "en",
    "targets": ["es"]
  },
  "buckets": {}
}

Die Quellsprache muss als BCP-47-Sprach-Tag angegeben werden.

Die vollständige Liste der von Lingo.dev CLI unterstützten Sprachcodes finden Sie unter Unterstützte Sprachcodes.

Schritt 3. Zielsprachen konfigurieren

Die Zielsprachen sind die Sprachen und Regionen, in die Sie Ihre Inhalte übersetzen möchten. Um die Zielsprachen zu konfigurieren, setzen Sie die Eigenschaft locale.targets in der Datei i18n.json:

{
  "$schema": "https://lingo.dev/schema/i18n.json",
  "version": "1.10",
  "locale": {
    "source": "en",
    "targets": ["es"]
  },
  "buckets": {}
}

Schritt 4. Quellinhalte erstellen

Falls noch nicht geschehen, erstellen Sie eine oder mehrere MJML-Template-Dateien, die die zu übersetzenden Inhalte enthalten. Diese Dateien müssen sich an einem Pfad befinden, der die Quellsprache irgendwo im Pfad enthält (z. B. als Verzeichnisname wie en/ oder als Teil des Dateinamens wie example_en.mjml).

Bei MJML-Templates umfassen übersetzbare Inhalte:

  • Textinhalte innerhalb von MJML-Komponenten:
    • mj-text (Fließtext)
    • mj-button (Button-Beschriftungen)
    • mj-title (E-Mail-Titel in der Vorschau)
    • mj-preview (Vorschautext)
    • mj-navbar-link (Navigationslinks)
    • mj-accordion-title (Akkordeon-Überschriften)
    • mj-accordion-text (Akkordeon-Inhalte)
  • HTML-Elemente innerhalb von MJML: p, h1-h6, li
  • Attributwerte einschließlich:
    • alt und title Attribute bei mj-image
    • title und aria-label Attribute bei mj-button
    • title und alt Attribute bei mj-social-element
    • alt und title Attribute bei HTML img und a Elementen

Wie Inline-HTML verarbeitet wird:

Wenn Text Inline-HTML-Elemente enthält (wie <strong>, <span>, <em>, <a> usw.), wird der gesamte Textblock als eine vollständige Einheit übersetzt. Dies bewahrt den Kontext für bessere Übersetzungsqualität und erhält die Inline-Formatierung.

Zum Beispiel:

<mj-text>
  <p>Welcome to <strong>our platform</strong>!</p>
</mj-text>

Der gesamte Absatz "Welcome to <strong>our platform</strong>!" wird als einzelner Block übersetzt, wobei die <strong> Tags an Ort und Stelle bleiben. Dies stellt sicher, dass der KI-Übersetzer den vollständigen Kontext hat und die Inline-Formatierung in der Übersetzung erhalten bleibt.

Template-Variablen (wie Razor-Variablen @Model.UserName) bleiben während der Übersetzung erhalten.

Schritt 5. Bucket erstellen

  1. Fügen Sie in der i18n.jsonDatei ein "mjml"Objekt zum bucketsObjekt hinzu:

    {
      "$schema": "https://lingo.dev/schema/i18n.json",
      "version": "1.10",
      "locale": {
        "source": "en",
        "targets": ["es"]
      },
      "buckets": {
        "mjml": {}
      }
    }
    
  2. Definieren Sie im "mjml"Objekt ein Array mit einem oder mehreren includeMustern:

    {
      "$schema": "https://lingo.dev/schema/i18n.json",
      "version": "1.10",
      "locale": {
        "source": "en",
        "targets": ["es"]
      },
      "buckets": {
        "mjml": {
          "include": ["./[locale]/example.mjml"]
        }
      }
    }
    

    Diese Muster definieren, welche Dateien übersetzt werden sollen.

    Die Muster selbst:

    • müssen [locale] als Platzhalter für die konfigurierte Locale enthalten
    • können auf Dateipfade verweisen (z. B. "[locale]/example.mjml")
    • können Sternchen als Wildcard-Platzhalter verwenden (z. B. "[locale]/*.mjml")

    Rekursive Glob-Muster (z. B. **/*.mjml) werden nicht unterstützt.

Schritt 6. LLM konfigurieren

Die Lingo.dev CLI verwendet Large Language Models (LLMs), um Inhalte mit KI zu übersetzen. Um eines dieser Modelle zu verwenden, benötigen Sie einen API-Schlüssel von einem unterstützten Anbieter.

Um so schnell wie möglich loszulegen, empfehlen wir die Verwendung der Lingo.dev Engine:

  1. Registrieren Sie sich für ein Lingo.dev-Konto.

  2. Führen Sie den folgenden Befehl aus:

    npx lingo.dev@latest login
    

    Dadurch wird Ihr Standardbrowser geöffnet und Sie werden zur Authentifizierung aufgefordert.

  3. Folgen Sie den Anweisungen.

Schritt 7. Übersetzungen generieren

Führen Sie im Verzeichnis, das die i18n.jsonDatei enthält, den folgenden Befehl aus:

npx lingo.dev@latest run

Dieser Befehl:

  1. Liest die i18n.jsonDatei.
  2. Findet die Dateien, die übersetzt werden müssen.
  3. Extrahiert den übersetzbaren Inhalt aus den Dateien.
  4. Verwendet das konfigurierte LLM, um den extrahierten Inhalt zu übersetzen.
  5. Schreibt den übersetzten Inhalt zurück in das Dateisystem.

Beim ersten Generieren von Übersetzungen wird eine i18n.lockDatei erstellt. Diese Datei verfolgt, welche Inhalte übersetzt wurden, und verhindert unnötige erneute Übersetzungen bei nachfolgenden Durchläufen.

Beispiel

en/example.mjml

<?xml version="1.0" encoding="UTF-8"?>
<mjml>
  <mj-head>
    <mj-title>Welcome to Our Service</mj-title>
    <mj-preview>Get started with your new account today</mj-preview>
    <mj-attributes>
      <mj-all font-family="Arial, sans-serif" />
    </mj-attributes>
  </mj-head>
  <mj-body>
    <mj-section background-color="#f0f0f0">
      <mj-column>
        <mj-image
          src="https://example.com/logo.png"
          alt="Company Logo"
          width="150px"
        />
      </mj-column>
    </mj-section>

    <mj-section background-color="#ffffff" padding="20px">
      <mj-column>
        <mj-text font-size="24px" color="#333333" font-weight="bold">
          Welcome to Our Platform!
        </mj-text>
        <mj-text font-size="16px" color="#555555" line-height="24px">
          Thank you for signing up. We're excited to have you on board.
        </mj-text>
        <mj-text font-size="16px" color="#555555" line-height="24px">
          To get started, please verify your email address by clicking the
          button below.
        </mj-text>
      </mj-column>
    </mj-section>

    <mj-section background-color="#ffffff" padding="20px">
      <mj-column>
        <mj-button
          background-color="#007bff"
          color="#ffffff"
          href="https://example.com/verify"
          title="Verify your email address"
          aria-label="Verify email"
        >
          Verify Email Address!
        </mj-button>
      </mj-column>
    </mj-section>

    <mj-section background-color="#ffffff" padding="20px">
      <mj-column>
        <mj-text font-size="14px" color="#666666">
          If you didn't create an account, you can safely ignore this email.
        </mj-text>
        <mj-text font-size="14px" color="#666666">
          Need help? Contact our support team.
        </mj-text>
      </mj-column>
    </mj-section>

    <mj-section background-color="#f8f9fa" padding="20px">
      <mj-column>
        <mj-social mode="horizontal">
          <mj-social-element
            name="facebook"
            href="https://facebook.com/example"
            title="Follow us on Facebook"
            alt="Facebook"
          />
          <mj-social-element
            name="twitter"
            href="https://twitter.com/example"
            title="Follow us on Twitter"
            alt="Twitter"
          />
          <mj-social-element
            name="instagram"
            href="https://instagram.com/example"
            title="Follow us on Instagram"
            alt="Instagram"
          />
        </mj-social>
        <mj-text font-size="12px" color="#999999" align="center">
          © 2024 Example Company. All rights reserved.
        </mj-text>
      </mj-column>
    </mj-section>
  </mj-body>
</mjml>

es/example.mjml

<?xml version="1.0" encoding="UTF-8"?>
<mjml>
  <mj-head>
    <mj-title>Bienvenido a nuestro servicio</mj-title>
    <mj-preview>Comienza con tu nueva cuenta hoy</mj-preview>
    <mj-attributes>
      <mj-all font-family="Arial, sans-serif" />
    </mj-attributes>
  </mj-head>
  <mj-body>
    <mj-section background-color="#f0f0f0">
      <mj-column>
        <mj-image
          src="https://example.com/logo.png"
          alt="Logo de la empresa"
          width="150px"
        />
      </mj-column>
    </mj-section>

    <mj-section background-color="#ffffff" padding="20px">
      <mj-column>
        <mj-text font-size="24px" color="#333333" font-weight="bold">
          ¡Bienvenido a nuestra plataforma!
        </mj-text>
        <mj-text font-size="16px" color="#555555" line-height="24px">
          Gracias por registrarte. Estamos encantados de tenerte con nosotros.
        </mj-text>
        <mj-text font-size="16px" color="#555555" line-height="24px">
          Para comenzar, por favor verifica tu dirección de correo electrónico
          haciendo clic en el botón de abajo.
        </mj-text>
      </mj-column>
    </mj-section>

    <mj-section background-color="#ffffff" padding="20px">
      <mj-column>
        <mj-button
          background-color="#007bff"
          color="#ffffff"
          href="https://example.com/verify"
          title="Verifica tu dirección de correo electrónico"
          aria-label="Verificar correo"
        >
          ¡Verificar dirección de correo!
        </mj-button>
      </mj-column>
    </mj-section>

    <mj-section background-color="#ffffff" padding="20px">
      <mj-column>
        <mj-text font-size="14px" color="#666666">
          Si no creaste una cuenta, puedes ignorar este correo electrónico.
        </mj-text>
        <mj-text font-size="14px" color="#666666">
          ¿Necesitas ayuda? Contacta a nuestro equipo de soporte.
        </mj-text>
      </mj-column>
    </mj-section>

    <mj-section background-color="#f8f9fa" padding="20px">
      <mj-column>
        <mj-social mode="horizontal">
          <mj-social-element
            name="facebook"
            href="https://facebook.com/example"
            title="Síguenos en Facebook"
            alt="Facebook"
          />
          <mj-social-element
            name="twitter"
            href="https://twitter.com/example"
            title="Síguenos en Twitter"
            alt="Twitter"
          />
          <mj-social-element
            name="instagram"
            href="https://instagram.com/example"
            title="Síguenos en Instagram"
            alt="Instagram"
          />
        </mj-social>
        <mj-text font-size="12px" color="#999999" align="center">
          © 2024 Example Company. Todos los derechos reservados.
        </mj-text>
      </mj-column>
    </mj-section>
  </mj-body>
</mjml>

i18n.json

{
  "$schema": "https://lingo.dev/schema/i18n.json",
  "version": "1.10",
  "locale": {
    "source": "en",
    "targets": ["es"]
  },
  "buckets": {
    "mjml": {
      "include": ["./[locale]/example.mjml"]
    }
  }
}

i18n.lock

version: 1
checksums:
  c1acde0589961652d4caf8a39d080857:
    mjml/mj-head/0/mj-title/0: c514a686b50f7158b2dd08ea65d3bc8a
    mjml/mj-head/0/mj-preview/0: 4ce14f6062c814cbdcdf8b0a3cb094d3
    mjml/mj-body/0/mj-section/0/mj-column/0/mj-image/0#alt: 82d5c0d5994508210ee02d684819f4b8
    mjml/mj-body/0/mj-section/1/mj-column/0/mj-text/0: b320b02942617a70dcbd1beac61da11a
    mjml/mj-body/0/mj-section/1/mj-column/0/mj-text/1: 028311348a5aeefea365fdf422a3fb21
    mjml/mj-body/0/mj-section/1/mj-column/0/mj-text/2: 0dfdc9b80ee70fcc2b28d0e81e03fabc
    mjml/mj-body/0/mj-section/2/mj-column/0/mj-button/0#title: 5c96f738bd6153ee07b72094cdfd2b98
    mjml/mj-body/0/mj-section/2/mj-column/0/mj-button/0#aria-label: 42dcab68d931f9145d9b6d76740a5c66
    mjml/mj-body/0/mj-section/2/mj-column/0/mj-button/0: dc8001d5c58294d22fe0b0e6118dbfb7
    mjml/mj-body/0/mj-section/3/mj-column/0/mj-text/0: a18f14ab69467cbdbe467df6255cfda7
    mjml/mj-body/0/mj-section/3/mj-column/0/mj-text/1: e83236e98aad1937bc99a47cff159caa
    mjml/mj-body/0/mj-section/4/mj-column/0/mj-social/0/mj-social-element/0#title: 180bd8aa700f6cedf65e0a2079503cea
    mjml/mj-body/0/mj-section/4/mj-column/0/mj-social/0/mj-social-element/0#alt: ac8afe226a7424849c247e6a9d566f64
    mjml/mj-body/0/mj-section/4/mj-column/0/mj-social/0/mj-social-element/1#title: ea4c2a7a9a60cbb0f8f9632222a46abe
    mjml/mj-body/0/mj-section/4/mj-column/0/mj-social/0/mj-social-element/1#alt: ba3d4aed69a50759b53a0b7c319a3ad9
    mjml/mj-body/0/mj-section/4/mj-column/0/mj-social/0/mj-social-element/2#title: 754efa5f98f51c510ff268e217877d8b
    mjml/mj-body/0/mj-section/4/mj-column/0/mj-social/0/mj-social-element/2#alt: c9555810826c30d571ffae869a236494
    mjml/mj-body/0/mj-section/4/mj-column/0/mj-text/0: 9ac6c625c7af33d70634846c8c9d11b0