Alejandro Rioja.
AI Agents SEO

Wie du einen Blogpost mit einem Agenten in 13 Sprachen übersetzt

Alejandro Rioja
Alejandro Rioja
7 Min. Lesezeit
TL;DR

Ein einzelner TypeScript-Agent ruft die Claude API parallel auf und übersetzt einen englischen Post in unter 90 Sekunden in 12 Sprachen. Voice Preservation erfordert einen zweiteiligen System-Prompt: zuerst Style-Constraints, dann sprachspezifische Hinweise. Die Kosten liegen bei ca. $0.004–$0.02 pro Post mit Haiku. Meine Website verzeichnete innerhalb von 60 Tagen einen internationalen Traffic-Anstieg von 34%.

Kostenloser Newsletter

Jeden Mittwoch. 28.400+ Experten. Kein Füllstoff.

Inhaltsverzeichnis

Aktualisiert Mai 2026.

TL;DR: Ein einzelner TypeScript-Agent ruft die Claude API parallel auf und übersetzt einen englischen Post in unter 90 Sekunden in 12 Sprachen. Voice Preservation erfordert einen zweiteiligen System-Prompt: zuerst Style-Constraints, dann sprachspezifische Hinweise. Die Kosten liegen bei ca. $0.004–$0.02 pro Post mit Haiku. Meine Website verzeichnete innerhalb von 60 Tagen einen internationalen Traffic-Anstieg von 34%.

[Operator-Perspektive] Ich führe diesen Agenten jedes Mal aus, wenn ich einen neuen Post veröffentliche. Er hat 341 Posts in 12 Sprachen verarbeitet, ohne dass ich eine einzige Übersetzung manuell angefasst habe. So funktioniert das genau.

Warum ich einen Übersetzungsagenten gebaut habe statt Übersetzer zu beauftragen

Das Argument für multilinguale SEO überspringe ich — du weißt, dass es wichtig ist. Das Problem war der Workflow. Übersetzer pro Post zu beauftragen ist teuer ($40–$120/Post × 12 Sprachen = $480–$1.440 pro Artikel), langsam (3–7 Tage Lieferzeit) und unmöglich in Batches zu verarbeiten, wenn du 341 bestehende Posts aufholen musst.

Die andere Option, die Leute vorschlagen, ist Google Translate oder DeepL. Beide sind gut für Genauigkeit, aber sie zerstören die Stimme. Mein Schreibstil ist direkt, in der ersten Person und leicht konträr. Maschinenübersetzungen klingen meist formal und passiv. Das ist ein Problem, wenn Konsistenz der Stimme Teil deiner Marke ist.

Also habe ich einen Claude-gestützten TypeScript-Agenten gebaut. Er läuft in CI bei jedem Merge in main, verteilt Übersetzungen parallel, schreibt Dateien auf die Festplatte zurück und überspringt alle Sprachen, die bereits eine Datei haben. Das Ganze dauert unter 90 Sekunden für einen neuen Post.

Die Projektstruktur

Der Agent lebt in scripts/agent/translate-worker.ts. Er wird von einem übergeordneten Orchestrator aufgerufen, der den englischen Post liest, das Frontmatter extrahiert und einen Übersetzungsjob pro Sprache versendet.

code
scripts/
  agent/
    translate-worker.ts   # Übersetzungslogik pro Sprache
    translate-all.ts      # Orchestrator: liest EN, verteilt an 12 Sprachen
    lib/
      frontmatter.ts      # gray-matter Frontmatter parsen/serialisieren
      voice-prompt.ts     # gemeinsamer System-Prompt-Builder

Der Orchestrator (translate-all.ts) verwendet Promise.allSettled, damit eine einzelne fehlgeschlagene Sprache den Rest nicht blockiert.

Das System-Prompt-Engineering

Hier machen die meisten Leute Fehler. Sie schreiben einen Einzeiler wie „übersetze das ins Französische, behalte die Stimme des Autors bei.” Das liefert mittelmäßige Ergebnisse.

Mein System-Prompt hat zwei Pflichtabschnitte:

Abschnitt 1 — Style-Constraints (universal, jedem Aufruf vorangestellt):

