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

    Intlayer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреА Remix 3 рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░реЗрдВ

    рдпрд╣ рдЧрд╛рдЗрдб рджрд░реНрд╢рд╛рддреА рд╣реИ рдХрд┐ рднрд╛рд╖рд╛-рдЬрд╛рдЧрд░реВрдХ рд░реВрдЯрд┐рдВрдЧ, рдЯрд╛рдЗрдк-рд╕реБрд░рдХреНрд╖рд┐рдд рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рдгрд╛рдУрдВ, рд╕рд░реНрд╡рд░-рд░реЗрдВрдбрд░ рдХрд┐рдП рдЧрдП JSX рдШрдЯрдХреЛрдВ рдФрд░ Node.js, Bun, Deno рдФрд░ Cloudflare Workers рдореЗрдВ рдХреНрд░реЙрд╕-рд░рдирдЯрд╛рдЗрдо рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде Remix 3 рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рд╕рд╣рдЬ рдЕрдВрддрд░реНрд░рд╛рд╖реНрдЯреНрд░реАрдпрдХрд░рдг рдХреЗ рд▓рд┐рдП Intlayer рдХреЛ рдХреИрд╕реЗ рдПрдХреАрдХреГрдд рдХрд┐рдпрд╛ рдЬрд╛рдПред

    Remix 3 рдХреНрдпрд╛ рд╣реИ?

    Remix 3 рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╡реЗрдм рдорд╛рдирдХреЛрдВ рдкрд░ рдирд┐рд░реНрдорд┐рдд, рдПрдХ рдХрдВрдкреЛрдЬрд╝реЗрдмрд▓, рд░рдирдЯрд╛рдЗрдо-рдЕрдЬреНрдЮреЗрдпрд╡рд╛рджреА рд╡реЗрдм рдлреНрд░реЗрдорд╡рд░реНрдХ рдХреА рдУрд░ рдПрдХ рдореМрд▓рд┐рдХ рд╡рд╛рд╕реНрддреБрдХрд▓рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рддреНрд╡ рдХрд░рддрд╛ рд╣реИред рд╡рд┐рд╢рд┐рд╖реНрдЯ рдмрдВрдбрд▓рд░реНрд╕ рдпрд╛ рдорд╛рд▓рд┐рдХрд╛рдирд╛ рд╕рд░реНрд╡рд░ рдПрдкреАрдЖрдИ рд╕реЗ рдЬреБрдбрд╝реЗ рд╣реЛрдиреЗ рдХреЗ рдмрдЬрд╛рдп, Remix 3 рдХреЛ рдПрдХрд▓-рдЙрджреНрджреЗрд╢реНрдпреАрдп, рдХрдВрдкреЛрдЬрд╝реЗрдмрд▓ рдкреИрдХреЗрдЬреЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд╡рд┐рддрд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:

    • remix/fetch-router (рдпрд╛ remix/router): Fetch API (Request рдФрд░ Response) рдкрд░ рдирд┐рд░реНрдорд┐рдд рд╣рд▓реНрдХрд╛, рдорд╛рдирдХ-рдЕрдиреБрд░реВрдк рд░реВрдЯрд┐рдВрдЧред
    • remix/component: рдПрдХ JSX рдШрдЯрдХ рдореЙрдбрд▓ (jsxImportSource: "remix/component"). рдПрдХ рдШрдЯрдХ рдПрдХ рд╕реЗрдЯрдЕрдк рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдПрдХ рд░реЗрдВрдбрд░ рдлрд╝рдВрдХреНрд╢рди рд▓реМрдЯрд╛рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдпрд╣ React рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╕реНрдерд┐рддрд┐ рдХреЛ рд╕рд╛рдорд╛рдиреНрдп JavaScript рдХреНрд▓реЛрдЬрд░ рдореЗрдВ рд░рдЦрддрд╛ рд╣реИред
    • remix/middleware/render: рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдкрд░ context.render(<Page />) рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ JSX рдЯреНрд░реА рдХреЛ HTML Response рдореЗрдВ рд╕реНрдЯреНрд░реАрдо рдХрд░рддрд╛ рд╣реИред
    • remix/node-fetch-server: Bun, Deno рдФрд░ рдПрдЬ рд░рдирдЯрд╛рдЗрдо рдХреЗ рдореВрд▓ рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде Node.js рдХреЗ рд▓рд┐рдП рд╕рд░реНрд╡рд░ рдПрдбреЗрдкреНрдЯрд░ред
    • remix/cookie: рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлрд╝рд┐рдХ рд░реВрдк рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдХреБрдХреА рдкрд╛рд░реНрд╕рд┐рдВрдЧ рдФрд░ рдХреНрд░рдорд╛рдВрдХрдиред

    Intlayer рдФрд░ remix-intlayer рдкреИрдХреЗрдЬ (рдПрдХ рд▓реЛрдХреЗрд▓ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдФрд░ Remix рдЕрдиреБрд░реЛрдз рд╕рдВрджрд░реНрдн рд╕реЗ рдмрдВрдзреЗ react-intlayer рдХреЗ рд╕рдорд╛рди useIntlayer / useDictionary / useLocale рд╣реБрдХреНрд╕) рдХреЗ рд╕рд╛рде рд╕рдВрдпреБрдХреНрдд, рдЖрдкрдХреЛ рдПрдХ рд╕рдВрдкреВрд░реНрдг рдЕрдВрддрд░реНрд░рд╛рд╖реНрдЯреНрд░реАрдпрдХрд░рдг рдкреНрд░рдгрд╛рд▓реА рдорд┐рд▓рддреА рд╣реИ рдЬреЛ рд╕рдВрдХрд▓рди-рд╕рдордп рд╕реБрд░рдХреНрд╖рд╛, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд AI рдЕрдиреБрд╡рд╛рдж, рд╢реВрдиреНрдп-рдУрд╡рд░рд╣реЗрдб рд╕рд░реНрд╡рд░ рд░реЗрдВрдбрд░рд┐рдВрдЧ рдФрд░ рд╕рд╣рдЬ рд▓реЛрдХреЗрд▓ рд░реВрдЯрд┐рдВрдЧ рдкреНрд░рджрд╛рди рдХрд░рддреА рд╣реИред

    рд╕рд╛рдордЧреНрд░реА рддрд╛рд▓рд┐рдХрд╛

    рд╡рд┐рдХрд▓реНрдкреЛрдВ рдХреЗ рдмрдЬрд╛рдп Intlayer рдХреНрдпреЛрдВ рдЪреБрдиреЗрдВ?

    i18next рдпрд╛ рдкрд╛рд░рдВрдкрд░рд┐рдХ рдЕрдиреБрд╡рд╛рдж рд▓реЛрдбрд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ, Intlayer рдЖрдзреБрдирд┐рдХ рд╡реЗрдм рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд рдПрдХ рдПрдХреАрдХреГрдд рдбреЗрд╡рд▓рдкрд░ рдЕрдиреБрднрд╡ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:

    Intlayer рдХреЛ рд╡реЗрдм рдорд╛рдирдХреЛрдВ (Request, Response, Headers, рдФрд░ URL) рдХреЗ рд╕рд╛рде рд╕рд╣рдЬрддрд╛ рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рд╣реИред remix-intlayer рдПрдХ рд╣рд▓реНрдХреЗ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЗ рд░реВрдк рдореЗрдВ Remix 3 рдХреЗ Fetch рд░рд╛рдЙрдЯрд░ рдореЗрдВ рдкреНрд▓рдЧ рдХрд░рддрд╛ рд╣реИ, URL рдкрдереЛрдВ, рдХреБрдХреАрдЬрд╝ рдпрд╛ Accept-Language рд╣реЗрдбрд░ рд╕реЗ рд▓реЛрдХреЗрд▓ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ рдЕрдиреБрд░реЛрдз рдХреЗ рдмрд╛рдХреА рд╣рд┐рд╕реНрд╕реЛрдВ, рд╣реИрдВрдбрд▓рд░, рджреГрд╢реНрдпреЛрдВ рдФрд░ remix/component рдШрдЯрдХреЛрдВ рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рддрд░реНрдХ рдХреЗ рдкрд╛рд╕ рдХрд┐рдП рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред

    рдвреАрд▓реА JSON рдХреБрдВрдЬрд┐рдпреЛрдВ рдФрд░ рд░рдирдЯрд╛рдЗрдо рдкрд░ рд▓рд╛рдкрддрд╛-рдХреБрдВрдЬреА рдХреНрд░реИрд╢ рдХреЛ рдЕрд▓рд╡рд┐рджрд╛ рдХрд╣реЗрдВред Intlayer рд╕рднреА рдШреЛрд╖рд┐рдд рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ TypeScript рдЬрд╛рдВрдЪ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдпрджрд┐ рдХреЛрдИ рдЕрдиреБрд╡рд╛рдж рдЧрд╛рдпрдм рдпрд╛ рдЕрдорд╛рдиреНрдп рд╣реИ рддреЛ рдЖрдкрдХреЛ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд╕рдордп рд╣реА рдЪреЗрддрд╛рд╡рдиреА рджреЗрддрд╛ рд╣реИред

    Remix 3 рд╕рд░реНрд╡рд░ рдкрд░ JSX рдШрдЯрдХреЛрдВ рдХреЛ рд░реЗрдВрдбрд░ рдХрд░рддрд╛ рд╣реИ рдФрд░ HTML рдХреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдкрд░ рд╕реНрдЯреНрд░реАрдо рдХрд░рддрд╛ рд╣реИред рдЕрдиреБрд░реЛрдзрд┐рдд рднрд╛рд╖рд╛ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рдЯреЗрдХреНрд╕реНрдЯ рдЖрдЙрдЯрдкреБрдЯ рд╕реНрдЯреНрд░реАрдо рдореЗрдВ рдЬрд╛рддрд╛ рд╣реИред рдЬрдм рддрдХ рдХрд┐рд╕реА рдШрдЯрдХ рдХреЛ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ clientEntry рдХреЗ рд░реВрдк рдореЗрдВ рдЪрд┐рд╣реНрдирд┐рдд рди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реЛ, рдХрд┐рд╕реА рдХреНрд▓рд╛рдЗрдВрдЯ рд╣рд╛рдЗрдбреНрд░реЗрд╢рди рдмрдВрдбрд▓ рдпрд╛ рднрд╛рд░реА рдЕрдиреБрд╡рд╛рдж рдХреИрдЯрд▓реЙрдЧ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реЛрддреА рд╣реИред

    Intlayer рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рдгрд╛рдУрдВ (.content.ts) рдХреЛ рдЖрдкрдХреЗ рд░реВрдЯ рд▓реЙрдЬрд┐рдХ рдХреЗ рд╕рд╛рде рд░рдЦрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдмрдбрд╝реЗ рднрд╛рд╖рд╛ рдореЙрдбрд▓ (LLMs) рдХреЗ рд▓рд┐рдП рдЖрд╡рд╢реНрдпрдХ рдЯреЛрдХрди рд╕рдВрджрд░реНрдн рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред intlayer fill рдФрд░ intlayer test рдЬреИрд╕реЗ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд CLI рдХрдорд╛рдВрдб рдЖрдкрдХреЛ рдЕрдкрдиреЗ рд╕реНрд╡рдпрдВ рдХреЗ AI рдкреНрд░рджрд╛рддрд╛ рдХреА рд▓рд╛рдЧрдд рдкрд░ CI/CD рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдЕрдиреБрд╡рд╛рдж рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ рджреЗрддреЗ рд╣реИрдВред

    рдХреЛрдб-рдкреНрд░рдердо рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рд╕реЗ рдкрд░реЗ, Intlayer рдПрдХ рд╕реНрд╡-рд╣реЛрд╕реНрдЯреЗрдб рд╡рд┐рдЬрд╝реБрдЕрд▓ рдПрдбрд┐рдЯрд░ рдФрд░ рдПрдХ рд░рд┐рдореЛрдЯ CMS рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЧреИрд░-рддрдХрдиреАрдХреА рд╕рдВрдкрд╛рджрдХреЛрдВ рдФрд░ рдЕрдиреБрд╡рд╛рджрдХреЛрдВ рдХреЛ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рддреИрдирд╛рдд рдХрд┐рдП рдмрд┐рдирд╛ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИред

    рдЪрд░рдг-рджрд░-рдЪрд░рдг рдЧрд╛рдЗрдб

    ide.intlayer.org
    intlayer-remix-3-template.vercel.app

    GitHub рдкрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЯреЗрдореНрдкрд▓реЗрдЯ рджреЗрдЦреЗрдВред

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

      рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ рдкреИрдХреЗрдЬ рдореИрдиреЗрдЬрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ intlayer, remix-intlayer рдФрд░ remix (рд╕рдВрд╕реНрдХрд░рдг 3) рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:

      bash
      npm install intlayer remix-intlayer remix@next
      
      • intlayer: рдореБрдЦреНрдп рдЕрдВрддрд░реНрд░рд╛рд╖реНрдЯреНрд░реАрдпрдХрд░рдг рдЗрдВрдЬрди рдЬреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░рдмрдВрдзрди, рд╢рдмреНрджрдХреЛрд╢ рдШреЛрд╖рдгрд╛ (t(), Dictionary), CLI рдЙрдкрдХрд░рдг рдФрд░ рд░рдирдЯрд╛рдЗрдо рджреБрднрд╛рд╖рд┐рдпрд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
      • remix-intlayer: Remix 3 рдПрдХреАрдХрд░рдг: intlayer() рд░рд╛рдЙрдЯрд░ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓реЛрдХреЗрд▓ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рдФрд░ useIntlayer, useDictionary рдФрд░ useLocale рд╣реБрдХреНрд╕ рдЬреЛ рдЗрд╕реЗ рдмрд╛рдж рдореЗрдВ рдХрд╣реАрдВ рднреА рдкрдврд╝рддреЗ рд╣реИрдВред
      • remix: рдПрдХреАрдХреГрдд Remix 3 рдлреНрд░реЗрдорд╡рд░реНрдХ рдкреИрдХреЗрдЬ рдЬреЛ remix/router, remix/routes, remix/component, remix/middleware/render, рдФрд░ remix/node-fetch-server рдХрд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рддрд╛ рд╣реИред
    2. Intlayer рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ

      рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░

      рдЗрд╕ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ, remix-intlayer рдХрд╛ intlayer() рдорд┐рдбрд▓рд╡реЗрдпрд░ render() рдорд┐рдбрд▓рд╡реЗрдпрд░ рд╕реЗ рдкрд╣рд▓реЗ createRouter() рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рд░рд╛рдЙрдЯрд░ рдорд┐рд▓рд╛рди рд╕реЗ рдкрд╣рд▓реЗ рд▓реЛрдХреЗрд▓ рдкреНрд░реАрдлрд╝рд┐рдХреНрд╕ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд░реВрдЯреНрд╕ рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА :locale рд╕реЗрдЧрдореЗрдВрдЯ рдХреЗ src/routes.ts рдореЗрдВ рдПрдХ рдмрд╛рд░ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╢реЗрд╖ рдЕрдиреБрд░реЛрдз рдХреЛ рдПрдХ AsyncLocalStorage рд╕реНрдХреЛрдк рдХреЗ рдЕрдВрджрд░ рдЪрд▓рд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ useIntlayer / useLocale рд░реВрдЯ рд╣реИрдВрдбрд▓рд░реНрд╕ рдФрд░ remix/component рд╡реНрдпреВрдЬрд╝ рдореЗрдВ рдмрд┐рдирд╛ рдХрд┐рд╕реА рддрд░реНрдХ рдХреЗ рд▓реЛрдХреЗрд▓ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рдХрдВрдЯреЗрдВрдЯ рдШреЛрд╖рдгрд╛рдПрдВ src/ рдореЗрдВ рдЖрдкрдХреЗ рд╡реНрдпреВрдЬрд╝ рдХреЗ рд╕рд╛рде рд░рдЦреА рдЬрд╛рддреА рд╣реИрдВ:

      bash
      .
      тФЬтФАтФА src
      тФВ   тФЬтФАтФА home.content.ts               # Home page content declaration
      тФВ   тФЬтФАтФА router.tsx                    # createRouter() with the intlayer() and render() middleware
      тФВ   тФЬтФАтФА routes.ts                     # Type-safe routes, declared once without locale segment
      тФВ   тФЬтФАтФА server.ts                     # fetch handler (Node.js, Bun, Deno, Cloudflare Workers)
      тФВ   тФФтФАтФА views
      тФВ       тФЬтФАтФА document.tsx              # HTML shell setting <html lang dir> from the locale
      тФВ       тФФтФАтФА home.tsx                  # Localized page using useIntlayer / useLocale
      тФЬтФАтФА intlayer.config.ts
      тФЬтФАтФА package.json
      тФФтФАтФА tsconfig.json
      

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

      рдЕрдкрдиреА рд╕рдорд░реНрдерд┐рдд рднрд╛рд╖рд╛рдУрдВ рдФрд░ рдЕрдВрддрд░реНрд░рд╛рд╖реНрдЯреНрд░реАрдпрдХрд░рдг рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдЯ рдореЗрдВ intlayer.config.ts рдмрдирд╛рдПрдБ:

      intlayer.config.ts
      import { Locales, type IntlayerConfig } from "intlayer";
      
      const config: IntlayerConfig = {
        internationalization: {
          locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH, Locales.HINDI],
          defaultLocale: Locales.ENGLISH,
        },
      };
      
      export default config;
      
      рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд▓рд┐рдП, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджреЗрдЦреЗрдВред
    3. рдЕрдкрдиреА рдмрд╣реБрднрд╛рд╖реА рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ

      рдЕрдкрдиреА рд╕реНрдерд╛рдиреАрдпрдХреГрдд рд╕рд╛рдордЧреНрд░реА рдХреЛ рдПрдХ .content.ts рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ:

      src/home.content.ts
      import { t, type Dictionary } from "intlayer";
      
      const homeContent = {
        key: "home",
        content: {
          title: t({
            hi: "Remix 3 рдореЗрдВ рдЖрдкрдХрд╛ рд╕реНрд╡рд╛рдЧрдд рд╣реИ",
            en: "Welcome to Remix 3",
            fr: "Bienvenue sur Remix 3",
            es: "Bienvenido a Remix 3",
          }),
          description: t({
            hi: "рджреЗрд╢реА i18n рдХреЗ рд╕рд╛рде рдПрдХ рдХрдВрдкреЛрдЬрд╝реЗрдмрд▓, рд╡реЗрдм-рдорд╛рдирдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧред",
            en: "A composable, web-standard application with native i18n.",
            fr: "Une application composable bas├йe sur les standards web avec i18n native.",
            es: "Una aplicaci├│n componible basada en est├бndares web con i18n nativa.",
          }),
          switchLanguage: t({
            hi: "рднрд╛рд╖рд╛ рдмрджрд▓реЗрдВ:",
            en: "Switch language:",
            fr: "Changer de langue :",
            es: "Cambiar idioma:",
          }),
        },
      } satisfies Dictionary;
      
      export default homeContent;
      
      Intlayer JSON, YAML рдФрд░ CommonJS рдШреЛрд╖рдгрд╛ рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХрд╛ рднреА рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рдгрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджреЗрдЦреЗрдВред
    4. Intlayer рд╢рдмреНрджрдХреЛрд╢ рдмрдирд╛рдПрдБ

      TypeScript рдкреНрд░рдХрд╛рд░ рдФрд░ рд░рдирдЯрд╛рдЗрдо рд░рдЬрд┐рд╕реНрдЯреНрд░рд┐рдпрд╛рдВ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢рдмреНрджрдХреЛрд╢ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ:

      bash
      npx intlayer build
      

      рдпрд╣ рдЖрдкрдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ .intlayer рдЖрд░реНрдЯрд┐рдлреИрдХреНрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдкреВрд░реНрдг TypeScript рд╕реНрд╡рддрдГ рдкреВрд░реНрдгрддрд╛ рдФрд░ рддреАрд╡реНрд░ рд╢рдмреНрджрдХреЛрд╢ рд▓реБрдХрдЕрдк рд╕рдХреНрд╖рдо рд╣реЛрддрд╛ рд╣реИред

    5. Intlayer рдорд┐рдбрд▓рд╡реЗрдпрд░ рдЬреЛрдбрд╝реЗрдВ

      Remix 3 createRouter({ middleware: [...] }) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдХрдВрдкреЛрдЬреЗрдмрд▓ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

      remix-intlayer intlayer() рдорд┐рдбрд▓рд╡реЗрдпрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдпрд╣ рдирд┐рдореНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓реЛрдХреЗрд▓ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ:

      1. no-prefix рдХреЛ рдЫреЛрдбрд╝рдХрд░ рдкреНрд░рддреНрдпреЗрдХ рд░реВрдЯрд┐рдВрдЧ рдореЛрдб рдореЗрдВ URL: рдкрде рдЙрдкрд╕рд░реНрдЧ (рдЙрджрд╛. /hi рдпрд╛ /en) рдпрд╛ ?locale= рдЦреЛрдЬ рдкреИрд░рд╛рдореАрдЯрд░ред
      2. рдХреНрд▓рд╛рдЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛ рд▓реЛрдХреЗрд▓: рд╕реНрдЯреЛрд░реЗрдЬ рдХреБрдХреА (INTLAYER_LOCALE) рдпрд╛ рдХрд╕реНрдЯрдо рд╣реЗрдбрд░ (x-intlayer-locale)ред
      3. рдорд╛рдирдХ Accept-Language рд╡рд╛рд░реНрддрд╛, рдЖрдкрдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдП defaultLocale рдкрд░ рд╡рд╛рдкрд╕ рдЖрдирд╛ред

      рдкрд░рд┐рдгрд╛рдо рдХреЛ Remix рдЕрдиреБрд░реЛрдз рд╕рдВрджрд░реНрдн рдореЗрдВ locale, defaultLocale рдФрд░ availableLocales рдХреЗ рд╕рд╛рде context.intlayer (рдпрд╛ context.get(Intlayer)) рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдорд┐рдбрд▓рд╡реЗрдпрд░ рддрдм рдЙрд╕ рд╕рдВрджрд░реНрдн рд╕реЗ рдмрдВрдзреЗ AsyncLocalStorage рджрд╛рдпрд░реЗ рдХреЗ рдЕрдВрджрд░ рд╢реЗрд╖ рдЕрдиреБрд░реЛрдз рдХреЛ рдЪрд▓рд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдкреИрдХреЗрдЬ рдХреЗ рд╣реБрдХреНрд╕ рдмрд┐рдирд╛ рдХрд┐рд╕реА рддрд░реНрдХ рдХреЗ рд▓реЛрдХреЗрд▓ рдХреЛ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЪрд╛рд╣реЗ рд╡рд╣ рд░реВрдЯ рд╣реИрдВрдбрд▓рд░, рджреГрд╢реНрдп рдпрд╛ remix/component рдШрдЯрдХ рд╣реЛрдВ:

      typescript
      import { useIntlayer, useLocale } from "remix-intlayer";
      
      // рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЗ рдмрд╛рдж рдХрд╣реАрдВ рднреА
      const { locale, availableLocales } = useLocale();
      const { title } = useIntlayer("home");
      

      useIntlayer("home", "fr") рдпрд╛ useIntlayer("faq", { item: 2 }) рдПрдХ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рд▓реЛрдХреЗрд▓ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ useDictionary(homeContent) рдПрдХ рдХреБрдВрдЬреА рдХреЗ рдмрдЬрд╛рдп рдПрдХ рдЖрдпрд╛рддрд┐рдд рд╢рдмреНрджрдХреЛрд╢ рдкрдврд╝рддрд╛ рд╣реИред рдПрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рдмрд╛рд╣рд░ рд╣реБрдХреНрд╕ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд▓реЛрдХреЗрд▓ рдкрд░ рд╡рд╛рдкрд╕ рдЖ рдЬрд╛рддреЗ рд╣реИрдВред

      рдорд┐рдбрд▓рд╡реЗрдпрд░ рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░ Intlayer рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХреЛ рднреА рддреИрдпрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рдПрдХ рдЫреВрдЯрд╛ рд╣реБрдЖ intlayer build рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдХреЛ рдЦрд╛рд▓реА рди рдЫреЛрдбрд╝реЗред
      рдХреЗрд╡рд▓ locale рд░рд┐рдЬрд╝реЙрд▓реНрдпреВрд╢рди рд░рдЦрдиреЗ рдФрд░ рд░реВрдЯрд┐рдВрдЧ рдХреЛ рд╕реНрд╡рдпрдВ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП intlayer.config.ts рдореЗрдВ routing.enableProxy: false рд╕реЗрдЯ рдХрд░реЗрдВред intlayer({ ignore }) рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрд░реЛрдзреЛрдВ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ API рдкреНрд░реАрдлрд╝рд┐рдХреНрд╕) рдХреЛ рдЕрдкрд░рд┐рд╡рд░реНрддрд┐рдд рдЫреЛрдбрд╝ рджреЗрддрд╛ рд╣реИ, рдФрд░ intlayer({ isDevServer }) рдпрд╣ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдбрд┐рдлрд╝реЙрд▓реНрдЯ enableProxy рдСрдЯреЛ рдореЛрдб рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд locale рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВред
    6. рдЯрд╛рдЗрдк-рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдЯреНрд╕ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ

      remix/routes рд╕реЗ route() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд░реВрдЯреНрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:

      src/routes.ts
      import { route } from "remix/routes";
      
      export const routes = route({
        // рдбрд┐рдлрд╝реЙрд▓реНрдЯ рднрд╛рд╖рд╛ рд░реВрдЯ
        home: "/",
      
        // рдЧрддрд┐рд╢реАрд▓ :locale рдЦрдВрдб рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдиреАрдпрдХреГрдд рд░реВрдЯ
        localizedHome: "/:locale",
      });
      

      route() рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдкреВрд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЯрд╛рдЗрдк-рд╕реБрд░рдХреНрд╖рд┐рдд URL рдЬрдирд░реЗрд╢рди рдорд┐рд▓рддрд╛ рд╣реИ:

      typescript
      routes.home.href(); // "/"
      routes.localizedHome.href({ locale: "hi" }); // "/hi"
      
    7. JSX рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдиреАрдпрдХреГрдд рдкреГрд╖реНрдареЛрдВ рдХреЛ рд░реЗрдВрдбрд░ рдХрд░реЗрдВ

      Remix 3 remix/component рдХреЗ JSX рдШрдЯрдХреЛрдВ рдХреЗ рд╕рд╛рде UI рдХреЛ рд░реЗрдВрдбрд░ рдХрд░рддрд╛ рд╣реИред рдПрдХ рдШрдЯрдХ рдПрдХ рд╕реЗрдЯрдЕрдк рдлрд╝рдВрдХреНрд╢рди рд╣реИ рдЬреЛ рдПрдХ Handle рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдПрдХ рд░реЗрдВрдбрд░ рдлрд╝рдВрдХреНрд╢рди рд▓реМрдЯрд╛рддрд╛ рд╣реИред рд╕реЗрдЯрдЕрдк рдкреНрд░рддрд┐ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдПрдХ рдмрд╛рд░ рдЪрд▓рддрд╛ рд╣реИ, рд░реЗрдВрдбрд░ рдкреНрд░рддреНрдпреЗрдХ рдЕрдкрдбреЗрдЯ рдкрд░ рдЪрд▓рддрд╛ рд╣реИ, рдФрд░ рдкреНрд░реЙрдкреНрд╕ рдХреЛ handle.props рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкрдврд╝рд╛ рдЬрд╛рддрд╛ рд╣реИред

      рдПрдХ рд╕рд╛рдЭрд╛ Document рд╢реЗрд▓ рд╕реЗ рд╢реБрд░реВ рдХрд░реЗрдВ рдЬреЛ рдорд┐рдбрд▓рд╡реЗрдпрд░ рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд┐рдП рдЧрдП рд▓реЛрдХреЗрд▓ рд╕реЗ <html lang="..." dir="..."> рд╡рд┐рд╢реЗрд╖рддрд╛рдУрдВ рдХреЛ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ:

      src/views/document.tsx
      import { getHTMLTextDir } from "intlayer";
      import { useLocale } from "remix-intlayer";
      import type { Handle, RemixNode } from "remix/component";
      
      type DocumentProps = {
        title: string;
        children?: RemixNode;
      };
      
      export const Document = (handle: Handle<DocumentProps>) => () => {
        const { title, children } = handle.props;
        const { locale } = useLocale();
      
        return (
          <html lang={locale} dir={getHTMLTextDir(locale)}>
            <head>
              <meta charSet="utf-8" />
              <meta name="viewport" content="width=device-width, initial-scale=1" />
              <title>{title}</title>
            </head>
            <body>{children}</body>
          </html>
        );
      };
      

      рдлрд┐рд░ рд╣реЛрдо рдкреЗрдЬ рдмрдирд╛рдПрдВред рдпрд╣ useIntlayer рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдиреАрдпрдХреГрдд рд╢рдмреНрджрдХреЛрд╢ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдПрдХ рднрд╛рд╖рд╛ рд╕реНрд╡рд┐рдЪрд░ рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реИ:

      src/views/home.tsx
      import { getLocaleName, getLocalizedUrl, getPathWithoutLocale } from "intlayer";
      import { useIntlayer, useLocale } from "remix-intlayer";
      import { Document } from "./document";
      
      export const HomePage = () => () => {
        const { locale, availableLocales } = useLocale();
        const home = useIntlayer("home");
        const pathWithoutLocale = getPathWithoutLocale();
      
        return (
          <Document title={home.title}>
            <header>
              <nav aria-label="Languages">
                <span>{home.switchLanguage}</span>
                <ul>
                  {availableLocales.map((localeItem) => {
                    const isActive = localeItem === locale;
      
                    return (
                      <li key={localeItem} class="p-1">
                        <a
                          href={getLocalizedUrl(pathWithoutLocale, localeItem)}
                          class={isActive ? "active" : undefined}
                          aria-current={isActive ? "page" : undefined}
                        >
                          {getLocaleName(localeItem, locale)}
                        </a>
                      </li>
                    );
                  })}
                </ul>
              </nav>
            </header>
            <main>
              <h1>{home.title}</h1>
              <p>{home.description}</p>
            </main>
          </Document>
        );
      };
      
      Remix JSX React рдирд╣реАрдВ рд╣реИ: class рдЬреИрд╕рд╛ рд╣реИ рд╡реИрд╕рд╛ рд╣реА рд▓рд┐рдЦрд╛ рдЬрд╛рддрд╛ рд╣реИ (className рднреА рд╕реНрд╡реАрдХрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ), рдФрд░ рдкреБрди: рд░реЗрдВрдбрд░рд┐рдВрдЧ рдХреЛ handle.update() рдХреЗ рд╕рд╛рде рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдЯреНрд░рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдкреНрд░рдХреНрд╖реЗрдкрд┐рдд рдорд╛рди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдмрдЪ рдЬрд╛рддреЗ рд╣реИрдВред Intlayer рд╣реБрдХреНрд╕ рдЕрдиреБрд░реЛрдз рджрд╛рдпрд░реЗ рдХреЛ рдкрдврд╝рдиреЗ рд╡рд╛рд▓реЗ рд╕рд╛рджреЗ рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рд╕реЗрдЯрдЕрдк рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рд░реЗрдВрдбрд░ рдлрд╝рдВрдХреНрд╢рди рджреЛрдиреЛрдВ рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
    8. рд░рд╛рдЙрдЯрд░ рдФрд░ рд╕рд░реНрд╡рд░ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ

      Intlayer рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЗ рдЖрдЧреЗ remix/middleware/render рд╕реЗ render() рдорд┐рдбрд▓рд╡реЗрдпрд░ рдЬреЛрдбрд╝реЗрдВред рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдкрд░ context.render(node, init) рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ JSX рдЯреНрд░реА рдХреЛ HTML Response рдореЗрдВ рд╕реНрдЯреНрд░реАрдо рдХрд░рддрд╛ рд╣реИ (рд╢реБрд░реБрдЖрдд рдореЗрдВ <!DOCTYPE html> рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдФрд░ Content-Type рд╣реЗрдбрд░ рд╕реЗрдЯ рдХрд░рддрд╛ рд╣реИ):

      src/router.tsx
      import { isDeclaredLocale } from "intlayer";
      import { intlayer } from "remix-intlayer";
      import { render } from "remix/middleware/render";
      import { createRouter } from "remix/router";
      import { routes } from "./routes";
      import { HomePage } from "./views/home";
      
      // 1. Initialize router with Intlayer + render middleware
      export const router = createRouter({
        middleware: [intlayer(), render()],
      });
      
      // 2. Map route handlers
      router.map(routes, {
        actions: {
          // Default locale route
          home(context) {
            return context.render(<HomePage />);
          },
      
          // Localized route
          localizedHome(context) {
            if (!isDeclaredLocale(context.params.locale)) {
              return new Response("Not Found", { status: 404 });
            }
            return context.render(<HomePage />);
          },
        },
      });
      
      context.render рджреВрд╕рд░реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд╡реИрдХрд▓реНрдкрд┐рдХ ResponseInit рд╕реНрд╡реАрдХрд╛рд░ рдХрд░рддрд╛ рд╣реИ, рдЙрджрд╛. context.render(<NotFoundPage />, { status: 404 })ред рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд▓реЛрдХреЗрд▓ рд╣реИрдВрдбрд▓рд░ рд╕реЗ context.intlayer.locale рдХреЗ рд░реВрдк рдореЗрдВ рдкрд╣реБрдБрдЪрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП Response.json рдкреЗрд▓реЛрдб рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдПред

      рдЕрдВрдд рдореЗрдВ, рдПрдХ рдорд╛рдирдХ fetch рд╣реИрдВрдбрд▓рд░ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░рд╛рдЙрдЯрд░ рдХреЛ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВред рд╡рд╣реА рд░рд╛рдЙрдЯрд░ Node.js, Bun, Deno рдФрд░ Cloudflare Workers рдкрд░ рдЪрд▓рддрд╛ рд╣реИ:

      src/server.ts
      import * as http from "node:http";
      import { createRequestListener } from "remix/node-fetch-server";
      import { router } from "./router";
      
      const PORT = Number(process.env.PORT || 3000);
      
      // Node.js
      const server = http.createServer(
        createRequestListener((request) => router.fetch(request))
      );
      
      server.listen(PORT, () => {
        console.log(`рд╕рд░реНрд╡рд░ http://localhost:${PORT} рдкрд░ рдЪрд▓ рд░рд╣рд╛ рд╣реИ`);
      });
      
      // Bun / Deno / Cloudflare Workers
      export default {
        port: PORT,
        fetch(request: Request) {
          return router.fetch(request);
        },
      };
      
    9. рдЕрдиреБрд╡рд╛рдж рдХрд╛ рдСрдбрд┐рдЯ рдХрд░реЗрдВ рдФрд░ рд╕реНрд╡рддрдГ рднрд░реЗрдВ

      Intlayer рдЕрдиреБрдкрд▓рдмреНрдз рдЕрдиреБрд╡рд╛рджреЛрдВ рдХрд╛ рдСрдбрд┐рдЯ рдХрд░рдиреЗ рдФрд░ AI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ CLI рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:

      bash
      # рд▓рд╛рдкрддрд╛ рдЕрдиреБрд╡рд╛рджреЛрдВ рдХрд╛ рдСрдбрд┐рдЯ рдХрд░реЗрдВ
      npx intlayer test
      
      # AI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЫреВрдЯреЗ рд╣реБрдП рдЕрдиреБрд╡рд╛рдж рднрд░реЗрдВ
      npx intlayer fill
      

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

    JSX рдХреЛ remix/component рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреА tsconfig.json рдореЗрдВ рдЙрддреНрдкрдиреНрди .intlayer рдкреНрд░рдХрд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

    tsconfig.json
    {
      "compilerOptions": {
        "moduleResolution": "Bundler",
        "module": "ESNext",
        "target": "ESNext",
        "jsx": "react-jsx",
        "jsxImportSource": "remix/component",
        "skipLibCheck": true,
        "strict": true
      },
      "include": ["src/**/*", ".intlayer/**/*.ts"]
    }
    
    jsxImportSource: "remix/component" рдХреЗ рдХрд╛рд░рдг рд╣реА <HomePage /> React рдХреЗ рдмрдЬрд╛рдп Remix рдХреЗ createElement рдкрд░ рд╣рд▓ рд╣реЛрддрд╛ рд╣реИред

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

    Remix 3 рдФрд░ Intlayer рдХреЗ рд╕рд╛рде, рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╕реБрд╡реНрдпрд╡рд╕реНрдерд┐рдд, рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рд╣реБрдЖ рдФрд░ рд░рдирдЯрд╛рдЗрдо-рдкреЛрд░реНрдЯреЗрдмрд▓ рд╕реНрдЯреИрдХ рд╣реИ рдЬреЛ рдЦреБрд▓реЗ рд╡реЗрдм рдорд╛рдирдХреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИред рдЖрдкрдХрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рд╛рдзрд╛рд░рдг рд╕реНрдерд╛рдиреАрдпрдХреГрдд рдорд╛рд░реНрдХреЗрдЯрд┐рдВрдЧ рдкреЗрдЬреЛрдВ рд╕реЗ рд▓реЗрдХрд░ рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рд╡рд┐рддрд░рд┐рдд рдФрд░ рдПрдЬ рдкрд░ рд░реЗрдВрдбрд░ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕реЗрд╡рд╛рдУрдВ рддрдХ рд╕рд╣рдЬрддрд╛ рд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред