הוסף רב-לשוניות לאפליקציית Next.js שלך.
תרגם את קבצי הלוקאל שלך, תוכן Markdown ודפי HTML דרך קריאה אחת ל-API. עובד עם App Router, next-intl וכל הגדרת ניתוב i18n.
Next.js נותן לך ניתוב. הוא לא נותן לך תרגומים.
Next.js App Router כולל תמיכה מצוינת מובנית לניתוב מבוסס לוקאל. ספריות כמו next-intl מקלות על ניהול קבצי תרגום והחלפת לוקאלים. מה שהם לא פותרים הוא התרגום עצמו — מישהו צריך לייצר את התוכן המתורגם בכל שפה, ומישהו זה בדרך כלל אתה. עבור רוב הצוותים, תהליך העבודה הוא להעתיק את JSON האנגלי ל-DeepL, לתקן את הפורמט שנשבר, להדביק את התוצאה חזרה, ולחזור על כך עבור כל שפה. זה איטי, רגיש לטעויות, ולא מתרחב.
תהליך העבודה הנפוץ ביותר הוא לכתוב את כל מחרוזות הממשק באנגלית בתוך קוד המקור, ואז לתרגם את קובץ messages.json לכל שפה יעד. בתיאוריה זה פשוט. בפועל, שמירת סינכרון של 10+ קבצי לוקאל עם שינויים בקוד המקור הופכת לנקודת כאב חוזרת. בכל פעם שהטקסט באנגלית משתנה, יש לעדכן כל קובץ לוקאל. בשימוש ב-API תרגום סטנדרטי לכך, שמות המפתחות מתקלקלים, משתני המקום מתורגמים, ומבנה ה-JSON מתרחק בין הלוקאלים — מה שגורם לבאגים עדינים בזמן ריצה שקשה לאתר.
PolyLingo משתלב בהגדרת ה-i18n הקיימת שלך ב-Next.js.
אם אתה משתמש ב-next-intl או בכל ספריית i18n אחרת, ההודעות שלך כבר ב-JSON. PolyLingo לוקח את ה-JSON הזה, שולח אותו דרך מודל התרגום, ומחזיר עותקים מתורגמים לכל שפה יעד — כשהמפתחות נשארים ללא שינוי, המבנה נשמר, וערכי המחרוזות מתורגמים כראוי. ניתן לקרוא לו מתוך סקריפט בנייה, webhook או ממשק PolyLingo. התוצאה נשמרת ישירות בתיקיית ההודעות שלך.
תהליך העבודה: כתוב את קובץ messages.json באנגלית. הרץ סקריפט יחיד שקורא ל-API של PolyLingo עם קובץ המקור וקודי כל שפות היעד. קבל קובץ JSON מתורגם אחד לכל שפה, עם מבנה זהה. כתוב כל אחד לתיקיית messages/. בצע commit. סיימת.
לאתרים עם תוכן כבד הכולל 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 של CMS
- ✓כל 36 השפות בבקשה אחת
- ✓רמת חינם — 50,000 טוקנים לחודש
- ✓מאגר זה משתמש בתהליך העבודה: npm run i18n:polylingo מחדש לוקאלים שיווקיים מקובץ messages/en.json (ראה MARKETING_I18N.md).
- ✓עובד עם App Router ו-Pages Router
- ✓קבצי הפלט מוכנים ל-commit — אין צורך בעיצוב מחדש
הגדר רב-לשוניות באפליקציית Next.js שלך
הגדר את next-intl עם קובץ ההודעות באנגלית שלך
התקן את next-intl וקנפג את i18n.ts וה-middleware שלך. כתוב את כל מחרוזות הממשק ב-messages/en.json. ארגן את הקובץ כפי שהאפליקציה שלך צריכה — שטוח או מקונן. זה יהפוך למקור האמת היחיד שלך.
הרץ את סקריפט התרגום
השתמש ב-PolyLingo JSON API מתוך סקריפט Node קטן (ראה הקוד למעלה). במונורפו זה, הרץ npm run i18n:polylingo מתוך frontend/ עם POLYLINGO_API_KEY מוגדר — הוא מחלק שמות מרחב גדולים לאמינות. הרצות טיפוסיות לוקחות פחות מדקה לחבילת שיווק מלאה.
בצע commit לקבצי הלוקאל ופרוס
קבצי הלוקאל שנוצרו הם JSON תקין עם מבנה זהה למקור שלך. בצע commit למאגר שלך. הוסף את סקריפט התרגום לצינור ה-CI שלך כדי לשמור על סינכרון הלוקאלים עם כל שינוי תוכן.
מקרי שימוש רב-לשוניים ב-Next.js
אפליקציות SaaS ולוחות בקרה
תרגם את כל ספריית מחרוזות הממשק שלך בהרצת סקריפט אחת. תומך בכל תכונות הפורמט של next-intl — תאריכים, מספרים, רבים — כי מבנה ה-JSON נשמר בדיוק.
אתרי תוכן ובלוגים
לאתרים כבדים בתוכן ב-Next.js המשתמשים ב-Sanity או Contentful, השתמש ב-PolyLingo לתרגום תוכן הדפים כמו גם מחרוזות הממשק — אותו API, אותן הבטחות לשמירת פורמט.
מסחר אלקטרוני עם וריאנטים אזוריים
תרגם שמות מוצרים, תיאורים, דפי קטגוריות וממשק תשלום. השתמש במודל Advanced לטקסט שיווקי שבו חשובה קול המותג, ו-Standard למחרוזות ממשק פונקציונליות.
שאלות נפוצות
האם זה עובד עם Next.js App Router?
כן. האינטגרציה של PolyLingo היא סקריפט שקורא וכותב קבצי JSON — אין לו תלות פנימית ב-Next.js. הוא עובד עם App Router, Pages Router או כל מסגרת. דוגמת הקונפיגורציה של next-intl שמוצגת משתמשת ב-API v4 עם requestLocale, התואם ל-Next.js 13, 14 ו-15.
מה אם קובץ messages.json שלי משתנה לעיתים קרובות?
הדפוס המומלץ הוא להוסיף את סקריפט התרגום לצינור ה-CI/CD שלך, שמופעל על שינויים ב-messages/en.json. זה שומר על סינכרון אוטומטי של כל קבצי הלוקאל. לצוותים עם שינויים תכופים בטקסט, זה מונע סטייה של הלוקאלים לחלוטין.
האם PolyLingo עובד עם next-i18next כמו עם next-intl?
כן. next-i18next משתמש באותו מבנה JSON של לוקאל. סקריפט התרגום עובד זהה — הפנה אותו לתיקיית public/locales/en/ וכתוב את הפלט לתיקיות הלוקאל האחרות. תאימות פורמט ה-JSON זהה.
מה לגבי תוכן דינמי שאינו בקובץ ההודעות?
תוכן דינמי — פוסטים בבלוג, תיאורי מוצרים, תוכן שנוצר על ידי משתמשים — צריך להיות מתורגם בשכבת הנתונים, או ב-CMS שלך או דרך סקריפט בנייה שמעבד את התוכן לפני שהוא מגיע ל-Next.js. PolyLingo מטפל ב-Markdown, HTML וטקסט רגיל באותה מידה למטרה זו.
האם אפשר לתרגם רק את המחרוזות שהשתנו מאז הריצה האחרונה?
תרגום אינקרמנטלי (תרגום רק מפתחות שהשתנו) נמצא בתכנון. כרגע הסקריפט מתרגם מחדש את הקובץ כולו. עבור רוב קבצי ההודעות (מתחת ל-20KB), זה מהיר מספיק להרצה בכל commit. עבור קבצים גדולים מאוד, מומלץ לחלק לפי שמות מרחב.
האם יש דרך לבדוק את התרגומים לפני שהם מגיעים לפרודקשן?
הדפוס המומלץ הוא לבצע commit של קבצי הלוקאל המתורגמים לסניף נפרד או PR לבדיקה לפני מיזוג ל-main. זה נוהג סטנדרטי לצוותים שדורשים בדיקה אנושית של איכות התרגום. PolyLingo מייצר מעבר ראשון טוב — עבור רוב מחרוזות הממשק, הפלט של מודל Standard אינו דורש עריכה.
קבל את קובץ הלוקאל הראשון שלך מתורגם בפחות מ-5 דקות.
מפתח API חינמי. ללא כרטיס אשראי. הדבק את JSON ההודעות שלך וראה את התוצאה מיד.
קבל את מפתח ה-API שלךהגדרת סקריפט התרגום לוקחת 5 דקות. רמת חינם — ללא צורך בכרטיס אשראי.