typescript
// scripts/agent/lib/voice-prompt.ts
export function buildSystemPrompt(targetLocale: string): string {
  const styleConstraints = `
You are a professional translator working on blog posts written by Alejandro Rioja.

STYLE RULES — apply to every locale:
- Short paragraphs (1–3 sentences max). Do not merge them.
- First-person, direct voice. Never passive if active is natural.
- No filler phrases: no "In today's world", no "It is worth noting that".
- Preserve all markdown: headings, bold, italics, code blocks, links.
- Translate heading text but keep the ## / ### prefix exactly.
- Code blocks: translate comments only. Keep all variable names, strings, and syntax in English.
- Preserve frontmatter keys exactly. Only translate the VALUES for: title, ogTitle, description, tldr, imageAlt.
- Keep these frontmatter values UNCHANGED: pubDate, updatedDate, translation_key, tags, image, author, draft, lang (set lang to: ${targetLocale}).
`.trim();

Abschnitt 2 — Sprachspezifische Hinweise (pro Aufruf hinzugefügt):

typescript
  const localeNotes: Record<string, string> = {
    ar: "Arabic: use Modern Standard Arabic (MSA). RTL layout is handled by the CMS — do not add any RTL markup. Avoid overly formal Classical Arabic registers.",
    de: "German: use informal 'du' not formal 'Sie'. Compound nouns are fine; don't over-hyphenate. Keep tech terms in English when that's the industry standard (e.g. 'Content Marketing', 'SEO').",
    es: "Spanish: use neutral Latin American Spanish, not Castilian. Tuteo ('tú') over 'usted'. Keep anglicisms that are standard in tech (SEO, agente, prompt).",
    fr: "French: use informal 'tu'. Avoid over-formalizing. Tech anglicisms are acceptable when widely used (SEO, agent, prompt).",
    hi: "Hindi: use Devanagari script. Mix Hindi and English naturally for tech terms — this is standard in Indian tech writing. Don't force Hindi equivalents for words like 'agent', 'prompt', 'SEO'.",
    it: "Italian: use 'tu' form. Keep English tech terms where they're standard in Italian digital marketing.",
    ja: "Japanese: use です/ます (polite) style, not casual or keigo. Keep technical English terms in katakana where standard (e.g. エージェント, プロンプト, SEO).",
    ko: "Korean: use 합쇼체 (formal polite). Tech terms in English or standard Korean loanwords. Keep SEO, agent, prompt as-is or standard loanwords.",
    nl: "Dutch: use 'je/jij' (informal). Keep English tech terms standard in Dutch digital marketing.",
    pt: "Portuguese: use Brazilian Portuguese (pt-BR). Informal 'você'. Keep tech anglicisms standard in Brazilian digital marketing.",
    ru: "Russian: use modern, accessible Russian. Avoid overly bureaucratic phrasing. Tech terms can stay in English where that's the norm in Russian tech writing.",
    zh: "Chinese: use Simplified Chinese (zh-CN). Modern, accessible tone. Tech terms can use standard Chinese equivalents or keep English where that's industry norm.",
  };

  return `${styleConstraints}\n\nLOCALE-SPECIFIC NOTES for ${targetLocale}:\n${localeNotes[targetLocale]}`;
}

Der Translate Worker

Hier ist der vollständige Worker. Er liest die englische Datei, ruft Claude auf und schreibt die Ausgabe auf die Festplatte.

typescript
// scripts/agent/translate-worker.ts
import Anthropic from "@anthropic-ai/sdk";
import * as fs from "fs";
import * as path from "path";
import { buildSystemPrompt } from "./lib/voice-prompt";

const client = new Anthropic();

export interface TranslateJob {
  enFilePath: string;
  locale: string;
  outputDir: string;
  model?: "claude-haiku-4-5" | "claude-sonnet-4-5";
  dryRun?: boolean;
}

export async function translatePost(job: TranslateJob): Promise<string> {
  const { enFilePath, locale, outputDir, model = "claude-haiku-4-5", dryRun = false } = job;

  // Idempotenz: überspringen wenn Übersetzung bereits existiert
  const filename = path.basename(enFilePath);
  const outPath = path.join(outputDir, locale, filename);
  if (fs.existsSync(outPath)) {
    console.log(`[${locale}] Bereits vorhanden — überspringe: ${outPath}`);
    return outPath;
  }

  const enContent = fs.readFileSync(enFilePath, "utf-8");
  const systemPrompt = buildSystemPrompt(locale);

  const message = await client.messages.create({
    model,
    max_tokens: 8192,
    system: systemPrompt,
    messages: [
      {
        role: "user",
        content: `Translate the following blog post to ${locale}. Return ONLY the translated markdown file content — no explanation, no preamble, no code fences around the whole file.\n\n${enContent}`,
      },
    ],
  });

  const translated = (message.content[0] as { type: string; text: string }).text;

  if (!dryRun) {
    fs.mkdirSync(path.join(outputDir, locale), { recursive: true });
    fs.writeFileSync(outPath, translated, "utf-8");
    console.log(`[${locale}] Geschrieben: ${outPath}`);
  }

  return outPath;
}

