שאלו את שאלתכם וקבלו סיכום של המסמך על ידי הפניה לדף הזה ולספק ה-AI שתבחרו
התוכן של הדף הזה תורגם באמצעות AI.
צפייה בגרסה האחרונה של התוכן המקורי באנגליתאם יש לכם רעיון לשיפור התיעוד הזה, אל תהססו לתרום על ידי הגשת Pull Request ב-GitHub.
קישור GitHub לתיעודהעתקת ה-Markdown של המסמך ללוח
next-intl מול @intlayer/next-intl: אותו ה-API, חבילת קוד (Bundle) שונה

@intlayer/next-intl הוא מתאם תאימות (compat adapter): הוא חושף את ה-API המוכר של next-intl (כגון useTranslations, getTranslations, useLocale, t.rich(), צורות רבים ב-ICU, NextIntlClientProvider...) ומגיש אותו מתוך מילונים שקומפלו על ידי Intlayer. קוד האפליקציה אינו משתנה, אך ה-bundle משתנה באופן משמעותי.
מאמר זה משווה בין השניים על אותו יישום Next.js, שנבנה פעם אחת עם next-intl ופעם שנייה עם המתאם. הנתונים מגיעים מ-Benchmark Bloom, חבילת בדיקות קוד פתוח המתעדת את מה שהדפדפן מוריד בפועל. אם ברצונכם לקרוא השוואה בין שתי הספריות כספריות עצמאיות, עיינו ב-next-intl מול Intlayer. מאמר זה עוסק בשינויים שמביא המתאם כאשר משאירים את הקומפוננטות ללא שינוי.
תקציר (tl;dr): באותו יישום Next.js, החלפתnext-intlב-@intlayer/next-intlהפחיתה את ה-JavaScript הממוצע לדף מ-153.6 KB ל-147.5 KB ב-gzip, את גודל הקומפוננטה הממוצע מ-21.8 KB ל-8.1 KB, ביטלה דליפת מחרוזות מדפים זרים מ-~90% ל-0%, וקיצרה את משך ההידרציה מ-14.7 ms ל-12.8 ms, מבלי לערוך אף קומפוננטה. ב-TanStack Start, המקבילה עבורuse-intl(המתאם@intlayer/use-intl) קיצצה את הקומפוננטות מ-76-87 KB ל-9-11 KB והאיצה את החלפת השפה מ-7-21 ms ל-4-9 ms. המתאם מוסיף 8.0 KB של זמן ריצה לעומת 14.7 KB ב-next-intlו-5.5 KB ב-next-intlayerהמקורית. הניתוב וה-middleware ממומשים מחדש על גבי תצורת הניתוב של Intlayer; נתיבים מתורגמים (pathnames) הם התכונה היחידה שאינה מועברת.
מהו בעצם @intlayer/next-intl
next-intl פועלת בזמן ריצה: getRequestConfig טוען קובץ messages/{locale}.json לכל בקשה, NextIntlClientProvider שולח אותו לצד הלקוח, ו-useTranslations("about") קורא מפתחות מאותו אובייקט בעת הרינדור. כל אופטימיזציה (פיצול ל-namespaces, סינון pick(messages, [...]) לכל דף, טעינה עצלה) היא באחריותכם הבלעדית.
@intlayer/next-intl שומרת על החלק הראשון והאחרון בשרשרת זו ומחליפה את התווך. הקומפוננטות שלכם עדיין קוראות ל-useTranslations("about"); מה שהן מקבלות בפועל מגיע ממילון Intlayer שקומפל בזמן build, מתוחם בדיוק לאותה קומפוננטה, ובשפה הפעילה בלבד.
שלושה מנגנונים גורמים לזה לעבוד:
- כינויי ייבוא (Import aliasing): הפונקציה
createNextIntlPlugin()מתוך@intlayer/next-intl/pluginעוטפת אתwithIntlayerומוסיפה כינויים ל-Webpack ול-Turbopack כך ש-next-intl, next-intl/server, next-intl/navigationו-next-intl/middlewareמנותבים אל@intlayer/next-intl. אין צורך לשנות אף שורת ייבוא בקוד שלכם. - JSON כמקור האמת: תוסף
syncJSONקורא את קובץmessages/{locale}.jsonהקיים שלכם, מפצל את המפתחות ברמה העליונה למילון נפרד לכל namespace, וכותב תרגומים בחזרה לאותם קבצים בדיוק כאשר ה-CLI או ה-CMS מעדכנים אותם. תהליך העבודה של המתרגמים נותר ללא שינוי. - קישור ברמת מוקד הקריאה (Call-site binding): שלב האופטימיזציה של Intlayer (דרך Babel או SWC) משכתב את הקריאה
useTranslations("about")לקריאה שמקבלת ישירות את מילוןabout. הקומפוננטה אינה ניגשת עוד לעץ הודעות גלובלי, אלא אך ורק לתוכן שלה.
העתקת הקוד ללוח
העתקת הקוד ללוח
שכתוב זה הוא הסיבה לכך שגודל הקומפוננטה ודליפת הדפים מצטמצמים: דף מושך אך ורק את המילונים של הקומפוננטות שהוא מרנדר, ורק בשפה המוגשת באותו רגע.
מה המתאם שומר, ממה הוא מתעלם ומה אינו מוחלף
פתיחת הטבלה בחלון כדי לראות את כל תוכן הנתונים בבירור
ה-API של next-intl | עם @intlayer/next-intl |
|---|---|
useTranslations("ns") / getTranslations("ns") | ✅ נשמר. נקשר למילון ns בזמן build. המפתחות מוקלדים ומאומתים מול התוכן שלכם. |
getTranslations({ locale, namespace }) | ✅ נשמר |
t("key", { name }), t.rich(), t.markup(), t.raw() | ✅ נשמר. צורות רבים ב-ICU, select, selectordinal, #, {ts, date, long} מעובדים דרך מפענח ה-ICU של Intlayer |
useLocale() / getLocale() / setRequestLocale() / setLocale | ✅ נשמר |
useFormatter() | ✅ נשמר. dateTime, number, relativeTime, list, dateTimeRange מגשרים ל-Intl המקורי |
NextIntlClientProvider | ✅ נשמר. הפרופס messages, timeZone ו-now מתקבלים אך מתעלמים מהם (אזהרת פיתוח תציין זאת) |
getMessages() | ✅ נשמר לצורכי תאימות; אינו נחוץ עוד |
getRequestConfig() ב-src/i18n.ts | ⚠️ אינו נחוץ. המילונים מתקמפלים בזמן build; אין טעינת הודעות לכל בקשה |
defineRouting() | ✅ נשמר. שדות שלא צוינו (locales, defaultLocale, localePrefix) נקראים מתוך intlayer.config.ts |
createNavigation(), Link, redirect, usePathname, useRouter | ✅ נשמר. ממומש מחדש על גבי תצורת הניתוב של Intlayer; הארגומנט routing מתקבל אך מתעלמים ממנו |
pathnames (שמות נתיבים מתורגמים) | ❌ מתקבל עבור בדיקת טיפוסים, אינו מפוענח. שמרו על נתיבים רגילים או העבירו מיפוי זה ל-rewrite של Intlayer |
createMiddleware() | ✅ נשמר. מחזיר את הפרוקסי של Intlayer; מגדיר את ה-cookie בשם NEXT_LOCALE כדי ש-useLocale() והמחליף ימשיכו לעבוד |
עוגיית NEXT_LOCALE | ✅ נקראת כברירת מחדל (אלא אם הגדרתם את routing.storage בעצמכם) |
שימוש ב-useTranslations() ללא ציון namespace | ⚠️ עובד, אך מוקד הקריאה אינו נקשר מראש: הוא מפוענח דרך רישום בזמן ריצה. ציינו namespace כדי ליהנות מהחיסכון ב-bundle |
מבחן הביצועים (Benchmark)
מה נבדק
חבילת Benchmark Bloom בונה את אותו יישום בדיוק בכל הגדרה: 10 דפים (home, about, blog, careers, contact, FAQ, pricing, products, settings, team), 10 שפות (en, fr, es, de, it, pt, zh, ja, ko, ru), קומפוננטות זהות ותוכן זהה. הדפים נמדדים ב-en וב-fr.
next-intl נבנתה בארבע אסטרטגיות טעינה שונות, מהתצורה הנאיבית (קובץ messages/{locale}.json נטען במלואו) ועד לאופטימלית (namespace אחד לכל נתיב + pick() לכל דף). המתאם נבנה על אותן קומפוננטות של התצורה הנאיבית, כאשר שונו רק next.config.ts ו-intlayer.config.ts. אין צורך בגרסת "scoped" ייעודית: הקומפיילר תוחם תוכן לכל קומפוננטה, כך ששורות ה-static וה-dynamic כבר מבודדות וממוטבות מראש.
לכל בנייה, חבילת הבדיקות מודדת:
- גודל ספרייה (Lib size): משקל gzip של קומפוננטה ריקה שמייבאת רק את ספריית ה-i18n (העלות הקבועה של זמן הריצה).
- ממוצע JS לדף (Page JS): משקל ה-JavaScript המורד ב-gzip לכל דף, בממוצע על פני כל הדפים והשפות.
- אחוז דליפת שפה (Locale leak %): חלקן של מחרוזות מתורגמות ב-JS שהורד השייכות לשפה שהמשתמש אינו צופה בה.
- אחוז דליפת דפים (Page leak %): חלקן של מחרוזות מתורגמות ב-JS שהורד השייכות לדף שהמשתמש אינו נמצא בו.
- ממוצע לקומפוננטה (Component avg): משקל ממוצע ב-gzip של כל קומפוננטה כשהיא מקומפלת בבידוד.
- תגובתיות מקצה לקצה (E2E reactivity): זמן שעון בין בחירת שפה חדשה לעדכון
html[lang]ב-DOM (נבדק ב-Playwright, ממוצע של 5 חזרות). - הידרציה (Hydration): משך שלב ההידרציה של React.
הנתונים להלן מגיעים מהרצה מיום 12 בספטמבר 2026 עםnext-intl/use-intl4.14.2 ו-@intlayer/*9.5.1. יישום הבדיקה קטן במכוון (עשרות בודדות של מחרוזות לכל שפה), כך שאחוזי הדליפה מתארים דפוס עקרוני: הם צומחים ככל שנפח התוכן גדל, בעוד שעלות זמן הריצה נשארת קבועה.
תוצאות ב-Next.js
מדד
טעינת JSON דינמית
טעינה עצלה של תרגומים בזמן ריצה
JSON תחום (namespacing)
מרחבי שמות תרגום לכל דף
מהו המדד הזה?
הגודל הכולל לאחר דחיסת gzip של ה-bundle של ספריית הבינאום. הוא כולל רק את ה-provider ואת לוגיקת שליפת התוכן לאחר tree-shaking ומיזעור.
למה זה חשוב?
ספרייה קטנה יותר מקטינה את מטען ה-JavaScript ההתחלתי, מה שמוביל לזמני הורדה והרצה מהירים יותר בצד הלקוח.
הצגה כ
פתיחת הטבלה בחלון כדי לראות את כל תוכן הנתונים בבירור
| הגדרה | אסטרטגיה | גודל ספרייה (gz) | ממוצע JS לדף (gz) | דליפת שפה | דליפת דפים | ממוצע לקומפוננטה (gz) | תגובתיות E2E | הידרציה |
|---|---|---|---|---|---|---|---|---|
| בסיס (ללא i18n) | - | 0.0 KB | 141.0 KB | 0.0% | 0.0% | 0.9 KB | 13.4 ms | 11.8 ms |
next-intl | static | 14.7 KB | 153.6 KB | 4.2% | 89.8% | 21.8 KB | 16.0 ms | 14.7 ms |
next-intl | dynamic | 14.7 KB | 153.6 KB | 9.7% | 89.9% | 21.8 KB | 15.6 ms | 14.8 ms |
next-intl | scoped-static | 14.7 KB | 153.6 KB | 0.0% | 0.0% | 80.1 KB | 17.9 ms | 17.4 ms |
next-intl | scoped-dynamic | 14.7 KB | 153.6 KB | 0.0% | 0.0% | 22.9 KB | 17.8 ms | 16.8 ms |
@intlayer/next-intl | static | 8.0 KB | 147.5 KB | 0.0% | 0.0% | 8.1 KB | 14.5 ms | 12.8 ms |
@intlayer/next-intl | dynamic | 8.0 KB | 148.7 KB | 0.0% | 0.0% | 8.1 KB | 11.7 ms | 12.8 ms |
next-intlayer (טבעי) | static | 5.5 KB | 141.3 KB | 0.0% | 0.0% | 8.5 KB | 15.5 ms | 16.9 ms |
next-intlayer (טבעי) | dynamic | 5.5 KB | 141.3 KB | 0.0% | 0.0% | 6.9 KB | 15.3 ms | 15.9 ms |
כיצד לקרוא את התוצאות
- אותן קומפוננטות, 6 KB פחות לדף: בניית האפליקציה הנאיבית עם המתאם מגיעה ל-147.5 KB, פחות מכל תצורה של
next-intlכולל התצורה הממוטבת ביותר (153.6 KB). ההבדל נובע ישירות ממשקל זמן הריצה: 8.0 KB לעומת 14.7 KB, המשולמים בכל דף. - הדליפה יורדת ל-0% מבלי לגעת בקומפוננטות: המערך הנאיבי ב-
next-intlשולח כ-90% מחרוזות מדפים זרים בכל דף. הגעה ל-0% ב-next-intlמחייבת מעבר לתצורותscoped-*: יצירת namespace לכל נתיב והפעלתpick(messages, [...])בכל דף. המתאם מגיע ל-0% ישירות מהקוד הנאיבי משום ששלב האופטימיזציה קושר כל קריאתuseTranslations("ns")למילון הייעודי שלה. - קומפוננטות מתכווצות פי 2.7: קומפוננטה המקומפלת בבידוד שוקלת בממוצע 21.8 KB ב-
next-intl(משום שהיא מקושרת ל-provider ולעץ ההודעות כולו) לעומת 8.1 KB עם המתאם. בתצורתscoped-staticשלnext-intlמספר זה אף מזנק ל-80 KB. - הידרציה מהירה יותר ב-2 ms (12.8 לעומת 14.7 ms): אין צורך לבצע דה-סריאליזציה לאובייקט הודעות גדול מתוך נתוני ה-RSC לפני ש-React יכולה לבצע הידרציה.
- המתאם אינו זמן הריצה הטבעי:
next-intlayerמגיעה ל-141.3 KB, תוספת של 0.3 KB בלבד מעל אפליקציית הבסיס, עם זמן ריצה של 5.5 KB. המתאם נושא את מעטפת ה-API שלnext-intl(כגוןuseFormatter,t.rich, ומפענח ה-ICU) על גבי ליבת Intlayer, ומכאן 8.0 KB ותוספת של 6 KB לדף. הוא מהווה גשר מצוין, ולא היעד הסופי.
הטבלה המלאה זמינה ב-דוח ה-benchmark של Next.js.
תוצאות ב-TanStack Start (use-intl)
use-intl היא ליבת הספרייה הבלתי-תלויה של next-intl. המתאם שלה, @intlayer/use-intl, פועל לפי אותו עקרון באמצעות תוסף Vite (@intlayer/use-intl/plugin).
פתיחת הטבלה בחלון כדי לראות את כל תוכן הנתונים בבירור
| הגדרה | אסטרטגיה | גודל ספרייה (gz) | ממוצע JS לדף (gz) | דליפת שפה | דליפת דפים | ממוצע לקומפוננטה (gz) | תגובתיות E2E | הידרציה |
|---|---|---|---|---|---|---|---|---|
| בסיס (ללא i18n) | - | 0.0 KB | 111.0 KB | 0.0% | 0.0% | 0.7 KB | 8.1 ms | 21.6 ms |
use-intl | static | 14.1 KB | 179.8 KB | 50.0% | 89.8% | 76.0 KB | 6.7 ms | 15.3 ms |
use-intl | dynamic | 14.1 KB | 119.4 KB | 0.0% | 89.8% | 75.9 KB | 7.0 ms | 15.4 ms |
use-intl | scoped-static | 14.1 KB | 128.7 KB | 0.0% | 0.0% | 87.1 KB | 20.9 ms | 24.8 ms |
use-intl | scoped-dynamic | 14.1 KB | 128.7 KB | 0.0% | 0.0% | 87.1 KB | 13.3 ms | 25.9 ms |
@intlayer/use-intl | static | 7.3 KB | 135.8 KB | 49.7% | 0.0% | 10.9 KB | 4.2 ms | 10.5 ms |
@intlayer/use-intl | dynamic | 7.3 KB | 129.7 KB | 0.0% | 0.0% | 9.3 KB | 8.7 ms | 16.1 ms |
intlayer (טבעי) | static | 5.0 KB | 125.8 KB | 50.0% | 0.0% | 8.1 KB | 3.2 ms | 11.5 ms |
intlayer (טבעי) | dynamic | 5.0 KB | 118.6 KB | 0.0% | 0.0% | 6.3 KB | 3.6 ms | 14.1 ms |
כיצד לקרוא את התוצאות
- במשקל הבתים לדף התוצאה כמעט זהה מול
use-intlהממוטבת.@intlayer/use-intlבמצבdynamic(129.7 KB) קרובה בטווח של 1 KB ל-use-intlב-scoped-dynamic(128.7 KB). שורת ה-dynamicהפשוטה שלuse-intlאמנם קלה יותר (119.4 KB), אך היא מדליפה 90% ממחרוזות הדפים הזרים. ה-0% דליפה של המתאם הוא מה ששומר על גודל קבוע ככל שהתוכן צומח. - קומפוננטות קטנות פי 7-9: קומפוננטות
use-intlשוקלות בממוצע 76-87 KB בכל אסטרטגיה, משום ש-useTranslationsקשורה לכל אובייקט ההודעות של ה-provider. המתאם מוריד זאת ל-9-11 KB. - החלפת שפה מהירה בהרבה: התצורות הממוטבות של
use-intlדורשות 13-21 ms לעדכוןhtml[lang]; המתאם דורש 4-9 ms בלבד. - שורת
staticשומרת על כל השפות: במצבstaticהמתאם מציג 49.7% דליפת שפה, בדיוק כמו Intlayer הטבעית במצב זה. שורת הגדרה בודדת (importMode: 'dynamic') מסירה זאת לחלוטין.
הטבלה המלאה זמינה ב-דוח ה-benchmark של TanStack Start.
מדוע המספרים משתנים

שום דבר בקומפוננטה עצמה לא השתנה, ולכן השיפורים נובעים במלואם מהגורם שאליו useTranslations קשורה.
עם next-intl, הקישור נעשה דרך ה-provider. NextIntlClientProvider מקבל את כל אובייקט ה-messages עבור השפה; כל קריאת useTranslations("about") קוראת ממנו. ה-bundler רואה קומפוננטה שמייבאת hook יחיד הקורא מ-context אחד, ואינו יכול לדעת שנעשה שימוש רק בענף של about. כל הנתיבים חולקים את אותו אובייקט הודעות, ולכן דליפת הדפים עומדת על כ-90% עד שמפצלים את הקבצים ידנית, והבזבוז גדל בשני הצירים במקביל:

העתקת הקוד ללוח
עם @intlayer/next-intl, הקישור נעשה ברמת המילון. תוסף syncJSON הופך את messages/en.json למילון נפרד לכל מפתח ראשי; הקומפיילר מזהה איזו קומפוננטה קוראת ל-useTranslations("about") ומעביר לה ישירות את מילון about, בשפה הפעילה, כייבוא שניתן למעקב ולפיצול ב-bundler.
העתקת הקוד ללוח
הקובץ src/i18n.ts והפרופ messages נעלמים. כל השאר נשאר זהה לחלוטין.
הגירה בשלושה שלבים
התקנה
bashהעתקת קודהעתקת הקוד ללוח
הפקודה מזהה את
next-intlומתקינה אתintlayer, next-intlayer, @intlayer/next-intlואת@intlayer/sync-json-plugin. השאירו אתnext-intlמותקנת: היא peer dependency של המתאם ומספקת את הטיפוסים.כיוון Intlayer אל קובצי ההודעות שלכם
intlayer.config.tsהעתקת קודהעתקת הקוד ללוח
הקבצים
messages/{locale}.jsonנשארים במקומם. כל מפתח ראשי הופך למילון;useTranslations("about")ממופה למילוןabout.עטיפת next.config.ts
next.config.tsהעתקת קודהעתקת הקוד ללוח
הפונקציה
createNextIntlPlugin()משלבת אתwithIntlayer(מעקב תוכן, קימפול מילונים, שלב האופטימיזציה) ואת הכינויים שלnext-intlל-@intlayer/next-intlעבור Webpack ו-Turbopack. בצעו build, והתוצאות בטבלאות שלעיל שלכם.
מה ניתן למחוק לאחר מכן
פתיחת הטבלה בחלון כדי לראות את כל תוכן הנתונים בבירור
| קובץ / דפוס | סיבה |
|---|---|
getRequestConfig ב-src/i18n.ts | אין צורך בטעינת הודעות לכל בקשה. השאירו את הקובץ רק אם הוא מייצא עזרי createNavigation |
messages={...} ב-NextIntlClientProvider | המתאם קורא פלט מקומפל; מתעלמים מהפרופ והוא מתריע באזהרה בסביבת פיתוח |
await getMessages() ב-layouts | מאותה סיבה בדיוק |
שימוש ב-pick(messages, [...]) לכל דף | הקומפיילר מבצע את הסינון והבחירה באופן אוטומטי, ברמת הקומפוננטה |
מה מרוויחים מעבר לחיסכון בבתים
- מפתחות בעלי טיפוסים קפדניים: הקריאה
useTranslations("about")מוקלדת ומאומתת מול מילוןabout. קריאה ל-t("does.not.exist")הופכת לשגיאת TypeScript ברורה, ולא לנפילת ריצה שקטה. npx intlayer testמכשיל את ה-CI כאשר בשפה מסוימת חסר מפתח.npx intlayer fillמתרגם מפתחות חסרים באמצעות הספק לבחירתכם (OpenAI, Anthropic, Mistral, Gemini...) באמצעות המפתח שלכם, וכותב את התוצאה בחזרה ל-messages/{locale}.json.- העורך החזותי וה-CMS פועלים על אותם מילונים, כך שמשתמשים ללא רקע טכני יכולים לערוך את
messages/fr.jsonדרך ממשק גרפי והקובץ מתעדכן. - מעבר הדרגתי ל-
.content.ts: כל קומפוננטה יכולה לעבור מ-useTranslations("about")ל-useIntlayer("about")עם קובץ תוכן צמוד, קומפוננטה אחר קומפוננטה. מילוני JSON ו-.content.tsמתקיימים במקביל ומתמזגים.
מגבלות שיש להכיר לפני שמתחילים
הפונקציות createNavigation(routing) ו-createMiddleware(routing) שומרות על החתימה שלהן אך מתעלמות מהארגומנט: השפות, שפת ברירת המחדל ואסטרטגיית הקידומת מגיעות מהגדרות ה-routing של Intlayer. אם אתם משתמשים ב-pathnames מתורגמים של next-intl (למשל מ-/about ל-/a-propos), המתאם אינו מפענח אותם ישירות; תכונת ה-routing.rewrite של Intlayer מכסה מקרה זה, אך מדובר בהגדרה נפרדת.
שלב האופטימיזציה זקוק ל-namespace סטטי כדי לדעת איזה מילון לייבא. קריאה ריקה עדיין עובדת, אך דרך רישום בזמן ריצה שמפנה לכל המילונים, שזו בדיוק הדליפה שרציתם למנוע. הקפידו להעביר את ה-namespace.
8.0 KB של זמן ריצה לעומת 5.5 KB עבור next-intlayer, ותוספת של כ-6-7 KB לדף לעומת הבנייה הטבעית. זהו המחיר של תמיכה במעטפת ה-API של next-intl. ברגע שכל הקומפוננטות הועברו ל-useIntlayer, ניתן להסיר את המתאם לחלוטין.
מעבדי הפורמט מגובים ב-Intl המקורי ורק השפה משפיעה על הפלט שלהם. אם אתם מסתמכים על אזור זמן כפוי או על ערך now קבוע עבור תאריכים יציבים בהידרציה, טפלו בכך במוקד הקריאה. ראו עיצוב תאריכים, זמנים ומספרים.
מתי להשתמש בכל אפשרות?
האפליקציה שלכם קטנה, גודל ה-bundle אינו מהווה דאגה, והצוות שלכם מרגיש בנוח עם ניהול ידני של namespaces ו-pick() בכל דף.
אתם עובדים כיום עם next-intl ורוצים את היתרונות של bundle קל, 0% דליפה, הידרציה מהירה, מפתחות מוקלדים וכלי CLI / CMS ללא צורך בשכתוב קוד. זוהי נקודת הכניסה המומלצת לכל בסיס קוד קיים של next-intl.
עבור פרויקטים חדשים, או לאחר שהמתאם השלים את משימת ההגירה. זוהי האפשרות הקלה ביותר (5.5 KB, תוספת של 0.3 KB לדף מעל יישום בסיס) הפותחת תמיכה מלאה ב-Server Components סינכרוניים, קובצי .content.ts לכל קומפוננטה וארגז הכלים המלא. התחילו עם Intlayer עם Next.js.
שאלות נפוצות (FAQ)
ב-Next.js, כן לחלוטין עבור הקומפוננטות: הבנייה במבחן הביצועים שינתה אך ורק את next.config.ts ואת intlayer.config.ts. הפונקציה getRequestConfig ב-src/i18n.ts, הפרופ messages ב-provider וקריאות pick() בכל דף הופכים לקוד לא פעיל שתוכלו למחוק.
הן ממשיכות לעבוד כרגיל. t("key", { count }), t.rich(), t.markup(), select, selectordinal, # ו-{ts, date, long} מפוענחים על ידי מפענח ה-ICU של Intlayer. ראו הסבר על פורמט הודעות ICU.
הוא נושא את מעטפת ה-API של next-intl על גבי הליבה של Intlayer: useFormatter, t.rich, מפענח ה-ICU ועוזרי הניווט. מדובר ב-8.0 KB לעומת 5.5 KB, ותוספת של כ-6 KB לדף. הוא משמש כגשר מעבר ולא כיעד הסופי.
כן. כל קומפוננטה יכולה לעבור מ-useTranslations("about") ל-useIntlayer("about") עם קובץ .content.ts צמוד. מילוני JSON ו-.content.ts מתקיימים זה לצד זה ומתמזגים באופן שקוף.
לא דרך הגדרת ה-pathnames של next-intl: המתאם מקבל אותה עבור בדיקת טיפוסים בלבד, אך אינו מפענח אותה. השתמשו ב-routing.rewrite של Intlayer במקום זאת.
השוואות קשורות
סדרת מתאמי התאימות:
השוואת הספריות ראש בראש:
תיעוד ומדריכים:
דוחות benchmark:
כדי להבין את מקורן של ספריות אלו, קראו על ההיסטוריה של בינאום ב-JavaScript.
סיכום
@intlayer/next-intl עושה דבר אחד מרכזי: היא משנה את הגורם שאליו useTranslations קשורה, מ-provider המחזיק בכל ההודעות למילון שקומפל במיוחד עבור אותה קומפוננטה. באותו יישום Next.js הדבר מביא לחיסכון של 6 KB לדף, קומפוננטות קטנות פי 2.7, 0% דליפת תוכן וקיצור של 2 ms במשך ההידרציה, עוד לפני שפותחים קובץ קומפוננטה כלשהו. הניתוב וה-middleware שומרים על ה-API המוכר שלהם על גבי תצורת הניתוב של Intlayer, וזמן הריצה הטבעי של next-intlayer נשאר קל אף יותר.
כל הנתונים הגולמיים, יישומי הבדיקה והסקריפטים זמינים במאגר Benchmark Bloom. הריצו אותם בעצמכם.
עיינו במסמך 'למה Intlayer?' לפרטים נוספים.
תגובות
עדיין אין תגובות. היו הראשונים לשתף את מחשבותיכם.
