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

    Intlayer рдХреЗ рд╕рд╛рде рдЕрдкрдиреА Astro + Svelte рд╕рд╛рдЗрдЯ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░реЗрдВ

    ide.intlayer.org
    intlayer-astro-template.vercel.app

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

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

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

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

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

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

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

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

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

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

    Astro + Svelte рдореЗрдВ Intlayer рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд░рдг-рджрд░-рдЪрд░рдг рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛

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

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

      рдЕрдкрдиреЗ рдкрд╕рдВрджреАрджрд╛ рдкреИрдХреЗрдЬ рдореИрдиреЗрдЬрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЖрд╡рд╢реНрдпрдХ рдкреИрдХреЗрдЬ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реЗрдВ:

      bash
      npm install intlayer astro-intlayer svelte svelte-intlayer @astrojs/svelte
      
      npx intlayer init
      
      рдпрджрд┐ рдЖрдк рдЕрдкрдиреА рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдПрдЯреНрд░рд┐рдмреНрдпреВрдЯ рдореЗрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ alt, title, href, aria-label, рдЖрджрд┐, рддреЛ рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ:
      tsx
      <img src={content.image.src.value} alt={content.image.value} />
      <img src={content.image.src.toString()} alt={content.image.toString()} />
      <img src={String(content.image.src)} alt={String(content.image)} />
      
      bash
      npm install intlayer astro-intlayer svelte svelte-intlayer @astrojs/svelte
      
      • intlayer рдореБрдЦреНрдп рдкреИрдХреЗрдЬ рдЬреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░рдмрдВрдзрди, рдЕрдиреБрд╡рд╛рдж, рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рдгрд╛, рдЯреНрд░рд╛рдВрд╕рдкрд╛рдЗрд▓реЗрд╢рди рдФрд░ CLI рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП i18n рдЯреВрд▓ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

      • astro-intlayer Intlayer рдХреЛ Vite рдмрдВрдбрд▓рд░ рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Astro рдПрдХреАрдХрд░рдг рдкреНрд▓рдЧрдЗрди, рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓реЛрдХреЗрд▓ рдХреЛ Astro.locals.intlayer рдореЗрдВ рд╣рд▓ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рдорд┐рдбрд▓рд╡реЗрдпрд░, рдФрд░ useIntlayer / useDictionary / useLocale рд╣реБрдХреНрд╕ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред рд╡рд╣реА рдЖрдпрд╛рдд рдкрде рдЖрдкрдХреЗ .astro рдлреНрд░рдВрдЯрдореИрдЯ рдореЗрдВ рд╕рд░реНрд╡рд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдФрд░ <script> рдмреНрд▓реЙрдХ рдореЗрдВ рдХреНрд▓рд╛рдЗрдВрдЯ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди (vanilla-intlayer рджреНрд╡рд╛рд░рд╛ рд╕рдорд░реНрдерд┐рдд) рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИред

      • svelte рдореБрдЦреНрдп Svelte рдкреИрдХреЗрдЬред

      • svelte-intlayer Svelte рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ Intlayer рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреИрдХреЗрдЬред рдпрд╣ Svelte рдореЗрдВ рдЕрдВрддрд░реНрд░рд╛рд╖реНрдЯреНрд░реАрдпрдХрд░рдг рдХреЗ рд▓рд┐рдП setupIntlayer рдХреЗ рд╕рд╛рде-рд╕рд╛рде useIntlayer рдФрд░ useLocale рд╕реНрдЯреЛрд░реНрд╕ (stores) рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

      • @astrojs/svelte рдЖрдзрд┐рдХрд╛рд░рд┐рдХ Astro рдПрдХреАрдХрд░рдг рдЬреЛ Svelte рдШрдЯрдХ islands рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред

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

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

      рдЗрд╕ рдЖрд░реНрдХрд┐рдЯреЗрдХреНрдЪрд░ рдореЗрдВ, astro.config.ts рдореЗрдВ рдкрдВрдЬреАрдХреГрдд intlayer() рдЗрдВрдЯреАрдЧреНрд░реЗрд╢рди рдЖрдкрдХреА рдбрд┐рдХреНрд╢рдирд░реА рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдПрдХ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдЬреЛрдбрд╝рддрд╛ рд╣реИ рдЬреЛ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓реЛрдХреЗрд▓ рдХреЛ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ Astro.locals.intlayer рдкрд░ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдкреЗрдЬ src/pages/[...locale]/ рд░реЗрд╕реНрдЯ рд╕реЗрдЧрдореЗрдВрдЯ рдХреЗ рддрд╣рдд рд░рд╣рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд▓реЛрдХреЗрд▓ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдкреНрд░реАрдлрд╝рд┐рдХреНрд╕ рдХреЗ рд╕рд░реНрд╡ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЕрдиреНрдп рдкреНрд░рддреНрдпреЗрдХ рд▓реЛрдХреЗрд▓ рдХреЛ рдЕрдкрдирд╛ рд╕рдорд░реНрдкрд┐рдд URL рдорд┐рд▓рддрд╛ рд╣реИред .astro рдлрд╝рд╛рдЗрд▓реЗрдВ рд╕рд░реНрд╡рд░ рд░реЗрдВрдбрд░ рдХреЗ рд▓рд┐рдП astro-intlayer рдХреЗ useIntlayer / useLocale рд╣реБрдХреНрд╕ рдХреЗ рд╕рд╛рде рдХрдВрдЯреЗрдВрдЯ рдХреЛ рдкрдврд╝рддреА рд╣реИрдВ, рдФрд░ Svelte рдЖрдЗрд▓реИрдВрдб (src/components/svelte/SvelteIsland.svelte) рд╕рд░реНрд╡рд░ рджреНрд╡рд╛рд░рд╛ рдкрд╣рдЪрд╛рдиреЗ рдЧрдП рд▓реЛрдХреЗрд▓ рдХреЛ рдПрдХ prop рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ svelte-intlayer рдХреЛ рд╕реМрдВрдкрддрд╛ рд╣реИред рдХрдВрдЯреЗрдВрдЯ рдШреЛрд╖рдгрд╛рдПрдВ src/ рдореЗрдВ рдЖрдкрдХреЗ рдХрдВрдкреЛрдиреЗрдВрдЯреНрд╕ рдХреЗ рд╕рд╛рде рд░рдЦреА рдЬрд╛рддреА рд╣реИрдВред

      bash
      .
      тФЬтФАтФА src
      тФВ   тФЬтФАтФА app.content.ts                # App content declaration
      тФВ   тФЬтФАтФА components
      тФВ   тФВ   тФФтФАтФА svelte
      тФВ   тФВ       тФФтФАтФА SvelteIsland.svelte   # Svelte island (content + locale switcher)
      тФВ   тФФтФАтФА pages
      тФВ       тФЬтФАтФА [...locale]
      тФВ       тФВ   тФФтФАтФА index.astro           # Localized page mounting the island
      тФВ       тФЬтФАтФА robots.txt.ts             # robots.txt endpoint
      тФВ       тФФтФАтФА sitemap.xml.ts            # Localized sitemap endpoint
      тФЬтФАтФА astro.config.ts                   # Astro config with the intlayer() and svelte() integrations
      тФЬтФАтФА intlayer.config.ts
      тФЬтФАтФА package.json
      тФФтФАтФА tsconfig.json
      

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

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

      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;
      
      рдЗрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдлрд╝рд╛рдЗрд▓ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рдЖрдк рд╕реНрдерд╛рдиреАрдпрдХреГрдд URL, рдорд┐рдбрд▓рд╡реЗрдпрд░ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ, рдХреБрдХреА рдирд╛рдо, рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рдгрд╛рдУрдВ рдХрд╛ рд╕реНрдерд╛рди рдФрд░ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдХрдВрд╕реЛрд▓ рдореЗрдВ Intlayer рд▓реЙрдЧ рдХреЛ рдЕрдХреНрд╖рдо рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдФрд░ рдмрд╣реБрдд рдХреБрдЫред рдЙрдкрд▓рдмреНрдз рдорд╛рдкрджрдВрдбреЛрдВ рдХреА рдкреВрд░реА рд╕реВрдЪреА рдХреЗ рд▓рд┐рдП, рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджреЗрдЦреЗрдВред
    3. рдЕрдкрдиреЗ Astro рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ Intlayer рдХреЛ рдПрдХреАрдХреГрдд рдХрд░реЗрдВ

      рдЕрдкрдиреЗ Astro рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ intlayer рдкреНрд▓рдЧрдЗрди рдФрд░ Svelte рдПрдХреАрдХрд░рдг рдЬреЛрдбрд╝реЗрдВред

      astro.config.ts
      // @ts-check
      
      import { intlayer } from "astro-intlayer";
      import svelte from "@astrojs/svelte";
      import { defineConfig } from "astro/config";
      
      // https://astro.build/config
      export default defineConfig({
        integrations: [intlayer(), svelte()],
      });
      
      intlayer() рдПрдХреАрдХрд░рдг рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ Intlayer рдХреЛ Astro рдХреЗ рд╕рд╛рде рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рдгрд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдЙрддреНрдкрд╛рджрди рдХреЛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╡рд┐рдХрд╛рд╕ рдореЛрдб рдореЗрдВ рдЙрдирдХреА рдирд┐рдЧрд░рд╛рдиреА рдХрд░рддрд╛ рд╣реИред рдпрд╣ Astro рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЗ рднреАрддрд░ Intlayer рдкрд░реНрдпрд╛рд╡рд░рдг рдЪрд░ рдХреЛ рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рджрд░реНрд╢рди рдХреЛ рдЕрдиреБрдХреВрд▓рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдирд╛рдо (aliases) рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
      svelte() рдПрдХреАрдХрд░рдг client:only="svelte" рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ Svelte рдШрдЯрдХ islands рдХреЗ рдЙрдкрдпреЛрдЧ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
    4. рдЕрдкрдиреА рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ

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

      src/app.content.ts
      import { t, type Dictionary } from "intlayer";
      
      const appContent = {
        key: "app",
        content: {
          title: t({
            en: "Hello World",
            fr: "Bonjour le monde",
            es: "Hola mundo",
            hi: "рдирдорд╕реНрддреЗ рджреБрдирд┐рдпрд╛",
          }),
        },
      } satisfies Dictionary;
      
      export default appContent;
      
      рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рдгрд╛рдУрдВ рдХреЛ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХрд╣реАрдВ рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдмрд╢рд░реНрддреЗ рд╡реЗ contentDir (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ ./src) рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВ рдФрд░ рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рдгрд╛ рдлрд╝рд╛рдЗрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ .content.{json,ts,tsx,js,jsx,mjs,cjs,md,mdx,yaml,yml}) рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реЛрдВред
      рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рдгрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджреЗрдЦреЗрдВред
    5. Astro рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

      astro-intlayer рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рд╣реБрдХреНрд╕ рдХреЗ рд╕рд╛рде .astro рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдЕрдкрдиреЗ рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рд╡реЗ react-intlayer рдХреЗ рд╕рдорд╛рди рд╣рд╕реНрддрд╛рдХреНрд╖рд░ рд╕рд╛рдЭрд╛ рдХрд░рддреЗ рд╣реИрдВ: useIntlayer("key") рдПрдХ рд╢рдмреНрджрдХреЛрд╢ рдХреА рд╕рд╛рдордЧреНрд░реА рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдФрд░ useLocale() рдмрд┐рдирд╛ рдХрд┐рд╕реА рддрд░реНрдХ рдХреЗ рд╡рд░реНрддрдорд╛рди рд▓реЛрдХреЗрд▓ рд▓реМрдЯрд╛рддрд╛ рд╣реИред

      рд▓реЛрдХреЗрд▓ astro-intlayer рдорд┐рдбрд▓рд╡реЗрдпрд░ рд╕реЗ рдЖрддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ рдПрдХреАрдХрд░рдг рдЖрдкрдХреЗ рдЕрдкрдиреЗ src/middleware.ts рд╕реЗ рдкрд╣рд▓реЗ рдкрдВрдЬреАрдХреГрдд рдХрд░рддрд╛ рд╣реИред рдпрд╣ рдкреНрд░рддреНрдпреЗрдХ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдЗрд╕реЗ URL рдЙрдкрд╕рд░реНрдЧ, рдлрд┐рд░ рдХреНрд▓рд╛рдЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ рд╕рд╣реЗрдЬреЗ рдЧрдП рд▓реЛрдХреЗрд▓ (рдХреБрдХреА рдпрд╛ рд╣реЗрдбрд░), рдлрд┐рд░ Accept-Language рд╕реЗ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕реЗ Astro.locals.intlayer рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рддрд╛ рд╣реИред рдкреНрд░реА-рд░реЗрдВрдбрд░ рдХрд┐рдП рдЧрдП рдкреГрд╖реНрда рдХреЗрд╡рд▓ URL рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдкреНрд░рддреНрдпреЗрдХ рдЖрдЧрдВрддреБрдХ рдХреЗ рд▓рд┐рдП рдПрдХ рдмрд╛рд░ рд░реЗрдВрдбрд░ рд╣реЛрддреЗ рд╣реИрдВред

      рдЖрдкрдХреЛ рд╣рд░ рдкреГрд╖реНрда рдкрд░ SEO рдореЗрдЯрд╛рдбреЗрдЯрд╛ (рдЬреИрд╕реЗ hreflang рдФрд░ рдХреИрдиреЛрдирд┐рдХрд▓ рд▓рд┐рдВрдХ) рднреА рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ Svelte island рдкреЗрд╢ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

      src/pages/[...locale]/index.astro
      ---
      import { useIntlayer, useLocale } from "astro-intlayer";
      import {
        getLocalizedUrl,
        getPrefix,
        localeMap,
        defaultLocale,
        getHTMLTextDir,
      } from "intlayer";
      import SvelteIsland from "../../components/svelte/SvelteIsland.svelte";
      
      export const getStaticPaths = () => {
        return localeMap(({ locale }) => ({
          params: { locale: getPrefix(locale).localePrefix },
        }));
      };
      
      // рдорд┐рдбрд▓рд╡реЗрдпрд░ рджреНрд╡рд╛рд░рд╛ рд╣рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд▓реЛрдХреЗрд▓ (рдЙрджрд╛. /hi/about -> 'hi')
      const { locale } = useLocale();
      
      // рдЙрд╕ рд▓реЛрдХреЗрд▓ рдХреЗ рд▓рд┐рдП 'app' рд╢рдмреНрджрдХреЛрд╢ рдХреА рд╕рд╛рдордЧреНрд░реА
      const { title } = useIntlayer("app");
      ---
      
      <!doctype html>
      <html lang={locale} dir={getHTMLTextDir(locale)}>
        <head>
          <meta charset="utf-8" />
          <meta name="viewport" content="width=device-width" />
          <link rel="icon" type="image/svg+xml" href="/favicon.svg" />
          <title>{title}</title>
      
          <!-- рдХреИрдиреЛрдирд┐рдХрд▓ рд▓рд┐рдВрдХ: рдЦреЛрдЬ рдЗрдВрдЬрдиреЛрдВ рдХреЛ рдЗрд╕ рдкреГрд╖реНрда рдХреЗ рдореБрдЦреНрдп рд╕рдВрд╕реНрдХрд░рдг рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ -->
          <link
            rel="canonical"
            href={new URL(getLocalizedUrl(Astro.url.pathname, locale), Astro.site)}
          />
      
          <!-- Hreflang: Google рдХреЛ рд╕рднреА рд╕реНрдерд╛рдиреАрдпрдХреГрдд рд╕рдВрд╕реНрдХрд░рдгреЛрдВ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реВрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ -->
          {
            localeMap(({ locale: mapLocale }) => (
              <link
                rel="alternate"
                hreflang={mapLocale}
                href={new URL(
                  getLocalizedUrl(Astro.url.pathname, mapLocale),
                  Astro.site
                )}
              />
            ))
          }
      
          <!-- x-default: рдлрд╝реЙрд▓рдмреИрдХ рд╡рд┐рдХрд▓реНрдк рдЬрдм рд▓реЛрдХреЗрд▓ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рднрд╛рд╖рд╛ рд╕реЗ рдореЗрд▓ рдирд╣реАрдВ рдЦрд╛рддрд╛ -->
          <link
            rel="alternate"
            hreflang="x-default"
            href={new URL(
              getLocalizedUrl(Astro.url.pathname, defaultLocale),
              Astro.site
            )}
          />
        </head>
        <body>
          <!-- Svelte island рднрд╛рд╖рд╛ рд╕реНрд╡рд┐рдЪрд░ рд╕рд╣рд┐рдд рд╕рднреА рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рд╕рд╛рдордЧреНрд░реА рдХреЛ рд░реЗрдВрдбрд░ рдХрд░рддрд╛ рд╣реИ -->
          <SvelteIsland locale={locale} client:only="svelte" />
        </body>
      </html>
      
      рдпрджрд┐ рдЖрдк рдЕрдкрдиреА content рдХреЛ string attribute рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ alt, title, href, aria-label, рдЖрджрд┐, рддреЛ рдЖрдк function рдХреЗ value рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ:
      tsx
      <img src={content.image.src.value} alt={content.image.value} />
      <img src={content.image.src.toString()} alt={content.image.toString()} />
      <img src={String(content.image.src)} alt={String(content.image)} />
      
      Astro.locals.intlayer рдЖрдкрдХреЗ рдЕрдкрдиреЗ рдорд┐рдбрд▓рд╡реЗрдпрд░ рдФрд░ рдПрдВрдбрдкреЙрдЗрдВрдЯреНрд╕ рдХреЗ рд▓рд┐рдП locale, defaultLocale рдФрд░ availableLocales рднреА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рддрд╛ рд╣реИред рдПрдХ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд░реЛрдз рд▓реЛрдХреЗрд▓ рдХреЛ рдУрд╡рд░рд░рд╛рдЗрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рджреВрд╕рд░реЗ рддрд░реНрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдПрдХ рд▓реЛрдХреЗрд▓ рдпрд╛ рдЪрдпрдирдХрд░реНрддрд╛ рдкрд╛рд╕ рдХрд░реЗрдВ (useIntlayer("app", "fr"), useIntlayer("faq", { item: 2 }))ред

      рд░реВрдЯрд┐рдВрдЧ рд╕реЗрдЯрдЕрдк рдкрд░ рдиреЛрдЯ: рдЖрдкрдХреЗ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рд╕рдВрд░рдЪрдирд╛ intlayer.config.ts рдореЗрдВ middleware.routing рд╕реЗрдЯрд┐рдВрдЧ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддреА рд╣реИ:

      • prefix-no-default (рдбрд┐рдлрд╝реЙрд▓реНрдЯ): рдбрд┐рдлрд╝реЙрд▓реНрдЯ рднрд╛рд╖рд╛ рдХреЛ рд░реВрдЯ рдкрд░ рд░рдЦрддрд╛ рд╣реИ (рдХреЛрдИ рдЙрдкрд╕рд░реНрдЧ рдирд╣реАрдВ) рдФрд░ рдЕрдиреНрдп рдХреЛ рдЙрдкрд╕рд░реНрдЧ рджреЗрддрд╛ рд╣реИред рд╕рднреА рдорд╛рдорд▓реЛрдВ рдХреЛ рдкрдХрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП [...locale] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
      • prefix-all: рд╕рднреА URL рдХреЛ рднрд╛рд╖рд╛ рдЙрдкрд╕рд░реНрдЧ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдкрдХреЛ рд░реВрдЯ рдХреЛ рдЕрд▓рдЧ рд╕реЗ рд╕рдВрднрд╛рд▓рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ рддреЛ рдЖрдк рдорд╛рдирдХ [locale] рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред
      • search-param рдпрд╛ no-prefix: рдХрд┐рд╕реА рднрд╛рд╖рд╛ рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред рднрд╛рд╖рд╛ рдХреЛ рдХреНрд╡реЗрд░реА рдкреИрд░рд╛рдореАрдЯрд░ рдпрд╛ рдХреБрдХреАрдЬрд╝ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдВрднрд╛рд▓рд╛ рдЬрд╛рддрд╛ рд╣реИред
    6. рдПрдХ Svelte Island рдШрдЯрдХ рдмрдирд╛рдПрдБ

      рдПрдХ island рдШрдЯрдХ рдмрдирд╛рдПрдБ рдЬреЛ рдЖрдкрдХреЗ Svelte рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдХреЛ рд▓рдкреЗрдЯрддрд╛ рд╣реИред рдЖрдкрдХреЛ рд╕реНрдЯреЛрд░реНрд╕ рддрдХ рдкрд╣реБрдБрдЪрдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рд╕рд░реНрд╡рд░-рд╕рдВрд╕реВрдЪрд┐рдд рд▓реЛрдХреЗрд▓ рдХреЗ рд╕рд╛рде setupIntlayer рдХреЛ рдХреЙрд▓ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред

      src/components/svelte/SvelteIsland.svelte
      <script lang="ts">
        import { useIntlayer, useLocale, setupIntlayer } from "svelte-intlayer";
        import { getLocalizedUrl, getLocaleName, type LocalesValues } from "intlayer";
      
        export let locale: LocalesValues;
      
        setupIntlayer(locale);
      
        const content = useIntlayer("app");
        const { locale: currentLocale, availableLocales, setLocale } = useLocale({
          onLocaleChange: (newLocale: LocalesValues) => {
            window.location.href = getLocalizedUrl(window.location.pathname, newLocale);
          },
        });
      </script>
      
      <div>
        <h1>{$content.title}</h1>
        <!-- рднрд╛рд╖рд╛ рд╕реНрд╡рд┐рдЪрд░ рд╕реАрдзреЗ island рдХреЗ рднреАрддрд░ рд░реЗрдВрдбрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ -->
        <div class="locale-switcher">
          <span class="switcher-label">рднрд╛рд╖рд╛ рдмрджрд▓реЗрдВ:</span>
          <div class="locale-buttons">
            {#each availableLocales as localeItem}
              <button
                class="locale-btn {localeItem === $currentLocale ? 'active' : ''}"
                disabled={localeItem === $currentLocale}
                on:click={() => setLocale(localeItem)}
              >
                <span class="ls-own-name">{getLocaleName(localeItem)}</span>
                <span class="ls-current-name">{getLocaleName(localeItem, $currentLocale)}</span>
                <span class="ls-code">{localeItem.toUpperCase()}</span>
              </button>
            {/each}
          </div>
        </div>
      </div>
      
      locale рдкреНрд░реЙрдк рдХреЛ Astro рдкреГрд╖реНрда (рд╕рд░реНрд╡рд░ рдкрд╣рдЪрд╛рди) рд╕реЗ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ setupIntlayer рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдШрдЯрдХ рдореЗрдВ рд╕рднреА рд╕реНрдЯреЛрд░реНрд╕ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрднрд┐рдХ рднрд╛рд╖рд╛ рд╕реЗрдЯ рд╣реЛ рдЬрд╛рддреА рд╣реИред
    7. рдПрдХ рднрд╛рд╖рд╛ рд╕реНрд╡рд┐рдЪрд░ рдЬреЛрдбрд╝рдирд╛

      рднрд╛рд╖рд╛ рд╕реНрд╡рд┐рдЪрд┐рдВрдЧ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рд╕реАрдзреЗ Svelte island рдХреЗ рднреАрддрд░ рдПрдХреАрдХреГрдд рд╣реИ (рдКрдкрд░ рдЪрд░рдг 6 рджреЗрдЦреЗрдВ)ред рдпрд╣ svelte-intlayer рд╕реЗ useLocale рд╕реНрдЯреЛрд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдПрдХ рдирдИ рднрд╛рд╖рд╛ рдЪреБрдирдиреЗ рдкрд░ рд╕реНрдерд╛рдиреАрдпрдХреГрдд URL рдкрд░ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рддрд╛ рд╣реИ:

      src/components/svelte/SvelteIsland.svelte
      <script lang="ts">
        import { useLocale } from "svelte-intlayer";
        import { getLocalizedUrl, getLocaleName, type LocalesValues } from "intlayer";
      
        // рдЪрд░рдг 6 рд╕реЗ рд╕рдорд╛рди рд▓реЛрдХреЗрд▓/setupIntlayer рд▓реЙрдЬрд┐рдХ рдХрд╛ рдкреБрди: рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ...
      
        const {
          locale: currentLocale,
          availableLocales,
          setLocale,
        } = useLocale({
          onLocaleChange: (newLocale: LocalesValues) => {
            // рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдкрд░ рд╕реНрдерд╛рдиреАрдпрдХреГрдд URL рдкрд░ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░реЗрдВ
            window.location.href = getLocalizedUrl(window.location.pathname, newLocale);
          },
        });
      </script>
      
      <div class="locale-switcher">
        <span class="switcher-label">рднрд╛рд╖рд╛ рдмрджрд▓реЗрдВ:</span>
        <div class="locale-buttons">
          {#each availableLocales as localeItem}
            <button
              class="locale-btn {localeItem === $currentLocale ? 'active' : ''}"
              disabled={localeItem === $currentLocale}
              on:click={() => setLocale(localeItem)}
            >
              <span class="ls-own-name">{getLocaleName(localeItem)}</span>
              <span class="ls-current-name">{getLocaleName(localeItem, $currentLocale)}</span>
              <span class="ls-code">{localeItem.toUpperCase()}</span>
            </button>
          {/each}
        </div>
      </div>
      

      рдирд┐рд░рдВрддрд░рддрд╛ рдкрд░ рдиреЛрдЯ: window.location.href рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП onLocaleChange рдХрд╛ рдЙрдкрдпреЛрдЧ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдирдпрд╛ рднрд╛рд╖рд╛рдИ URL рджреЗрдЦрд╛ рдЬрд╛рдП, рдЬрд┐рд╕рд╕реЗ Intlayer рдорд┐рдбрд▓рд╡реЗрдпрд░ рднрд╛рд╖рд╛ рдХреБрдХреА рд╕реЗрдЯ рдХрд░ рд╕рдХреЗ рдФрд░ рднрд╡рд┐рд╖реНрдп рдХреА рдпрд╛рддреНрд░рд╛рдУрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рд╡рд░реАрдпрддрд╛ рдХреЛ рдпрд╛рдж рд░рдЦ рд╕рдХреЗред

    8. Sitemap рдФрд░ Robots.txt

      Intlayer рдЖрдкрдХреА рд╕реНрдерд╛рдиреАрдпрдХреГрдд рд╕рд╛рдЗрдЯрдореИрдк рдФрд░ robots.txt рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЧрддрд┐рд╢реАрд▓ рд░реВрдк рд╕реЗ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧрд┐рддрд╛рдУрдВ рдХреА рдкреЗрд╢рдХрд╢ рдХрд░рддрд╛ рд╣реИред

      рд╕рд╛рдЗрдЯрдореИрдк (Sitemap)

      Intlayer comes with a built-in sitemap generator to help you create a sitemap for your application easily. It handles localized routes and adds the necessary metadata for search engines.

      The Intlayer generated sitemap supports the xhtml:link namespace (Hreflang XML Extensions). Unlike the default sitemap generators that only list raw URLs, Intlayer automatically creates the required bidirectional links between all language versions of a page (e.g., /about, /about?lang=fr, and /about?lang=es). This ensures search engines correctly index and serve the right language version to the right audience.

      рдЕрдкрдиреЗ рд╕рднреА рд╕реНрдерд╛рдиреАрдпрдХреГрдд рд░реВрдЯ рд╕рд╣рд┐рдд рд╕рд╛рдЗрдЯрдореИрдк рдЙрддреНрдкрдиреНрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП src/pages/sitemap.xml.ts рдмрдирд╛рдПрдБред

      src/pages/sitemap.xml.ts
      import type { APIRoute } from "astro";
      import { generateSitemap, type SitemapUrlEntry } from "intlayer";
      
      const pathList: SitemapUrlEntry[] = [
        { path: "/", changefreq: "daily", priority: 1.0 },
        { path: "/about", changefreq: "monthly", priority: 0.7 },
      ];
      
      export const GET: APIRoute = async ({ site }) => {
        const xmlOutput = generateSitemap(pathList, {
          siteUrl: "https://example.com",
        });
      
        return new Response(xmlOutput, {
          headers: { "Content-Type": "application/xml" },
        });
      };
      

      Robots.txt

      рдЦреЛрдЬ рдЗрдВрдЬрди рдХреНрд░реЙрд▓рд┐рдВрдЧ рдХреЛ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП src/pages/robots.txt.ts рдмрдирд╛рдПрдБред

      src/pages/robots.txt.ts
      import type { APIRoute } from "astro";
      import { getMultilingualUrls } from "intlayer";
      
      const getAllMultilingualUrls = (urls: string[]) =>
        urls.flatMap((url) => Object.values(getMultilingualUrls(url)) as string[]);
      
      const disallowedPaths = getAllMultilingualUrls(["/admin", "/private"]);
      
      export const GET: APIRoute = ({ site }) => {
        const robotsTxt = [
          "User-agent: *",
          "Allow: /",
          ...disallowedPaths.map((path) => `Disallow: ${path}`),
          "",
          `Sitemap: ${new URL("/sitemap.xml", site).href}`,
        ].join("\n");
      
        return new Response(robotsTxt, {
          headers: { "Content-Type": "text/plain" },
        });
      };
      
    9. рдЕрдкрдиреЗ рдШрдЯрдХреЛрдВ рдХреА рд╕рд╛рдордЧреНрд░реА рдирд┐рдХрд╛рд▓реЗрдВ

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

      рдпрджрд┐ рдЖрдкрдХреЗ рдкрд╛рд╕ рдореМрдЬреВрджрд╛ рдХреЛрдбрдмреЗрд╕ рд╣реИ, рддреЛ рд╣рдЬрд╛рд░реЛрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдмрджрд▓рдирд╛ рд╕рдордп рд▓реЗрдиреЗ рд╡рд╛рд▓рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред

      рдЗрд╕ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдЖрд╕рд╛рди рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, Intlayer рдЖрдкрдХреЗ рдШрдЯрдХреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдФрд░ рд╕рд╛рдордЧреНрд░реА рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдХрдВрдкрд╛рдЗрд▓рд░ / рдПрдХреНрд╕рдЯреНрд░реИрдХреНрдЯрд░ рдХрд╛ рдкреНрд░рд╕реНрддрд╛рд╡ рдХрд░рддрд╛ рд╣реИред

      рдЗрд╕реЗ рд╕реЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЕрдкрдиреА intlayer.config.ts рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рдПрдХ compiler рдЕрдиреБрднрд╛рдЧ рдЬреЛрдбрд╝ рд╕рдХрддреЗ рд╣реИрдВ:

      intlayer.config.ts
      import { type IntlayerConfig } from "intlayer";
      
      const config: IntlayerConfig = {
        // ... рдЖрдкрдХрд╛ рд╢реЗрд╖ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди
        compiler: {
          /**
           * рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдХрдВрдкрд╛рдЗрд▓рд░ рд╕рдХреНрд╖рдо рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдПред
           */
          enabled: true,
      
          /**
           * рдЖрдЙрдЯрдкреБрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдкрде рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ
           */
          output: ({ fileName, extension }) => `./${fileName}${extension}`,
      
          /**
           * рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреНрдпрд╛ рдШрдЯрдХреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдХреЗ рдмрд╛рдж рд╕рд╣реЗрдЬрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЙрд╕ рддрд░рд╣ рд╕реЗ, рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдРрдк рдмрджрд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ рдПрдХ рдмрд╛рд░ рдЪрд▓рд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рдЗрд╕реЗ рд╣рдЯрд╛рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
           */
          saveComponents: false,
      
          /**
           * рд╢рдмреНрджрдХреЛрд╢ рдХреБрдВрдЬреА рдЙрдкрд╕рд░реНрдЧ
           */
          dictionaryKeyPrefix: "",
        },
      };
      
      export default config;
      

      рдЕрдкрдиреЗ рдШрдЯрдХреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдФрд░ рд╕рд╛рдордЧреНрд░реА рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХреНрд╕рдЯреНрд░реИрдХреНрдЯрд░ рдЪрд▓рд╛рдПрдБ

      bash
      npx intlayer extract
      

      рдЕрдкрдиреЗ рдШрдЯрдХреЛрдВ рдХреЛ рдмрджрд▓рдиреЗ рдФрд░ рд╕рд╛рдордЧреНрд░реА рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдмрд┐рд▓реНрдб рдХрд░реЗрдВ

      bash
      npm run build # рдпрд╛ npm run dev
      

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

    Intlayer рдЕрдкрдиреЗ рдХреЛрдбрдмреЗрд╕ рдХреЛ рдЕрдзрд┐рдХ рдордЬрдмреВрдд рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП TypeScript рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ рдСрдЧрдореЗрдВрдЯреЗрд╢рди (module augmentation) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред

    Autocompletion

    Translation Error

    рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ TypeScript рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рд╕реНрд╡рддрдГ рдЙрддреНрдкрдиреНрди рдкреНрд░рдХрд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

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

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

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

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

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

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

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

    рдпрд╣ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:

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

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

    рдЕрдкрдиреЗ рдЬреНрдЮрд╛рди рдХреЛ рдФрд░ рдЧрд╣рд░рд╛ рдХрд░реЗрдВ

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

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

    Astro рдХрд╛ рдЕрдВрддрд░реНрдирд┐рд╣рд┐рдд i18n рд╡рд┐рдХрд▓реНрдк рдЙрдкрд╕рд░реНрдЧреЛрдВ рдФрд░ рдкреБрдирд░реНрдирд┐рд░реНрджреЗрд╢реЛрдВ рдХреЛ рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИ рд▓реЗрдХрд┐рди рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдкреНрд░рдмрдВрдзрди рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред рдЖрдЗрд▓реИрдВрдб рдЬреЛрдбрд╝рдиреЗ рд╕реЗ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдЪреБрдиреМрддреА рдкреИрджрд╛ рд╣реЛрддреА рд╣реИ: рд╡реЗ Astro рдирд╣реАрдВ рдмрд▓реНрдХрд┐ Svelte рдЪрд▓рд╛рддреЗ рд╣реИрдВред

    • Astro i18n рдкреНрд▓рд╕ рдХрд╕реНрдЯрдо рд╢рдмреНрджрдХреЛрд╢, рдФрд░ рдЖрдЗрд▓реИрдВрдб рдореЗрдВ svelte-i18n: рдмрд┐рдирд╛ рд╕рд╛рдЭрд╛ рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЗ рджреЛ рдЕрд▓рдЧ-рдЕрд▓рдЧ рд╕рд╛рдордЧреНрд░реА рд╕реНрд░реЛрддред
    • Intlayer: рджреЛрдиреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рд╛рдЭрд╛ рд╕рд╛рдордЧреНрд░реА рдкрд░рддред astro-intlayer .astro рдкреГрд╖реНрдареЛрдВ рдХреЛ рд╕реЗрд╡рд╛ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ, рдФрд░ svelte-intlayer Svelte рдЖрдЗрд▓реИрдВрдб рдХреЗ рд▓рд┐рдП рд╕рдорд╛рди рдШреЛрд╖рдгрд╛ рдкрдврд╝рддрд╛ рд╣реИред

    рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рдПрдХ рдмрд╛рд░ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рдФрд░ рд╕реНрдерд┐рд░ рдкреГрд╖реНрдареЛрдВ рд╡ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдЖрдЗрд▓реИрдВрдб рджреЛрдиреЛрдВ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ рд╣реА рдПрдХ рдПрдХреАрдХреГрдд рд╕рд╛рдордЧреНрд░реА рдкрд░рдд рдЪреБрдирдиреЗ рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░рдг рд╣реИред Intlayer рдХреНрдпреЛрдВ рдЪреБрдиреЗрдВ рджреЗрдЦреЗрдВред

    рдиреЗрдорд╕реНрдкреЗрд╕-рдЖрдзрд╛рд░рд┐рдд рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдмрд╣реБрдд рдХрдо, рдХреНрдпреЛрдВрдХрд┐ рдПрдХ рдкреГрд╖реНрда рдХрднреА рднреА рдЙрд╕ рдХреИрдЯрд▓реЙрдЧ рдХреЛ рдбрд╛рдЙрдирд▓реЛрдб рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ рдЬрд┐рд╕реЗ рд╡рд╣ рд░реЗрдВрдбрд░ рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред Astro рдкреГрд╖реНрда рдмрд┐рд▓реНрдб рд╕рдордп рдкрд░ рд░реЗрдВрдбрд░ рд╣реЛрддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдХреЗрд╡рд▓ рдЕрдиреБрд╡рд╛рджрд┐рдд HTML рднреЗрдЬрд╛ рдЬрд╛рддрд╛ рд╣реИ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдЕрддрд┐рд░рд┐рдХреНрдд рд╢рдмреНрджрдХреЛрд╢ рдХреЗ; рдХреЗрд╡рд▓ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдЖрдЗрд▓реИрдВрдб рдШрдЯрдХ рд╣реА рд╢рдмреНрджрдХреЛрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред рдЧрддрд┐рд╢реАрд▓ рд╢рдмреНрджрдХреЛрд╢ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдкреНрд░рддрд┐ рд▓реЛрдХреЗрд▓ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рдЬрд┐рд╕рд╕реЗ рдмрдВрдбрд▓ 50% рддрдХ рдХрдо рд╣реЛ рдЬрд╛рддрд╛ рд╣реИред рдмрдВрдбрд▓ рдЕрдиреБрдХреВрд▓рди рдФрд░ рдмреЗрдВрдЪрдорд╛рд░реНрдХ рджреЗрдЦреЗрдВред

    рдХрд╛рдлреА рд╣рдж рддрдХ рд╣рд╛рдБред рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдЧрд╛рдЗрдб рдХрд╛ рдкрд╛рд▓рди рдХрд░реЗрдВред рдЖрдк рдзреАрд░реЗ-рдзреАрд░реЗ рднреА рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: sync JSON plugin рдЖрдкрдХреЗ JSON рдХреИрдЯрд▓реЙрдЧ рдХреЛ рд╕рддреНрдп рдХрд╛ рд╕реНрд░реЛрдд рдмрдирд╛рдП рд░рдЦрддрд╛ рд╣реИ рдФрд░ Intlayer рд╢рдмреНрджрдХреЛрд╢ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИред

    рд╣рд╛рдБред sync JSON plugin рдЖрдкрдХреА /messages/{locale}/{namespace}.json рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рддреНрдп рдХрд╛ рд╕реНрд░реЛрдд рдмрдирд╛рдП рд░рдЦрддрд╛ рд╣реИ рдФрд░ рджреЛрдиреЛрдВ рджрд┐рд╢рд╛рдУрдВ рдореЗрдВ рдЙрдирд╕реЗ Intlayer dictionaries рдмрдирд╛рддрд╛ рд╣реИред sync PO plugin gettext catalogs рдХреЗ рд▓рд┐рдП рднреА рдРрд╕рд╛ рд╣реА рдХрд░рддрд╛ рд╣реИ, рдФрд░ per locale files рдЖрдкрдХреЛ locales рдХреЛ рдПрдХ рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╕рдореВрд╣реАрдХреГрдд рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рднрд╛рд╖рд╛ рдХреЗ рдЕрдиреБрд╕рд╛рд░ content рдХреЛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рдиреЗ рджреЗрддреЗ рд╣реИрдВред

    рдирд╣реАрдВред npx intlayer extract рдЪрд▓рд╛рдПрдВ рдФрд░ Intlayer рдЖрдкрдХреА рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрдврд╝рддрд╛ рд╣реИ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рдЕрдиреБрдХреВрд▓ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ, рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдмрдЧрд▓ рдореЗрдВ рдПрдХ .content рдлрд╝рд╛рдЗрд▓ рд▓рд┐рдЦрддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдЖрдк рдХреИрдЯрд▓реЙрдЧ рдореЗрдВ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдПрдХ diff рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред рдЗрд╕ рдЧрд╛рдЗрдб рдХрд╛ рдЪрд░рдг 15 рдЗрд╕реЗ рд╕рдордЭрд╛рддрд╛ рд╣реИред

    рдкреВрд░реНрдг рд╕реНрд╡рдЪрд╛рд▓рди рдХреЗ рд▓рд┐рдП, Intlayer Compiler рдмрд┐рд▓реНрдб рд╕рдордп рдкрд░ рдпрд╣реА рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: рдкреНрд░рддреНрдпреЗрдХ рдкрд░рд┐рд╡рд░реНрддрди рдкрд░ рдХреЛрдб рд╕реНрдХреИрди рдХрд░рддрд╛ рд╣реИ, рд╢рдмреНрджрдХреЛрд╢ рдЙрддреНрдкрдиреНрди рдХрд░рддрд╛ рд╣реИ рдФрд░ HMR рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдХ рдХрд░рддрд╛ рд╣реИред

    рдХрдВрдкрд╛рдЗрд▓рд░ рдХреЛ рдЪрд╛рд▓реВ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рджреЛ рд╕реАрдорд╛рдПрдВ рдЬрд╛рдирдиреЗ рдпреЛрдЧреНрдп рд╣реИрдВред рдпрд╣ рд╕реНрдерд┐рд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рджреНрд╡рд╛рд░рд╛ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЬреЛ рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЗрд╡рд▓ рд░рдирдЯрд╛рдЗрдо рдкрд░ рдореМрдЬреВрдж рд╣реЛрддреА рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ API рддреНрд░реБрдЯрд┐ рдХреЛрдб рдпрд╛ CMS рдлрд╝реАрд▓реНрдб, рд╡реЗ рдкрд╣реБрдВрдЪ рд╕реЗ рдмрд╛рд╣рд░ рд░рд╣рддреА рд╣реИрдВред рдФрд░ рдЗрд╕реЗ className="active" рдпрд╛ рд╕реНрдерд┐рддрд┐ рдХреЛрдб рдЬреИрд╕реЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рд▓реЙрдЬрд┐рдХ рд╕реЗ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреЗ рд╕рд╛рдордиреЗ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЯреЗрдХреНрд╕реНрдЯ рдХреЛ рдЕрд▓рдЧ рдХрд░рдирд╛ рд╣реЛрдЧрд╛, рдЬрд┐рд╕рдХреЗ рд▓рд┐рдП рдПрдХ рдмрдбрд╝реЗ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рдХреБрдЫ рдПрдиреЛрдЯреЗрд╢рди рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред extract command рдЖрдкрдХреЛ рд▓реВрдк рдореЗрдВ рд░рдЦрдХрд░ рджреЛрдиреЛрдВ рд╕реЗ рдмрдЪрд╛рддрд╛ рд╣реИред

    рдкрд╛рдБрдЪ рдЙрдкрдХрд░рдг, рд╕рднреА рд╡реИрдХрд▓реНрдкрд┐рдХ:

    • VS Code extension: useIntlayer рдХреБрдВрдЬреА рд╕реЗ рдЙрд╕реЗ рдШреЛрд╖рд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓реА рд╕рд╛рдордЧреНрд░реА рдлрд╝рд╛рдЗрд▓ рдкрд░ рдЬрд╛рдПрдВ, рдШрдЯрдХреЛрдВ рд╕реЗ рд╕рд╛рдордЧреНрд░реА рдирд┐рдХрд╛рд▓реЗрдВ, рдФрд░ рдХрдорд╛рдВрдб рдкреИрд▓реЗрдЯ рдпрд╛ Intlayer рдЯреИрдм рд╕реЗ build, fill, test, push рдФрд░ pull рдЪрд▓рд╛рдПрдВред
    • LSP server: LSP рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рд╕рдорд╛рди рд╕реБрд╡рд┐рдзрд╛, рдкрд░рд┐рднрд╛рд╖рд╛ рдкрд░ рдЬрд╛рдПрдВ, рдЕрдиреБрд╡рд╛рджрд┐рдд рдорд╛рди рдХрд╛ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рджреЗрдЦреЗрдВ, рдФрд░ рдХреБрдВрдЬреА рдкреВрд░реНрдгрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред i18next, react-i18next, next-intl рдФрд░ use-intl рдХреЙрд▓ рдХрд╛ рднреА рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред
    • MCP server: Cursor, VS Code, Claude Desktop, Claude Code рдФрд░ ChatGPT рдХреЗ рд▓рд┐рдП Intlayer рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рдФрд░ CLI рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред
    • Agent skills: рдХреЗрдВрджреНрд░рд┐рдд рдХреМрд╢рд▓ рдЬреИрд╕реЗ intlayer-config, intlayer-cli рдФрд░ intlayer-contentред
    • ESLint plugin: no-raw-text рдирд┐рдпрдо рд╣рд╛рд░реНрдбрдХреЛрдбреЗрдб рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддрд╛ рд╣реИред