שאלו את שאלתכם וקבלו סיכום של המסמך על ידי הפניה לדף הזה ולספק ה-AI שתבחרו
התוכן של הדף הזה תורגם באמצעות AI.
צפייה בגרסה האחרונה של התוכן המקורי באנגליתאם יש לכם רעיון לשיפור התיעוד הזה, אל תהססו לתרום על ידי הגשת Pull Request ב-GitHub.
קישור GitHub לתיעודהעתקת ה-Markdown של המסמך ללוח
כיצד לבחור את ספריית ה-i18n הנכונה ל-Vue
"Vue i18n" הוא גם מונח כללי וגם שמה של הספרייה שכמעט כולם מתקינים. זהו מצב נוח אך גם מטעה: vue-i18n היא ברירת מחדל טובה, אך היא אינה האפשרות היחידה, והשאלות שאמורות להניע את הבחירה (SSR או לא, כמה עמודים קיימים, מי כותב את התרגומים) נשאלות לעיתים נדירות לפני שמריצים npm install.
מדריך זה שואל את השאלות הללו תחילה, ולאחר מכן מתאים את התשובות לספריות המתאימות ביותר, עבור Vite + Vue ועבור Nuxt.
תוכן העניינים
שש שאלות שיש לענות עליהן לפני שמשווים בין ספריות
- Vite SPA או Nuxt? ב-SPA, עלות הקטלוג היא בעיה של גודל חבילת ה-JS. ב-Nuxt זו גם בעיה של משקל ה-HTML, מכיוון שההודעות עוברות סריאליזציה לתוך ה-state של ה-SSR ועוברות הידרציה. מסיבה זו, רוב הדיווחים בנוסח "vue-i18n איטית" מגיעים מאפליקציות Nuxt.
- מי כותב את התרגומים? מפתחים, מערכת TMS, סוכנות המספקת מחרוזות בפורמט ICU, או צינור אוטומטי של AI. הספרייה
vue-i18nמשתמשת בתחביר ריבוי משלה המופרד בתווי pipe (|), ולא ב-ICU. עובדה זו קריטית אם המחרוזות מגיעות מגורם חיצוני. - כמה שפות ועמודים יש באפליקציה? שתי שפות וחמישה עמודים יכולים לטעון הכל מראש. עשר שפות וארבעים נתיבים לא יכולים, ואסטרטגיית הטעינה הופכת לעלות המרכזית.
- האם אתם זקוקים לטיפוסים על מפתחות (Types on keys)? קריאה ל-
t("cart.totl")תעבור קומפילציה ב-vue-i18nאלא אם תעבירו טיפוס גנרי של סכמת הודעות, וסכמה זו מתנגשת לעיתים קרובות עם קטלוגים בטעינה מושהית (lazy). - מה מכיל התוכן? תוויות ממשק בלבד, או מסמכי Markdown, קישורים בתוך משפטים ובלוקים מותאמים לכל שפה. תוכן עשיר הוא המקום שבו פונקציית
t()המחזירה מחרוזת הופכת למסורבלת. - האם CSP מהווה אילוץ? גרסת הבנייה המוגדרת כברירת מחדל ב-
vue-i18nמקמפלת הודעות בדפדפן באמצעותnew Function. גרסאות זמן ריצה בלבד (Runtime-only) דורשות את@intlify/unplugin-vue-i18nלצורך קומפילציה מקדימה בזמן בנייה.
רשמו לעצמכם את התשובות. כל הניתוח שלהלן מתייחס אליהן ישירות.
תמונת המצב הכוללת
באקוסיסטם של Vue יש פחות ספריות i18n מאשר ב-React, והן מגיעות מגלים ארכיטקטוניים שונים.

