أضف تعدد اللغات إلى تطبيق Next.js الخاص بك.
ترجم ملفات الموقع، محتوى Markdown، وصفحات HTML من خلال مكالمة API واحدة. يعمل مع App Router، next-intl، وأي إعداد توجيه i18n.
Next.js يوفر التوجيه. لكنه لا يوفر الترجمات.
يحتوي Next.js App Router على دعم مدمج ممتاز للتوجيه بناءً على اللغة. تجعل مكتبات مثل next-intl إدارة ملفات الترجمة وتبديل اللغة أمرًا بسيطًا. ما لا تحله هو الترجمة نفسها — يجب على شخص ما إنتاج المحتوى المترجم بكل لغة، وغالبًا ما يكون هذا الشخص أنت. بالنسبة لمعظم الفرق، سير العمل هو نسخ JSON الإنجليزي إلى DeepL، إصلاح التنسيق الذي يتلف، لصق النتيجة مرة أخرى، وتكرار ذلك لكل لغة. إنه بطيء، عرضة للأخطاء، ولا يتوسع بسهولة.
سير العمل الأكثر شيوعًا هو كتابة كل نصوص واجهة المستخدم بالإنجليزية داخل الكود المصدري، ثم ترجمة ملف messages.json لكل لغة مستهدفة. نظريًا هذا بسيط. عمليًا، الحفاظ على تزامن أكثر من 10 ملفات locale مع تغييرات المصدر يصبح نقطة ألم متكررة. في كل مرة يتغير النص الإنجليزي، يجب تحديث كل ملف locale. عند استخدام APIs الترجمة القياسية، تتلف أسماء المفاتيح، تُترجم متغيرات العنصر النائب، ويتغير هيكل JSON بين اللغات — مما يسبب أخطاء دقيقة في وقت التشغيل يصعب تتبعها.
يتناسب PolyLingo مع إعداد i18n الحالي في Next.js الخاص بك.
إذا كنت تستخدم next-intl أو أي مكتبة i18n أخرى، فإن رسائلك موجودة بالفعل في JSON. يأخذ PolyLingo هذا JSON، يرسله عبر نموذج الترجمة، ويعيد نسخًا مترجمة لكل لغة مستهدفة — مع الحفاظ على المفاتيح دون تغيير، والتداخل سليم، وقيم النصوص مترجمة بشكل صحيح. يمكنك استدعاؤه من سكريبت بناء، أو webhook، أو واجهة PolyLingo. النتيجة تذهب مباشرة إلى مجلد الرسائل الخاص بك.
سير العمل: اكتب ملف messages.json الإنجليزي. شغّل سكريبت واحد يستدعي PolyLingo API مع ملف المصدر وكل رموز اللغات المستهدفة. استلم ملف JSON مترجم لكل لغة، بنفس الهيكل. اكتب كل منها في مجلد messages/. قم بالالتزام. انتهى.
للمواقع التي تحتوي على محتوى كبير مع Markdown في CMS (Sanity، Contentful)، ينطبق نفس النهج على المحتوى: تصدير كـ Markdown أو HTML، ترجمة، إعادة الكتابة إلى CMS عبر API الخاص به. يمكن تشغيل كامل العملية كخطوة بناء أو عند تفعيل webhook.
// This repository: frontend/scripts/translate-messages.mjs
// Chunks large namespaces (e.g. home) so the model stays within output limits.
//
// export POLYLINGO_API_KEY=pl_xxx
// npm run i18n:polylingo
//
// Writes messages/es.json, fr.json, … from messages/en.json via POST /v1/translate
// with format: "json". See MARKETING_I18N.md for options and CI notes.
//
// Minimal one-shot pattern (fine for small message files):
//
// const source = readFileSync('./messages/en.json', 'utf8')
// const { translations } = await fetch(apiUrl + '/translate', {
// method: 'POST',
// headers: { Authorization: `Bearer ${apiKey}`, 'Content-Type': 'application/json' },
// body: JSON.stringify({
// content: source, format: 'json', source: 'en',
// targets: ['es', 'fr', 'de'], model: 'standard',
// }),
// }).then((r) => r.json())
//
// for (const [lang, raw] of Object.entries(translations)) {
// const obj = typeof raw === 'string' ? JSON.parse(raw) : raw
// writeFileSync(`./messages/${lang}.json`, JSON.stringify(obj, null, 2))
// }// i18n.ts (next-intl v4)
import { getRequestConfig } from 'next-intl/server'
export const locales = [
'en', 'ar', 'bn', 'cs', 'da', 'de', 'el', 'es', 'fa', 'fi',
'fr', 'he', 'hi', 'id', 'it', 'ja', 'ko', 'ms', 'nl', 'no',
'pl', 'pt', 'ru', 'sv', 'sw', 'th', 'tr', 'uk', 'vi', 'zh',
] as const
export type Locale = (typeof locales)[number]
export default getRequestConfig(async ({ requestLocale }) => {
const locale = await requestLocale
return {
locale,
messages: (await import(`./messages/${locale}.json`)).default,
}
})// package.json
{
"scripts": {
"dev": "next dev",
"build": "next build",
"i18n:polylingo": "node scripts/translate-messages.mjs",
"translate:build": "npm run i18n:polylingo && next build"
}
}لماذا يتناسب PolyLingo مع سير عمل i18n في Next.js
- ✓ترجم ملفات messages/*.json مباشرة — المفاتيح محفوظة دائمًا
- ✓ترجم محتوى Markdown لمشاركات المدونة وصفحات الوثائق
- ✓يعمل مع next-intl، next-i18next، والإعدادات المخصصة
- ✓REST API يتكامل مع سكريبتات البناء وwebhooks الخاصة بنظام إدارة المحتوى
- ✓كل اللغات الـ36 في طلب واحد
- ✓الطبقة المجانية — 50,000 رمز شهريًا
- ✓هذا المستودع يستخدم سير العمل نفسه: npm run i18n:polylingo يعيد توليد ملفات التسويق من messages/en.json (انظر MARKETING_I18N.md).
- ✓يعمل مع App Router وPages Router
- ✓ملفات الإخراج جاهزة للالتزام — لا حاجة لإعادة التنسيق
قم بإعداد تعدد اللغات في تطبيق Next.js الخاص بك
قم بإعداد next-intl مع ملف الرسائل الإنجليزي الخاص بك
ثبت next-intl وقم بتكوين i18n.ts وmiddleware الخاص بك. اكتب كل نصوص واجهة المستخدم في messages/en.json. نظم الملف كما يحتاج تطبيقك — مسطح أو متداخل. هذا يصبح المصدر الوحيد للحقيقة.
شغّل سكريبت الترجمة
استخدم PolyLingo JSON API من سكريبت Node صغير (انظر الكود أعلاه). في هذا المستودع الأحادي، شغّل npm run i18n:polylingo من frontend/ مع تعيين POLYLINGO_API_KEY — يقوم بتقسيم المساحات الاسمية الكبيرة للموثوقية. عادةً ما تستغرق التشغيلات أقل من دقيقة لحزمة تسويق كاملة.
قم بالالتزام بملفات locale وانشر التطبيق
ملفات locale المولدة هي JSON صالح بنفس هيكل المصدر. قم بالالتزام بها في المستودع الخاص بك. أضف سكريبت الترجمة إلى خط أنابيب CI للحفاظ على تزامن اللغات مع كل تغيير في المحتوى.
حالات استخدام تعدد اللغات في Next.js
تطبيقات SaaS ولوحات التحكم
ترجم مكتبة نصوص واجهة المستخدم بالكامل في تشغيل سكريبت واحد. يدعم كل ميزات تنسيق next-intl — التواريخ، الأرقام، الجمع — لأن هيكل JSON محفوظ تمامًا.
مواقع المحتوى والمدونات
لمواقع Next.js التي تحتوي على محتوى كبير باستخدام Sanity أو Contentful، استخدم PolyLingo لترجمة محتوى الصفحات بالإضافة إلى نصوص واجهة المستخدم — نفس API، نفس ضمانات الحفاظ على التنسيق.
التجارة الإلكترونية مع المتغيرات الإقليمية
ترجم أسماء المنتجات، الأوصاف، صفحات الفئات، وواجهة الدفع. استخدم النموذج المتقدم للنصوص التسويقية حيث يهم صوت العلامة التجارية، والنموذج القياسي لنصوص واجهة المستخدم الوظيفية.
الأسئلة المتكررة
هل يعمل هذا مع Next.js App Router؟
نعم. تكامل PolyLingo هو مجرد سكريبت يقرأ ويكتب ملفات JSON — لا يعتمد على تفاصيل Next.js الداخلية. يعمل مع App Router، Pages Router، أو أي إطار عمل. مثال تكوين next-intl المعروض يستخدم API الإصدار 4 مع requestLocale، وهو متوافق مع Next.js 13، 14، و15.
ماذا لو تغير ملف messages.json الخاص بي بشكل متكرر؟
النمط الموصى به هو إضافة سكريبت الترجمة إلى خط أنابيب CI/CD الخاص بك، يتم تفعيله عند تغييرات في messages/en.json. هذا يحافظ على تزامن كل ملفات locale تلقائيًا. للفرق التي تغير النصوص بشكل متكرر، يمنع هذا الانحراف في اللغات تمامًا.
هل يعمل PolyLingo مع next-i18next بالإضافة إلى next-intl؟
نعم. يستخدم next-i18next نفس هيكل JSON الخاص بالموقع. يعمل سكريبت الترجمة بنفس الطريقة — وجهه إلى مجلد public/locales/en/ واكتب المخرجات إلى مجلدات اللغات الأخرى. التوافق مع تنسيق JSON هو نفسه.
ماذا عن المحتوى الديناميكي الذي ليس في ملف الرسائل؟
يجب ترجمة المحتوى الديناميكي — مشاركات المدونة، أوصاف المنتجات، المحتوى الذي ينشئه المستخدم — في طبقة البيانات، إما في CMS الخاص بك أو عبر سكريبت بناء يعالج المحتوى قبل وصوله إلى Next.js. يتعامل PolyLingo مع Markdown، HTML، والنص العادي بنفس الكفاءة لهذا الغرض.
هل يمكنني ترجمة النصوص التي تغيرت فقط منذ آخر تشغيل؟
الترجمة التزايدية (ترجمة المفاتيح التي تغيرت فقط) ضمن خارطة الطريق. حاليًا، يعيد السكريبت ترجمة الملف بالكامل. لمعظم ملفات الرسائل (أقل من 20 كيلوبايت)، هذا سريع بما يكفي للتشغيل عند كل التزام. للملفات الكبيرة جدًا، يُنصح بالتقسيم حسب المساحات الاسمية.
هل هناك طريقة لمراجعة الترجمات قبل نشرها؟
النمط الموصى به هو الالتزام بملفات locale المترجمة إلى فرع منفصل أو طلب سحب للمراجعة قبل الدمج إلى الفرع الرئيسي. هذا ممارسة قياسية للفرق التي تحتاج مراجعة بشرية لجودة الترجمة. يولد PolyLingo تمريرة أولى جيدة — لمعظم نصوص واجهة المستخدم، لا يتطلب مخرجات النموذج القياسي تعديلًا.
أدلة ذات صلة
احصل على ملف اللغة الأول مترجمًا في أقل من 5 دقائق.
مفتاح API مجاني. لا حاجة لبطاقة ائتمان. الصق JSON الخاص برسائلك وشاهد النتيجة فورًا.
احصل على مفتاح API الخاص بكيستغرق إعداد سكريبت الترجمة 5 دقائق. الطبقة المجانية — لا حاجة لبطاقة ائتمان.