كيف تترجم تدوينة واحدة إلى 13 لغة باستخدام وكيل ذكاء اصطناعي واحد
وكيل TypeScript واحد يستدعي Claude API بشكل متوازٍ لترجمة تدوينة إنجليزية إلى 12 لغة في أقل من 90 ثانية. الحفاظ على الأسلوب يتطلب system prompt ثنائي الجزء: أولاً قيود الأسلوب، ثم ملاحظات خاصة بكل لغة. التكلفة حوالي $0.004–$0.02 للتدوينة مع Haiku. شهد موقعي ارتفاعاً بنسبة 34% في حركة المرور الدولية خلال 60 يوماً.
كل أربعاء. أكثر من 28,400 مشترك. بدون حشو.
✓ Check your inbox — click the confirmation link to complete sign-up.
✓ You're subscribed!
✓ You're already on the list.
جدول المحتويات
محدَّث مايو 2026.
TL;DR: وكيل TypeScript واحد يستدعي Claude API بشكل متوازٍ لترجمة تدوينة إنجليزية إلى 12 لغة في أقل من 90 ثانية. الحفاظ على الأسلوب يتطلب system prompt ثنائي الجزء: أولاً قيود الأسلوب، ثم ملاحظات خاصة بكل لغة. التكلفة حوالي $0.004–$0.02 للتدوينة مع Haiku. شهد موقعي ارتفاعاً بنسبة 34% في حركة المرور الدولية خلال 60 يوماً.
[منظور المُشغِّل] أشغّل هذا الوكيل في كل مرة أنشر فيها تدوينة جديدة. لقد عالج 341 تدوينة بـ 12 لغة دون أن أتدخل يدوياً في أي ترجمة. إليك كيف يعمل بالضبط.
لماذا بنيت وكيل ترجمة بدلاً من توظيف مترجمين
سأتجاوز الحجج الداعية إلى السيو متعدد اللغات — أنت تعرف أهميتها. المشكلة كانت في سير العمل. توظيف مترجمين لكل تدوينة مكلف ($40–$120/تدوينة × 12 لغة = $480–$1,440 للمقال)، بطيء (مدة التسليم 3–7 أيام)، ومستحيل معالجته دفعةً واحدة عند وجود 341 تدوينة موجودة سلفاً.
الخيار الآخر الذي يقترحه الناس هو Google Translate أو DeepL. كلاهما جيد في الدقة لكنهما يدمران الأسلوب. أسلوبي في الكتابة مباشر وبضمير المتكلم وفيه نبرة نقدية خفيفة. الترجمة الآلية تجعل كل شيء رسمياً ومبنياً للمجهول. هذه مشكلة حين يكون تناسق الأسلوب جزءاً من هويتك.
لذا بنيت وكيل TypeScript مدعوماً بـ Claude. يعمل في CI عند كل merge إلى main، يوزع الترجمات بالتوازي، يكتب الملفات على القرص، ويتجاوز أي لغة لها ملف بالفعل. العملية بأكملها تستغرق أقل من 90 ثانية لتدوينة جديدة.
هيكل المشروع
الوكيل يسكن في scripts/agent/translate-worker.ts، ويستدعيه محرّك علوي يقرأ التدوينة الإنجليزية، ويستخرج الـ frontmatter، ويُرسل مهمة ترجمة لكل لغة.
scripts/
agent/
translate-worker.ts # منطق الترجمة لكل لغة
translate-all.ts # المحرك: يقرأ EN، يوزع على 12 لغة
lib/
frontmatter.ts # تحليل وتسلسل frontmatter باستخدام gray-matter
voice-prompt.ts # منشئ system prompt المشتركيستخدم المحرّك (translate-all.ts) Promise.allSettled حتى لا يؤدي فشل لغة واحدة إلى تعطيل البقية.
هندسة system prompt
هنا يخطئ معظم الناس. يكتبون سطراً واحداً مثل “ترجم هذا إلى الفرنسية، احتفظ بأسلوب الكاتب”. هذا يُنتج نتائج متواضعة.
يحتوي system prompt الخاص بي على قسمين إلزاميين:
القسم الأول — قيود الأسلوب (عالمية، تُضاف في مقدمة كل استدعاء):
// 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();القسم الثاني — ملاحظات خاصة بالـ locale (تُضاف في كل استدعاء):
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]}`;
}وكيل الترجمة
إليك الوكيل الكامل. يقرأ ملف EN، ويستدعي Claude، ويكتب المخرجات على القرص.
// 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;
// الإيدمبوتنسية: تخطَّ إذا كانت الترجمة موجودة بالفعل
const filename = path.basename(enFilePath);
const outPath = path.join(outputDir, locale, filename);
if (fs.existsSync(outPath)) {
console.log(`[${locale}] موجود بالفعل — يُتخطى: ${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}] تمت الكتابة: ${outPath}`);
}
return outPath;
}المحرّك
// 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() {
// استقبال ملف محدد أو ترجمة جميع تدوينات EN
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(`ترجمة ${enFiles.length} تدوينة × ${LOCALES.length} لغات. النموذج: ${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]}] فشل:`, r.reason);
}
});
}
console.log("اكتمل.");
}
main();التشغيل:
# ترجمة تدوينة جديدة واحدة
npx ts-node scripts/agent/translate-all.ts src/content/posts/en/my-new-post.md
# ترجمة الكل (إيدمبوتنت — يتخطى الموجود)
npx ts-node scripts/agent/translate-all.tsمقارنة التكاليف: Haiku مقابل Sonnet
هذه هي التكلفة الحقيقية لكل تدوينة بناءً على استخدامي:
| النموذج | رموز الإدخال (متوسط) | رموز الإخراج (متوسط) | التكلفة لكل لغة | التكلفة × 12 لغة |
|---|---|---|---|---|
| claude-haiku-4-5 | ~2,400 | ~2,600 | ~$0.0004 | ~$0.005 |
| claude-sonnet-4-5 | ~2,400 | ~2,600 | ~$0.015 | ~$0.18 |
لـ 341 تدوينة × 12 لغة على Haiku: حوالي $1.70 إجمالاً. هذا هو المتراكم بأكمله.
يُنتج Sonnet صياغة اصطلاحية أفضل بهامش طفيف، لكن لمعظم التدوينات لا يستحق الفارق 36 ضعف السعر. أستخدم Sonnet فقط للتدوينات التي يهمّ فيها النبرة الإقناعية الدقيقة — كصفحات المبيعات والمحتوى المحوري عالي الحركة.
يمكن تغيير النموذج لكل تشغيل عبر متغير البيئة TRANSLATE_MODEL:
TRANSLATE_MODEL=claude-sonnet-4-5 npx ts-node scripts/agent/translate-all.ts src/content/posts/en/flagship-post.mdالنتائج الحقيقية: ما الذي حدث لحركة المرور؟
نشرت الترجمة الكاملة للمتراكم (341 تدوينة) في ديسمبر 2025. خلال 60 يوماً:
- ارتفاع الجلسات العضوية بنسبة 34% على مستوى الموقع (Google Search Console، يناير–فبراير 2026 مقابل أكتوبر–نوفمبر 2025)
- أفضل لغة جديدة من حيث الجلسات: البرتغالية البرازيلية (pt) — 11% من حركة المرور الدولية الجديدة
- أفضل لغة جديدة من حيث معدل التحويل: الألمانية (de) — معدل حجز الاستشارة 2.1% مقابل متوسط عالمي 1.8%
- أسوأ أداء: العربية (ar) — جاءت حركة مرور لكن لم يكن هناك أي تحويلات. أشك في أن تدفق الحجز غير مُحلَّل بما يتخطى محتوى التدوينة.
- اليابانية (ja) والكورية (ko): ارتفاع ملحوظ في حركة المرور (8% و6% من الجلسات الدولية على التوالي) مع تفاعل فوق المتوسط (وقت على الصفحة +40% مقارنة بالإنجليزية)
فاجأتني نتائج اليابانية والكورية. كلتا اللغتين تمتلكان مجتمعات ذكاء اصطناعي عالية الجودة ويبدو أن الطلب على المحتوى العملي للمُشغِّلين حقيقي.
خلاصة المُشغِّل
وكيل واحد، ساعة إعداد، $1.70 تكاليف API. هذا كل ما احتجته لجعل 341 تدوينة قابلة للاكتشاف في 12 لغة إضافية. الارتفاع في السيو وحده أعاد تكاليف الحوسبة في الأسبوع الأول. إذا كنت تدير موقعاً غنياً بالمحتوى ولم تبنِ هذا بعد، فأنت تترك حركة مرور دولية على الطاولة. الكود أعلاه هو التطبيق الكامل — انسخه، عدّل ملاحظات voice-prompt الخاصة بك، وشغّله على متراكمك الليلة.
كل أربعاء. أكثر من 28,400 مشترك. بدون حشو.
✓ Check your inbox — click the confirmation link to complete sign-up.
✓ You're subscribed!
✓ You're already on the list.
احصل على دليل الذكاء الاصطناعي في صندوق بريدك
كل أربعاء. أكثر من 28,400 مشترك. بدون حشو.
Check your inbox.
We sent you a confirmation email — click the link inside to complete your subscription. Check spam if you don't see it within a minute.
You're subscribed.
Welcome — the next edition lands in your inbox soon.
You're already on the list — look for it every Wednesday.