Der Orchestrator

typescript
// scripts/agent/translate-all.ts
import * as path from "path";
import * as fs from "fs";
import { translatePost } from "./translate-worker";

const LOCALES = ["ar", "de", "es", "fr", "hi", "it", "ja", "ko", "nl", "pt", "ru", "zh"];
const POSTS_DIR = path.resolve("src/content/posts");
const MODEL = (process.env.TRANSLATE_MODEL as "claude-haiku-4-5" | "claude-sonnet-4-5") ?? "claude-haiku-4-5";

async function main() {
  // Bestimmte Datei akzeptieren oder alle englischen Posts übersetzen
  const targetFile = process.argv[2];
  const enFiles = targetFile
    ? [path.resolve(targetFile)]
    : fs.readdirSync(path.join(POSTS_DIR, "en")).map((f) => path.join(POSTS_DIR, "en", f));

  console.log(`Übersetze ${enFiles.length} Post(s) × ${LOCALES.length} Sprachen. Modell: ${MODEL}`);

  for (const enFile of enFiles) {
    const results = await Promise.allSettled(
      LOCALES.map((locale) =>
        translatePost({
          enFilePath: enFile,
          locale,
          outputDir: POSTS_DIR,
          model: MODEL,
        })
      )
    );

    results.forEach((r, i) => {
      if (r.status === "rejected") {
        console.error(`[${LOCALES[i]}] FEHLGESCHLAGEN:`, r.reason);
      }
    });
  }

  console.log("Fertig.");
}

main();

Ausführen mit:

sh
# Einen neuen Post übersetzen
npx ts-node scripts/agent/translate-all.ts src/content/posts/en/mein-neuer-post.md

# Alles übersetzen (idempotent — überspringt Vorhandenes)
npx ts-node scripts/agent/translate-all.ts

Kostenaufstellung: Haiku vs Sonnet

Das kostet es wirklich pro Post, basierend auf meiner Nutzung:

ModellEingabe-Tokens (Durchschnitt)Ausgabe-Tokens (Durchschnitt)Kosten pro SpracheKosten × 12 Sprachen
claude-haiku-4-5~2.400~2.600~$0.0004~$0.005
claude-sonnet-4-5~2.400~2.600~$0.015~$0.18

Für 341 Posts × 12 Sprachen mit Haiku: ungefähr $1.70 gesamt. Das ist das gesamte Backlog.

Sonnet liefert marginal bessere idiomatische Formulierungen, aber für die meisten Posts ist der Unterschied den 36-fachen Preis nicht wert. Ich nutze Sonnet nur für Posts, bei denen nuancierter persuasiver Ton wichtig ist — wie Verkaufsseiten oder wichtige Cornerstone-Inhalte mit hohem Traffic.

Das Modell lässt sich pro Durchlauf mit der TRANSLATE_MODEL-Umgebungsvariable wechseln:

sh
TRANSLATE_MODEL=claude-sonnet-4-5 npx ts-node scripts/agent/translate-all.ts src/content/posts/en/flagship-post.md

Echte Ergebnisse: Was mit meinem Traffic passiert ist

Ich habe die vollständige Backlog-Übersetzung (341 Posts) im Dezember 2025 veröffentlicht. Innerhalb von 60 Tagen:

Die japanischen und koreanischen Ergebnisse haben mich überrascht. Beide Sprachen haben hochqualitative KI-Communities und offenbar gute Nachfrage nach praktischen Operator-Inhalten.

Das Fazit des Operators

Ein Agent, eine Stunde Einrichtung, $1.70 an API-Kosten. Das hat gereicht, um 341 Posts in 12 weiteren Sprachen auffindbar zu machen. Allein der SEO-Anstieg hat die Rechenkosten in der ersten Woche amortisiert. Wenn du eine inhaltsreiche Website betreibst und das noch nicht gebaut hast, lässt du internationalen Traffic liegen. Der obige Code ist die vollständige Implementierung — fork ihn, tausche deine Voice-Prompt-Hinweise aus und führe ihn heute Abend gegen dein Backlog aus.

Weiterlesen

Holen Sie sich das KI-Playbook in Ihr Postfach

Jeden Mittwoch. 28.400+ Experten. Kein Füllstoff.

↵ alle Ergebnisse anzeigen esc esc zum Schließen