Multi-Language Email Templates for SaaS

Multi-Language-E-Mail-Vorlagen für SaaS entwickeln und implementieren – locale-aware Inhalte, Template-Engines, Fallback-Strategien und sprachübergreifendes Testen.

Sam Rivera
Sam Rivera
13. Juni 202613 min read
Auch verfügbar auf:English · 中文

TL;DR: Multi-Language-E-Mail-Vorlagen erfordern sorgfältiges Design – locale-aware Inhalte, Template-Vererbung, dynamische Betreffzeilen und robuste Fallback-Ketten. Dieser Leitfaden behandelt Architektur und Implementierung. Patterns von tanstackship.com.

Einführung

E-Mail ist ein zentraler Kommunikationskanal für SaaS – und E-Mails in der falschen Sprache beschädigen das Vertrauen Ihrer Nutzer. Ein ausgereiftes Multi-Language-E-Mail-System bewältigt Übersetzungen, locale-spezifische Formatierungen und Inhaltsvarianten über 10+ Sprachen hinweg, ohne Vorlagen zu duplizieren. Eine umfassendere i18n-Strategie finden Sie in i18n für SaaS: Architecture Patterns im Vergleich.

E-Mail-Template-Architektur

KomponenteVerantwortlichkeitBeispiel
Template-EngineHTML mit Variablen rendernHandlebars, MJML, React Email
Translation ServiceLocale-aware InhalteParaglide.js JSON-Dateien
Formatting ServiceLocale-aware Zahlen/DatumsangabenIntl API
Image ServiceLocale-spezifische BilderCDN mit Locale-Pfad
Fallback-KetteFehlende Übersetzung behandelntarget → en → key

Template-Struktur

emails/
├── en/
│   ├── welcome.html        # Englische Version
│   ├── welcome.subject     # Nur Betreffzeile
│   ├── invoice.html
│   └── invoice.subject
├── de/
│   ├── welcome.html
│   ├── welcome.subject
│   ├── invoice.html
│   └── invoice.subject
└── shared/
    ├── header.html          # Geteilte Komponenten
    ├── footer.html
    └── styles.css

Implementierung mit React Email

tsx
// React Email-Komponente mit i18n
import * as m from '~/paraglide/messages.js'
import {
  Body, Container, Head, Heading, Html,
  Preview, Section, Text, Button,
} from '@react-email/components'

interface WelcomeEmailProps {
  userName: string
  locale: string
  dashboardUrl: string
}

export function WelcomeEmail({ userName, locale, dashboardUrl }: WelcomeEmailProps) {
  return (
    <Html>
      <Head />
      <Preview>{m.email_welcome_preview({ name: userName })}</Preview>
      <Body>
        <Container>
          <Heading>{m.email_welcome_title({ name: userName })}</Heading>
          
          <Text>{m.email_welcome_body()}</Text>
          
          <Section>
            <Button href={dashboardUrl}>
              {m.email_welcome_cta()}
            </Button>
          </Section>
          
          <Text style={{ fontSize: '12px', color: '#666' }}>
            {m.email_welcome_footer()}
          </Text>
        </Container>
      </Body>
    </Html>
  )
}

Dynamische Betreffzeilen

ts
// Betreffzeile pro Locale, mit Variablen
const subjectTemplates = {
  en: 'Welcome to TanStack Ship, {name}!',
  de: 'Willkommen bei TanStack Ship, {name}!',
  zh: '{name},欢迎使用 TanStack Ship!',
  ja: '{name}さん、TanStack Shipへようこそ!',
  ar: 'مرحبًا {name} في TanStack Ship!',
}

function getSubject(template: string, locale: string, vars: Record<string, string>) {
  let subject = subjectTemplates[locale] || subjectTemplates['en']
  Object.entries(vars).forEach(([key, value]) => {
    subject = subject.replace(`{${key}}`, value)
  })
  return subject
}

Versand mit Fallback

ts
// E-Mail-Versand mit Locale-Fallback
async function sendEmail({
  to,
  locale,
  template,
  data,
}: {
  to: string
  locale: string
  template: string
  data: Record<string, any>
}) {
  const effectiveLocale = SUPPORTED_LOCALES.includes(locale) ? locale : 'en'
  
  // Template mit Fallback-Kette laden
  const html = await loadTemplate(template, effectiveLocale, data)
  const subject = await loadSubject(template, effectiveLocale, data)
  
  await sendEmailClient({
    to,
    subject,
    html,
    headers: {
      // Sprache für Analytics tracken
      'X-Email-Locale': effectiveLocale,
    },
  })
}

Multi-Language-E-Mails testen

TestfallMethodeWas geprüft wird
Alle Locales rendernAutomatischer Render-TestKeine fehlenden Keys, keine Fehler
BetreffzeilenlängeZeichenzählungArabische/chinesische Betreffzeilen können kürzer sein
RTL-RenderingSichtprüfungArabische E-Mails werden von rechts nach links gelesen
Datums-/ZahlenformatSnapshot-TestLocale-korrekte Formatierung
Fallback-VerhaltenTest mit nicht unterstütztem LocaleSauberer Fallback auf en

Fazit

Nutzen Sie ein einzelnes Template-System mit locale-spezifischen Inhaltsdateien. React Email-Komponenten mit Paraglide.js bieten typsichere Übersetzungen. Rendern Sie immer ein Fallback-Locale, wenn eine Übersetzung fehlt. Testen Sie jede E-Mail-Vorlage in allen unterstützten Locales als Teil Ihrer CI-Pipeline.

Zur locale-aware Formatierung in E-Mails lesen Sie Lokalisierung von Datums-, Zeit-, Zahlen- und Währungsformaten. Unser Leitfaden zur SaaS-E-Mail-Zustellbarkeit behandelt SPF-, DKIM- und DMARC-Setup. Zum Erstellen locale-spezifischer Marketing-Seiten sehen Sie sich Eine Language-Specific Landing Page Strategy aufbauen an.