Author:
    Creation:2026-09-13Last update:2026-09-27

    next-intl рдмрдирд╛рдо Intlayer: React рдФрд░ Next.js рдЕрдВрддрд░реНрд░рд╛рд╖реНрдЯреНрд░реАрдпрдХрд░рдг (i18n) рдмреЗрдВрдЪрдорд╛рд░реНрдХ

    next-intl VS Intlayer

    next-intl Next.js рдХреЗ рд▓рд┐рдП рд╕рдмрд╕реЗ рд▓реЛрдХрдкреНрд░рд┐рдп i18n рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИред Intlayer рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░-рдЖрдзрд╛рд░рд┐рдд, рдШрдЯрдХ-рдХреНрд╖реЗрддреНрд░реАрдп рд╡рд┐рдХрд▓реНрдк рд╣реИред рджреЛрдиреЛрдВ App Router рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХрд╛ рд╕реНрдерд╛рдиреАрдпрдХрд░рдг рдХрд░рддреЗ рд╣реИрдВред рд╕рд╡рд╛рд▓ рдпрд╣ рд╣реИ рдХрд┐ рдРрдк рдмрдирдиреЗ рдХреЗ рдмрд╛рдж рдкреНрд░рддреНрдпреЗрдХ рдХреА рд▓рд╛рдЧрдд рдХреНрдпрд╛ рд╣реИред

    рдпрд╣ рд▓реЗрдЦ рдХреЛрдИ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдирд╣реАрдВ рд╣реИред рдпрд╣ Benchmark Bloom рдХреЗ рдЖрдВрдХрдбрд╝реЛрдВ рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд рдПрдХ рддреБрд▓рдирд╛ рд╣реИ, рдЬреЛ рдПрдХ рдУрдкрди-рд╕реЛрд░реНрд╕ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд╕реВрдЯ рд╣реИ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рд╛рде рдПрдХ рд╣реА рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдорд╛рдкрддрд╛ рд╣реИ рдХрд┐ рдмреНрд░рд╛рдЙрдЬрд╝рд░ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХреНрдпрд╛ рдбрд╛рдЙрдирд▓реЛрдб рдФрд░ рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддрд╛ рд╣реИред

    рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ (tl;dr): next-intl рдХреЗрд╡рд▓ рдЕрдкрдиреЗ рд░рдирдЯрд╛рдЗрдо рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпреЗрдХ рдкреЗрдЬ рдкрд░ +12.6 KB gzip рдЬреЛрдбрд╝рддрд╛ рд╣реИ, рдФрд░ рдЕрдкрдиреЗ рд╕рд╛рдорд╛рдиреНрдп рд╕реЗрдЯрдЕрдк (static рдФрд░ dynamic) рдореЗрдВ ~90% рдЕрдиреНрдп рдкреЗрдЬреЛрдВ рдХреА рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рд▓реАрдХ рдХрд░рддрд╛ рд╣реИред рдЙрд╕ рд▓реАрдХреЗрдЬ рдХреЛ рд╣рдЯрд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрдЯрд▓реЙрдЧ рдХреЛ рдиреЗрдорд╕реНрдкреЗрд╕ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдирд╛ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдкреЗрдЬ рдХреЗ рд▓рд┐рдП рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЪреБрдирдирд╛ рдкрдбрд╝рддрд╛ рд╣реИ, рдЬреЛ рдПрдХ рдХрдард┐рди рдХрд╛рдо рд╣реИред рдЗрд╕рдХреЗ рд╡рд┐рдкрд░реАрдд, Intlayer рдХрд╛ рдХрдВрдкрд╛рдЗрд▓рд░ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ 0% рд▓реАрдХреЗрдЬ, 3 рдЧреБрдирд╛ рдЫреЛрдЯреЗ рдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕, рдФрд░ рдмреЗрд╕ рдРрдк рд╕реЗ рдХреЗрд╡рд▓ +0.3 KB рдЕрдзрд┐рдХ рд╕рд╛рдЗрдЬрд╝ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИред

    рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ

    • next-intl - Next.js рд╕рдореБрджрд╛рдп рдХрд╛ рдорд╛рдирдХред рдкреНрд░рддрд┐ рднрд╛рд╖рд╛ рдХреЗрдВрджреНрд░реАрдХреГрдд JSON рдбрд┐рдХреНрд╢рдирд░реА, рдкреВрд░реНрдг ICU MessageFormat рд╕рдорд░реНрдерди, рдФрд░ Next.js рдЕрдиреБрд░реЛрдз рд╣реИрдВрдбрд▓рд┐рдВрдЧ рдФрд░ рд░рд╛рдЙрдЯрд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЧрд╣рд░рд╛ рдПрдХреАрдХрд░рдгред
    • Intlayer - рдХрдВрдкреЛрдиреЗрдВрдЯ-рдХреЗрдВрджреНрд░рд┐рдд рдХрдВрдЯреЗрдВрдЯ рдореЙрдбрд▓ред .content.ts рдлрд╛рдЗрд▓реЗрдВ рдЕрдкрдиреЗ рдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕ рдХреЗ рдмрдЧрд▓ рдореЗрдВ рдмреИрдарддреА рд╣реИрдВ, рдмрд┐рд▓реНрдб-рдЯрд╛рдЗрдо рдХрдВрдкрд╛рдЗрд▓рд░ рдЙрдиреНрд╣реЗрдВ рдкреНрд░рддрд┐ рдХрдВрдкреЛрдиреЗрдВрдЯ рдФрд░ рдкреНрд░рддрд┐ рд▓реЛрдХреЗрд▓ рдЯреНрд░реА-рд╢реЗрдХ рдФрд░ рд▓реЗрдЬрд╝реА-рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ, рдФрд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рд╕рдЦреНрдд TypeScript рдкреНрд░рдХрд╛рд░ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред
    рд▓рд╛рдЗрдмреНрд░реЗрд░реАGitHub рд╕реНрдЯрд╛рд░реНрд╕рдХреБрд▓ рдХрдорд┐рдЯреНрд╕рдЕрдВрддрд┐рдо рдХрдорд┐рдЯрдкрд╣рд▓рд╛ рд╕рдВрд╕реНрдХрд░рдгNPM рд╕рдВрд╕реНрдХрд░рдгNPM рдбрд╛рдЙрдирд▓реЛрдбреНрд╕
    aymericzip/intlayerGitHub Repo starsGitHub commit activityLast CommitрдЕрдкреНрд░реИрд▓ 2024npmnpm downloads
    amannn/next-intlGitHub Repo starsGitHub commit activityLast Commitрдорд╛рд░реНрдЪ 2021npmnpm downloads
    рдмреИрдЬ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЕрдкрдбреЗрдЯ рд╣реЛрддреЗ рд╣реИрдВред

    рдЖрдордиреЗ-рд╕рд╛рдордиреЗ рд╕реБрд╡рд┐рдзрд╛ рддреБрд▓рдирд╛

    рд╕реБрд╡рд┐рдзрд╛Intlayer (react-intlayer / next-intlayer)next-intl (next-intl / use-intl)
    рдХрдВрдкреЛрдиреЗрдВрдЯ рдХреЗ рдкрд╛рд╕ рдЕрдиреБрд╡рд╛рджтЬЕ рд╣рд╛рдБ, рдкреНрд░рддреНрдпреЗрдХ рдХрдВрдкреЛрдиреЗрдВрдЯ рдХреЗ рдмрдЧрд▓ рдореЗрдВ .content.ts рдореМрдЬреВрджтЭМ messages/ рдореЗрдВ рдХреЗрдВрджреНрд░реАрдХреГрдд JSON рдбрд┐рдХреНрд╢рдирд░реА
    TypeScript рдПрдХреАрдХрд░рдгтЬЕ рдХрдВрдЯреЗрдВрдЯ рд╕реЗ рдСрдЯреЛ-рдЬрдирд░реЗрдЯреЗрдб рд╕рдЦреНрдд рдкреНрд░рдХрд╛рд░тЪая╕П рд╕рдВрджреЗрд╢ рдкрдереЛрдВ рдХреЗ рд▓рд┐рдП рдореИрдиреНрдпреБрдЕрд▓ global.d.ts рд╕реЗрдЯрдЕрдк рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдорд░реНрдерд┐рдд
    рдЧрд╛рдпрдм рдЕрдиреБрд╡рд╛рджреЛрдВ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдирд╛тЬЕ TypeScript рдПрд░рд░ + рдмрд┐рд▓реНрдб-рдЯрд╛рдЗрдо рдПрд░рд░/рдЪреЗрддрд╛рд╡рдиреАтЪая╕П рд░рдирдЯрд╛рдЗрдо рдЧрд╛рдпрдм рдХреБрдВрдЬреА рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдпрд╛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рддреНрд░реБрдЯрд┐ рдлреЗрдВрдХрддрд╛ рд╣реИ
    рд░рд┐рдЪ рдХрдВрдЯреЗрдВрдЯ (JSX / Markdown / рдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕)тЬЕ рд╕реАрдзрд╛ рд╕рдорд░реНрдердитЪая╕П рдореИрдкрд┐рдВрдЧ рдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕ рдХреЗ рд╕рд╛рде t.rich() рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ
    ICU рд╕рдорд░реНрдердитЪая╕П рдХрд╛рд░реНрдп рдкреНрд░рдЧрддрд┐ рдкрд░тЬЕ рд╣рд╛рдБ, рдкреВрд░реНрдг ICU рд╕рдорд░реНрдерди
    рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╕рд░реНрд╡рд░ рдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕тЬЕ next-intlayer/server рд╕реЗ useIntlayer рдХрд┐рд╕реА рднреА рдЪрд╛рдЗрд▓реНрдб рд╕рд░реНрд╡рд░ рдХрдВрдкреЛрдиреЗрдВрдЯ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИтЭМ рдПрд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╕рд░реНрд╡рд░ рдкреИрд░реЗрдВрдЯ рд╕реЗ рдкреНрд░реЙрдкреНрд╕ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЕрдиреБрд╡рд╛рдж рдкрд╛рд╕ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ
    рдЯреНрд░реА-рд╢реЗрдХрд┐рдВрдЧ (Tree-shaking)тЬЕ рдХрдВрдкрд╛рдЗрд▓рд░ рджреНрд╡рд╛рд░рд╛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд (рдкреНрд░рддрд┐ рдХрдВрдкреЛрдиреЗрдВрдЯ, рдкреНрд░рддрд┐ рд▓реЛрдХреЗрд▓)тЪая╕П рдиреЗрдорд╕реНрдкреЗрд╕ рдХреЛ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдФрд░ pick() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ
    рд▓реЗрдЬрд╝реА рд▓реЛрдбрд┐рдВрдЧ (Lazy loading)тЬЕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдХреА рдПрдХ рдкрдВрдХреНрддрд┐ (importMode: 'dynamic')тЪая╕П getRequestConfig рдореЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рдбрд╛рдпрдиреЗрдорд┐рдХ рдЗрдореНрдкреЛрд░реНрдЯ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ
    рд╡рд┐рдЬреБрдЕрд▓ рдПрдбрд┐рдЯрд░ / CMSтЬЕ рдирд┐рдГрд╢реБрд▓реНрдХ рд╡рд┐рдЬреБрдЕрд▓ рдПрдбрд┐рдЯрд░ + рд╡реИрдХрд▓реНрдкрд┐рдХ CMSтЭМ рдирд╣реАрдВ
    AI-рд╕рдВрдЪрд╛рд▓рд┐рдд рдЕрдиреБрд╡рд╛рджтЬЕ рдмрд┐рд▓реНрдЯ-рдЗрди, рдЖрдкрдХреА рдЕрдкрдиреА рдкреНрд░рджрд╛рддрд╛ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИтЭМ рдирд╣реАрдВ
    MCP рд╕рд░реНрд╡рд░ рдФрд░ рдПрдЬреЗрдВрдЯ рд╕реНрдХрд┐рд▓реНрд╕тЬЕ рд╣рд╛рдБтЭМ рдирд╣реАрдВ

    рдмреЗрдВрдЪрдорд╛рд░реНрдХ

    рдХреНрдпрд╛ рдорд╛рдкрд╛ рдЧрдпрд╛ рдерд╛

    Benchmark Bloom рдЯреЗрд╕реНрдЯ рд╕реБрдЗрдЯ рдкреНрд░рддреНрдпреЗрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рд╕рд╛рде рд╕рдорд╛рди рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрдирд╛рддрд╛ рд╣реИ: 10 рдкреЗрдЬ (home, about, blog, careers, contact, FAQ, pricing, products, settings, team), 10 рд▓реЛрдХреЗрд▓ (en, fr, es, de, it, pt, zh, ja, ko, ru), рд╕рдорд╛рди рдХрдВрдкреЛрдиреЗрдВрдЯ рдФрд░ рд╕рдорд╛рди рдХрдВрдЯреЗрдВрдЯред рдкреЗрдЬреЛрдВ рдХреЛ en рдФрд░ fr рдореЗрдВ рдорд╛рдкрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рдЪрд╛рд░ рд▓реЛрдбрд┐рдВрдЧ рд░рдгрдиреАрддрд┐рдпреЛрдВ рддрдХ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

    рд░рдгрдиреАрддрд┐рд╡рд┐рд╡рд░рдгрдпрд╣ рдХреМрди рдХрд░рддрд╛ рд╣реИ
    staticрдкреНрд░рддреНрдпреЗрдХ рд▓реЛрдХреЗрд▓ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдкреЗрдЬ рдХреЛ рдПрдХ рд╕рд╛рде рдмрдВрдбрд▓ рдХрд░рдХреЗ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИрддреНрд╡рд░рд┐рдд рдкреНрд░реЛрдЯреЛрдЯрд╛рдЗрдк, AI-рдЬрдирд░реЗрдЯреЗрдб рдХреЛрдб
    dynamicрдХреЗрд╡рд▓ рд╕рдХреНрд░рд┐рдп рд▓реЛрдХреЗрд▓ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рд╕рднреА рдкреЗрдЬ рдПрдХ рд╕рд╛рдердЕрдзрд┐рдХрд╛рдВрд╢ рдкреНрд░реЛрдЬреЗрдХреНрдЯреНрд╕
    scoped-staticрдкреНрд░рддрд┐ рд░реВрдЯ рдиреЗрдорд╕реНрдкреЗрд╕, рдХреЛрдИ рд▓реЗрдЬрд╝реА рд▓реЛрдбрд┐рдВрдЧ рдирд╣реАрдВрджреБрд░реНрд▓рдн
    scoped-dynamicрдкреНрд░рддрд┐ рд░реВрдЯ рдиреЗрдорд╕реНрдкреЗрд╕ + рд▓реЗрдЬрд╝реА рд▓реЛрдбрд┐рдВрдЧред рдХреЗрд╡рд▓ рд╡рд░реНрддрдорд╛рди рдкреЗрдЬ рдФрд░ рд╡рд░реНрддрдорд╛рди рд▓реЛрдХреЗрд▓ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИрд╕рдЦреНрдд рдкреНрд░рджрд░реНрд╢рди рдмрдЬрдЯ рд╡рд╛рд▓реЗ рдРрдкреНрд╕

    Intlayer рдореЗрдВ рдХреЛрдИ "scoped" рд╕рдВрд╕реНрдХрд░рдг рдирд╣реАрдВ рд╣реИ: рдХрдВрдкрд╛рдЗрд▓рд░ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдкреНрд░рддрд┐ рдХрдВрдкреЛрдиреЗрдВрдЯ рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕реНрдХреЛрдк рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЗрд╕рдХреА static рдФрд░ dynamic рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдХреЛрдкреНрдб рд╣реИрдВред

    рдкреНрд░рддреНрдпреЗрдХ рдмрд┐рд▓реНрдб рдХреЗ рд▓рд┐рдП, рд╕реБрдЗрдЯ рд░рд┐рдХреЙрд░реНрдб рдХрд░рддрд╛ рд╣реИ:

    • Lib size: рдХреЗрд╡рд▓ i18n рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЗрдореНрдкреЛрд░реНрдЯ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдЦрд╛рд▓реА рдХрдВрдкреЛрдиреЗрдВрдЯ рдХрд╛ gzip рдЖрдХрд╛рд░ред
    • Page JS: рдкреНрд░рддрд┐ рдкреЗрдЬ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ gzip рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯред
    • Locale leak %: рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдЧрдП JS рдореЗрдВ рдкрд╛рдП рдЧрдП рдЕрдиреВрджрд┐рдд рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдЬреЛ рдЙрд╕ рд▓реЛрдХреЗрд▓ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ рдЬрд┐рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╣реАрдВ рджреЗрдЦ рд░рд╣рд╛ рд╣реИред
    • Page leak %: рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдЧрдП JS рдореЗрдВ рдкрд╛рдП рдЧрдП рдЕрдиреВрджрд┐рдд рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рдЬреЛ рдЙрд╕ рдкреЗрдЬ рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИрдВ рдЬрд┐рд╕ рдкрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдирд╣реАрдВ рд╣реИред
    • Component avg: рдЕрд▓рдЧ рд╕реЗ рдХрдВрдкрд╛рдЗрд▓ рдХрд┐рдП рдЧрдП рдкреНрд░рддреНрдпреЗрдХ рдХрдВрдкреЛрдиреЗрдВрдЯ рдХрд╛ рдФрд╕рдд gzip рдЖрдХрд╛рд░ред
    • E2E reactivity: рдирдпрд╛ рд▓реЛрдХреЗрд▓ рдЪреБрдирдиреЗ рдФрд░ DOM рдореЗрдВ html[lang] рдЕрдкрдбреЗрдЯ рд╣реЛрдиреЗ рдХреЗ рдмреАрдЪ рдХрд╛ рд╕рдордпред
    • Hydration: React рд╣рд╛рдЗрдбреНрд░реЗрд╢рди рдЪрд░рдг рдХреА рдЕрд╡рдзрд┐ред
    рдиреАрдЪреЗ рджрд┐рдП рдЧрдП рдЖрдВрдХрдбрд╝реЗ 2026-09-12 рдХреЗ рд░рди рд╕реЗ рд╣реИрдВ, рдЬрд┐рд╕рдореЗрдВ next-intl 4.14.2 рдФрд░ intlayer 9.5.1 рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

    Next.js (App Router) рдкрд░ рдкрд░рд┐рдгрд╛рдо

    рдЕрдкрдиреА рдкрд╕рдВрдж рдХреЗ рдореЗрдЯреНрд░рд┐рдХреНрд╕ рдФрд░ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЪреБрдиреЗрдВ:

    рдореАрдЯреНрд░рд┐рдХ

    рдбрд╛рдпрдирд╛рдорд┐рдХ JSON рд▓реЛрдбрд┐рдВрдЧ

    рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЖрд▓рд╕реНрдп рд╕реЗ рдЕрдиреБрд╡рд╛рдж рд▓реЛрдб рдХрд░рддрд╛ рд╣реИ

    рд╕реНрдХреЛрдкреНрдб JSON (рдиреЗрдорд╕реНрдкреЗрд╕рд┐рдВрдЧ)

    рдкреНрд░рддрд┐-рдкреГрд╖реНрда рдЕрдиреБрд╡рд╛рдж рдиреЗрдорд╕реНрдкреЗрд╕

    рдпрд╣ рдореАрдЯреНрд░рд┐рдХ рдХреНрдпрд╛ рд╣реИ?

    рдЕрдВрддрд░реНрд░рд╛рд╖реНрдЯреНрд░реАрдпрдХрд░рдг рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдмрдВрдбрд▓ рдХрд╛ рдХреБрд▓ gzip-рд╕рдВрдкреАрдбрд╝рд┐рдд рдЖрдХрд╛рд░ред рдЗрд╕рдореЗрдВ рдХреЗрд╡рд▓ рдЯреНрд░реА-рд╢реЗрдХрд┐рдВрдЧ рдФрд░ рдорд┐рдирд┐рдлрд┐рдХреЗрд╢рди рдХреЗ рдмрд╛рдж рдкреНрд░рджрд╛рддрд╛ рдФрд░ рд╕рд╛рдордЧреНрд░реА рдкреБрдирд░реНрдкреНрд░рд╛рдкреНрддрд┐ рддрд░реНрдХ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

    рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдХреНрдпреЛрдВ рд╣реИ?

    рдПрдХ рдЫреЛрдЯрд╛ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЖрдХрд╛рд░ рдкреНрд░рд╛рд░рдВрднрд┐рдХ рдЬрд╛рд╡рд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреЗрд▓реЛрдб рдХреЛ рдХрдо рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рддреЗрдЬрд╝ рдбрд╛рдЙрдирд▓реЛрдб рдФрд░ рдирд┐рд╖реНрдкрд╛рджрди рд╕рдордп рд╣реЛрддрд╛ рд╣реИред

    рджреЗрдЦрдиреЗ рдХрд╛ рддрд░реАрдХрд╛

    рд▓рд╛рдЗрдмреНрд░реЗрд░реАрд░рдгрдиреАрддрд┐рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕рд╛рдЗрдЬрд╝ (gz)рдкреЗрдЬ JS рдФрд╕рдд (gz)рд▓реЛрдХреЗрд▓ рд▓реАрдХрдкреЗрдЬ рд▓реАрдХрдХрдВрдкреЛрдиреЗрдВрдЯ рдФрд╕рдд (gz)E2E рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛рд╣рд╛рдЗрдбреНрд░реЗрд╢рди
    base (рдмрд┐рдирд╛ i18n)-0.0 KB141.0 KB0.0%0.0%0.9 KB13.4 ms11.8 ms
    next-intlstatic14.7 KB153.6 KB4.2%89.8%21.8 KB16.0 ms14.7 ms
    next-intldynamic14.7 KB153.6 KB9.7%89.9%21.8 KB15.6 ms14.8 ms
    next-intlscoped-static14.7 KB153.6 KB0.0%0.0%80.1 KB17.9 ms17.4 ms
    next-intlscoped-dynamic14.7 KB153.6 KB0.0%0.0%22.9 KB17.8 ms16.8 ms
    next-intlayerstatic5.5 KB141.3 KB0.0%0.0%8.5 KB15.5 ms16.9 ms
    next-intlayerdynamic5.5 KB141.3 KB0.0%0.0%6.9 KB15.3 ms15.9 ms
    @intlayer/next-intl (рд╕рдВрдЧрддрддрд╛)static8.0 KB147.5 KB0.0%0.0%8.1 KB14.5 ms12.8 ms
    @intlayer/next-intl (рд╕рдВрдЧрддрддрд╛)dynamic8.0 KB148.7 KB0.0%0.0%8.1 KB11.7 ms12.8 ms

    рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдХреИрд╕реЗ рд╕рдордЭреЗрдВ

    • рд░рдирдЯрд╛рдЗрдо рд▓рд╛рдЧрддред рдмреЗрд╕ рдПрдкреНрд▓рд┐рдХреЗрд╢рди 141.0 KB рдкреНрд░рддрд┐ рдкреЗрдЬ рд╣реИред next-intl рдЗрд╕реЗ 153.6 KB (рдкреНрд░рддреНрдпреЗрдХ рдкреЗрдЬ рдкрд░ +12.6 KB gzip) рддрдХ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ, рдЬрдмрдХрд┐ Intlayer рдЗрд╕реЗ рдХреЗрд╡рд▓ 141.3 KB (+0.3 KB) рддрдХ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИред
    • рд▓реАрдХреЗрдЬред рд╕рдмрд╕реЗ рдЖрдо рд╕реЗрдЯрдЕрдк (static рдФрд░ dynamic) рдореЗрдВ, next-intl рд╣рд░ рдкреЗрдЬ рдкрд░ ~90% рдЕрдиреНрдп рдкреЗрдЬреЛрдВ рдХреА рд╕рд╛рдордЧреНрд░реА рднреЗрдЬрддрд╛ рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреВрд░реА en.json рдХреНрд▓рд╛рдЗрдВрдЯ рдкреНрд░реЛрд╡рд╛рдЗрдбрд░ рдореЗрдВ рдЬрд╛рддреА рд╣реИред 0% рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рд╡рдзрд╛рдиреАрдкреВрд░реНрд╡рдХ рдореИрдиреБрдЕрд▓ рд╡рд┐рднрд╛рдЬрди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдЬрдмрдХрд┐ Intlayer рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ 0% рдкрд░ рд╣реИред
    • рдХрдВрдкреЛрдиреЗрдВрдЯ рд╕рд╛рдЗрдЬрд╝ред useTranslations() рдХреЛ рдХреЙрд▓ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдХрдВрдкреЛрдиреЗрдВрдЯ рдФрд╕рддрди 21.8 KB рдХрд╛ рд╣реЛрддрд╛ рд╣реИ; useIntlayer() рдХреЗ рд╕рд╛рде рд╡рд╣реА рдХрдВрдкреЛрдиреЗрдВрдЯ рдХреЗрд╡рд▓ 6.9 KB рдХрд╛ рд╣реЛрддрд╛ рд╣реИред
    рдкреВрд░реА рддрд╛рд▓рд┐рдХрд╛, рдкреНрд░рддреНрдпреЗрдХ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдФрд░ рд░рдгрдиреАрддрд┐, Next.js рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред

    TanStack Start (use-intl) рдкрд░ рдкрд░рд┐рдгрд╛рдо

    use-intl next-intl рдХрд╛ рдлреНрд░реЗрдорд╡рд░реНрдХ-рдЕрдЬреНрдЮреЗрдп рдХреЛрд░ рд╣реИред рд╡рд╣реА API, рд╡рд╣реА рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рд░реВрдкред TanStack Start рдкрд░ intlayer рдХреЗ рд╕рд╛рде рдЗрд╕рдХреА рддреБрд▓рдирд╛ Next.js-рд╡рд┐рд╢рд┐рд╖реНрдЯ рднрд╛рдЧреЛрдВ рдХреЛ рд╕рдореАрдХрд░рдг рд╕реЗ рд╣рдЯрд╛ рджреЗрддреА рд╣реИред

    рд▓рд╛рдЗрдмреНрд░реЗрд░реАрд░рдгрдиреАрддрд┐рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕рд╛рдЗрдЬрд╝ (gz)рдкреЗрдЬ JS рдФрд╕рдд (gz)рд▓реЛрдХреЗрд▓ рд▓реАрдХрдкреЗрдЬ рд▓реАрдХрдХрдВрдкреЛрдиреЗрдВрдЯ рдФрд╕рдд (gz)E2E рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╢реАрд▓рддрд╛
    base (рдмрд┐рдирд╛ i18n)-0.0 KB111.0 KB0.0%0.0%0.7 KB8.1 ms
    use-intlstatic14.1 KB179.8 KB50.0%89.8%76.0 KB6.7 ms
    use-intldynamic14.1 KB119.4 KB0.0%89.8%75.9 KB7.0 ms
    use-intlscoped-static14.1 KB128.7 KB0.0%0.0%87.1 KB20.9 ms
    use-intlscoped-dynamic14.1 KB128.7 KB0.0%0.0%87.1 KB13.3 ms
    intlayerstatic5.0 KB125.8 KB50.0%0.0%8.1 KB3.2 ms
    intlayerdynamic5.0 KB118.6 KB0.0%0.0%6.3 KB3.6 ms
    @intlayer/use-intl (рд╕рдВрдЧрддрддрд╛)dynamic7.3 KB129.7 KB0.0%0.0%9.3 KB8.7 ms

    рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдХреИрд╕реЗ рд╕рдордЭреЗрдВ

    • рд╕рд░рд▓ use-intl рд╕реЗрдЯрдЕрдк рдмреЗрд╕ рдРрдк рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдкреНрд░рддрд┐ рдкреЗрдЬ 68.8 KB рдЕрдзрд┐рдХ JS рднреЗрдЬрддрд╛ рд╣реИред
    • dynamic рдореЛрдб рдореЗрдВ, use-intl 119.4 KB рдкрд░ рдЖрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА 89.8% рдкреЗрдЬ рд▓реАрдХреЗрдЬ рд╡рд╣рди рдХрд░рддрд╛ рд╣реИред
    • рдХрдВрдкреЛрдиреЗрдВрдЯ рдХреЗ рд╕реНрддрд░ рдкрд░ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдХрд╛ рдЕрдВрддрд░ рд╕реНрдкрд╖реНрдЯ рд╣реИ: use-intl рдХреЗ рд╕рд╛рде 76-87 KB рдмрдирд╛рдо Intlayer рдХреЗ рд╕рд╛рде 6-8 KBред
    • рд▓реЛрдХреЗрд▓ рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ Intlayer рдХреЗ рд╕рд╛рде 2x-4x рддреЗрдЬрд╝ рд╣реИ (3 ms рдмрдирд╛рдо 7-21 ms)ред
    рдкреВрд░реА рддрд╛рд▓рд┐рдХрд╛ TanStack Start рдмреЗрдВрдЪрдорд╛рд░реНрдХ рд░рд┐рдкреЛрд░реНрдЯ рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИред

    рдЕрдВрддрд░ рдХреНрдпреЛрдВ рд╣реИ? рдХреЗрдВрджреНрд░реАрдХреГрдд рдХреИрдЯрд▓реЙрдЧ рдмрдирд╛рдо рдХрдВрдкрд╛рдЗрд▓ рдХреА рдЧрдИ рдбрд┐рдХреНрд╢рдирд░реА

    Centralized catalogs versus per-component dictionaries

    next-intl рдХреНрд▓рд╛рд╕рд┐рдХ рдореЙрдбрд▓ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИ: рдкреНрд░рддрд┐ рд▓реЛрдХреЗрд▓ рдПрдХ JSON, рдЬреЛ getRequestConfig рдореЗрдВ рд▓реЛрдб рд╣реЛрддрд╛ рд╣реИ, NextIntlClientProvider рдореЗрдВ рдкрд╛рд╕ рд╣реЛрддрд╛ рд╣реИ, рдФрд░ t("namespace.key") рджреНрд╡рд╛рд░рд╛ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред

    bash
    .
    тФЬтФАтФА messages
    тФВ   тФЬтФАтФА en.json
    тФВ   тФФтФАтФА fr.json
    тФФтФАтФА src
        тФЬтФАтФА i18n
        тФВ   тФЬтФАтФА request.ts
        тФВ   тФФтФАтФА routing.ts
        тФЬтФАтФА middleware.ts
        тФФтФАтФА app
            тФФтФАтФА [locale]
                тФЬтФАтФА layout.tsx
                тФФтФАтФА about
                    тФФтФАтФА page.tsx
    

    рд░рдирдЯрд╛рдЗрдо рдпрд╣ рдирд╣реАрдВ рдЬрд╛рди рд╕рдХрддрд╛ рдХрд┐ рдХреЛрдИ рдкреЗрдЬ рдХрд┐рди рдХреБрдВрдЬрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдЧрд╛, рдЗрд╕рд▓рд┐рдП рд╕рдВрдкреВрд░реНрдг рдХреИрдЯрд▓реЙрдЧ рднреЗрдЬрдирд╛ рд╣реА рд╕реБрд░рдХреНрд╖рд┐рдд рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд╣реИред

    рд╡рд╣рд╛рдВ рддрдХ рди рдкрд╣реБрдБрдЪрдиреЗ рдХреА рд▓рд╛рдЧрдд рджреЛ рдЕрдХреНрд╖реЛрдВ рдкрд░ рдПрдХ рд╕рд╛рде рдмрдврд╝рддреА рд╣реИ, рдкреГрд╖реНрда рдФрд░ рднрд╛рд╖рд╛рдПрдБ:

    Theoretical content leakage by architecture

    Intlayer рдЬрд┐рдореНрдореЗрджрд╛рд░реА рдХреЛ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред рд╕рд╛рдордЧреНрд░реА рд╕реАрдзреЗ рдХрдВрдкреЛрдиреЗрдВрдЯ рдХреЗ рдмрдЧрд▓ рдореЗрдВ рдШреЛрд╖рд┐рдд рдХреА рдЬрд╛рддреА рд╣реИ:

    bash
    .
    тФЬтФАтФА intlayer.config.ts
    тФФтФАтФА src
        тФЬтФАтФА middleware.ts
        тФФтФАтФА app
            тФФтФАтФА [locale]
                тФЬтФАтФА layout.tsx
                тФФтФАтФА about
                    тФЬтФАтФА page.tsx
                    тФФтФАтФА page.content.ts
        тФФтФАтФА components
            тФФтФАтФА Counter
                тФЬтФАтФА index.tsx
                тФФтФАтФА index.content.ts
    

    рдмрд┐рд▓реНрдб рд╕рдордп рдкрд░, рдХрдВрдкрд╛рдЗрд▓рд░ рджреЗрдЦрддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рдХрдВрдкреЛрдиреЗрдВрдЯ рдХреМрди рд╕реА рдбрд┐рдХреНрд╢рдирд░реА рдЗрдореНрдкреЛрд░реНрдЯ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдХреЗрд╡рд▓ рд╕рдХреНрд░рд┐рдп рд▓реЛрдХреЗрд▓ рдХреЗ рд▓рд┐рдП рдЙрди рдбрд┐рдХреНрд╢рдирд░реА рдХреЛ рдмрдВрдбрд▓ рдХрд░рддрд╛ рд╣реИред

    dynamic рдкрдВрдХреНрддрд┐ рдХреЗ рдЖрдВрдХрдбрд╝реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, intlayer.config.ts рдореЗрдВ dictionary.importMode: 'dynamic' рд╕реЗрдЯ рдХрд░реЗрдВред рдмрдВрдбрд▓ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджреЗрдЦреЗрдВред

    рдбреЗрд╡рд▓рдкрд░ рдЕрдиреБрднрд╡

    рдХреНрд▓рд╛рдЗрдВрдЯ рдХрдВрдкреЛрдиреЗрдВрдЯ

    messages/en.json
    {
      "counter": {
        "label": "Counter",
        "increment": "Increment"
      }
    }
    
    src/components/ClientCounter.tsx
    "use client";
    
    import { useState } from "react";
    import { useTranslations, useFormatter } from "next-intl";
    
    export const Counter = () => {
      const t = useTranslations("counter");
      const format = useFormatter();
      const [count, setCount] = useState(0);
    
      return (
        <div>
          <p>{format.number(count)}</p>
          <button aria-label={t("label")} onClick={() => setCount((c) => c + 1)}>
            {t("increment")}
          </button>
        </div>
      );
    };
    
    рдЗрд╕ рдШрдЯрдХ рдХреЛ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда рдкрд░ NextIntlClientProvider рдХреЛ рджрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рд╕рдВрджреЗрд╢реЛрдВ рдореЗрдВ counter рдиреЗрдорд╕реНрдкреЗрд╕ рд╢рд╛рдорд┐рд▓ рдХрд░рдирд╛ рдпрд╛рдж рд░рдЦреЗрдВред
    src/components/Counter/index.content.ts
    import { t, type Dictionary } from "intlayer";
    
    const counterContent = {
      key: "counter",
      content: {
        label: t({ en: "Counter", fr: "Compteur" }),
        increment: t({ en: "Increment", fr: "Incr├йmenter" }),
      },
    } satisfies Dictionary;
    
    export default counterContent;
    
    src/components/Counter/index.tsx
    "use client";
    
    import { useState } from "react";
    import { useIntlayer } from "next-intlayer";
    import { useNumber } from "next-intlayer/format";
    
    export const Counter = () => {
      const { label, increment } = useIntlayer("counter");
      const number = useNumber();
      const [count, setCount] = useState(0);
    
      return (
        <div>
          <p>{number(count)}</p>
          <button aria-label={label} onClick={() => setCount((c) => c + 1)}>
            {increment}
          </button>
        </div>
      );
    };
    

    рдкреГрд╖реНрда рдкрд░ рдХреБрдЫ рднреА рдкрдВрдЬреАрдХреГрдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ: рдШрдЯрдХ рдЕрдкрдиреА рд╕рд╛рдордЧреНрд░реА рд╕реНрд╡рдпрдВ рд▓рд╛рддрд╛ рд╣реИред

    рд╕рд┐рдВрдХреНрд░реЛрдирд╕ рд╕рд░реНрд╡рд░ рдХрдВрдкреЛрдиреЗрдВрдЯ

    рдбрд┐рдЬрд╝рд╛рдЗрди рд╕рд┐рд╕реНрдЯрдо рдХреЗ рдШрдЯрдХ (рдЬреИрд╕реЗ рдиреЗрд╡рдмрд╛рд░, рдлреВрдЯрд░, рдХрд╛рд░реНрдб) рдЕрдХреНрд╕рд░ рд╕рд░реНрд╡рд░ рдХрдВрдкреЛрдиреЗрдВрдЯ рд╣реЛрддреЗ рд╣реИрдВ рдЬрд┐рдиреНрд╣реЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдХрдВрдкреЛрдиреЗрдВрдЯ рдХреЗ рдЪрд┐рд▓реНрдбреНрд░рди рдХреЗ рд░реВрдк рдореЗрдВ рд░реЗрдВрдбрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рд╡реЗ async рдирд╣реАрдВ рд╣реЛ рд╕рдХрддреЗред

    src/components/ServerCounter.tsx
    type ServerCounterProps = {
      t: (key: string) => string;
      formattedCount: string;
    };
    
    export const ServerCounter = ({ t, formattedCount }: ServerCounterProps) => (
      <div>
        <p>{formattedCount}</p>
        <button aria-label={t("label")}>{t("increment")}</button>
      </div>
    );
    

    рдкреГрд╖реНрда рдХреЛ await getTranslations("counter") рдФрд░ await getFormatter() рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдлрд┐рд░ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдкреНрд░реЙрдкреНрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдиреАрдЪреЗ рднреЗрдЬрдирд╛ рд╣реЛрдЧрд╛ред рдШрдЯрдХ рдЕрдм рдЖрддреНрдордирд┐рд░реНрднрд░ рдирд╣реАрдВ рд░рд╣рд╛ред

    src/components/ServerCounter.tsx
    import { useIntlayer } from "next-intlayer/server";
    import { useNumber } from "next-intlayer/server/format";
    
    export const ServerCounter = ({ count }: { count: number }) => {
      const { label, increment } = useIntlayer("counter");
      const number = useNumber();
    
      return (
        <div>
          <p>{number(count)}</p>
          <button aria-label={label}>{increment}</button>
        </div>
      );
    };
    

    рдореЗрдЯрд╛рдбреЗрдЯрд╛ (Metadata)

    src/app/[locale]/about/page.tsx
    import type { Metadata } from "next";
    import { getTranslations } from "next-intl/server";
    import { routing } from "@/i18n/routing";
    
    const localizedPath = (locale: string, path: string) =>
      locale === routing.defaultLocale ? path : `/${locale}${path}`;
    
    export const generateMetadata = async ({
      params,
    }: {
      params: Promise<{ locale: string }>;
    }): Promise<Metadata> => {
      const { locale } = await params;
      const t = await getTranslations({ locale, namespace: "about" });
    
      const languages = Object.fromEntries(
        routing.locales.map((l) => [l, localizedPath(l, "/about")])
      );
    
      return {
        title: t("title"),
        description: t("description"),
        alternates: {
          canonical: localizedPath(locale, "/about"),
          languages: { ...languages, "x-default": "/about" },
        },
      };
    };
    
    src/app/[locale]/about/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("about-metadata", locale);
      const multilingualUrls = getMultilingualUrls("/about");
    
      return {
        ...metadata,
        alternates: {
          canonical: multilingualUrls[locale as keyof typeof multilingualUrls],
          languages: { ...multilingualUrls, "x-default": "/about" },
        },
      };
    };
    

    next-intl API рдмрдирд╛рдП рд░рдЦреЗрдВ, Intlayer рдХрд╛ рдЖрдЙрдЯрдкреБрдЯ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ

    рдЙрдкрд░реЛрдХреНрдд рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕ рдХреЛ рджреЛрдмрд╛рд░рд╛ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред @intlayer/next-intl рдПрдХ рдбреНрд░реЙрдк-рдЗрди рдПрдбреЗрдкреНрдЯрд░ рд╣реИ: рдпрд╣ useTranslations, getTranslations, useFormatter, t.rich() рдФрд░ ICU рдкреНрд▓реБрд░рд▓реНрд╕ рдХреЛ рдмрдирд╛рдП рд░рдЦрддрд╛ рд╣реИ, рдФрд░ рдЙрдиреНрд╣реЗрдВ Intlayer рдбрд┐рдХреНрд╢рдирд░реА рд╕реЗ рдкрд░реЛрд╕рддрд╛ рд╣реИред

    next.config.ts
    import type { NextConfig } from "next";
    import { createNextIntlPlugin } from "@intlayer/next-intl/plugin";
    
    const withIntlayer = createNextIntlPlugin();
    
    const nextConfig: NextConfig = {};
    
    export default withIntlayer(nextConfig);
    

    рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдореЗрдВ, рдмрд┐рдирд╛ рдХрд┐рд╕реА рдХреЛрдб рдкрд░рд┐рд╡рд░реНрддрди рдХреЗ, рдЗрд╕реА рдРрдк рдХрд╛ рдХрдВрдкреИрдЯ рдмрд┐рд▓реНрдб рдкреНрд░рддрд┐ рдкреЗрдЬ 153.6 KB рд╕реЗ рдШрдЯрдХрд░ 147.5 KB, рдХрдВрдкреЛрдиреЗрдВрдЯ рд╕рд╛рдЗрдЬрд╝ 21.8 KB рд╕реЗ рдШрдЯрдХрд░ 8.1 KB, рдФрд░ рдкреЗрдЬ рд▓реАрдХреЗрдЬ ~90% рд╕реЗ рдШрдЯрдХрд░ 0% рд╣реЛ рдЧрдпрд╛ред рдЖрдкрдХреА рдореМрдЬреВрджрд╛ messages/{locale}.json рдлрд╛рдЗрд▓реЗрдВ JSON рд╕рд┐рдВрдХ рдкреНрд▓рдЧрдЗрди рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рддреНрдп рдХрд╛ рд╕реНрд░реЛрдд рдмрдиреА рд░рд╣ рд╕рдХрддреА рд╣реИрдВред

    рдЪрд░рдг-рджрд░-рдЪрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП next-intl рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдЧрд╛рдЗрдб рджреЗрдЦреЗрдВред

    рдХрдм рдХрд┐рд╕реЗ рдЪреБрдиреЗрдВ?

    рдЖрдк Next.js рдХреЗ рд▓рд┐рдП рдЗрдХреЛрд╕рд┐рд╕реНрдЯрдо рдорд╛рдирдХ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, ICU MessageFormat рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреЗ рд╣реИрдВ, рдЖрдкрдХрд╛ рдРрдк рдЫреЛрдЯреЗ рд╕реЗ рдордзреНрдпрдо рдЖрдХрд╛рд░ рдХрд╛ рд╣реИ, рдпрд╛ рдЖрдк рдХрд┐рд╕реА рдРрд╕реЗ рдЕрдиреБрд╡рд╛рдж рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо (Crowdin, Phrase, Lokalise...) рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдХреЗрдВрджреНрд░реАрдХреГрдд JSON рдХреА рдЕрдкреЗрдХреНрд╖рд╛ рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдкреНрд░рджрд░реНрд╢рди рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ рддреЛ рдХреИрдЯрд▓реЙрдЧ рдХреЛ рдиреЗрдорд╕реНрдкреЗрд╕ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рдФрд░ рдкреНрд░рддрд┐ рдкреГрд╖реНрда pick() рдХреЗ рд╕рд╛рде рд╕рдВрджреЗрд╢ рдЪреБрдирдиреЗ рдХреЗ рд▓рд┐рдП рд╕рдордп рдирд┐рдХрд╛рд▓реЗрдВред

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

    рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА next-intl рдкрд░ рд╣реИрдВ рдФрд░ рдмрд┐рдирд╛ рджреЛрдмрд╛рд░рд╛ рд▓рд┐рдЦреЗ рдмрдВрдбрд▓ рд▓рд╛рдн рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдХрдореНрдкреИрдЯрд┐рдмрд┐рд▓рд┐рдЯреА рдПрдбреЗрдкреНрдЯрд░ рдЖрдкрдХреЗ рдЗрдореНрдкреЛрд░реНрдЯ рдФрд░ рдЖрдкрдХреА messages/{locale}.json рдлрд╝рд╛рдЗрд▓ рдХреЛ рд╕рддреНрдп рдХреЗ рдПрдХрд▓ рд╕реНрд░реЛрдд рдХреЗ рд░реВрдк рдореЗрдВ рд░рдЦрддрд╛ рд╣реИред next-intl vs @intlayer/next-intl рдореЗрдВ рдПрдХ рд╕рд╛рде рдорд╛рдкрд╛ рдЧрдпрд╛ред

    рдЕрдХреНрд╕рд░ рдкреВрдЫреЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдкреНрд░рд╢реНрди (FAQ)

    рд░реЗрдВрдбрд░ рд╕рдордп рдкрд░ рдирд╣реАрдВред рдЕрдВрддрд░ рдЗрд╕рдореЗрдВ рд╣реИ рдХрд┐ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреЛ рдХреНрдпрд╛ рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ: next-intl рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда рдкрд░ +12.6 KB gzip рд░рдирдЯрд╛рдЗрдо рдХреА рд▓рд╛рдЧрдд рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЕрдзрд┐рдХрд╛рдВрд╢ рд╕реЗрдЯрдЕрдк рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда рдХреЗ рд╕рд╛рде рд╡рд┐рджреЗрд╢реА рдкреГрд╖реНрдареЛрдВ рдХреЗ рд▓рдЧрднрдЧ 90% рдЯреЗрдХреНрд╕реНрдЯ рднреЗрдЬрддрд╛ рд╣реИред рднрд╛рд╖рд╛ рдмрджрд▓рдирд╛ рдФрд░ рд╣рд╛рдЗрдбреНрд░реЗрд╢рди Next.js рдкрд░ рддреБрд▓рдиреАрдп рд╣реИрдВ (15-18 ms); TanStack Start рдкрд░ use-intl 7-21 ms рд▓реЗрддрд╛ рд╣реИ рдЬрдмрдХрд┐ Intlayer рдХреЗрд╡рд▓ 3-4 ms рд▓реЗрддрд╛ рд╣реИред

    рд╣рд╛рдБ, scoped-dynamic рд╕реЗрдЯрдЕрдк рдХреЗ рд╕рд╛рде: messages/{locale}.json рдХреЛ рдкреНрд░рддрд┐ рд░реВрдЯ рдПрдХ рдиреЗрдорд╕реНрдкреЗрд╕ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░реЗрдВ, рдлрд┐рд░ рдкреНрд░рддреНрдпреЗрдХ рдкреГрд╖реНрда рдореЗрдВ pick(messages, [...]) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ рдФрд░ рдХрдВрдкреЛрдиреЗрдВрдЯ рдмрджрд▓рдиреЗ рдкрд░ рдЙрд╕ рдореИрдкрд┐рдВрдЧ рдХреЛ рд╕рд╣реА рдмрдирд╛рдП рд░рдЦреЗрдВред рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреА scoped-* рдкрдВрдХреНрддрд┐рдпрд╛рдБ рдареАрдХ рдЙрд╕реА рдХрд╛рдо рдХреЛ рджрд░реНрд╢рд╛рддреА рд╣реИрдВред Intlayer рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░рдпрд╛рд╕ рдХреЗ 0% рддрдХ рдкрд╣реБрдБрдЪ рдЬрд╛рддрд╛ рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рдХрдВрдкрд╛рдЗрд▓рд░ рдХрдВрдкреЛрдиреЗрдВрдЯ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╕реАрдорд┐рдд рдХрд░рддрд╛ рд╣реИред рдмрдВрдбрд▓ рдСрдкреНрдЯрд┐рдорд╛рдЗрдЬрд╝реЗрд╢рди рджреЗрдЦреЗрдВред

    рдирд╣реАрдВред @intlayer/next-intl useTranslations, getTranslations, useFormatter, t.rich(), ICU рдмрд╣реБрд╡рдЪрди рдФрд░ рдиреЗрд╡рд┐рдЧреЗрд╢рди рд╕рд╣рд╛рдпрдХреЛрдВ рдХреЛ рдмрд░рдХрд░рд╛рд░ рд░рдЦрддрд╛ рд╣реИ, рдФрд░ рдЙрдиреНрд╣реЗрдВ рд╕рдВрдХрд▓рд┐рдд рд╢рдмреНрджрдХреЛрд╢реЛрдВ рд╕реЗ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИред next.config.ts рдореЗрдВ рдХреЗрд╡рд▓ рдПрдХ рдкреНрд▓рдЧрдЗрди рдкрдВрдХреНрддрд┐ред рдЪрд░рдг рджрд░ рдЪрд░рдг next-intl рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдЧрд╛рдЗрдб рдореЗрдВ рджреЗрдЦреЗрдВред

    рдореВрд▓ API рдкрд░ ICU рд╕рдорд░реНрдерди рдкрд░ рдХрд╛рд░реНрдп рдкреНрд░рдЧрддрд┐ рдкрд░ рд╣реИред рдХрдореНрдкреИрдЯрд┐рдмрд┐рд▓рд┐рдЯреА рдПрдбреЗрдкреНрдЯрд░ (@intlayer/next-intl, @intlayer/use-intl) ICU рдЪрд▓рд╛рддреЗ рд╣реИрдВ: рдмрд╣реБрд╡рдЪрди, select, selectordinal, # рдФрд░ {ts, date, long} Intlayer рдХреЗ ICU рд░рд┐рдЬрд╝реЙрд▓реНрд╡рд░ рд╕реЗ рдЧреБрдЬрд░рддреЗ рд╣реИрдВред рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП ICU рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рд░реВрдк рдкрдврд╝реЗрдВред

    рд╣рд╛рдБред JSON рд╕рд┐рдВрдХ рдкреНрд▓рдЧрдЗрди рдЙрдиреНрд╣реЗрдВ рдкрдврд╝рддрд╛ рд╣реИ, рдЙрдирдХреА рд╢реАрд░реНрд╖-рд╕реНрддрд░реАрдп рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЛ рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЬрдм CLI рдпрд╛ CMS рдЙрдиреНрд╣реЗрдВ рдЕрдкрдбреЗрдЯ рдХрд░рддрд╛ рд╣реИ рддреЛ рдЕрдиреБрд╡рд╛рджреЛрдВ рдХреЛ рдЙрдиреНрд╣реАрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╡рд╛рдкрд╕ рд▓рд┐рдЦрддрд╛ рд╣реИред рдЖрдкрдХреЗ рдЕрдиреБрд╡рд╛рджрдХреЛрдВ рдХрд╛ рдХрд╛рд░реНрдпрдкреНрд░рд╡рд╛рд╣ рдирд╣реАрдВ рдмрджрд▓рддрд╛ рд╣реИред

    рд╕рдВрдмрдВрдзрд┐рдд рддреБрд▓рдирд╛рдПрдБ

    рд╡рд╣реА рдмреЗрдВрдЪрдорд╛рд░реНрдХ, рдЕрдиреНрдп рд▓рд╛рдЗрдмреНрд░реЗрд░реАрдЬрд╝:

    next-intl рдкрд░ рдЧрд╣рд░рд╛рдИ рд╕реЗ рдЬрд╛рдиреЗрдВ:

    рд╕рдВрджрд░реНрдн рджрд╕реНрддрд╛рд╡реЗрдЬрд╝:

    рдпреЗ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╣рд╛рдБ рд╕реЗ рдЖрдИрдВ, рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП JavaScript i18n рдХрд╛ рдЗрддрд┐рд╣рд╛рд╕ рдкрдврд╝реЗрдВред

    GitHub STARS

    GitHub рд╕реНрдЯрд╛рд░ рдХрд┐рд╕реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреА рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛, рд╕рд╛рдореБрджрд╛рдпрд┐рдХ рд╡рд┐рд╢реНрд╡рд╛рд╕ рдФрд░ рджреАрд░реНрдШрдХрд╛рд▓рд┐рдХ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХрддрд╛ рдХрд╛ рдПрдХ рдордЬрдмреВрдд рд╕рдВрдХреЗрддрдХ рд╣реИрдВред

    рд╕реНрдЯрд╛рд░ рд╣рд┐рд╕реНрдЯреНрд░реА рдЪрд╛рд░реНрдЯ

    рдХрдорд┐рдЯ рдЧрддрд┐рд╡рд┐рдзрд┐

    рд╕реНрдЯрд╛рд░ рд▓реЛрдХрдкреНрд░рд┐рдпрддрд╛ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВред рдХрдорд┐рдЯ рджрд┐рдЦрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдХрд┐рд╕реА рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдХрд┐рддрдирд╛ рдХрд╛рдо рд▓рдЧрд╛ рд╣реИред рд▓рд┐рдЦрддреЗ рд╕рдордп Intlayer рдореЗрдВ рд▓рдЧрднрдЧ 7,500 рдХрдорд┐рдЯ рд╣реИрдВ, рдЬреЛ рдпрд╣рд╛рдБ рддреБрд▓рдирд╛ рдХреА рдЧрдИ рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╕реЗ рдЬрд╝реНрдпрд╛рджрд╛ рд╣реИрдВ рдФрд░ next-intl рдпрд╛ next-i18next рд╕реЗ рд▓рдЧрднрдЧ 5 рдЧреБрдирд╛ред

    • amannn/next-intl
    • aymericzip/intlayer

    рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдмреНрд░рд╛рдВрдЪ рдкрд░ рдХрдорд┐рдЯ, рд╕реНрд░реЛрдд: GitHub APIред

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

    npm рдбрд╛рдЙрдирд▓реЛрдб

    • next-intl
    • next-intlayer

    рд╕реНрд░реЛрдд: npm рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдбрд╛рдЙрдирд▓реЛрдб APIред

    рдбрд╛рдЙрдирд▓реЛрдб рд╕рдмрд╕реЗ рдкреБрд░рд╛рдиреЗ рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреЛ рдкреБрд░рд╕реНрдХреГрдд рдХрд░рддреЗ рд╣реИрдВ, рд╕рдмрд╕реЗ рдЕрдЪреНрдЫреЗ рдХреЛ рдирд╣реАрдВред рд╡рд░реНрд╖реЛрдВ рдкрд╣рд▓реЗ рдЬрд╛рд░реА рд╣реБрдИ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдЖрдЬ рднреА рд╣рд░ рдЙрд╕ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдореЗрдВ рдЗрдВрд╕реНрдЯреЙрд▓ рд╣реЛрддреА рд╣реИ рдЬрд┐рд╕рдиреЗ рдЙрд╕реЗ рддрдм рдЪреБрдирд╛ рдерд╛, рд╣рд░ CI рд░рди рдореЗрдВ рдФрд░ рд╣рд░ рдЙрд╕ рдкреИрдХреЗрдЬ рдореЗрдВ рдЬреЛ рдЙрд╕ рдкрд░ рдирд┐рд░реНрднрд░ рд╣реИред рдпрд╣ рд╕рдВрдЦреНрдпрд╛ рдирдП рдЪреБрдирд╛рд╡ рд╕реЗ рдЬрд╝реНрдпрд╛рджрд╛ рдЬрдбрд╝рддрд╛ рдХреЛ рдорд╛рдкрддреА рд╣реИред

    AI рдЕрд╕рд┐рд╕реНрдЯреЗрдВрдЯ рдЗрд╕ рдкреНрд░рднрд╛рд╡ рдХреЛ рдФрд░ рдмрдврд╝рд╛рддреЗ рд╣реИрдВред next-intl, i18next рдФрд░ vue-i18n рдЙрд╕ рдХреЛрдб рдореЗрдВ рд╣рд░ рдЬрдЧрд╣ рд╣реИрдВ рдЬрд┐рд╕ рдкрд░ рд╡реЗ рдкреНрд░рд╢рд┐рдХреНрд╖рд┐рдд рд╣реБрдП, рдЗрд╕рд▓рд┐рдП рд╡реЗ рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреА рддреБрд▓рдирд╛ рдХрд┐рдП рдмрд┐рдирд╛ рдЗрдиреНрд╣реЗрдВ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рд╕реБрдЭрд╛рддреЗ рд╣реИрдВред рд╣рд░ рд╕реБрдЭрд╛рд╡ рдбрд╛рдЙрдирд▓реЛрдб рдмрдврд╝рд╛рддрд╛ рд╣реИ, рдЬреЛ рдЕрдЧрд▓реЗ рд╕реБрдЭрд╛рд╡ рдХреЛ рдмрдврд╝рд╛рд╡рд╛ рджреЗрддрд╛ рд╣реИред рдбрд╛рдЙрдирд▓реЛрдб рдХреА рд╕рдВрдЦреНрдпрд╛ рдирд╣реАрдВ, рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рддреБрд▓рдирд╛ рдХрд░реЗрдВред

    рдирд┐рд╖реНрдХрд░реНрд╖

    next-intl рдПрдХ рдареЛрд╕, рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рдЕрдиреБрд░рдХреНрд╖рд┐рдд рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИ, рдФрд░ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рдкреБрд╖реНрдЯрд┐ рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпрд╣ Next.js рдкрд░ рдПрдХ рдЕрдЪреНрдЫрд╛ рд╡рд┐рдХрд▓реНрдк рд╣реИред рд▓реЗрдХрд┐рди рдЗрд╕рдХрд╛ рдХреЗрдВрджреНрд░реАрдХреГрдд рдХреИрдЯрд▓реЙрдЧ рдореЙрдбрд▓ рд╣рд░ рдЕрдиреБрдХреВрд▓рди рдХрд╛ рднрд╛рд░ рдбреЗрд╡рд▓рдкрд░ рдкрд░ рдбрд╛рд▓рддрд╛ рд╣реИ: рд╕рд░рд▓ рд╕реЗрдЯрдЕрдк рд▓рдЧрднрдЧ 90% рдЕрдиреНрдп рдкреЗрдЬреЛрдВ рдХреА рд╕рд╛рдордЧреНрд░реА рд▓реАрдХ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЕрдХреЗрд▓реЗ рд░рдирдЯрд╛рдЗрдо рдХреА рд▓рд╛рдЧрдд рдкреНрд░рддреНрдпреЗрдХ рдкреЗрдЬ рдкрд░ +12.6 KB gzip рд╣реЛрддреА рд╣реИред

    Intlayer рдЙрд╕ рдХрд╛рдо рдХреЛ рдХрдВрдкрд╛рдЗрд▓рд░ рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рддрд╛ рд╣реИред рдкреНрд░рддрд┐-рдХрдВрдкреЛрдиреЗрдВрдЯ рдбрд┐рдХреНрд╢рдирд░реА, рдкреНрд░рддрд┐-рд▓реЛрдХреЗрд▓ рд▓реЗрдЬрд╝реА рд▓реЛрдбрд┐рдВрдЧ рдФрд░ рдЕрдкреНрд░рдпреБрдХреНрдд рд╕рд╛рдордЧреНрд░реА рдХреЛ рд╣рдЯрд╛рдирд╛ рдмрд┐рд▓реНрдб рдЖрдЙрдЯрдкреБрдЯ рд╣реИрдВред рдкрд░рд┐рдгрд╛рдо: +0.3 KB рдкреНрд░рддрд┐ рдкреЗрдЬ, 0% рд▓реАрдХреЗрдЬ, рдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕ 3 рдЧреБрдирд╛ рдЫреЛрдЯреЗ, рдФрд░ TanStack Start рдкрд░ рд▓реЛрдХреЗрд▓ рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ 2x-4x рддреЗрдЬрд╝ред

    рд╕рднреА рдХрдЪреНрдЪреЗ рдбреЗрдЯрд╛, рдкрд░реАрдХреНрд╖рдг рдРрдкреНрд╕ рдФрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ Benchmark Bloom рд░рд┐рдкреЙрдЬрд┐рдЯрд░реА рдореЗрдВ рдЙрдкрд▓рдмреНрдз рд╣реИрдВред

    рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП 'Why Intlayer?' рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджреЗрдЦреЗрдВред

    рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

    рдЕрднреА рддрдХ рдХреЛрдИ рдЯрд┐рдкреНрдкрдгреА рдирд╣реАрдВред рдЕрдкрдиреЗ рд╡рд┐рдЪрд╛рд░ рд╕рд╛рдЭрд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдкрд╣рд▓реЗ рд╡реНрдпрдХреНрддрд┐ рдмрдиреЗрдВред

    рд╕рдВрдмрдВрдзрд┐рдд рдкреЛрд╕реНрдЯ

    рдирд╡реАрдирддрдо рдкреЛрд╕реНрдЯ