vue-i18n הופיעה ב-2015 ומשמשת כברירת המחדל מאז. החבילה @nuxt/i18n עוטפת אותה עם ניתוב שפות, תגיות SEO וטעינה מושהית לפי שפה. הודעות מקומפלות לפונקציות רינדור, בזמן בנייה אם מוסיפים את ה-unplugin, או ישירות בדפדפן בכל מקרה אחר.
קובצי .ftl של Mozilla Fluent הביאו עמם תחביר הודעות נוח יותר עם וריאציות תלויות-דקדוק. ללא טיפוסים על מפתחות, ותוסף ה-Vite טוען את כל השפות לתוך כל עמוד.
Paraglide מייצרת פונקציה אחת לכל הודעה ומאפשרת לכלי ה-bundling להסיר את השאר ב-tree-shaking. הספרייה Intlayer מצהירה על תוכן ברמת הרכיב בקובצי .content.ts, מייצרת טיפוסים, ושולחת אך ורק את מה שנתיב מסוים מרנדר.
המאמר על ההיסטוריה של בינאום ב-JavaScript סוקר כל גל בהרחבה.
ההחלטה החשובה ביותר: היכן התוכן שמור ומתי הוא נטען
שתי בחירות מבניות מסבירות את מרבית ההבדלים בגודל ה-bundle בין ההגדרות השונות:
- תוכן מרוכז או מתוחם (Scoped): קובץ
locales/en.jsonיחיד לכל האפליקציה, או הצהרה אחת לכל רכיב. - ייבוא סטטי או דינמי: הכל נטען עם הפעלת האפליקציה, או שהשפה הפעילה (ובאופן אידיאלי גם הנתיב הפעיל) נמשכים לפי דרישה.
התרשים מעריך את גודל המידע של אפליקציה תיאורטית בעלת 1 עד 10 עמודים, המתורגמת ל-1 עד 10 שפות, עם כ-30 KB של טקסט לכל עמוד.

הספרייה vue-i18n תומכת בציר הדינמי: שימוש ב-setLocaleMessage לאחר קריאת import() מאפשר להפסיק לשלוח תשע שפות שאיש אינו קורא. מה שהיא אינה מספקת הוא את ציר העמודים. קטלוג שפה הוא אובייקט יחיד, וטעינתו טוענת את הטקסט של כל העמודים באפליקציה. באפליקציית SPA איש אינו מבחין בכך. ב-Nuxt, עם @nuxtjs/i18n ומעל לעשרה עמודים, כל נתיב נושא את המחרוזות של כל שאר הנתיבים פעמיים: בתוך מקטע ה-JS ובתוך ה-payload של ה-SSR.
מבחן הביצועים של Vue benchmark מודד זאת כ"דליפה מנתיבים אחרים" ו"דליפה משפות אחרות". אם תשובתכם לשאלה 3 הייתה "עמודים רבים", סעיף זה גובר על כל העדפת API. המאמר על i18n ברמת הרכיב לעומת מרוכז עוסק בהשלכות התחזוקה של פשרה זו.
הספריות המועמדות
גדלי הספריות מבוססים על תוצאות ה-Vue benchmark: תוסף יחד עם composable בתוך רכיב ריק, לאחר bundling, tree-shaking ו-minification, באפליקציה של 10 עמודים ו-10 שפות. התוכן נמדד בנפרד.

פתיחת הטבלה בחלון כדי לראות את כל תוכן הנתונים בבירור
| ספרייה | מודל תוכן | בטיחות טיפוסים (Type safety) | פורמט הודעות | פיצול לפי נתיב | גודל ספרייה |
|---|---|---|---|---|---|
vue-i18n | קטלוגים מרכזיים לפי שפה, בלוקים אופציונליים <i18n> ב-SFC | 2/5 - בהגדרה ידנית דרך טיפוס גנרי | פורמט עצמאי (ריבוי בתו pipe) | לא | ~24.3 kB |
@nuxtjs/i18n | זהה ל-vue-i18n, בתוספת ניתוב ותגיות SEO | 2/5 - זהה | זהה | לא, לפי שפה בלבד | ~24.3 kB |
fluent-vue | קובצי .ftl (Mozilla Fluent) | 1/5 - ללא | Fluent | לא | ~29.7 kB |
| Paraglide | פרויקט inlang, פונקציות נוצרות אוטומטית | 3.5/5 - נוצרת אוטומטית | פורמט עצמאי | דרך tree-shaking | קרוב לאפס (בשל קוד שנוצר בתוך המאגר) |
| Intlayer | קובץ .content.ts אחד לכל רכיב | 5/5 - נוצרת, פעילה כברירת מחדל | Intlayer (+ ICU, i18next, vue-i18n) | כן, ברמת הרכיב | ~3.9 kB |
המספרים מייצגים תמונת מצב בגרסאות שנבדקו במבחן ההשוואה. הריצו את הבדיקה על האפליקציה שלכם לפני קבלת החלטה על סמך גודל בלבד. בטיחות טיפוסים: ציון 5/5 מעיד על כך שמפתחות, פרמטרים וכל שפה נבדקים ללא צורך בהגדרה ידנית, כולל מעצבי כתובות URL וכלי עזר.
גודל הספרייה האפסי כמעט של Paraglide נובע מעצם המבנה שלה: קוד זמן הריצה נוצר ישירות בתוך מאגר הקוד שלכם, מה שמחייב שלב יצירה מחדש לפני כל push וגורר קונפליקטים במיזוגים. Intlayer זקוקה לתוסף vite-intlayer (או למודול Nuxt), ולכן אינה יכולה לפעול ללא שלב בנייה.
פעילות Commits
כמות ה-commits משקפת כמה מאמץ פיתוח מושקע בכל פרויקט. מונו-ריפו סופר כל חבילה שהוא משחרר, לכן יש לקרוא את המספר כאינדיקציה לפעילות שוטפת ולא בהכרח כמדד איכות.
- intlify/vue-i18n
- nuxt-modules/i18n
- fluent-vue/fluent-vue
- opral/paraglide-js
- aymericzip/intlayer
Commits בענף ברירת המחדל, מקור: GitHub API.
הורדות ב-npm
- vue-i18n
- @nuxtjs/i18n
- fluent-vue
- @inlang/paraglide-js
- vue-intlayer
מקור: API ההורדות של מאגר npm.
נתוני הורדות מתגמלים פתרונות ותיקים ולא בהכרח את הטובים ביותר. ספרייה ששוחררה לפני שנים עדיין מותקנת על ידי כל פרויקט שבחר בה בעבר, בכל הרצת CI ועל ידי כל חבילה שתלויה בה. הכמות משקפת אינרציה ולא בהכרח בחירה עדכנית.
עוזרי AI מעצימים את האפקט. ספריות כמו next-intl, i18next ו-vue-i18n נפוצות בכל הקוד שעליו אומנו המודלים, ולכן הם מציעים אותן כברירת מחדל מבלי להשוות חלופות. כל הצעה מובילה להורדות נוספות, שמזינות את ההמלצה הבאה. מומלץ להשוות על פי תוצאות ה-benchmark ולא על פי מדדי הורדות.
התאימו את התשובות שלכם לספרייה
vue-i18n במצב Composition (legacy: false), עם @intlify/unplugin-vue-i18n כך שתשלחו חבילת זמן ריצה בלבד (runtime-only). טענו שפות בהשהיה באמצעות import(). הגדרה זו מכסה את מרבית האפליקציות הקטנות והתשובות בקהילה זמינות בכל מקום. בלוקי <i18n> ברכיבי SFC מציבים את ההודעות בצמוד לרכיב, מה שמסייע מאוד, אך כלי החילוץ ומערכות ה-TMS סביבם דלים יותר מאשר סביב קטלוגי JSON, לכן החליטו מראש באיזה פורמט הצוות ישתמש.
@nuxtjs/i18n מספקת את אסטרטגיית הניתוב, תגיות ה-hreflang וזיהוי השפה ללא צורך בכתיבת קוד מיוחד, וזה כשלעצמו מצדיק את הבחירה בה לאתרי תוכן עם עמודים בודדים. המגבלה שלה טמונה בקטלוג לפי שפה: מעבר לעשרה עמודים לערך, ה-payload של ה-SSR נושא את הטקסטים של כל הנתיבים. אם זה המצב אצלכם, חברו ידנית את vue-i18n עם הודעות לפי נתיב, או עברו לתוכן מתוחם. המדריך על בינאום ב-Nuxt מלווה את בחירת אסטרטגיית הניתוב תחילה.
תחביר הריבוי של vue-i18n (לדוגמה "no item | one item | {count} items") אינו תואם ל-ICU ואינו נייד. יש לעדכן את המתרגמים על כך מראש, וייצוא ממערכת TMS לא ייצר תחביר זה מעצמו. הסכימו על הפורמט לפני יצירת הקטלוג הראשון, או בחרו בספרייה שהפורמט שלה תואם לספק התוכן שלכם. התמיכה של Intlayer ב-ICU היא חלקית, לכן אם אתם מקבלים מחרוזות ICU כיום, התייחסו לכך כאל חסם.
העדיפו תוכן מתוחם המקומפל בזמן הבנייה. Paraglide מגיעה לכך באמצעות tree-shaking, הפועל כמובטח ב-Vite. הספרייה Intlayer מגיעה לכך באמצעות הצהרות ברמת הרכיב ושולחת אך ורק את מה שהנתיב מרנדר. עם vue-i18n תוכלו לפצל הודעות לפי נתיב באופן ידני, אך שום דבר אינו כופה זאת, ורכיב משותף המייבא namespace גלובלי מבטל בשקט את הפיצול.
ניתן להגדיר טיפוסים ב-vue-i18n על ידי העברת טיפוס גנרי של סכמה לפונקציה createI18n. זה עובד, אך נשבר ברגע שקטלוגים נטענים בהשהיה, מכיוון שהסכמה מתארת הודעות שאולי טרם נטענו. אם אינכם רוצים לתחזק זאת, בחרו בספרייה שהטיפוסים שלה נוצרים ישירות מתוך התוכן: Paraglide או Intlayer. המאמר על זיהוי תרגומים חסרים משווה מה כל כלי תופס בזמן הבנייה.
עמודי Markdown, משפטים עם רכיב <RouterLink> באמצע, רכיבים ייעודיים לכל שפה. הספרייה vue-i18n כוללת את <i18n-t> לאינטרפולציית רכיבים, שעובד אך מסורבל למדי. צמתי התוכן של Intlayer מקבלים Markdown, HTML ואובייקטים מקוננים ישירות, מה שמתאים הרבה יותר לאפליקציות עתירות תוכן.
במקרה כזה, לקובץ JSON מרכזי אין עוד צורך ממשי שמצדיק אותו. תוכן המוצב בצמוד לרכיבים בליווי כלי CLI שמשלים שפות חסרות מספקים את הנתיב הקצר ביותר. פקודת ה-fill של Intlayer פועלת מול מפתח ה-API האישי שלכם (OpenAI, Anthropic, Mistral, Gemini) ומתרגמת מחדש רק את מה שהשתנה.
היכן כל ספרייה מתקשה
vue-i18n: הכבדה ביותר בקבוצה, פורמט ריבוי עצמאי, טיפוסים מוגדרים ידנית ושבירים בעת טעינה מושהית, ללא תיחום לפי נתיב, ומפתחות מתים מצטברים בשקט. השארתlegacy: trueבאפליקציית Vue 3 משאירה את שכבת התאימות של Vue 2 ומבטלת את הטיפוסיות שלuseI18n().@nuxtjs/i18n: יורשת את כל המגבלות שלעיל, ובנוסף ה-payload של ה-SSR נושא את המחרוזות של כל עמוד ברגע שעוברים תריסר נתיבים.fluent-vue: תחביר הודעות אלגנטי, ללא טיפוסים על מפתחות, ותוסף ה-Vite טוען את כל התוכן בכל השפות לתוך כל עמוד. הכבדה ביותר במבחן הביצועים.- Paraglide: קבצים הנוצרים ישירות בתוך המאגר, יצירה מחדש לפני כל push, והשפה נקראת מעוגייה או אחסון בכל קריאת הודעה במקום מתוך reactive store, מה שגורר פעולות מיותרות בהחלפת שפה.
- Intlayer: מחייבת תוסף בנייה, אקוסיסטם קטן יותר, תמיכת ICU חלקית, ותוכן המפוזר בבסיס הקוד מעצם התכנון, כך שייצוא JSON בודד למתרגם דורש שימוש בכלי עזר.
כיצד כל אפשרות נראית בקוד
אותו רכיב בדיוק, סיכום עגלת קניות עם כותרת וצורת ריבוי, כתוב בכל אחת מהספריות. החלק המעניין אינו התבנית עצמה, אלא המקום שבו התוכן נשמר ומה ש-vue-tsc יודע עליו.
העתקת הקוד ללוח
העתקת הקוד ללוח
העתקת הקוד ללוח
העתקת הקוד ללוח
ריבוי מופרד ב-pipe הוא הפורמט העצמאי של vue-i18n ולא ICU. הפונקציה t מקבלת כל מחרוזת אלא אם תעבירו טיפוס גנרי של סכמת הודעות ל-createI18n.
העתקת הקוד ללוח
העתקת הקוד ללוח
העתקת הקוד ללוח
העתקת הקוד ללוח
התחביר של Fluent מתמודד היטב עם צורות ריבוי ושינויים דקדוקיים. מזהי ההודעות הם מחרוזות ללא טיפוסים, ותוסף ה-Vite כולל את כל השפות בתוך כל עמוד.
העתקת הקוד ללוח
העתקת הקוד ללוח
העתקת הקוד ללוח
העתקת הקוד ללוח
כל הודעה היא פונקציה מוגדרת טיפוסים שנוצרת אוטומטית, כך שמפתח חסר מהווה שגיאת ייבוא (import error). התיקייה paraglide/ נוצרת בתוך המאגר שלכם ומיוצרת מחדש בכל שינוי.
העתקת הקוד ללוח
העתקת הקוד ללוח
כל השפות נשמרות בקובץ יחיד בצמוד לרכיב. טיפוסים נוצרים בזמן בנייה, כך ש-title מושלם אוטומטית ושגיאת כתיב תכשיל את vue-tsc. התגית <title /> מרנדרת צומת שהעורך הוויזואלי יכול להתמקד בו; התחביר {{ items(props.count) }} מחזיר את המחרוזת הפשוטה.
כבר משתמשים ב-vue-i18n? מתאם התאימות של @intlayer/vue-i18n מספק כינוי (alias) לחבילה ברמת ה-bundler, כך ש-useI18n(), $t, ריבוי מבוסס pipe וההוראה v-t ממשיכים לפעול בזמן ש-Intlayer מגישה את התוכן. מדריך ההגירה מכסה את שלבי המעבר מהמתאם לאחר מכן, וקיים גם מדריך ייעודי ל-Nuxt.
נקודות למחשבה לפני שמתחייבים
טבלת תכונות מציגה מה הספרייה יודעת לעשות כיום. הנקודות הבאות ממחישות כיצד תיראה שגרת החיים איתה.
בדקו את פעילות המאגר (Repository Activity).
כמות commits, זמן מענה ל-issues, והאם גרסת ה-minor האחרונה שוחררה השנה. תכנון מעולה ללא מתחזק פעיל הוא הגירה שמחכה לקרות.
אל תבחרו לפי כמות ההורדות ב-npm.
הספרייה המותקנת ביותר היא זו ששוחררה ראשונה, לא זו שהכי מתאימה לבסיס קוד של Vue ב-2026. הורדות מודדות היסטוריה, לא התאמה.

