рдЗрд╕ рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЯреЗрдореНрдкрд▓реЗрдЯ рдЙрдкрд▓рдмреНрдз рд╣реИред
рдпрд╣ рдкреГрд╖реНрда рдЯреЗрдореНрдкрд▓реЗрдЯ рдХрд╛ рд▓рд╛рдЗрд╡ рдбреЗрдореЛ рд▓рд┐рдВрдХ рдХрд░рддрд╛ рд╣реИред
рдЕрдкрдиреЗ рдкреНрд░рд╢реНрди рдХреЛ рдкреВрдЫреЗрдВ рдФрд░ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╛ рд╕рд╛рд░рд╛рдВрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ, рдЗрд╕ рдкреГрд╖реНрда рдФрд░ рдЖрдкрдХреЗ рдЪреБрдиреЗ рд╣реБрдП AI рдкреНрд░рджрд╛рддрд╛ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ
рд╕рдВрд╕реНрдХрд░рдг рдЗрддрд┐рд╣рд╛рд╕
- "remix-intlayer рдорд┐рдбрд▓рд╡реЗрдпрд░ рдФрд░ рд╣реБрдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ"v9.5.519/9/2026
- "Remix 3 рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрднрд┐рдХ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝"v9.5.09/9/2026
рдЗрд╕ рдкреГрд╖реНрда рдХреА рд╕рд╛рдордЧреНрд░реА рдПрдХ AI рджреНрд╡рд╛рд░рд╛ рдЕрдиреБрд╡рд╛рджрд┐рдд рдХреА рдЧрдИ рд╣реИред
рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рдореВрд▓ рд╕рд╛рдордЧреНрд░реА рдХреЗ рдЕрдВрддрд┐рдо рд╕рдВрд╕реНрдХрд░рдг рджреЗрдЦреЗрдВрдЕрдЧрд░ рдЖрдкрдХреЗ рдкрд╛рд╕ рдЗрд╕ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЛ рд╕реБрдзрд╛рд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╡рд┐рдЪрд╛рд░ рд╣реИ, рддреЛ рдХреГрдкрдпрд╛ GitHub рдкрд░ рдПрдХ рдкреБрд▓ рдЕрдиреБрд░реЛрдз рд╕рдмрдорд┐рдЯ рдХрд░рдХреЗ рдпреЛрдЧрджрд╛рди рджреЗрдиреЗ рдореЗрдВ рд╕рдВрдХреЛрдЪ рди рдХрд░реЗрдВред
рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХреЗ рд▓рд┐рдП GitHub рд▓рд┐рдВрдХрджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдХрд╛ Markdown рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
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 рдЯреНрд░реА рдХреЛ HTMLResponseрдореЗрдВ рд╕реНрдЯреНрд░реАрдо рдХрд░рддрд╛ рд╣реИред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 рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЧреИрд░-рддрдХрдиреАрдХреА рд╕рдВрдкрд╛рджрдХреЛрдВ рдФрд░ рдЕрдиреБрд╡рд╛рджрдХреЛрдВ рдХреЛ рдХреЛрдб рдХреЛ рдлрд┐рд░ рд╕реЗ рддреИрдирд╛рдд рдХрд┐рдП рдмрд┐рдирд╛ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рдорд┐рд▓рддреА рд╣реИред
рдЪрд░рдг-рджрд░-рдЪрд░рдг рдЧрд╛рдЗрдб
GitHub рдкрд░ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЯреЗрдореНрдкрд▓реЗрдЯ рджреЗрдЦреЗрдВред
рдирд┐рд░реНрднрд░рддрд╛рдПрдБ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ
рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ рдкреИрдХреЗрдЬ рдореИрдиреЗрдЬрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ
intlayer,remix-intlayerрдФрд░remix(рд╕рдВрд╕реНрдХрд░рдг 3) рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:bashрдХреЛрдб рдХреЙрдкреА рдХрд░реЗрдВрдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
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рдХрд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд░рддрд╛ рд╣реИред
Intlayer рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ
рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░
рдЗрд╕ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ,
remix-intlayerрдХрд╛intlayer()рдорд┐рдбрд▓рд╡реЗрдпрд░render()рдорд┐рдбрд▓рд╡реЗрдпрд░ рд╕реЗ рдкрд╣рд▓реЗcreateRouter()рдореЗрдВ рдкрдВрдЬреАрдХреГрдд рд╣реЛрддрд╛ рд╣реИред рдпрд╣ рд░рд╛рдЙрдЯрд░ рдорд┐рд▓рд╛рди рд╕реЗ рдкрд╣рд▓реЗ рд▓реЛрдХреЗрд▓ рдкреНрд░реАрдлрд╝рд┐рдХреНрд╕ рдХреЛ рд╣рдЯрд╛ рджреЗрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рд░реВрдЯреНрд╕ рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА:localeрд╕реЗрдЧрдореЗрдВрдЯ рдХреЗsrc/routes.tsрдореЗрдВ рдПрдХ рдмрд╛рд░ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдпрд╣ рд╢реЗрд╖ рдЕрдиреБрд░реЛрдз рдХреЛ рдПрдХAsyncLocalStorageрд╕реНрдХреЛрдк рдХреЗ рдЕрдВрджрд░ рдЪрд▓рд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗuseIntlayer/useLocaleрд░реВрдЯ рд╣реИрдВрдбрд▓рд░реНрд╕ рдФрд░remix/componentрд╡реНрдпреВрдЬрд╝ рдореЗрдВ рдмрд┐рдирд╛ рдХрд┐рд╕реА рддрд░реНрдХ рдХреЗ рд▓реЛрдХреЗрд▓ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рдХрдВрдЯреЗрдВрдЯ рдШреЛрд╖рдгрд╛рдПрдВsrc/рдореЗрдВ рдЖрдкрдХреЗ рд╡реНрдпреВрдЬрд╝ рдХреЗ рд╕рд╛рде рд░рдЦреА рдЬрд╛рддреА рд╣реИрдВ:bashрдХреЛрдб рдХреЙрдкреА рдХрд░реЗрдВрдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди
рдЕрдкрдиреА рд╕рдорд░реНрдерд┐рдд рднрд╛рд╖рд╛рдУрдВ рдФрд░ рдЕрдВрддрд░реНрд░рд╛рд╖реНрдЯреНрд░реАрдпрдХрд░рдг рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЛ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЗ рд░реВрдЯ рдореЗрдВ
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;рдЕрддрд┐рд░рд┐рдХреНрдд рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЗ рд▓рд┐рдП, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджреЗрдЦреЗрдВред
рдЕрдкрдиреА рдмрд╣реБрднрд╛рд╖реА рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ
рдЕрдкрдиреА рд╕реНрдерд╛рдиреАрдпрдХреГрдд рд╕рд╛рдордЧреНрд░реА рдХреЛ рдПрдХ
.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 рдШреЛрд╖рдгрд╛ рдкреНрд░рд╛рд░реВрдкреЛрдВ рдХрд╛ рднреА рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рдгрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджреЗрдЦреЗрдВред
Intlayer рд╢рдмреНрджрдХреЛрд╢ рдмрдирд╛рдПрдБ
TypeScript рдкреНрд░рдХрд╛рд░ рдФрд░ рд░рдирдЯрд╛рдЗрдо рд░рдЬрд┐рд╕реНрдЯреНрд░рд┐рдпрд╛рдВ рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢рдмреНрджрдХреЛрд╢ рдкрд░рд┐рднрд╛рд╖рд╛рдУрдВ рдХреЛ рд╕рдВрдХрд▓рд┐рдд рдХрд░реЗрдВ:
bashрдХреЛрдб рдХреЙрдкреА рдХрд░реЗрдВрдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
рдпрд╣ рдЖрдкрдХреА рд╕рд╛рдордЧреНрд░реА рдХреЛ
.intlayerрдЖрд░реНрдЯрд┐рдлреИрдХреНрдЯ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╕рдВрдХрд▓рд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдкреВрд░реНрдг TypeScript рд╕реНрд╡рддрдГ рдкреВрд░реНрдгрддрд╛ рдФрд░ рддреАрд╡реНрд░ рд╢рдмреНрджрдХреЛрд╢ рд▓реБрдХрдЕрдк рд╕рдХреНрд╖рдо рд╣реЛрддрд╛ рд╣реИредIntlayer рдорд┐рдбрд▓рд╡реЗрдпрд░ рдЬреЛрдбрд╝реЗрдВ
Remix 3
createRouter({ middleware: [...] })рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдПрдХ рдХрдВрдкреЛрдЬреЗрдмрд▓ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдкрд╛рдЗрдкрд▓рд╛рдЗрди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИредremix-intlayerintlayer()рдорд┐рдбрд▓рд╡реЗрдпрд░ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред рдкреНрд░рддреНрдпреЗрдХ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдпрд╣ рдирд┐рдореНрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд▓реЛрдХреЗрд▓ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ:no-prefixрдХреЛ рдЫреЛрдбрд╝рдХрд░ рдкреНрд░рддреНрдпреЗрдХ рд░реВрдЯрд┐рдВрдЧ рдореЛрдб рдореЗрдВ URL: рдкрде рдЙрдкрд╕рд░реНрдЧ (рдЙрджрд╛./hiрдпрд╛/en) рдпрд╛?locale=рдЦреЛрдЬ рдкреИрд░рд╛рдореАрдЯрд░ред- рдХреНрд▓рд╛рдЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ рд╕рд╣реЗрдЬрд╛ рдЧрдпрд╛ рд▓реЛрдХреЗрд▓: рд╕реНрдЯреЛрд░реЗрдЬ рдХреБрдХреА (
INTLAYER_LOCALE) рдпрд╛ рдХрд╕реНрдЯрдо рд╣реЗрдбрд░ (x-intlayer-locale)ред - рдорд╛рдирдХ
Accept-Languageрд╡рд╛рд░реНрддрд╛, рдЖрдкрдХреЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдП рдЧрдПdefaultLocaleрдкрд░ рд╡рд╛рдкрд╕ рдЖрдирд╛ред
рдкрд░рд┐рдгрд╛рдо рдХреЛ Remix рдЕрдиреБрд░реЛрдз рд╕рдВрджрд░реНрдн рдореЗрдВ
locale,defaultLocaleрдФрд░availableLocalesрдХреЗ рд╕рд╛рдеcontext.intlayer(рдпрд╛context.get(Intlayer)) рдХреЗ рд░реВрдк рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдорд┐рдбрд▓рд╡реЗрдпрд░ рддрдм рдЙрд╕ рд╕рдВрджрд░реНрдн рд╕реЗ рдмрдВрдзреЗAsyncLocalStorageрджрд╛рдпрд░реЗ рдХреЗ рдЕрдВрджрд░ рд╢реЗрд╖ рдЕрдиреБрд░реЛрдз рдХреЛ рдЪрд▓рд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдкреИрдХреЗрдЬ рдХреЗ рд╣реБрдХреНрд╕ рдмрд┐рдирд╛ рдХрд┐рд╕реА рддрд░реНрдХ рдХреЗ рд▓реЛрдХреЗрд▓ рдХреЛ рдкрдврд╝ рд╕рдХрддреЗ рд╣реИрдВ, рдЪрд╛рд╣реЗ рд╡рд╣ рд░реВрдЯ рд╣реИрдВрдбрд▓рд░, рджреГрд╢реНрдп рдпрд╛remix/componentрдШрдЯрдХ рд╣реЛрдВ:typescriptрдХреЛрдб рдХреЙрдкреА рдХрд░реЗрдВрдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
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 рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХреЛ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдпрд╛ рдирд╣реАрдВредрдЯрд╛рдЗрдк-рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдЯреНрд╕ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ
remix/routesрд╕реЗroute()рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд░реВрдЯреНрд╕ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░реЗрдВ:src/routes.tsрдХреЛрдб рдХреЙрдкреА рдХрд░реЗрдВрдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
import { route } from "remix/routes"; export const routes = route({ // рдбрд┐рдлрд╝реЙрд▓реНрдЯ рднрд╛рд╖рд╛ рд░реВрдЯ home: "/", // рдЧрддрд┐рд╢реАрд▓ :locale рдЦрдВрдб рдХреЗ рд╕рд╛рде рд╕реНрдерд╛рдиреАрдпрдХреГрдд рд░реВрдЯ localizedHome: "/:locale", });route()рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдЖрдкрдХреЛ рдЕрдкрдиреЗ рдкреВрд░реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдЯрд╛рдЗрдк-рд╕реБрд░рдХреНрд╖рд┐рдд URL рдЬрдирд░реЗрд╢рди рдорд┐рд▓рддрд╛ рд╣реИ:typescriptрдХреЛрдб рдХреЙрдкреА рдХрд░реЗрдВрдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
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 рд╣реБрдХреНрд╕ рдЕрдиреБрд░реЛрдз рджрд╛рдпрд░реЗ рдХреЛ рдкрдврд╝рдиреЗ рд╡рд╛рд▓реЗ рд╕рд╛рджреЗ рдлрд╝рдВрдХреНрд╢рди рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЙрдиреНрд╣реЗрдВ рд╕реЗрдЯрдЕрдк рдлрд╝рдВрдХреНрд╢рди рдпрд╛ рд░реЗрдВрдбрд░ рдлрд╝рдВрдХреНрд╢рди рджреЛрдиреЛрдВ рд╕реЗ рдмреБрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИредрд░рд╛рдЙрдЯрд░ рдФрд░ рд╕рд░реНрд╡рд░ рдХреЛ рдХрдиреЗрдХреНрдЯ рдХрд░реЗрдВ
Intlayer рдорд┐рдбрд▓рд╡реЗрдпрд░ рдХреЗ рдЖрдЧреЗ
remix/middleware/renderрд╕реЗrender()рдорд┐рдбрд▓рд╡реЗрдпрд░ рдЬреЛрдбрд╝реЗрдВред рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдкрд░context.render(node, init)рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддрд╛ рд╣реИ, рдЬреЛ JSX рдЯреНрд░реА рдХреЛ HTMLResponseрдореЗрдВ рд╕реНрдЯреНрд░реАрдо рдХрд░рддрд╛ рд╣реИ (рд╢реБрд░реБрдЖрдд рдореЗрдВ<!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); }, };рдЕрдиреБрд╡рд╛рдж рдХрд╛ рдСрдбрд┐рдЯ рдХрд░реЗрдВ рдФрд░ рд╕реНрд╡рддрдГ рднрд░реЗрдВ
Intlayer рдЕрдиреБрдкрд▓рдмреНрдз рдЕрдиреБрд╡рд╛рджреЛрдВ рдХрд╛ рдСрдбрд┐рдЯ рдХрд░рдиреЗ рдФрд░ AI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЙрдиреНрд╣реЗрдВ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ CLI рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:
bashрдХреЛрдб рдХреЙрдкреА рдХрд░реЗрдВрдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
TypeScript рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди
JSX рдХреЛ remix/component рд░рдирдЯрд╛рдЗрдо рдкрд░ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреА tsconfig.json рдореЗрдВ рдЙрддреНрдкрдиреНрди .intlayer рдкреНрд░рдХрд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:
рдХреЛрдб рдХреЛ рдХреНрд▓рд┐рдкрдмреЛрд░реНрдб рдкрд░ рдХреЙрдкреА рдХрд░реЗрдВ
jsxImportSource: "remix/component"рдХреЗ рдХрд╛рд░рдг рд╣реА<HomePage />React рдХреЗ рдмрдЬрд╛рдп Remix рдХреЗcreateElementрдкрд░ рд╣рд▓ рд╣реЛрддрд╛ рд╣реИред
рдирд┐рд╖реНрдХрд░реНрд╖
Remix 3 рдФрд░ Intlayer рдХреЗ рд╕рд╛рде, рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╕реБрд╡реНрдпрд╡рд╕реНрдерд┐рдд, рдкреВрд░реА рддрд░рд╣ рд╕реЗ рдЯрд╛рдЗрдк рдХрд┐рдпрд╛ рд╣реБрдЖ рдФрд░ рд░рдирдЯрд╛рдЗрдо-рдкреЛрд░реНрдЯреЗрдмрд▓ рд╕реНрдЯреИрдХ рд╣реИ рдЬреЛ рдЦреБрд▓реЗ рд╡реЗрдм рдорд╛рдирдХреЛрдВ рдХрд╛ рдкрд╛рд▓рди рдХрд░рддрд╛ рд╣реИред рдЖрдкрдХрд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд╕рд╛рдзрд╛рд░рдг рд╕реНрдерд╛рдиреАрдпрдХреГрдд рдорд╛рд░реНрдХреЗрдЯрд┐рдВрдЧ рдкреЗрдЬреЛрдВ рд╕реЗ рд▓реЗрдХрд░ рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рд╡рд┐рддрд░рд┐рдд рдФрд░ рдПрдЬ рдкрд░ рд░реЗрдВрдбрд░ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рд╕реЗрд╡рд╛рдУрдВ рддрдХ рд╕рд╣рдЬрддрд╛ рд╕реЗ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░ рд╕рдХрддрд╛ рд╣реИред
