האם אוכל להשתמש ב-Intlayer ללא provider גלובלי?

    כן. getIntlayer ו-getDictionary הן פונקציות רגילות שאינן זקוקות ל-provider כלשהו, וגם useIntlayer עובד מחוץ ל-provider.

    ts
    import { getIntlayer } from "intlayer";
    
    const { title } = getIntlayer("app"); // לא הועבר locale
    

    באיזה locale נעשה שימוש?

    כאשר אתה מעביר locale מפורש, הוא תמיד קודם. אחרת, ה-locale נקבע לפי הסדר הבא:

    1. ה-locale של הבקשה הנוכחית, בשרת, כאשר אינטגרציה של Intlayer מטפלת בה: ה-middlewares של express-intlayer, fastify-intlayer, hono-intlayer, adonis-intlayer, elysia-intlayer, remix-intlayer ו-astro-intlayer, או IntlayerProvider ב-React Server Components.
    2. ה-locale השמור בדפדפן (cookie, localStorage, sessionStorage), הערך שנשמר על ידי מחליף השפות שלך.
    3. ה-defaultLocale המוגדר בתצורה שלך.

    כל בקשה נפתרת מתוך קובצי ה-cookies וה-headers שלה, ונשמרת בטווח (scope) ייעודי לכל בקשה. משתמשים בו-זמניים בעלי locales שונים לעולם אינם חולקים את אותו ה-locale.

    אותו סדר פענוח חל על getDictionary, על קריאות ששוכתבו על ידי אופטימיזציית הבנייה (build optimization), ועל useIntlayer ו-useDictionaryDynamic המרונדרים מחוץ ל-provider.

    ה-formatters (number, date, list…) וה-hooks שלהם (useNumber, useDate, useList…) פועלים לפי אותו סדר כאשר לא מועבר locale.

    רכיבי שרת ב-Next.js (Server Components)

    ב-Next.js, ניתן לקרוא את ה-locale של הבקשה רק באופן אסינכרוני, דרך headers() ו-cookies(). השתמש ב-getIntlayerAsync, הממתין לו באותו אופן שבו getLocale() מתוך next-intlayer/server פועל:

    tsx
    import { getIntlayerAsync } from "intlayer";
    
    export const generateMetadata = async () => {
      const { title } = await getIntlayerAsync("app"); // ה-locale של הבקשה
    
      return { title };
    };
    

    קריאת ה-headers מעבירה את הנתיב למצב רינדור דינמי (dynamic rendering). כאשר IntlayerProvider כבר מספק את ה-locale, ה-headers אינן נקראות והנתיב נשאר סטטי.

    ביצועים: עם או בלי provider

    התוכן זהה. ההבדל הוא בתגובתיות (reactivity) ובעלות הרינדור.

    עם providerללא provider
    החלפת localeרכיבים מתרנדרים מחדש במקומם, ללא רענון עמודשום דבר אינו מתרנדר מחדש; ה-locale החדש יוצג בקריאה הבאה (ניווט, רענון)
    עלות קריאהאיתור context והרשמה (subscription) ל-localeקריאת פונקציה עם memoization, אותו אובייקט עבור אותו key + locale
    עלות החלפהרינדור מחדש של כל צרכן (consumer)ללא עלות
    רינדור שרתהשרת והדפדפן מרנדרים את אותו ה-localeמחוץ לאינטגרציית בקשה, השרת מרנדר את ה-defaultLocale והדפדפן את ה-locale השמור: ייתכן חוסר התאמה בהידרציה (hydration mismatch)
    Bundleקוד ה-providerכ-100 בתים (gzipped) לקריאת ה-locale השמור, נשמר במטמון עד לשינוי ה-locale

    שמור על ה-provider עבור אפליקציות אינטראקטיביות שמחליפות locale במקום או מתרנדרות בשרת. ניתן לוותר עליו עבור backends, סקריפטים, דפים סטטיים שה-locale שלהם מגיע מתוך ה-URL (העבר אותו במפורש), או קוד שקורא את התוכן פעם אחת בלבד.

    לפרטים נוספים, עיין ב-getIntlayer.