שאלו מי מממן את המתחזק, ומה הוא מוכר.
הספרייה vue-i18n נתמכת על ידי Crowdin, בדומה ל-next-intl ו-svelte-i18n. הספרייה i18next נתמכת על ידי Locize. הספריות Tolgee, Paraglide (inlang) ו-Intlayer מפעילות כל אחת פלטפורמה משלה. לספק שרווחיו מבוססים על אחסון תרגומים בענן יש אינטרס נמוך מאוד לספק תרגום חינמי ישירות בתוך כלי הפיתוח שלכם. Intlayer היא היחידה בקבוצה שמספקת תרגום AI דרך ה-CLI עם מפתח API אישי שלכם, ומערכת CMS שניתן לארח עצמאית.
האם הספרייה מוכנה לסוכני AI (AI Agents)?
סוכנים מתקשים לעיתים קרובות עם i18n: הם שוכחים שפות, ממציאים מפתחות ומערבבים תחבירי הודעות. האם הספרייה מספקת Agent Skills או שרת MCP כך שהסוכן יוכל לרשום, למלא ולבדוק תוכן? והאם טעינת התוכן ממוטבת כברירת מחדל, או שמישהו יצטרך לבדוק namespaces וטעינות מושהות מדי רבעון?
בטיחות טיפוסים (Type safety) מהקופסה.
לא "יכולה לתמוך בטיפוסים עם הגדרות נוספות", אלא "מפתח שגוי מכשיל את tsc בהתקנה חדשה". בדקו מה קורה עם מפתח שאינו קיים, ועם שפה שחסר בה תרגום אחד.
זיהוי תוכן שאינו בשימוש.
קטלוגים נוטים רק לגדול. תהליך הבנייה של Intlayer מנקה שדות שאינם בשימוש ומתעד אותם (build.purge). הספרייה Paraglide משיגה זאת באופן מבני, מכיוון שפונקציית הודעה שאינה נקראת מוסרת ב-tree-shaking. כל שאר הספריות משאירות את הניקוי לאחריותכם.
חוויית פיתוח (DX).
זמן הגדרה עד למחרוזת המתורגמת הראשונה, תמיכת LSP או תוסף VS Code המציג את התרגום בריחוף (hover) ומקפיץ להצהרה, CLI למילוי, בדיקה ודחיפת תוכן, מהדר או מחלץ המוציא מחרוזות מקודדות מתוך הרכיבים כדי שלא תנהלו כל מחרוזת מפתח-אחר-מפתח, ואפשרות לאנשי תוכן שאינם מפתחים לערוך תוכן (עורך ויזואלי או CMS) ללא צורך ב-pull request.
שאלות נפוצות
עבור רוב אפליקציות ה-Vue, כן. האקוסיסטם שלה הוא הגדול ביותר, התיעוד מקיף מאוד, והעלויות שלה צפויות: סביבת זמן ריצה כבדה, פורמט ריבוי ייחודי, ותיחום לפי נתיבים שעליכם לבנות ולהגן עליו בעצמכם.
השתמשו במודול הרשמי אלא אם הניתוב שלכם חריג במיוחד או שהאפליקציה כוללת עמודים בודדים בלבד. חיבור ידני מחייב בנייה עצמאית של נתיבי שפה, middleware, תגיות hreflang ומפת אתר (sitemap), וכל אלה מורכבים מכפי שהם נראים בתחילה.
רק אם גודל ה-bundle, משקל ה-SSR payload, טיפוסים הנוצרים אוטומטית או בדיקות מפתחות חסרים בזמן בנייה הם דרישות ממשיות. המאמר על i18n מבוסס מהדר לעומת דקלרטיבי מסביר מה מהדרים מעניקים והיכן הם עלולים לטעות.
באופן עקיף. מה שזחלנים רואים תלוי בניתוב, ב-hreflang, בתגית <html lang> ובשאלה האם הטקסט נכלל ב-HTML שמרונדר בשרת. עיינו ב-מדריך hreflang.
קריאה נוספת
מדריכים מקבילים עבור
תגובות
עדיין אין תגובות. היו הראשונים לשתף את מחשבותיכם.
