Author:
    Creation:2024-12-06Last update:2026-06-23

    Intlayer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреА Next.js 15 рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░реЗрдВ | рдЕрдВрддрд░реНрд░рд╛рд╖реНрдЯреНрд░реАрдпрдХрд░рдг (i18n)

    рд╡рд┐рд╖рдп-рд╕реВрдЪреА

    рд╡рд┐рдХрд▓реНрдкреЛрдВ рдкрд░ рдЗрдиреНрдЯрд▓реЗрдпрд░ рдХреНрдпреЛрдВ?

    рдиреЗрдХреНрд╕реНрдЯ-рдЗрдВрдЯрд▓ рдпрд╛ рдЖрдИ18рдиреЗрдХреНрд╕реНрдЯ рдЬреИрд╕реЗ рдореБрдЦреНрдп рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, рдЗрдВрдЯрд▓реЗрдпрд░ рдПрдХ рдРрд╕рд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ рдЬреЛ рдПрдХреАрдХреГрдд рдЕрдиреБрдХреВрд▓рди рдХреЗ рд╕рд╛рде рдЖрддрд╛ рд╣реИ рдЬреИрд╕реЗ:

    рдкреВрд░реНрдг Next.js рдХрд╡рд░реЗрдЬ

    рдХреБрд╢рд▓ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЗ рд▓рд┐рдП рдЗрдВрдЯрд▓реЗрдпрд░ рдХреЛ рд╕рд░реНрд╡рд░ рдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ рдФрд░ рдпрд╣ рдЯрд░реНрдмреЛрдкреИрдХ рдХреЗ рд╕рд╛рде рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрдЧрдд рд╣реИред рдпрд╣ рд╕реНрдереИрддрд┐рдХ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЛ рдЕрд╡рд░реБрджреНрдз рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдЕрдВрддрд░реНрд░рд╛рд╖реНрдЯреНрд░реАрдпрдХрд░рдг (i18n) рдХреЛ рд╕реНрдХреЗрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рд╕рднреА рд╕реБрд╡рд┐рдзрд╛рдПрдБ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

    рдЗрдВрдЯрд▓реЗрдпрд░ Next.js 12, 13, 14, 15 рдФрд░ 16 рдХреЗ рд╕рд╛рде рд╕рдВрдЧрдд рд╣реИред рдпрджрд┐ рдЖрдк Next.js рдкреЗрдЬ рд░рд╛рдЙрдЯрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд░рд╣реЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕ [рдЧрд╛рдЗрдб] (/hi/doc/environment/nextjs/next-with-page-router) рдХреЛ рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЛрдХреЗрд▓ рд░реВрдЯрд┐рдВрдЧ рдПрд╕рдИрдУ, рдмрдВрдбрд▓ рдЖрдХрд╛рд░ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рдЗрд╕рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рддреЛ рдЖрдк рдЗрд╕ рдЧрд╛рдЗрдб рдХрд╛ рд╕рдВрджрд░реНрдн рд▓реЗ рд╕рдХрддреЗ рд╣реИрдВред рдРрдк рд░рд╛рдЙрдЯрд░ рдХреЗ рд╕рд╛рде Next.js 12, 13, 14, рдФрд░ 15 рдХреЗ рд▓рд┐рдП, рдЗрд╕ рдЧрд╛рдЗрдб рдХреЛ рджреЗрдЦреЗрдВред

    </Accordion>

    рдмрдВрдбрд▓ рдХрд╛ рдЖрдХрд╛рд░

    рдЕрдкрдиреЗ рдкреГрд╖реНрдареЛрдВ рдореЗрдВ рд╡рд┐рд╢рд╛рд▓ JSON рдлрд╝рд╛рдЗрд▓реЗрдВ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп, рдХреЗрд╡рд▓ рдЖрд╡рд╢реНрдпрдХ рд╕рд╛рдордЧреНрд░реА рд▓реЛрдб рдХрд░реЗрдВред рдЗрдВрдЯрд▓реЗрдпрд░ рдЖрдкрдХреЗ рдмрдВрдбрд▓ рдФрд░ рдкреГрд╖реНрда рдЖрдХрд╛рд░ рдХреЛ 50% рддрдХ рдХрдо рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред

    рд░рдЦрд░рдЦрд╛рд╡

    рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рд╕рд╛рдордЧреНрд░реА рдХрд╛ рджрд╛рдпрд░рд╛ рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдХреЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рд░рдЦрд░рдЦрд╛рд╡ рдХреА рд╕реБрд╡рд┐рдзрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЖрдк рдЕрдкрдиреЗ рд╕рдВрдкреВрд░реНрдг рд╕рд╛рдордЧреНрд░реА рдХреЛрдбрдмреЗрд╕ рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рдиреЗ рдХреЗ рдорд╛рдирд╕рд┐рдХ рдмреЛрдЭ рдХреЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдПрдХ рдлреАрдЪрд░ рдлрд╝реЛрд▓реНрдбрд░ рдХреА рдирдХрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЙрд╕реЗ рд╣рдЯрд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдЖрдкрдХреА рд╕рд╛рдордЧреНрд░реА рдХреА рд╕рдЯреАрдХрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Intlayer рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред

    рдПрдЖрдИ рдПрдЬреЗрдВрдЯ

    рд╕рд╛рдордЧреНрд░реА рдХрд╛ рд╕рд╣-рд╕реНрдерд╛рдиреАрдХрд░рдг рдмрдбрд╝реЗ рднрд╛рд╖рд╛ рдореЙрдбрд▓ (рдПрд▓рдПрд▓рдПрдо) рджреНрд╡рд╛рд░рд╛ рдЖрд╡рд╢реНрдпрдХ рд╕рдВрджрд░реНрдн рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИред рдЗрдВрдЯрд▓реЗрдпрд░ рдЯреВрд▓ рдХреЗ рдПрдХ рд╕реВрдЯ рдХреЗ рд╕рд╛рде рднреА рдЖрддрд╛ рд╣реИ, рдЬреИрд╕реЗ CLI рддрд╛рдХрд┐ рд▓рд╛рдкрддрд╛ рдЕрдиреБрд╡рд╛рджреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ,LSP, MCP, рдФрд░ agent skills, AI рдПрдЬреЗрдВрдЯреЛрдВ рдХреЗ рд▓рд┐рдП рдбреЗрд╡рд▓рдкрд░ рдЕрдиреБрднрд╡ (DX) рдХреЛ рдФрд░ рднреА рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдПред

    рд╕реНрд╡рдЪрд╛рд▓рди

    рдЕрдкрдиреЗ рдПрдЖрдИ рдкреНрд░рджрд╛рддрд╛ рдХреА рдХреАрдордд рдкрд░ рдЕрдкрдиреА рдкрд╕рдВрдж рдХреЗ рдПрд▓рдПрд▓рдПрдо рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рд╕реАрдЖрдИ/рд╕реАрдбреА рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╕реНрд╡рдЪрд╛рд▓рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдЗрдВрдЯрд▓реЗрдпрд░ рд╕рд╛рдордЧреНрд░реА рдирд┐рд╖реНрдХрд░реНрд╖рдг рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЗ рд╕рд╛рде-рд╕рд╛рде рдкреГрд╖реНрдарднреВрдорд┐ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдореЗрдВ рдорджрдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реЗрдм рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рднреА рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

    рдкреНрд░рджрд░реНрд╢рди

    рдмрдбрд╝реЗ рдкреИрдорд╛рдиреЗ рдкрд░ JSON рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдШрдЯрдХреЛрдВ рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдкреНрд░рджрд░реНрд╢рди рдФрд░ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛ рд╕рдВрдмрдВрдзреА рд╕рдорд╕реНрдпрд╛рдПрдВ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рдЗрдВрдЯрд▓реЗрдпрд░ рдмрд┐рд▓реНрдб рд╕рдордп рдкрд░ рдЖрдкрдХреА рд╕рд╛рдордЧреНрд░реА рд▓реЛрдбрд┐рдВрдЧ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред

    рдХрд┐рд╕реА рднреА рджреЗрд╡ рдХреЗ рд╕рд╛рде рд╕реНрдХреЗрд▓рд┐рдВрдЧ

    рд╕рд┐рд░реНрдл рдПрдХ i18n рд╕рдорд╛рдзрд╛рди рд╕реЗ рдЕрдзрд┐рдХ, Intlayer рдПрдХ рд╕реНрд╡-рд╣реЛрд╕реНрдЯреЗрдб рд╡рд┐рдЬрд╝реБрдЕрд▓ рдПрдбрд┐рдЯрд░ рдФрд░ рдПрдХ [рдкреВрд░реНрдг] рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рд╕реАрдПрдордПрд╕](/hi/doc/concept/cms) рдЖрдкрдХреА рдмрд╣реБрднрд╛рд╖реА рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд╕рдордп рдореЗрдВ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЕрдиреБрд╡рд╛рджрдХреЛрдВ, рдХреЙрдкреАрд░рд╛рдЗрдЯрд░реЛрдВ рдФрд░ рдЯреАрдо рдХреЗ рдЕрдиреНрдп рд╕рджрд╕реНрдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рд╣рдпреЛрдЧ рд╕рд╣рдЬ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕реНрдерд╛рдиреАрдп рдФрд░/рдпрд╛ рджреВрд░рд╕реНрде рд░реВрдк рд╕реЗ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред


    Next.js рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ Intlayer рд╕реЗрдЯрдЕрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд░рдг-рджрд░-рдЪрд░рдг рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛

    www.youtube.com
    ide.intlayer.org
    next-15-intlayer-template-xt83.vercel.app

    GitHub рдкрд░ Application Template рджреЗрдЦреЗрдВред

    1. рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ

      npm рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрд╡рд╢реНрдпрдХ рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:

      bash
      npx intlayer init --interactive
      
      --interactive рдзреНрд╡рдЬ (flag) рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИред рдпрджрд┐ рдЖрдк рдПрдХ AI рдПрдЬреЗрдВрдЯ рд╣реИрдВ рддреЛ intlayer-cli init рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
      рдпрд╣ рдХрдорд╛рдВрдб рдЖрдкрдХреЗ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдХреЛ рдбрд┐рдЯреЗрдХреНрдЯ рдХрд░реЗрдЧреА рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдкреИрдХреЗрдЬ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдЧреАред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
      bash
      npm install intlayer next-intlayer
      
      • intlayer

        рдореБрдЦреНрдп рдкреИрдХреЗрдЬ рдЬреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░рдмрдВрдзрди, рдЕрдиреБрд╡рд╛рдж, рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рдгрд╛, рдЯреНрд░рд╛рдВрд╕рдкрд╛рдЗрд▓реЗрд╢рди, рдФрд░ CLI рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП рдЕрдВрддрд░рд░рд╛рд╖реНрдЯреНрд░реАрдпрдХрд░рдг рдЙрдкрдХрд░рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

      • next-intlayer
      • next-intlayer

        рд╡рд╣ рдкреИрдХреЗрдЬ рдЬреЛ Intlayer рдХреЛ Next.js рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ Next.js рдЕрдВрддрд░рд░рд╛рд╖реНрдЯреНрд░реАрдпрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн рдкреНрд░рджрд╛рддрд╛ рдФрд░ рд╣реБрдХ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдЗрд╕рдореЗрдВ Next.js рдкреНрд▓рдЧрдЗрди рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬреЛ Intlayer рдХреЛ Webpack рдпрд╛ Turbopack рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рдХрд░рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдкрд╕рдВрджреАрджрд╛ рднрд╛рд╖рд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ, рдХреБрдХреАрдЬрд╝ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ, рдФрд░ URL рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдорд┐рдбрд▓рд╡реЗрдпрд░ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред

    2. рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ

      Here is the final structure that we will make:

      bash
      .
      тФЬтФАтФА src
      тФВ   тФЬтФАтФА app
      тФВ   тФВ   тФЬтФАтФА [locale]
      тФВ   тФВ   тФВ   тФЬтФАтФА layout.tsx            # Locale layout for the Intlayer provider
      тФВ   тФВ   тФВ   тФЬтФАтФА page.content.ts
      тФВ   тФВ   тФВ   тФФтФАтФА page.tsx
      тФВ   тФВ   тФФтФАтФА layout.tsx                # Root layout for style and global providers
      тФВ   тФЬтФАтФА components
      тФВ   тФВ   тФЬтФАтФА client-component-example.content.ts
      тФВ   тФВ   тФЬтФАтФА ClientComponentExample.tsx
      тФВ   тФВ   тФЬтФАтФА LocaleSwitcher
      тФВ   тФВ   тФВ   тФЬтФАтФА localeSwitcher.content.ts
      тФВ   тФВ   тФВ   тФФтФАтФА LocaleSwitcher.tsx
      тФВ   тФВ   тФЬтФАтФА server-component-example.content.ts
      тФВ   тФВ   тФФтФАтФА ServerComponentExample.tsx
      тФВ   тФФтФАтФА middleware.ts
      тФЬтФАтФА intlayer.config.ts
      тФЬтФАтФА next.config.ts
      тФЬтФАтФА package.json
      тФФтФАтФА tsconfig.json
      
      If you don't want locale routing, intlayer can be used as a simple provider / hook. See this guide for more details.

      рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреА рднрд╛рд╖рд╛рдУрдВ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЙрдиреНрдлрд╝рд┐рдЧ рдлрд╛рдЗрд▓ рдмрдирд╛рдПрдВ:

      intlayer.config.ts
      import { Locales, type IntlayerConfig } from "intlayer";
      
      const config: IntlayerConfig = {
        internationalization: {
          locales: [
            Locales.ENGLISH,
            Locales.FRENCH,
            Locales.SPANISH,
            // рдЖрдкрдХреА рдЕрдиреНрдп рднрд╛рд╖рд╛рдПрдБ
          ],
          defaultLocale: Locales.ENGLISH,
        },
      };
      
      export default config;
      
      рдЗрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдЖрдк рд╕реНрдерд╛рдиреАрдпрдХреГрдд URL, рдорд┐рдбрд▓рд╡реЗрдпрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди, рдХреБрдХреА рдирд╛рдо, рдЖрдкрдХреА рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рдгрд╛рдУрдВ рдХрд╛ рд╕реНрдерд╛рди рдФрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХрдВрд╕реЛрд▓ рдореЗрдВ Intlayer рд▓реЙрдЧ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рднреА рдмрд╣реБрдд рдХреБрдЫред рдЙрдкрд▓рдмреНрдз рд╕рднреА рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдкреВрд░реА рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджреЗрдЦреЗрдВред
    3. рдЕрдкрдиреЗ Next.js рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ Intlayer рдХреЛ рдПрдХреАрдХреГрдд рдХрд░реЗрдВ

      рдЕрдкрдиреЗ Next.js рд╕реЗрдЯрдЕрдк рдХреЛ Intlayer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ:

      next.config.ts
      import type { NextConfig } from "next";
      import { withIntlayer } from "next-intlayer/server";
      
      const nextConfig: NextConfig = {/* рдпрд╣рд╛рдБ рдХреЙрдиреНрдлрд╝рд┐рдЧ рд╡рд┐рдХрд▓реНрдк */};
      
      export default withIntlayer(nextConfig);
      
      withIntlayer() Next.js рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ Intlayer рдХреЛ Next.js рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рдХрдВрдЯреЗрдВрдЯ рдШреЛрд╖рдгрд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдирд┐рд░реНрдорд╛рдг рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡рд┐рдХрд╛рд╕ рдореЛрдб рдореЗрдВ рдЙрдирдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рддрд╛ рд╣реИред рдпрд╣ Webpack рдпрд╛ Turbopack рд╡рд╛рддрд╛рд╡рд░рдг рдХреЗ рднреАрддрд░ Intlayer рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдпрд╣ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдирд╛рдо рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рд░реНрд╡рд░ рдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИред

      withIntlayer() рдлрд╝рдВрдХреНрд╢рди рдПрдХ promise рдлрд╝рдВрдХреНрд╢рди рд╣реИред рдпрд╣ рдмрд┐рд▓реНрдб рд╢реБрд░реВ рд╣реЛрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ intlayer dictionaries рдХреЛ рддреИрдпрд╛рд░ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдЗрд╕реЗ рдЕрдиреНрдп plugins рдХреЗ рд╕рд╛рде рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк рдЗрд╕реЗ await рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг:

      tsx
      const nextConfig = await withIntlayer(nextConfig);
      const nextConfigWithOtherPlugins = withOtherPlugins(nextConfig);
      
      export default nextConfigWithOtherPlugins;
      

      рдпрджрд┐ рдЖрдк рдЗрд╕реЗ synchronously рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк withIntlayerSync() рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг:

      tsx
      const nextConfig = withIntlayerSync(nextConfig);
      const nextConfigWithOtherPlugins = withOtherPlugins(nextConfig);
      
      export default nextConfigWithOtherPlugins;
      
    4. рдбрд╛рдпрдирд╛рдорд┐рдХ рд▓реЛрдХрд▓ рд░реВрдЯреНрд╕ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ

      RootLayout рд╕реЗ рд╕рдм рдХреБрдЫ рд╣рдЯрд╛ рджреЗрдВ рдФрд░ рдЗрд╕реЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдХреЛрдб рд╕реЗ рдмрджрд▓реЗрдВ:

      src/app/layout.tsx
      import type { PropsWithChildren, FC } from "react";
      import "./globals.css";
      
      const RootLayout: FC<PropsWithChildren> = ({ children }) => children;
      
      export default RootLayout;
      
      RootLayout рдШрдЯрдХ рдХреЛ рдЦрд╛рд▓реА рд░рдЦрдиреЗ рд╕реЗ рдЖрдк lang рдФрд░ dir рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ <html> рдЯреИрдЧ рдкрд░ рд╕реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
      рдбрд╛рдпрдирд╛рдорд┐рдХ рд░реВрдЯрд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдкрдиреЗ [locale] рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рдПрдХ рдирдпрд╛ рд▓реЗрдЖрдЙрдЯ рдЬреЛрдбрд╝рдХрд░ рд▓реЛрдХрд▓ рдХреЗ рд▓рд┐рдП рдкрде рдкреНрд░рджрд╛рди рдХрд░реЗрдВ:
      src/app/[locale]/layout.tsx
      import { type NextLayoutIntlayer } from "next-intlayer";
      import { IntlayerProvider } from "next-intlayer/server";
      import { Inter } from "next/font/google";
      import { getHTMLTextDir } from "intlayer";
      
      const inter = Inter({ subsets: ["latin"] });
      
      const LocaleLayout: NextLayoutIntlayer = async ({ children, params }) => {
        const { locale } = await params;
        return (
          <html lang={locale} dir={getHTMLTextDir(locale)}>
            <body className={inter.className}>
              <IntlayerProvider locale={locale}>{children}</IntlayerProvider>
            </body>
          </html>
        );
      };
      
      export default LocaleLayout;
      
      рдПрдХ single IntlayerProvider tree рдХреЗ рджреЛрдиреЛрдВ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ cover рдХрд░рддрд╛ рд╣реИ: рдпрд╣ request-scoped server context рдХреЛ seed рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ server hooks рджреНрд╡рд╛рд░рд╛ read рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ client provider рдХреЛ mount рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ client components рдХреЛ same locale рдкреНрд░рд╛рдкреНрдд рд╣реЛред
      src/app/[locale]/layout.tsx
      import { type NextLayoutIntlayer, IntlayerClientProvider } from "next-intlayer";
      import { Inter } from "next/font/google";
      import { IntlayerClientProvider } from "next-intlayer";
      import { getHTMLTextDir } from "intlayer";
      
      const inter = Inter({ subsets: ["latin"] });
      
      // `LocaleLayout` рдПрдХ рд▓реЗрдЖрдЙрдЯ рдХрдВрдкреЛрдиреЗрдВрдЯ рд╣реИ рдЬреЛ рд╕реНрдерд╛рдиреАрдп рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ HTML рдЯреИрдЧ рдХреЗ `lang` рдФрд░ `dir` рдПрдЯреНрд░рд┐рдмреНрдпреВрдЯ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИред
      const LocaleLayout: NextLayoutIntlayer = async ({ children, params }) => {
        const { locale } = await params;
        return (
          <html lang={locale} dir={getHTMLTextDir(locale)}>
            <body className={inter.className}>
              <IntlayerClientProvider locale={locale}>
                {children}
              </IntlayerClientProvider>
            </body>
          </html>
        );
      };
      
      export default LocaleLayout;
      
      [locale] рдкрд╛рде рд╕реЗрдЧрдореЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рд▓реЛрдХрд▓ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг: /en-US/about en-US рдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░ /fr/about fr рдХреЛред
      рдЗрд╕ рдЪрд░рдг рдкрд░, рдЖрдкрдХреЛ рддреНрд░реБрдЯрд┐ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝реЗрдЧрд╛: Error: Missing <html> and <body> tags in the root layout.ред рдпрд╣ рдЕрдкреЗрдХреНрд╖рд┐рдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ /app/page.tsx рдлрд╝рд╛рдЗрд▓ рдЕрдм рдЙрдкрдпреЛрдЧ рдореЗрдВ рдирд╣реАрдВ рд╣реИ рдФрд░ рдЗрд╕реЗ рд╣рдЯрд╛ рджрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, [locale] рдкрд╛рде рд╕реЗрдЧрдореЗрдВрдЯ /app/[locale]/page.tsx рдкреЗрдЬ рдХреЛ рд╕рдХреНрд░рд┐рдп рдХрд░реЗрдЧрд╛ред рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк, рдкреЗрдЬ рдЖрдкрдХреЗ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рдореЗрдВ /en, /fr, /es рдЬреИрд╕реЗ рдкрд╛рде рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реБрд▓рдн рд╣реЛрдВрдЧреЗред рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд▓реЛрдХрд▓ рдХреЛ рд░реВрдЯ рдкреЗрдЬ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЪрд░рдг 7 рдореЗрдВ middleware рд╕реЗрдЯрдЕрдк рджреЗрдЦреЗрдВред

      рдлрд┐рд░, рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЗрдЖрдЙрдЯ рдореЗрдВ generateStaticParams рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░реЗрдВред

      src/app/[locale]/layout.tsx
      export { generateStaticParams } from "next-intlayer"; // рд╕рдореНрдорд┐рд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд▓рд╛рдЗрди
      
      const LocaleLayout: NextLayoutIntlayer = async ({ children, params }) => {
        /*... рдХреЛрдб рдХрд╛ рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕рд╛ */
      };
      
      export default LocaleLayout;
      
      generateStaticParams рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рднреА рд▓реЛрдХрд▓ рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдкреГрд╖реНрдареЛрдВ рдХреЛ рдкреВрд░реНрд╡-рдирд┐рд░реНрдорд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд░рдирдЯрд╛рдЗрдо рдЧрдгрдирд╛ рдХрдо рд╣реЛрддреА рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрднрд╡ рдмреЗрд╣рддрд░ рд╣реЛрддрд╛ рд╣реИред рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, Next.js рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВ generateStaticParams рджреЗрдЦреЗрдВред
      Intlayer export const dynamic = 'force-static'; рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдкреГрд╖реНрда рд╕рднреА locales рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рдирд┐рд░реНрдорд┐рдд рд╣реЛрдВред
    5. рдЕрдкрдиреА рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ

      рдЕрдиреБрд╡рд╛рджреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рдгрд╛рдПрдБ рдмрдирд╛рдПрдВ рдФрд░ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░реЗрдВ:

      src/app/[locale]/page.content.ts
      import { t, type Dictionary } from "intlayer";
      
      const pageContent = {
        key: "page",
        content: {
          getStarted: {
            main: t({
              en: "Get started by editing",
              fr: "Commencez par ├йditer",
              es: "Comience por editar",
            }),
            pageLink: "src/app/page.tsx",
          },
        },
      } satisfies Dictionary;
      
      export default pageContent;
      
      рдЖрдкрдХреА рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рдгрд╛рдПрдБ рдЖрдкрдХреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдХрд╣реАрдВ рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рд╡реЗ contentDir рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, ./src) рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВред рдФрд░ рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рдгрд╛ рдлрд╝рд╛рдЗрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реЛрдВ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, .content.{json,ts,tsx,js,jsx,mjs,cjs,md,mdx,yaml,yml})ред
      рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рдгрд╛ рдкреНрд░рд▓реЗрдЦрди рджреЗрдЦреЗрдВред
    6. рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ

      рдЕрдкрдиреЗ рдкреВрд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЕрдкрдиреЗ рдХрдВрдЯреЗрдВрдЯ рдбрд┐рдХреНрд╢рдирд░реАрдЬрд╝ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░реЗрдВ:

      src/app/[locale]/page.tsx
      import type { FC } from "react";
      import { ClientComponentExample } from "@components/ClientComponentExample";
      import { ServerComponentExample } from "@components/ServerComponentExample";
      import { type NextPageIntlayer, useIntlayer } from "next-intlayer";
      
      const PageContent: FC = () => {
        const content = useIntlayer("page");
      
        return (
          <>
            <p>{content.getStarted.main}</p>
            <code>{content.getStarted.pageLink}</code>
          </>
        );
      };
      
      const Page: NextPageIntlayer = () => (
        <>
          <PageContent />
          <ServerComponentExample />
      
          <ClientComponentExample />
        </>
      );
      
      export default Page;
      
      • IntlayerProvider рдХреЛ locale layout рдореЗрдВ рдПрдХ рдмрд╛рд░ mount рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ server рдФрд░ client рджреЛрдиреЛрдВ components рдХреЛ locale рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП pages рдЕрдм рдЕрдкрдиреЗ рдЖрдк рдХреЛ wrap рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВред
      • Server hooks locale рдХреЛ рдЗрд╕реА рдХреНрд░рдо рдореЗрдВ resolve рдХрд░рддреЗ рд╣реИрдВ: call site рдкрд░ рдкрд╛рд╕ рдХрд┐рдпрд╛ рдЧрдпрд╛ locale, рдлрд┐рд░ provider рджреНрд╡рд╛рд░рд╛ seeded рдХрд┐рдпрд╛ рдЧрдпрд╛ server context, рдлрд┐рд░ request рдХреЗ рд╕рд╛рде рдХрд┐рдпрд╛ рдЧрдпрд╛ locale (Intlayer proxy рджреНрд╡рд╛рд░рд╛ рд╕реЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ x-intlayer-locale header, рдлрд┐рд░ locale cookie)ред рдпрд╣ рдЕрдВрддрд┐рдо рдЪрд░рдг рд╡рд╣ рд╣реИ рдЬреЛ client-side navigation рдкрд░ content рдХреЛ рд╕рд╣реА рд░рдЦрддрд╛ рд╣реИ рдЬреЛ рдХреЗрд╡рд▓ page segment рдХреЛ re-render рдХрд░рддрд╛ рд╣реИ, рдЬрд╣рд╛рдВ layout тАФ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде provider тАФ рджреЛрдмрд╛рд░рд╛ рдирд╣реАрдВ рдЪрд▓рддрд╛ рд╣реИред

      рдЕрдкрдиреЗ рдЖрд╡реЗрджрди рдореЗрдВ рдЕрдкрдиреА рд╕рд╛рдордЧреНрд░реА рд╢рдмреНрджрдХреЛрд╢реЛрдВ рддрдХ рдкрд╣реБрдБрдЪреЗрдВ:

      src/app/[locale]/page.tsx
      import type { FC } from "react";
      import { ClientComponentExample } from "@components/ClientComponentExample";
      import { ServerComponentExample } from "@components/ServerComponentExample";
      import { type NextPageIntlayer } from "next-intlayer";
      import { IntlayerServerProvider, useIntlayer } from "next-intlayer/server";
      
      const PageContent: FC = () => {
        const content = useIntlayer("page");
      
        return (
          <>
            <p>{content.getStarted.main}</p>
            <code>{content.getStarted.pageLink}</code>
          </>
        );
      };
      
      const Page: NextPageIntlayer = async ({ params }) => {
        const { locale } = await params;
      
        return (
          <IntlayerServerProvider locale={locale}>
            <PageContent />
            <ServerComponentExample />
      
            <ClientComponentExample />
          </IntlayerServerProvider>
        );
      };
      
      export default Page;
      
      • IntlayerClientProvider рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕ рдХреЛ рд▓реЛрдХрд▓ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕реЗ рдХрд┐рд╕реА рднреА рдкреИрд░реЗрдВрдЯ рдХрдВрдкреЛрдиреЗрдВрдЯ рдореЗрдВ рд░рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рд▓реЗрдЖрдЙрдЯ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред рд╣рд╛рд▓рд╛рдВрдХрд┐, рдЗрд╕реЗ рд▓реЗрдЖрдЙрдЯ рдореЗрдВ рд░рдЦрдирд╛ рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╣реИ рдХреНрдпреЛрдВрдХрд┐ Next.js рдкреЗрдЬреЛрдВ рдХреЗ рдмреАрдЪ рд▓реЗрдЖрдЙрдЯ рдХреЛрдб рд╕рд╛рдЭрд╛ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдпрд╣ рдЕрдзрд┐рдХ рдХреБрд╢рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рд▓реЗрдЖрдЙрдЯ рдореЗрдВ IntlayerClientProvider рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рд╣рд░ рдкреЗрдЬ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ рдкреБрдирдГ рдЖрд░рдВрдн рдХрд░рдиреЗ рд╕реЗ рдмрдЪрддреЗ рд╣реИрдВ, рдкреНрд░рджрд░реНрд╢рди рдореЗрдВ рд╕реБрдзрд╛рд░ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдПрдХ рд╕реБрд╕рдВрдЧрдд рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рд╕рдВрджрд░реНрдн рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реИрдВред
      • IntlayerServerProvider рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рд░реНрд╡рд░ рдЪрд╛рдЗрд▓реНрдб рдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕ рдХреЛ рд▓реЛрдХрд▓ рдкреНрд░рджрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕реЗ рд▓реЗрдЖрдЙрдЯ рдореЗрдВ рд╕реЗрдЯ рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ред

        рд▓реЗрдЖрдЙрдЯ рдФрд░ рдкреЗрдЬ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рд░реНрд╡рд░ рд╕рдВрджрд░реНрдн рд╕рд╛рдЭрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдХреНрдпреЛрдВрдХрд┐ рд╕рд░реНрд╡рд░ рд╕рдВрджрд░реНрдн рдкреНрд░рдгрд╛рд▓реА рдкреНрд░рддрд┐ рдЕрдиреБрд░реЛрдз рдбреЗрдЯрд╛ рд╕реНрдЯреЛрд░ (React рдХреЗ рдХреИрд╢ React's cache рддрдВрддреНрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╡рд┐рднрд┐рдиреНрди рд╕реЗрдЧрдореЗрдВрдЯ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ "рд╕рдВрджрд░реНрдн" рдкреБрдирдГ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рджрд╛рддрд╛ рдХреЛ рд╕рд╛рдЭрд╛ рд▓реЗрдЖрдЙрдЯ рдореЗрдВ рд░рдЦрдиреЗ рд╕реЗ рдпрд╣ рдкреГрдердХреНрдХрд░рдг рдЯреВрдЯ рдЬрд╛рдПрдЧрд╛, рдЬрд┐рд╕рд╕реЗ рдЖрдкрдХреЗ рд╕рд░реНрд╡рд░ рдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕ рдХреЛ рд╕рд╣реА рд╕рд░реНрд╡рд░ рд╕рдВрджрд░реНрдн рдорд╛рдиреЛрдВ рдХрд╛ рдкреНрд░рд╕рд╛рд░ рдирд╣реАрдВ рд╣реЛ рдкрд╛рдПрдЧрд╛ред
        рд▓реЗрдЖрдЙрдЯ рдФрд░ рдкреЗрдЬ рдПрдХ рд╕рд╛рдорд╛рдиреНрдп рд╕рд░реНрд╡рд░ рд╕рдВрджрд░реНрдн рд╕рд╛рдЭрд╛ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рдХреНрдпреЛрдВрдХрд┐ рд╕рд░реНрд╡рд░ рд╕рдВрджрд░реНрдн рдкреНрд░рдгрд╛рд▓реА рдкреНрд░рддрд┐ рдЕрдиреБрд░реЛрдз рдбреЗрдЯрд╛ рд╕реНрдЯреЛрд░ (React рдХреЗ рдХреИрд╢ React's cache рддрдВрддреНрд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ) рдкрд░ рдЖрдзрд╛рд░рд┐рдд рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рд╡рд┐рднрд┐рдиреНрди рдЦрдВрдбреЛрдВ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ "рд╕рдВрджрд░реНрдн" рдкреБрдирдГ рдмрдирд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рджрд╛рддрд╛ рдХреЛ рд╕рд╛рдЭрд╛ рд▓реЗрдЖрдЙрдЯ рдореЗрдВ рд░рдЦрдирд╛ рдЗрд╕ рдкреГрдердХреНрдХрд░рдг рдХреЛ рддреЛрдбрд╝ рджреЗрдЧрд╛, рдЬрд┐рд╕рд╕реЗ рдЖрдкрдХреЗ рд╕рд░реНрд╡рд░ рдШрдЯрдХреЛрдВ рдХреЛ рд╕рд░реНрд╡рд░ рд╕рдВрджрд░реНрдн рдорд╛рдиреЛрдВ рдХрд╛ рд╕рд╣реА рдкреНрд░рдЪрд╛рд░рд┐рдд рд╣реЛрдирд╛ рдмрд╛рдзрд┐рдд рд╣реЛ рдЬрд╛рдПрдЧрд╛ред
      src/components/ClientComponentExample.tsx
      "use client";
      
      import type { FC } from "react";
      import { useIntlayer } from "next-intlayer";
      
      export const ClientComponentExample: FC = () => {
        const content = useIntlayer("client-component-example"); // рд╕рдВрдмрдВрдзрд┐рдд рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рдгрд╛ рдмрдирд╛рдПрдБ
      
        return (
          <div>
            <h2>{content.title}</h2>
            <p>{content.content}</p>
          </div>
        );
      };
      
      src/components/ServerComponentExample.tsx
      import type { FC } from "react";
      import { useIntlayer } from "next-intlayer";
      
      export const ServerComponentExample: FC = () => {
        const content = useIntlayer("server-component-example"); // рд╕рдВрдмрдВрдзрд┐рдд рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рдгрд╛ рдмрдирд╛рдПрдВ
      
        return (
          <div>
            <h2>{content.title}</h2>
            <p>{content.content}</p>
          </div>
        );
      };
      
      next-intlayer рдПрдХ isomorphic import path рд╣реИ: react-server export condition рд╕рд░реНрд╡рд░ components рдХреЛ ambient-locale implementation рджреЗрддрд╛ рд╣реИ, рдЬрдмрдХрд┐ client components рдХреЛ context-backed рдПрдХ рдорд┐рд▓рддрд╛ рд╣реИред рдпрд╣реА call рджреЛрдиреЛрдВ рддрд░рдл рдХрд╛рдо рдХрд░рддреА рд╣реИред
      src/components/ServerComponentExample.tsx
      import type { FC } from "react";
      import { useIntlayer } from "next-intlayer/server";
      
      export const ServerComponentExample: FC = () => {
        const content = useIntlayer("server-component-example"); // рд╕рдВрдмрдВрдзрд┐рдд рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рдгрд╛ рдмрдирд╛рдПрдБ
      
        return (
          <div>
            <h2>{content.title}</h2>
            <p>{content.content}</p>
          </div>
        );
      };
      
      рдпрджрд┐ рдЖрдк рдЕрдкрдиреА рд╕рд╛рдордЧреНрд░реА рдХреЛ string рдПрдЯреНрд░рд┐рдмреНрдпреВрдЯ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ alt, title, href, aria-label, рдЖрджрд┐, рддреЛ рдЖрдкрдХреЛ рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рди рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬреИрд╕реЗ:
      html
      <img src="{content.image.src.value}" alt="{content.image.value}" />
      <img src="{content.image.src.toString()}" alt="{content.image.toString()}" />
      <img src="{String(content.image.src)}" alt="{String(content.image)}" />
      
      useIntlayer рд╣реБрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рд▓реЗрдЦрди рджреЗрдЦреЗрдВред
    7. рд╕реНрдерд╛рди рдкрд╣рдЪрд╛рди рдХреЗ рд▓рд┐рдП рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ

      рд╡реИрдХрд▓реНрдкрд┐рдХ

      рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдкрд╕рдВрджреАрджрд╛ рднрд╛рд╖рд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдорд┐рдбрд▓рд╡реЗрдпрд░ рд╕реЗрдЯ рдХрд░реЗрдВ:

      src/middleware.ts
      export { intlayerMiddleware as middleware } from "next-intlayer/middleware";
      
      export const config = {
        matcher:
          "/((?!api|static|assets|robots|sitemap|sw|service-worker|manifest|.*\\..*|_next).*)",
      };
      
      intlayerMiddleware рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдкрд╕рдВрджреАрджрд╛ рднрд╛рд╖рд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЙрдкрдпреБрдХреНрдд URL рдкрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдкрд╕рдВрджреАрджрд╛ рднрд╛рд╖рд╛ рдХреЛ рдХреБрдХреА рдореЗрдВ рд╕рд╣реЗрдЬрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рднреА рджреЗрддрд╛ рд╣реИред
      Intlayer v9 рдХреЗ рдмрд╛рдж рд╕реЗ, рдпрд╣ middleware routing.enableProxy рд╡рд┐рдХрд▓реНрдк рдХреЛ рд╕рдореНрдорд╛рдирд┐рдд рдХрд░рддрд╛ рд╣реИ (true рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ)ред рдЗрд╕реЗ pass-through рдореЗрдВ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ routing.enableProxy: false рд╕реЗрдЯ рдХрд░реЗрдВ рдмрд┐рдирд╛ рдЗрд╕ рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╣рдЯрд╛рдПред v9 release notes рджреЗрдЦреЗрдВред
      рдпрджрд┐ рдЖрдкрдХреЛ рдХрдИ middlewares рдХреЛ рдПрдХ рд╕рд╛рде chain рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, authentication рдпрд╛ custom middlewares рдХреЗ рд╕рд╛рде intlayerMiddleware), Intlayer рдЕрдм multipleMiddlewares рдирд╛рдордХ рдПрдХ helper рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
      ts
      import {
        multipleMiddlewares,
        intlayerMiddleware,
      } from "next-intlayer/middleware";
      import { customMiddleware } from "@utils/customMiddleware";
      
      export const middleware = multipleMiddlewares([
        intlayerMiddleware,
        customMiddleware,
      ]);
      
    8. рдЕрдкрдиреЗ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХрд╛ рдЕрдВрддрд░рд░рд╛рд╖реНрдЯреНрд░реАрдпрдХрд░рдг

      рд╡реИрдХрд▓реНрдкрд┐рдХ

      рдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЛ рдЕрдВрддрд░рд░рд╛рд╖реНрдЯреНрд░реАрдпрдХреГрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдЖрдкрдХреЗ рдкреГрд╖реНрда рдХрд╛ рд╢реАрд░реНрд╖рдХ, рддреЛ рдЖрдк Next.js рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ generateMetadata рдлрд╝рдВрдХреНрд╢рди рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЗрд╕рдХреЗ рдЕрдВрджрд░, рдЖрдк рдЕрдкрдиреЗ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП getIntlayer рдлрд╝рдВрдХреНрд╢рди рд╕реЗ рд╕рд╛рдордЧреНрд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

      src/app/[locale]/metadata.content.ts
      import { type Dictionary, t } from "intlayer";
      import { Metadata } from "next";
      
      const metadataContent = {
        key: "page-metadata",
        content: {
          title: t({
            en: "Create Next App",
            fr: "Cr├йer une application Next.js",
            es: "Crear una aplicaci├│n Next.js",
          }),
          description: t({
            en: "Generated by create next app",
            fr: "G├йn├йr├й par create next app",
            es: "Generado por create next app",
          }),
        },
      } satisfies Dictionary<Metadata>;
      
      export default metadataContent;
      
      src/app/[locale]/layout.tsx or src/app/[locale]/page.tsx
      import { getIntlayer, getMultilingualUrls } from "intlayer";
      import type { Metadata } from "next";
      import type { LocalPromiseParams } from "next-intlayer";
      
      export const generateMetadata = async ({
        params,
      }: LocalPromiseParams): Promise<Metadata> => {
        const { locale } = await params;
      
        const metadata = getIntlayer("page-metadata", locale);
      
        /**
         * рдкреНрд░рддреНрдпреЗрдХ рд╕реНрдерд╛рдиреАрдп рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рд╕рднреА URL рд╡рд╛рд▓реЗ рдСрдмреНрдЬреЗрдХреНрдЯ рдХреЛ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред
         *
         * рдЙрджрд╛рд╣рд░рдг:
         * ```ts
         *  getMultilingualUrls('/about');
         *
         *  // рд▓реМрдЯрд╛рддрд╛ рд╣реИ
         *  // {
         *  //   en: '/about',
         *  //   fr: '/fr/about',
         *  //   es: '/es/about',
         *  // }
         * ```
         */
        const multilingualUrls = getMultilingualUrls("/");
        const localizedUrl =
          multilingualUrls[locale as keyof typeof multilingualUrls];
      
        return {
          ...metadata,
          alternates: {
            canonical: localizedUrl,
            languages: { ...multilingualUrls, "x-default": "/" },
          },
          openGraph: {
            url: localizedUrl,
          },
        };
      };
      
      // ... рдмрд╛рдХреА рдХреЛрдб
      
      рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ next-intlayer рд╕реЗ рдЖрдпрд╛рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ getIntlayer рдлрд╝рдВрдХреНрд╢рди рдЖрдкрдХреЗ рдХрдВрдЯреЗрдВрдЯ рдХреЛ рдПрдХ IntlayerNode рдореЗрдВ рд▓рдкреЗрдЯ рдХрд░ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЬреЛ рд╡рд┐рдЬрд╝реБрдЕрд▓ рдПрдбрд┐рдЯрд░ рдХреЗ рд╕рд╛рде рдПрдХреАрдХрд░рдг рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, intlayer рд╕реЗ рдЖрдпрд╛рдд рдХрд┐рдпрд╛ рдЧрдпрд╛ getIntlayer рдлрд╝рдВрдХреНрд╢рди рдЖрдкрдХреЗ рдХрдВрдЯреЗрдВрдЯ рдХреЛ рд╕реАрдзреЗ рдмрд┐рдирд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдЧреБрдгреЛрдВ рдХреЗ рд▓реМрдЯрд╛рддрд╛ рд╣реИред
      рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдЕрдиреБрдХреВрд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдиреЗрдВ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ Next.js рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВред
    9. рдЕрдкрдиреЗ sitemap.xml рдФрд░ robots.txt рдХрд╛ рдЕрдВрддрд░рд░рд╛рд╖реНрдЯреНрд░реАрдпрдХрд░рдг

      рд╡реИрдХрд▓реНрдкрд┐рдХ

      рдЕрдкрдиреЗ sitemap.xml рдФрд░ robots.txt рдХрд╛ рдЕрдВрддрд░рд░рд╛рд╖реНрдЯреНрд░реАрдпрдХрд░рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк Intlayer рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЧрдИ getMultilingualUrls рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдЖрдкрдХреЗ рд╕рд╛рдЗрдЯрдореИрдк рдХреЗ рд▓рд┐рдП рдмрд╣реБрднрд╛рд╖реА URL рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

      src/app/sitemap.ts
      import { getMultilingualUrls } from "intlayer";
      import type { MetadataRoute } from "next";
      
      const sitemap = (): MetadataRoute.Sitemap => [
        {
          url: "https://example.com",
          alternates: {
            languages: {
              ...getMultilingualUrls("https://example.com"),
              "x-default": "https://example.com",
            },
          },
        },
        {
          url: "https://example.com/login",
          alternates: {
            languages: {
              ...getMultilingualUrls("https://example.com/login"),
              "x-default": "https://example.com/login",
            },
          },
        },
        {
          url: "https://example.com/register",
          alternates: {
            languages: {
              ...getMultilingualUrls("https://example.com/register"),
              "x-default": "https://example.com/register",
            },
          },
        },
      ];
      
      export default sitemap;
      
      src/app/robots.ts
      import type { MetadataRoute } from "next";
      import { getMultilingualUrls } from "intlayer";
      
      // рд╕рднреА рдмрд╣реБрднрд╛рд╖реА URL рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
      const getAllMultilingualUrls = (urls: string[]) =>
        urls.flatMap((url) => Object.values(getMultilingualUrls(url)) as string[]);
      
      // рд░реЛрдмреЛрдЯреНрд╕ рдирд┐рдпрдо рд╕реЗрдЯ рдХрд░реЗрдВ
      const robots = (): MetadataRoute.Robots => ({
        rules: {
          userAgent: "*", // рд╕рднреА рдпреВрдЬрд░ рдПрдЬреЗрдВрдЯреНрд╕ рдХреЗ рд▓рд┐рдП рдирд┐рдпрдо
          allow: ["/"], // рд╕рднреА рдкрдереЛрдВ рдХреА рдЕрдиреБрдорддрд┐
          disallow: getAllMultilingualUrls(["/login", "/register"]), // рд▓реЙрдЧрд┐рди рдФрд░ рд░рдЬрд┐рд╕реНрдЯрд░ рдкрдереЛрдВ рдХреЛ рдЕрд╕реНрд╡реАрдХрд╛рд░ рдХрд░реЗрдВ
        },
        host: "https://example.com",
        sitemap: `https://example.com/sitemap.xml`,
      });
      
      export default robots;
      
      рд╕рд╛рдЗрдЯрдореИрдк рдЕрдиреБрдХреВрд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдиреЗрдВ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ Next.js рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкрд░ред robots.txt рдЕрдиреБрдХреВрд▓рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдиреЗрдВ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ Next.js рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкрд░ред
    10. рдЕрдкрдиреА рд╕рд╛рдордЧреНрд░реА рдХреА рднрд╛рд╖рд╛ рдмрджрд▓реЗрдВ

      рд╡реИрдХрд▓реНрдкрд┐рдХ

      Next.js рдореЗрдВ рдЕрдкрдиреА рд╕рд╛рдордЧреНрд░реА рдХреА рднрд╛рд╖рд╛ рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП, рдЕрдиреБрд╢рдВрд╕рд┐рдд рддрд░реАрдХрд╛ рд╣реИ рдХрд┐ Link рдХреЙрдореНрдкреЛрдиреЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЙрдкрдпреБрдХреНрдд рд╕реНрдерд╛рдиреАрдпрдХреГрдд рдкреГрд╖реНрда рдкрд░ рдкреБрдирдГ рдирд┐рд░реНрджреЗрд╢рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рдПред Link рдХреЙрдореНрдкреЛрдиреЗрдВрдЯ рдкреГрд╖реНрда рдХреА рдкреНрд░реАрдлрд╝реЗрдЪрд┐рдВрдЧ рд╕рдХреНрд╖рдо рдХрд░рддрд╛ рд╣реИ, рдЬреЛ рдкреВрд░реНрдг рдкреГрд╖реНрда рдкреБрдирдГ рд▓реЛрдб рд╕реЗ рдмрдЪрдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддрд╛ рд╣реИред

      src/components/LocaleSwitcher.tsx
      "use client";
      
      import type { FC } from "react";
      import {
        Locales,
        getHTMLTextDir,
        getLocaleName,
        getLocalizedUrl,
      } from "intlayer";
      import { useLocale } from "next-intlayer";
      import Link from "next/link";
      
      export const LocaleSwitcher: FC = () => {
        const { locale, pathWithoutLocale, availableLocales, setLocale } =
          useLocale();
      
        return (
          <div>
            <button popoverTarget="localePopover">{getLocaleName(locale)}</button>
            <div id="localePopover" popover="auto">
              {availableLocales.map((localeItem) => (
                <Link
                  href={getLocalizedUrl(pathWithoutLocale, localeItem)}
                  hrefLang={localeItem}
                  key={localeItem}
                  aria-current={locale === localeItem ? "page" : undefined}
                  onClick={() => setLocale(localeItem)}
                >
                  <span>
                    {/* рд▓реЛрдХрд▓ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП FR */}
                    {localeItem}
                  </span>
                  <span>
                    {/* рдЕрдкрдиреА рд▓реЛрдХрд▓ рдореЗрдВ рднрд╛рд╖рд╛ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП Fran├зais */}
                    {getLocaleName(localeItem, locale)}
                  </span>
                  <span dir={getHTMLTextDir(localeItem)} lang={localeItem}>
                    {/* рд╡рд░реНрддрдорд╛рди рд▓реЛрдХрд▓ рдореЗрдВ рднрд╛рд╖рд╛ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП Franc├йs рдЬрдм рд╡рд░реНрддрдорд╛рди рд▓реЛрдХрд▓ Locales.SPANISH рд╕реЗрдЯ рд╣реЛ */}
                    {getLocaleName(localeItem)}
                  </span>
                  <span dir="ltr" lang={Locales.ENGLISH}>
                    {/* рдЕрдВрдЧреНрд░реЗрдЬрд╝реА рдореЗрдВ рднрд╛рд╖рд╛ - рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП French */}
                    {getLocaleName(localeItem, Locales.ENGLISH)}
                  </span>
                </Link>
              ))}
            </div>
          </div>
        );
      };
      
      рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ рддрд░реАрдХрд╛ рд╣реИ useLocale рд╣реБрдХ рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ setLocale рдлрд╝рдВрдХреНрд╢рди рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдкреЗрдЬ рдХреЛ рдкреНрд░реАрдлрд╝реЗрдЪ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдирд╣реАрдВ рджреЗрдЧрд╛ рдФрд░ рдкреЗрдЬ рдХреЛ рдкреБрдирдГ рд▓реЛрдб рдХрд░реЗрдЧрд╛ред
      рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, router.push рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди рдХреЗ, рдХреЗрд╡рд▓ рдЖрдкрдХрд╛ рд╕рд░реНрд╡рд░-рд╕рд╛рдЗрдб рдХреЛрдб рд╕рд╛рдордЧреНрд░реА рдХреА рднрд╛рд╖рд╛ рдХреЛ рдмрджрд▓ рджреЗрдЧрд╛ред
      src/components/LocaleSwitcher.tsx
      "use client";
      
      import { useRouter } from "next/navigation";
      import { useLocale } from "next-intlayer";
      import { getLocalizedUrl } from "intlayer";
      
      // ... рдмрд╛рдХреА рдХреЛрдб
      
      const router = useRouter();
      const { setLocale } = useLocale({
        onLocaleChange: (locale) => {
          router.push(getLocalizedUrl(pathWithoutLocale, locale));
        },
      });
      
      return (
        <button onClick={() => setLocale(Locales.FRENCH)}>рдлреНрд░реЗрдВрдЪ рдореЗрдВ рдмрджрд▓реЗрдВ</button>
      );
      

      рдкреНрд░рд▓реЗрдЦрди рд╕рдВрджрд░реНрдн:

    11. рдПрдХ рд╕реНрдерд╛рдиреАрдпрдХреГрдд рд▓рд┐рдВрдХ рдХреЙрдореНрдкреЛрдиреЗрдВрдЯ рдмрдирд╛рдирд╛

      рд╡реИрдХрд▓реНрдкрд┐рдХ

      рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдиреЗрд╡рд┐рдЧреЗрд╢рди рд╡рд░реНрддрдорд╛рди рд▓реЛрдХрд▓ рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рддрд╛ рд╣реИ, рдЖрдк рдПрдХ рдХрд╕реНрдЯрдо Link рдХреЙрдореНрдкреЛрдиреЗрдВрдЯ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рдХреЙрдореНрдкреЛрдиреЗрдВрдЯ рдЖрдВрддрд░рд┐рдХ URL рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╡рд░реНрддрдорд╛рди рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде рдкреНрд░реАрдлрд┐рдХреНрд╕ рдХрд░рддрд╛ рд╣реИред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЬрдм рдПрдХ рдлреНрд░реЗрдВрдЪ-рднрд╛рд╖реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ "About" рдкреЗрдЬ рдХреЗ рд▓рд┐рдВрдХ рдкрд░ рдХреНрд▓рд┐рдХ рдХрд░рддрд╛ рд╣реИ, рддреЛ рдЙрд╕реЗ /fr/about рдкрд░ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рди рдХрд┐ /about рдкрд░ред

      рдпрд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрдИ рдХрд╛рд░рдгреЛрдВ рд╕реЗ рдЙрдкрдпреЛрдЧреА рд╣реИ:

      • SEO рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрднрд╡: рд╕реНрдерд╛рдиреАрдпрдХреГрдд URL рдЦреЛрдЬ рдЗрдВрдЬрди рдХреЛ рднрд╛рд╖рд╛-рд╡рд┐рд╢рд┐рд╖реНрдЯ рдкреГрд╖реНрдареЛрдВ рдХреЛ рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдЗрдВрдбреЗрдХреНрд╕ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛рдУрдВ рдХреЛ рдЙрдирдХреА рдкрд╕рдВрджреАрджрд╛ рднрд╛рд╖рд╛ рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рдкреНрд░рджрд╛рди рдХрд░рддреЗ рд╣реИрдВред
      • рд╕рдВрдЧрддрд┐: рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рд╕реНрдерд╛рдиреАрдпрдХреГрдд рд▓рд┐рдВрдХ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдиреЗрд╡рд┐рдЧреЗрд╢рди рд╡рд░реНрддрдорд╛рди рд▓реЛрдХрд▓ рдХреЗ рднреАрддрд░ рд╣реА рд░рд╣рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЕрдкреНрд░рддреНрдпрд╛рд╢рд┐рдд рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рд╕реЗ рдмрдЪрд╛ рдЬрд╛ рд╕рдХреЗред
      • рд░рдЦрд░рдЦрд╛рд╡ рдХреНрд╖рдорддрд╛: рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рд▓реЙрдЬрд┐рдХ рдХреЛ рдПрдХ рд╣реА рдХрдВрдкреЛрдиреЗрдВрдЯ рдореЗрдВ рдХреЗрдВрджреНрд░реАрдХреГрдд рдХрд░рдиреЗ рд╕реЗ URL рдкреНрд░рдмрдВрдзрди рд╕рд░рд▓ рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдкрдХрд╛ рдХреЛрдбрдмреЗрд╕ рдмрдирд╛рдП рд░рдЦрдирд╛ рдФрд░ рдмрдврд╝рд╛рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЖрдкрдХрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдврд╝рддрд╛ рд╣реИред

      рдиреАрдЪреЗ TypeScript рдореЗрдВ рдПрдХ рд╕реНрдерд╛рдиреАрдпрдХреГрдд Link рдХрдВрдкреЛрдиреЗрдВрдЯ рдХрд╛ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

      src/components/Link.tsx
      "use client";
      
      import { getLocalizedUrl } from "intlayer";
      import NextLink, { type LinkProps as NextLinkProps } from "next/link";
      import { useLocale } from "next-intlayer";
      import type { PropsWithChildren, FC } from "react";
      
      /**
       * рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдлрд╝рдВрдХреНрд╢рди рдпрд╣ рдЬрд╛рдВрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рджрд┐рдпрд╛ рдЧрдпрд╛ URL рдмрд╛рд╣рд░реА рд╣реИ рдпрд╛ рдирд╣реАрдВред
       * рдпрджрд┐ URL http:// рдпрд╛ https:// рд╕реЗ рд╢реБрд░реВ рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдЗрд╕реЗ рдмрд╛рд╣рд░реА рдорд╛рдирд╛ рдЬрд╛рддрд╛ рд╣реИред
       */
      export const checkIsExternalLink = (href?: string): boolean =>
        /^https?:\/\//.test(href ?? "");
      
      /**
       * рдПрдХ рдХрд╕реНрдЯрдо Link рдХреЙрдореНрдкреЛрдиреЗрдВрдЯ рдЬреЛ рд╡рд░реНрддрдорд╛рди рд▓реЛрдХрд▓ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ href рдПрдЯреНрд░рд┐рдмреНрдпреВрдЯ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИред
       * рдЖрдВрддрд░рд┐рдХ рд▓рд┐рдВрдХ рдХреЗ рд▓рд┐рдП, рдпрд╣ `getLocalizedUrl` рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ URL рдХреЗ рдЖрдЧреЗ рд▓реЛрдХрд▓ рдЬреЛрдбрд╝рд╛ рдЬрд╛ рд╕рдХреЗ (рдЬреИрд╕реЗ, /fr/about)ред
       * рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдиреЗрд╡рд┐рдЧреЗрд╢рди рдЙрд╕реА рд▓реЛрдХрд▓ рд╕рдВрджрд░реНрдн рдХреЗ рднреАрддрд░ рд░рд╣реЗред
       */
      export const Link: FC<PropsWithChildren<NextLinkProps>> = ({
        href,
        children,
        ...props
      }) => {
        const { locale } = useLocale();
        const isExternalLink = checkIsExternalLink(href.toString());
      
        // рдпрджрд┐ рд▓рд┐рдВрдХ рдЖрдВрддрд░рд┐рдХ рд╣реИ рдФрд░ рдПрдХ рдорд╛рдиреНрдп href рдкреНрд░рджрд╛рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рддреЛ рд╕реНрдерд╛рдиреАрдпрдХреГрдд URL рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред
        const hrefI18n: NextLinkProps["href"] =
          href && !isExternalLink ? getLocalizedUrl(href.toString(), locale) : href;
      
        return (
          <NextLink href={hrefI18n} {...props}>
            {children}
          </NextLink>
        );
      };
      

      рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

      • рдмрд╛рд╣рд░реА рд▓рд┐рдВрдХ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛:
      • рдмрд╛рд╣рд░реА рд▓рд┐рдВрдХ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛:
        рд╕рд╣рд╛рдпрдХ рдлрд╝рдВрдХреНрд╢рди checkIsExternalLink рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреЛрдИ URL рдмрд╛рд╣рд░реА рд╣реИ рдпрд╛ рдирд╣реАрдВред рдмрд╛рд╣рд░реА рд▓рд┐рдВрдХ рдХреЛ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рдЫреЛрдбрд╝ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдЙрдиреНрд╣реЗрдВ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

      • рд╡рд░реНрддрдорд╛рди рднрд╛рд╖рд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛:
        useLocale рд╣реБрдХ рд╡рд░реНрддрдорд╛рди рднрд╛рд╖рд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ (рдЬреИрд╕реЗ, рдлреНрд░реЗрдВрдЪ рдХреЗ рд▓рд┐рдП fr)ред

      • URL рдХрд╛ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг:
        рдЖрдВрддрд░рд┐рдХ рд▓рд┐рдВрдХ (рдЕрд░реНрдерд╛рддреН рдЧреИрд░-рдмрд╛рд╣рд░реА) рдХреЗ рд▓рд┐рдП, getLocalizedUrl рдХрд╛ рдЙрдкрдпреЛрдЧ рд╡рд░реНрддрдорд╛рди рднрд╛рд╖рд╛ рдХреЗ рд╕рд╛рде URL рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрдкрд╕рд░реНрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдпрджрд┐ рдЖрдкрдХрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдлреНрд░реЗрдВрдЪ рдореЗрдВ рд╣реИ, рддреЛ /about рдХреЛ href рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╛рд╕ рдХрд░рдиреЗ рдкрд░ рдпрд╣ /fr/about рдореЗрдВ рдмрджрд▓ рдЬрд╛рдПрдЧрд╛ред

      • рд▓рд┐рдВрдХ рд▓реМрдЯрд╛рдирд╛:
        рдпрд╣ рдХреЙрдореНрдкреЛрдиреЗрдВрдЯ рд╕реНрдерд╛рдиреАрдпрдХреГрдд URL рдХреЗ рд╕рд╛рде рдПрдХ <a> рддрддреНрд╡ рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдиреЗрд╡рд┐рдЧреЗрд╢рди рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд░реВрдк рд░рд╣рддрд╛ рд╣реИред

      рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЗрд╕ Link рдХрдВрдкреЛрдиреЗрдВрдЯ рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рдХреЗ, рдЖрдк рдПрдХ рд╕реБрд╕рдВрдЧрдд рдФрд░ рднрд╛рд╖рд╛-рд╕рдЪреЗрдд рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрднрд╡ рдмрдирд╛рдП рд░рдЦрддреЗ рд╣реИрдВ, рд╕рд╛рде рд╣реА рдмреЗрд╣рддрд░ SEO рдФрд░ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рд▓рд╛рдн рднреА рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред

    12. рдЕрдкрдиреЗ рдмрдВрдбрд▓ рдЖрдХрд╛рд░ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдВ

      рд╡реИрдХрд▓реНрдкрд┐рдХ

      рдпрджрд┐ рдЖрдкрдХреЛ Server Action рдХреЗ рдЕрдВрджрд░ рд╕рдХреНрд░рд┐рдп locale рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдИрдореЗрд▓ рдХреЛ рд╕реНрдерд╛рдиреАрдпрдХреГрдд рдХрд░рдиреЗ рдпрд╛ locale-aware logic рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП), рддреЛ next-intlayer/server рд╕реЗ getLocale рдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ:

      src/app/actions/getLocale.ts
      "use server";
      
      import { getLocale } from "next-intlayer/server";
      
      export const myServerAction = async () => {
        const locale = await getLocale();
      
        // locale рдХреЗ рд╕рд╛рде рдХреБрдЫ рдХрд░реЗрдВ
      };
      

      getLocale рдлрд╝рдВрдХреНрд╢рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ locale рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ cascading strategy рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИ:

      1. рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ request headers рдореЗрдВ рдПрдХ locale value рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ рдЬреЛ middleware рджреНрд╡рд╛рд░рд╛ рд╕реЗрдЯ рдХреА рдЧрдИ рд╣реЛ рд╕рдХрддреА рд╣реИ
      2. рдпрджрд┐ headers рдореЗрдВ рдХреЛрдИ locale рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рдпрд╣ cookies рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд locale рдХреЛ рдЦреЛрдЬрддрд╛ рд╣реИ
      3. рдпрджрд┐ рдХреЛрдИ cookie рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА browser settings рд╕реЗ рдкрд╕рдВрджреАрджрд╛ рднрд╛рд╖рд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ
      4. рдЕрдВрддрд┐рдо рдЙрдкрд╛рдп рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ application рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП default locale рдкрд░ рд╡рд╛рдкрд╕ рдЖрддрд╛ рд╣реИ

      рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЙрдкрд▓рдмреНрдз context рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд locale рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИред

    13. рдЕрдкрдиреЗ bundle size рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдВ

      рд╡реИрдХрд▓реНрдкрд┐рдХ

      рдЬрдм рдЖрдк next-intlayer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдбрд┐рдХреНрд╢рдирд░реА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╣рд░ рдкреЗрдЬ рдХреЗ рдмрдВрдбрд▓ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреА рд╣реИрдВред рдмрдВрдбрд▓ рдЖрдХрд╛рд░ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Intlayer рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ SWC рдкреНрд▓рдЧрдЗрди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ useIntlayer рдХреЙрд▓реНрд╕ рдХреЛ рдмреБрджреНрдзрд┐рдорд╛рдиреА рд╕реЗ рдмрджрд▓рддрд╛ рд╣реИред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдбрд┐рдХреНрд╢рдирд░реА рдХреЗрд╡рд▓ рдЙрди рдкреЗрдЬреЛрдВ рдХреЗ рдмрдВрдбрд▓ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред

      рдЗрд╕ рдЕрдиреБрдХреВрд▓рди рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, @intlayer/swc рдкреИрдХреЗрдЬ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВред рдПрдХ рдмрд╛рд░ рдЗрдВрд╕реНрдЯреЙрд▓ рд╣реЛ рдЬрд╛рдиреЗ рдкрд░, next-intlayer рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдЧрд╛ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛:

      bash
      npm install @intlayer/swc --save-dev
      
      рдиреЛрдЯ: рдпрд╣ рдЕрдиреБрдХреВрд▓рди рдХреЗрд╡рд▓ Next.js 13 рдФрд░ рдЙрд╕рд╕реЗ рдКрдкрд░ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИред

      рдиреЛрдЯ: рдпрд╣ рдкреИрдХреЗрдЬ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдирд╣реАрдВ рд╣реЛрддрд╛ рдХреНрдпреЛрдВрдХрд┐ SWC рдкреНрд▓рдЧрдЗрдиреНрд╕ рдЕрднреА Next.js рдореЗрдВ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рд╣реИрдВред рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕рдореЗрдВ рдмрджрд▓рд╛рд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

    14. рдиреЛрдЯ: рдпрджрд┐ рдЖрдк рд╡рд┐рдХрд▓реНрдк рдХреЛ importMode: 'dynamic' рдпрд╛ importMode: 'fetch' рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ (dictionary рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ), рддреЛ рдпрд╣ Suspense рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЕрдкрдиреА useIntlayer рдХреЙрд▓реЛрдВ рдХреЛ Suspense boundary рдореЗрдВ рд▓рдкреЗрдЯрдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдк useIntlayer рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реАрдзреЗ рдЕрдкрдиреЗ Page / Layout component рдХреЗ рд╢реАрд░реНрд╖ рд╕реНрддрд░ рдкрд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред </Step>

    TypeScript рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ

    Translation error

    рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреА TypeScript рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдСрдЯреЛ-рдЬреЗрдирд░реЗрдЯреЗрдб рдЯрд╛рдЗрдкреНрд╕ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

    tsconfig.json
    {
      // ... рдЖрдкрдХреЗ рдореМрдЬреВрджрд╛ TypeScript рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди
      "include": [
        // ... рдЖрдкрдХреЗ рдореМрдЬреВрджрд╛ TypeScript рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди
        ".intlayer/**/*.ts", // рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди рдкреНрд░рдХрд╛рд░ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ
      ],
    }
    

    Git рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди

    Intlayer module augmentation рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ TypeScript рдХреЗ рд▓рд╛рднреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдФрд░ рдЖрдкрдХреЗ codebase рдХреЛ рдордЬрдмреВрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред

    Autocompletion

    рдпрд╣ рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ Intlayer рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЗрд╕рд╕реЗ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреА Git рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдХрдорд┐рдЯ рдХрд░рдиреЗ рд╕реЗ рдмрдЪ рд╕рдХрддреЗ рд╣реИрдВред

    рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЕрдкрдиреА .gitignore рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд░реНрджреЗрд╢ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:

    .gitignore
    # Intlayer рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдВ
    .intlayer
    

    VS рдХреЛрдб рдПрдХреНрд╕рдЯреЗрдВрд╢рди

    VS Code рдорд╛рд░реНрдХреЗрдЯрдкреНрд▓реЗрд╕ рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ

    • рдЕрдиреБрд╡рд╛рдж рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдСрдЯреЛрдХрдореНрдкреНрд▓реАрд╢рдиред
    • рдЕрдиреБрд╡рд╛рджреЛрдВ рдХреЗ рд▓рд┐рдП рд░рд┐рдпрд▓-рдЯрд╛рдЗрдо рддреНрд░реБрдЯрд┐ рдкрд╣рдЪрд╛рдиред
    • рдЕрдиреБрд╡рд╛рджрд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рдЗрдирд▓рд╛рдЗрди рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрдиред
    • рддреЗрдЬреА рд╕реЗ рдХреНрд░рд┐рдпрд╛рдПрдВ рдЬреЛ рдЕрдиреБрд╡рд╛рджреЛрдВ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдмрдирд╛рдиреЗ рдФрд░ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреА рд╣реИрдВред

    рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ, рджреЗрдЦреЗрдВ Intlayer VS Code рдПрдХреНрд╕рдЯреЗрдВрд╢рди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ред

    Turbopack рдкрд░ рд╢рдмреНрджрдХреЛрд╢ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░реЗрдВ

    рдЕрдкрдиреЗ Intlayer рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд╛рд╕ рдЕрдиреБрднрд╡ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЖрдзрд┐рдХрд╛рд░рд┐рдХ Intlayer VS Code Extension рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

    рдЬрдм next dev --turbopack рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд╛рд╕ рд╕рд░реНрд╡рд░ рдХреЗ рд░реВрдк рдореЗрдВ Turbopack рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╢рдмреНрджрдХреЛрд╢ рдкрд░рд┐рд╡рд░реНрддрди рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкрддрд╛ рдирд╣реАрдВ рдЪрд▓рддреЗ рд╣реИрдВред

    рдпрд╣ рд╕реАрдорд╛ рдЗрд╕рд▓рд┐рдП рд╣реЛрддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ Turbopack рдЖрдкрдХреА рд╕рд╛рдордЧреНрд░реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ webpack рдкреНрд▓рдЧрдЗрдиреНрд╕ рдирд╣реАрдВ рдЪрд▓рд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╡рд┐рдХрд╛рд╕ рд╕рд░реНрд╡рд░ рдФрд░ Intlayer рдмрд┐рд▓реНрдб рд╡реЙрдЪрд░ рджреЛрдиреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП intlayer watch рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

    package.json
    {
      // ... рдЖрдкрдХреА рдореМрдЬреВрджрд╛ package.json рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди
      "scripts": {
        // ... рдЖрдкрдХреА рдореМрдЬреВрджрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди
        "dev": "intlayer watch --with 'next dev --turbopack'",
      },
    }
    

    рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП, Intlayer VS Code Extension documentation рджреЗрдЦреЗрдВред

    рдЖрдЧреЗ рдмрдврд╝реЗрдВ

    рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╡рд┐рдЬрд╝реБрдЕрд▓ рдПрдбрд┐рдЯрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЕрдкрдиреА рд╕рд╛рдордЧреНрд░реА рдХреЛ CMS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд╛рд╣рд░реА рд░реВрдк рд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред