התחלה: בעיית N+1 עם שאילתות לוקאליזציה
שאילתות N+1 הן בעיה קלאסית בעבודה עם i18n ב-Strapi. כאשר אתה מביא מאמרים מתורגמים עם קטגוריות מקוננות, כל תרגום יוצר שאילתת מסד נתונים נפרדת. במקום שאילתה אחת עם populate, אתה מקבל 1+N, מה שמכפיל את זמן התגובה של ה-API בחמישה. נתקלנו בזה בפרויקט מסחר אלקטרוני עם 6 שפות — דפי קטלוג נטענו במשך יותר מ-3 שניות.
הפתרון הוא לציין במפורש populate עבור שדות קשורים ולהשתמש ב-?locale=ru. זה מכסה 80% מהמקרים. עבור יחסים מורכבים אנו משתמשים באגרגציות דרך שדות וירטואליים. להלן מחזור ההתקנה המלא.
אילו בעיות אנו פותרים
ראשית וחשוב מכל — לא כל השדות מתורגמים. אם אתה שוכח להפעיל localized עבור מאפיין, הנתונים הופכים למשותפים, מה ששובר את התרחיש של "תוכן שונה לשפות שונות". שנית — שאילתות N+1 בעת הבאת ישויות קשורות. שלישית — SEO: אתה צריך לתרגם את ה-slug, תגי meta, ולעתים קרובות גם גרסאות קבצי מדיה לפי שוק.
הגישה שלנו מכסה תרחישים אלה: אנו מגדירים במפורש לוקאליזציה לכל שדה ומשתמשים ב-populate בבקשות API, מה שמפחית את מספר השאילתות בחמישה. בפרויקטים עם 15+ סוגי תוכן, חיסכון בזמן הפיתוח מגיע עד 40%.
הגדרת לוקאליזציה: מהקונפיגורציה ל-API
הפעלת הפלאגין והוספת שפות
פלאגין ה-i18n מגיע מובנה עם Strapi. הפעל אותו ב-config/plugins.js:
module.exports = { i18n: { enabled: true }, } בלוח הניהול, עבור אל Settings → Internationalization → Add a locale. הוסף את השפות הנדרשות, לדוגמה module.exports = { i18n: { enabled: true }, } , ru, en. לאחר מכן, תוכל להפעיל לוקאליזציה לשדות בכל סוג תוכן.
לוקאליזציה של שדות סוג תוכן
ב-Content-Type Builder, עבור כל שדה שאמור להשתנות לפי שפה, החלף את "Enable localization". הסכמה המתקבלת נראית כך:
{
"options": {
"draftAndPublish": true
},
"pluginOptions": {
"i18n": {
"localized": true
}
},
"attributes": {
"title": {
"type": "string",
"pluginOptions": {
"i18n": {
"localized": true
}
}
},
"content": {
"type": "richtext",
"pluginOptions": {
"i18n": {
"localized": true
}
}
},
"slug": {
"type": "uid",
"targetField": "title",
"pluginOptions": {
"i18n": {
"localized": true
}
}
},
"publishedAt": {
"type": "datetime"
}
}
}שדות שאינם מתורגמים (לדוגמה, uk) יהיו משותפים לכל התרגומים של רשומה אחת. אם אתה צריך תאריכי פרסום שונים לכל שפה, עליך לתרגם גם שדה זה.
בקשות API עם לוקאליזציה
לחץ כדי לראות דוגמאות API
# Получить статьи на русском
GET /api/articles?locale=ru
# Получить статьи на английском
GET /api/articles?locale=en
# Получить статью со всеми переводами
GET /api/articles/1?locale=all
# Создать перевод
POST /api/articles
{
"data": {
"title": "English Title",
"locale": "en",
"localizations": [1]
}
}הפרמטר locale=all מחזיר את הרשומה עם מערך { "options": { "draftAndPublish": true }, "pluginOptions": { "i18n": { "localized": true } }, "attributes": { "title": { "type": "string", "pluginOptions": { "i18n": { "localized": true } } }, "content": { "type": "richtext", "pluginOptions": { "i18n": { "localized": true } } }, "slug": { "type": "uid", "targetField": "title", "pluginOptions": { "i18n": { "localized": true } } }, "publishedAt": { "type": "datetime" } } } מקונן לכל שפה. השתמש בו בזהירות: עם שפות רבות התגובה עלולה להיות כבדה.
אינטגרציה עם Next.js i18n
לפי תיעוד Strapi, אינטגרציה עם Next.js דורשת העברת ה-locale בבקשות API. דוגמת פונקציה:
// lib/strapi.ts
export async function getArticles(locale: string = 'ru') {
const res = await fetch(
`${process.env.STRAPI_URL}/api/articles?locale=${locale}&populate=cover,category`,
{
headers: {
Authorization: `Bearer ${process.env.STRAPI_API_TOKEN}`
}
}
)
return res.json()
}עבור דפים סטטיים השתמש ב-publishedAt עם טעינה מוקדמת של כל השפות; עבור דפים דינמיים השתמש ברינדור בצד השרת עם קאשינג דרך # Получить статьи на русском GET /api/articles?locale=ru # Получить статьи на английском GET /api/articles?locale=en # Получить статью со всеми переводами GET /api/articles/1?locale=all # Создать перевод POST /api/articles { "data": { "title": "English Title", "locale": "en", "localizations": [1] } } . זה מפחית את עומס השרת ומאיץ את טעינת הדפים. בפרויקט עם 3 שפות ו-50 מאמרים, זמן הבנייה הסטטית גדל ב-30%, אך TTFB יורד ל-100 אלפיות השנייה.
השוואה: i18n מובנה לעומת יישום מותאם אישית
| קריטריון | פלאגין i18n מובנה | שדה לוקאליזציה מותאם אישית |
|---|---|---|
| מורכבות ההתקנה | נמוכה (הפעל ותרגם שדות) | גבוהה (ניהול יחסים ידני) |
| גמישות | מוגבלת על ידי מבנה הפלאגין | מקסימלית (כל סכמה) |
| תמיכת API | מוכנה (locale=all) |
דורשת יישום פילטרים |
| לוח ניהול | מחליף שפות אוטומטי | דורש הרחבה מותאמת אישית |
| ביצועים | מותאם (מובנה) | תלוי ביישום |
עבור 95% מהפרויקטים הפלאגין המובנה מספיק. התקנת i18n מובנית מהירה פי 3 ליישום מאשר פתרון מותאם אישית. יש לשקול יישום מותאם אישית רק עבור דרישות לא שגרתיות.
מה כלול בהתקנה ולמה זה משתלם
כיצד להגדיר לוקאליזציה ל-SEO?
עבור SEO חשוב לתרגם את ה-slug ושדות meta (כותרת, תיאור). ב-Strapi, אתה הופך את ה-slug לשדה מתורגם כפי שהוצג לעיל. ב-Next.js, השתמש ב-localizations או next-seo כדי להכניס תגי hreflang. זה משפר את הרלוונטיות של הדף למנועי חיפוש באזורים שונים. בפועל, לוקאליזציית SEO נכונה מגדילה את התנועה משפות שאינן ראשיות ב-60% תוך 3 חודשים.
כיצד לתרגם קבצי מדיה?
Strapi אינו תומך בלוקאליזציית מדיה מובנית — כל תמונה מקושרת במפורש לשפה מסוימת. אנו ממליצים ליצור שדות מדיה נפרדים לכל שפה (לדוגמה, // lib/strapi.ts export async function getArticles(locale: string = 'ru') { const res = await fetch( `${process.env.STRAPI_URL}/api/articles?locale=${locale}&populate=cover,category`, { headers: { Authorization: `Bearer ${process.env.STRAPI_API_TOKEN}` } } ) return res.json() } , generateStaticParams) או להשתמש בפלאגין מותאם אישית לקישור. אפשרות נוספת היא לאחסן את כל התמונות בשדה אחד ולנהל את הצגתן בפרונטאנד. חיסכון בזמן ניהול המדיה יכול להגיע ל-40%.
היקף העבודה והאחריות
מה כלול
- ביקורת הסכמה הנוכחית וזיהוי שדות הדורשים לוקאליזציה.
- הפעלת פלאגין i18n והוספת שפות.
- הגדרת סוגי תוכן עם לוקאליזציה נכונה של מאפיינים.
- אופטימיזציית API לשאילתות מודעות שפה (הבאת נתונים קשורים, קאשינג).
- אינטגרציית פרונטאנד (Next.js, Nuxt, React) — העברת locale בבקשות.
- בדיקת כל גרסאות השפה לתצוגה נכונה ו-SEO.
- תיעוד ה-API והתהליך להוספת שפות חדשות.
- הדרכת הצוות על עבודה עם תוכן רב-לשוני בלוח הניהול.
תהליך
- ניתוח — קביעת רשימת השפות, מפת התרגומים, דרישות המדיה.
- עיצוב — סכמת סוגי תוכן תוך התחשבות בלוקאליזציה עד 15 סוגים.
- קונפיגורציה — הפעלת i18n, הגדרת הפלאגין, העברת נתונים קיימים.
- אינטגרציה — התאמת API ופרונטאנד למודעות שפה.
- בדיקות — אימות כל ה-endpoints, מחליף השפות, מטא SEO.
- פריסה — העלאה לסביבת production עם ניטור.
לוחות זמנים, אחריות וניסיון
התקנת i18n לשלוש שפות עם לוקאליזציה של 3 עד 5 סוגי תוכן אורכת בין יום ל-3 ימים (מחיר קבוע מ-$1,200 עבור עד 5 סוגי תוכן). לוח הזמנים תלוי במורכבות היחסים ובצורך בהעברת נתונים. אנו מספקים אחריות ל-6 חודשים על פעולת לוקאליזציה תקינה. אם מתעוררות בעיות, אנו מתקנים אותן ללא עלות. הניסיון שלנו: 30+ פרויקטים מוצלחים עם תוכן רב-לשוני, מומחי Strapi ו-Next.js מוסמכים, 5 שנות פיתוח ב-Strapi, דיווח ותיעוד שקופים. הזמינו התקנת i18n וקבלו תמיכה רב-לשונית יציבה.
קבלו ייעוץ לפרויקט שלכם — אנו נעריך את המורכבות ואת לוחות הזמנים. צרו קשר כדי לדון בפרטים.







