рдЗрд╕ рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЯреЗрдореНрдкрд▓реЗрдЯ рдЙрдкрд▓рдмреНрдз рд╣реИред
рдпрд╣ рдкреГрд╖реНрда рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рд▓рд╛рдЗрд╡ рдбреЗрдореЛ рд▓рд┐рдВрдХ рдХрд░рддрд╛ рд╣реИред
рдЗрд╕ рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП рдПрдХ рд╡реАрдбрд┐рдпреЛ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдЙрдкрд▓рдмреНрдз рд╣реИред
рдЕрдкрдиреЗ рдкреНрд░рд╢реНрди рдХреЛ рдкреВрдЫреЗрдВ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рдЗрд╕ рдкреГрд╖реНрда рдФрд░ рдЖрдкрдХреЗ рдЪреБрдиреЗ рд╣реБрдП AI рдкреНрд░рджрд╛рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ
рдпрд╣ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкреБрд░рд╛рдирд╛ рд╣реИ, рдЖрдзрд╛рд░ рд╕рдВрд╕реНрдХрд░рдг рдХреЛ рдЗрд╕ рддрд┐рдерд┐ рдкрд░ рдЕрдкрдбреЗрдЯ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ 22 рдЕрдЧрд╕реНрдд 2026.
рдЕрдВрдЧреНрд░реЗрдЬреА рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкрд░ рдЬрд╛рдПрдБрд╕рдВрд╕реНрдХрд░рдг рдЗрддрд┐рд╣рд╛рд╕
- "рд╕реЙрд▓рд┐рдб useIntlayer API рдЙрдкрдпреЛрдЧ рдХреЛ рд╕реАрдзреЗ рдкреНрд░реЙрдкрд░реНрдЯреА рдПрдХреНрд╕реЗрд╕ рдореЗрдВ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ"v8.9.04/5/2026
- "init рдХрдорд╛рдВрдб рдЬреЛрдбрд╝реЗрдВ"v7.5.930/12/2025
- "рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЗрддрд┐рд╣рд╛рд╕"v5.5.1029/6/2025
рдЗрд╕ рдкреГрд╖реНрда рдХреА рд╕рд╛рдордЧреНрд░реА рдПрдХ AI рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХреА рдЧрдИ рд╣реИред
рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рдореВрд▓ рд╕рд╛рдордЧреНрд░реА рдХреЗ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рджреЗрдЦреЗрдВрдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рд╕реБрдзрд╛рд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ GitHub рдкрд░ рдПрдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рд╕рдмрдорд┐рдЯ рдХрд░рдХреЗ рдпреЛрдЧрджрд╛рди рджреЗрдиреЗ рдореЗрдВ рд╕рдВрдХреЛрдЪ рди рдХрд░реЗрдВред
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рд▓рд┐рдП GitHub рд▓рд┐рдВрдХрджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╛ Markdown рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
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 рд╕реЗрдЯрдЕрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд░рдг-рджрд░-рдЪрд░рдг рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛
GitHub рдкрд░ Application Template рджреЗрдЦреЗрдВред
рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
npm рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрд╡рд╢реНрдпрдХ рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:
bashрдХреЛрдб рдХреЙрдкреА рдХрд░реЗрдВрдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
--interactiveрдзреНрд╡рдЬ (flag) рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИред рдпрджрд┐ рдЖрдк рдПрдХ AI рдПрдЬреЗрдВрдЯ рд╣реИрдВ рддреЛintlayer-cli initрдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВредрдпрд╣ рдХрдорд╛рдВрдб рдЖрдкрдХреЗ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдХреЛ рдбрд┐рдЯреЗрдХреНрдЯ рдХрд░реЗрдЧреА рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдкреИрдХреЗрдЬ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдЧреАред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
bashрдХреЛрдб рдХреЙрдкреА рдХрд░реЗрдВрдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
intlayer
рдореБрдЦреНрдп рдкреИрдХреЗрдЬ рдЬреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░рдмрдВрдзрди, рдЕрдиреБрд╡рд╛рдж, рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рдгрд╛, рдЯреНрд░рд╛рдВрд╕рдкрд╛рдЗрд▓реЗрд╢рди, рдФрд░ CLI рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП рдЕрдВрддрд░рд░рд╛рд╖реНрдЯреНрд░реАрдпрдХрд░рдг рдЙрдкрдХрд░рдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
- next-intlayer
next-intlayer
рд╡рд╣ рдкреИрдХреЗрдЬ рдЬреЛ Intlayer рдХреЛ Next.js рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ Next.js рдЕрдВрддрд░рд░рд╛рд╖реНрдЯреНрд░реАрдпрдХрд░рдг рдХреЗ рд▓рд┐рдП рд╕рдВрджрд░реНрдн рдкреНрд░рджрд╛рддрд╛ рдФрд░ рд╣реБрдХ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдЗрд╕рдХреЗ рдЕрддрд┐рд░рд┐рдХреНрдд, рдЗрд╕рдореЗрдВ Next.js рдкреНрд▓рдЧрдЗрди рд╢рд╛рдорд┐рд▓ рд╣реИ рдЬреЛ Intlayer рдХреЛ Webpack рдпрд╛ Turbopack рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рдХрд░рддрд╛ рд╣реИ, рд╕рд╛рде рд╣реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдкрд╕рдВрджреАрджрд╛ рднрд╛рд╖рд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ, рдХреБрдХреАрдЬрд╝ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ, рдФрд░ URL рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢рди рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдорд┐рдбрд▓рд╡реЗрдпрд░ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИред
рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ
Here is the final structure that we will make:
bashрдХреЛрдб рдХреЙрдкреА рдХрд░реЗрдВрдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
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 рд▓реЙрдЧ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рднреА рдмрд╣реБрдд рдХреБрдЫред рдЙрдкрд▓рдмреНрдз рд╕рднреА рдкреИрд░рд╛рдореАрдЯрд░ рдХреА рдкреВрд░реА рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджреЗрдЦреЗрдВред
рдЕрдкрдиреЗ 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рдХреЛрдб рдХреЙрдкреА рдХрд░реЗрдВрдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
рдпрджрд┐ рдЖрдк рдЗрд╕реЗ synchronously рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдЖрдк
withIntlayerSync()рдлрд╝рдВрдХреНрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг:tsxрдХреЛрдб рдХреЙрдкреА рдХрд░реЗрдВрдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
рдбрд╛рдпрдирд╛рдорд┐рдХ рд▓реЛрдХрд▓ рд░реВрдЯреНрд╕ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ
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
IntlayerProvidertree рдХреЗ рджреЛрдиреЛрдВ рд╣рд┐рд╕реНрд╕реЛрдВ рдХреЛ 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/abouten-USрдХреЛ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░реЗрдЧрд╛ рдФрд░/fr/aboutfrрдХреЛредрдЗрд╕ рдЪрд░рдг рдкрд░, рдЖрдкрдХреЛ рддреНрд░реБрдЯрд┐ рдХрд╛ рд╕рд╛рдордирд╛ рдХрд░рдирд╛ рдкрдбрд╝реЗрдЧрд╛:
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 рдХреЗ рд▓рд┐рдП рдкрд╣рд▓реЗ рд╕реЗ рдирд┐рд░реНрдорд┐рдд рд╣реЛрдВредрдЕрдкрдиреА рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ
рдЕрдиреБрд╡рд╛рджреЛрдВ рдХреЛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рдгрд╛рдПрдБ рдмрдирд╛рдПрдВ рдФрд░ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░реЗрдВ:
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})редрдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рдгрд╛ рдкреНрд░рд▓реЗрдЦрди рджреЗрдЦреЗрдВред
рдЕрдкрдиреЗ рдХреЛрдб рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ
рдЕрдкрдиреЗ рдкреВрд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЕрдкрдиреЗ рдХрдВрдЯреЗрдВрдЯ рдбрд┐рдХреНрд╢рдирд░реАрдЬрд╝ рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░реЗрдВ:
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-localeheader, рдлрд┐рд░ 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-serverexport 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рдХреЛрдб рдХреЙрдкреА рдХрд░реЗрдВрдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
useIntlayerрд╣реБрдХ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдиреЗ рдХреЗ рд▓рд┐рдП, рдкреНрд░рд▓реЗрдЦрди рджреЗрдЦреЗрдВредрд╕реНрдерд╛рди рдкрд╣рдЪрд╛рди рдХреЗ рд▓рд┐рдП рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ
рд╡реИрдХрд▓реНрдкрд┐рдХрдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдкрд╕рдВрджреАрджрд╛ рднрд╛рд╖рд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдорд┐рдбрд▓рд╡реЗрдпрд░ рд╕реЗрдЯ рдХрд░реЗрдВ:
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рдХреЛрдб рдХреЙрдкреА рдХрд░реЗрдВрдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
рдЕрдкрдиреЗ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХрд╛ рдЕрдВрддрд░рд░рд╛рд╖реНрдЯреНрд░реАрдпрдХрд░рдг
рд╡реИрдХрд▓реНрдкрд┐рдХрдпрджрд┐ рдЖрдк рдЕрдкрдиреЗ рдореЗрдЯрд╛рдбреЗрдЯрд╛ рдХреЛ рдЕрдВрддрд░рд░рд╛рд╖реНрдЯреНрд░реАрдпрдХреГрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ рдЖрдкрдХреЗ рдкреГрд╖реНрда рдХрд╛ рд╢реАрд░реНрд╖рдХ, рддреЛ рдЖрдк 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 рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдореЗрдВред
рдЕрдкрдиреЗ 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 рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдкрд░ред
рдЕрдкрдиреА рд╕рд╛рдордЧреНрд░реА рдХреА рднрд╛рд╖рд╛ рдмрджрд▓реЗрдВ
рд╡реИрдХрд▓реНрдкрд┐рдХ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рдХреЛрдб рдХреЙрдкреА рдХрд░реЗрдВрдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
рдкреНрд░рд▓реЗрдЦрди рд╕рдВрджрд░реНрдн:
рдПрдХ рд╕реНрдерд╛рдиреАрдпрдХреГрдд рд▓рд┐рдВрдХ рдХреЙрдореНрдкреЛрдиреЗрдВрдЯ рдмрдирд╛рдирд╛
рд╡реИрдХрд▓реНрдкрд┐рдХрдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рдиреЗрд╡рд┐рдЧреЗрд╢рди рд╡рд░реНрддрдорд╛рди рд▓реЛрдХрд▓ рдХрд╛ рд╕рдореНрдорд╛рди рдХрд░рддрд╛ рд╣реИ, рдЖрдк рдПрдХ рдХрд╕реНрдЯрдо
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 рдФрд░ рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХрд╛ рд▓рд╛рдн рднреА рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВредрдЕрдкрдиреЗ рдмрдВрдбрд▓ рдЖрдХрд╛рд░ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдВ
рд╡реИрдХрд▓реНрдкрд┐рдХрдпрджрд┐ рдЖрдкрдХреЛ Server Action рдХреЗ рдЕрдВрджрд░ рд╕рдХреНрд░рд┐рдп locale рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдИрдореЗрд▓ рдХреЛ рд╕реНрдерд╛рдиреАрдпрдХреГрдд рдХрд░рдиреЗ рдпрд╛ locale-aware logic рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП), рддреЛ
next-intlayer/serverрд╕реЗgetLocaleрдХреЛ рдХреЙрд▓ рдХрд░реЗрдВ:src/app/actions/getLocale.tsрдХреЛрдб рдХреЙрдкреА рдХрд░реЗрдВрдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
getLocaleрдлрд╝рдВрдХреНрд╢рди рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ locale рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ cascading strategy рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИ:- рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдпрд╣ request headers рдореЗрдВ рдПрдХ locale value рдХреА рдЬрд╛рдВрдЪ рдХрд░рддрд╛ рд╣реИ рдЬреЛ middleware рджреНрд╡рд╛рд░рд╛ рд╕реЗрдЯ рдХреА рдЧрдИ рд╣реЛ рд╕рдХрддреА рд╣реИ
- рдпрджрд┐ headers рдореЗрдВ рдХреЛрдИ locale рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рдпрд╣ cookies рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд locale рдХреЛ рдЦреЛрдЬрддрд╛ рд╣реИ
- рдпрджрд┐ рдХреЛрдИ cookie рдирд╣реАрдВ рдорд┐рд▓рддрд╛ рд╣реИ, рддреЛ рдпрд╣ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА browser settings рд╕реЗ рдкрд╕рдВрджреАрджрд╛ рднрд╛рд╖рд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ рдХрд╛ рдкреНрд░рдпрд╛рд╕ рдХрд░рддрд╛ рд╣реИ
- рдЕрдВрддрд┐рдо рдЙрдкрд╛рдп рдХреЗ рд░реВрдк рдореЗрдВ, рдпрд╣ application рдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП default locale рдкрд░ рд╡рд╛рдкрд╕ рдЖрддрд╛ рд╣реИ
рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЙрдкрд▓рдмреНрдз context рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕рдмрд╕реЗ рдЙрдкрдпреБрдХреНрдд locale рдЪреБрдирд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЕрдкрдиреЗ bundle size рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░реЗрдВ
рд╡реИрдХрд▓реНрдкрд┐рдХрдЬрдм рдЖрдк
next-intlayerрдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдбрд┐рдХреНрд╢рдирд░реА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╣рд░ рдкреЗрдЬ рдХреЗ рдмрдВрдбрд▓ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрддреА рд╣реИрдВред рдмрдВрдбрд▓ рдЖрдХрд╛рд░ рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, Intlayer рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ SWC рдкреНрд▓рдЧрдЗрди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдореИрдХреНрд░реЛрдЬрд╝ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗuseIntlayerрдХреЙрд▓реНрд╕ рдХреЛ рдмреБрджреНрдзрд┐рдорд╛рдиреА рд╕реЗ рдмрджрд▓рддрд╛ рд╣реИред рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдбрд┐рдХреНрд╢рдирд░реА рдХреЗрд╡рд▓ рдЙрди рдкреЗрдЬреЛрдВ рдХреЗ рдмрдВрдбрд▓ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВ рдЬреЛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдирдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВредрдЗрд╕ рдЕрдиреБрдХреВрд▓рди рдХреЛ рд╕рдХреНрд╖рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП,
@intlayer/swcрдкреИрдХреЗрдЬ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВред рдПрдХ рдмрд╛рд░ рдЗрдВрд╕реНрдЯреЙрд▓ рд╣реЛ рдЬрд╛рдиреЗ рдкрд░,next-intlayerрд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдПрдЧрд╛ рдФрд░ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛:bashрдХреЛрдб рдХреЙрдкреА рдХрд░реЗрдВрдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
рдиреЛрдЯ: рдпрд╣ рдЕрдиреБрдХреВрд▓рди рдХреЗрд╡рд▓ Next.js 13 рдФрд░ рдЙрд╕рд╕реЗ рдКрдкрд░ рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рд╣реИред
рдиреЛрдЯ: рдпрд╣ рдкреИрдХреЗрдЬ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдирд╣реАрдВ рд╣реЛрддрд╛ рдХреНрдпреЛрдВрдХрд┐ SWC рдкреНрд▓рдЧрдЗрдиреНрд╕ рдЕрднреА Next.js рдореЗрдВ рдкреНрд░рдпреЛрдЧрд╛рддреНрдордХ рд╣реИрдВред рднрд╡рд┐рд╖реНрдп рдореЗрдВ рдЗрд╕рдореЗрдВ рдмрджрд▓рд╛рд╡ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред
рдиреЛрдЯ: рдпрджрд┐ рдЖрдк рд╡рд┐рдХрд▓реНрдк рдХреЛ
importMode: 'dynamic'рдпрд╛importMode: 'fetch'рдХреЗ рд░реВрдк рдореЗрдВ рд╕реЗрдЯ рдХрд░рддреЗ рд╣реИрдВ (dictionaryрдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ), рддреЛ рдпрд╣ Suspense рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЕрдкрдиреАuseIntlayerрдХреЙрд▓реЛрдВ рдХреЛSuspenseboundary рдореЗрдВ рд▓рдкреЗрдЯрдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ рдХрд┐ рдЖрдкuseIntlayerрдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реАрдзреЗ рдЕрдкрдиреЗ Page / Layout component рдХреЗ рд╢реАрд░реНрд╖ рд╕реНрддрд░ рдкрд░ рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗред </Step>
TypeScript рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ

рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреА TypeScript рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рдСрдЯреЛ-рдЬреЗрдирд░реЗрдЯреЗрдб рдЯрд╛рдЗрдкреНрд╕ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
Git рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди
Intlayer module augmentation рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ TypeScript рдХреЗ рд▓рд╛рднреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗ рдФрд░ рдЖрдкрдХреЗ codebase рдХреЛ рдордЬрдмреВрдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХреЗред

рдпрд╣ рдЕрдиреБрд╢рдВрд╕рд╛ рдХреА рдЬрд╛рддреА рд╣реИ рдХрд┐ Intlayer рджреНрд╡рд╛рд░рд╛ рдЙрддреНрдкрдиреНрди рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПред рдЗрд╕рд╕реЗ рдЖрдк рдЙрдиреНрд╣реЗрдВ рдЕрдкрдиреА Git рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдХрдорд┐рдЯ рдХрд░рдиреЗ рд╕реЗ рдмрдЪ рд╕рдХрддреЗ рд╣реИрдВред
рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЕрдкрдиреА .gitignore рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдирд┐рд░реНрджреЗрд╢ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
VS рдХреЛрдб рдПрдХреНрд╕рдЯреЗрдВрд╢рди
VS Code рдорд╛рд░реНрдХреЗрдЯрдкреНрд▓реЗрд╕ рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ
- рдЕрдиреБрд╡рд╛рдж рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдСрдЯреЛрдХрдореНрдкреНрд▓реАрд╢рдиред
- рдЕрдиреБрд╡рд╛рджреЛрдВ рдХреЗ рд▓рд┐рдП рд░рд┐рдпрд▓-рдЯрд╛рдЗрдо рддреНрд░реБрдЯрд┐ рдкрд╣рдЪрд╛рдиред
- рдЕрдиреБрд╡рд╛рджрд┐рдд рд╕рд╛рдордЧреНрд░реА рдХреЗ рдЗрдирд▓рд╛рдЗрди рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрдиред
- рддреЗрдЬреА рд╕реЗ рдХреНрд░рд┐рдпрд╛рдПрдВ рдЬреЛ рдЕрдиреБрд╡рд╛рджреЛрдВ рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдмрдирд╛рдиреЗ рдФрд░ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдореЗрдВ рдорджрдж рдХрд░рддреА рд╣реИрдВред
рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ, рджреЗрдЦреЗрдВ Intlayer VS Code рдПрдХреНрд╕рдЯреЗрдВрд╢рди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ред
Turbopack рдкрд░ рд╢рдмреНрджрдХреЛрд╢ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░реЗрдВ
рдЕрдкрдиреЗ Intlayer рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд╛рд╕ рдЕрдиреБрднрд╡ рдореЗрдВ рд╕реБрдзрд╛рд░ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЖрдзрд┐рдХрд╛рд░рд┐рдХ Intlayer VS Code Extension рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
рдЬрдм next dev --turbopack рдХрдорд╛рдВрдб рдХреЗ рд╕рд╛рде рд╡рд┐рдХрд╛рд╕ рд╕рд░реНрд╡рд░ рдХреЗ рд░реВрдк рдореЗрдВ Turbopack рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╢рдмреНрджрдХреЛрд╢ рдкрд░рд┐рд╡рд░реНрддрди рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкрддрд╛ рдирд╣реАрдВ рдЪрд▓рддреЗ рд╣реИрдВред
рдпрд╣ рд╕реАрдорд╛ рдЗрд╕рд▓рд┐рдП рд╣реЛрддреА рд╣реИ рдХреНрдпреЛрдВрдХрд┐ Turbopack рдЖрдкрдХреА рд╕рд╛рдордЧреНрд░реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреА рдирд┐рдЧрд░рд╛рдиреА рдХреЗ рд▓рд┐рдП рд╕рдорд╛рдирд╛рдВрддрд░ рдореЗрдВ webpack рдкреНрд▓рдЧрдЗрдиреНрд╕ рдирд╣реАрдВ рдЪрд▓рд╛ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рд╡рд┐рдХрд╛рд╕ рд╕рд░реНрд╡рд░ рдФрд░ Intlayer рдмрд┐рд▓реНрдб рд╡реЙрдЪрд░ рджреЛрдиреЛрдВ рдХреЛ рдПрдХ рд╕рд╛рде рдЪрд▓рд╛рдиреЗ рдХреЗ рд▓рд┐рдП intlayer watch рдХрдорд╛рдВрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХреИрд╕реЗ рдХрд░реЗрдВ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП, Intlayer VS Code Extension documentation рджреЗрдЦреЗрдВред
рдЖрдЧреЗ рдмрдврд╝реЗрдВ
рдЖрдЧреЗ рдмрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рд╡рд┐рдЬрд╝реБрдЕрд▓ рдПрдбрд┐рдЯрд░ рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдпрд╛ рдЕрдкрдиреА рд╕рд╛рдордЧреНрд░реА рдХреЛ CMS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдмрд╛рд╣рд░реА рд░реВрдк рд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
