Author:
    Creation:2026-04-24Last update:2026-06-23

    Intlayer рдХреЗ рд╕рд╛рде рдЕрдкрдиреА Astro + Preact рд╕рд╛рдЗрдЯ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░реЗрдВ | рдЕрдВрддрд░реНрд░рд╛рд╖реНрдЯреНрд░реАрдпрдХрд░рдг (i18n)

    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 + Preact рдореЗрдВ Intlayer рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд░рдг-рджрд░-рдЪрд░рдг рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛

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

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

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

      bash
      npm install intlayer astro-intlayer preact preact-intlayer @astrojs/preact
      
      npx intlayer init
      
      рдпрджрд┐ рдЖрдк рдЕрдкрдиреА рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдПрдЯреНрд░рд┐рдмреНрдпреВрдЯ рдореЗрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ рдХрд┐ alt, title, href, aria-label, рдЖрджрд┐, рддреЛ рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ:
      html
      <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 preact preact-intlayer @astrojs/preact
      
      • intlayer рдореБрдЦреНрдп рдкреИрдХреЗрдЬ рдЬреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдкреНрд░рдмрдВрдзрди, рдЕрдиреБрд╡рд╛рдж, рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рдгрд╛, рдЯреНрд░рд╛рдВрд╕рдкрд╛рдЗрд▓реЗрд╢рди рдФрд░ CLI рдХрдорд╛рдВрдб рдХреЗ рд▓рд┐рдП i18n рдЯреВрд▓ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

      • astro-intlayer Intlayer рдХреЛ Vite рдмрдВрдбрд▓рд░ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рдиреЗ рдХреЗ рд▓рд┐рдП Astro рдПрдХреАрдХрд░рдг рдкреНрд▓рдЧрдЗрди, рд╕рд╛рде рд╣реА рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдкрд╕рдВрджреАрджрд╛ рднрд╛рд╖рд╛ рдХрд╛ рдкрддрд╛ рд▓рдЧрд╛рдиреЗ, рдХреБрдХреАрдЬрд╝ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдФрд░ URL рд░реАрдбрд╛рдпрд░реЗрдХреНрдЯ рдХреЛ рд╕рдВрднрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП рдорд┐рдбрд▓рд╡реЗрдпрд░ рд╢рд╛рдорд┐рд▓ рд╣реИред

      • preact рдореБрдЦреНрдп Preact рдкреИрдХреЗрдЬ - React рдХрд╛ рдПрдХ рддреЗрдЬрд╝, рд╣рд▓реНрдХрд╛ рд╡рд┐рдХрд▓реНрдкред

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

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

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

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

      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 рдкреНрд▓рдЧрдЗрди рдФрд░ Preact рдПрдХреАрдХрд░рдг рдЬреЛрдбрд╝реЗрдВред

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

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

      src/app.content.tsx
      import { h } from "preact";
      import { t, type Dictionary } from "intlayer";
      import type { ComponentChildren } from "preact";
      
      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}) рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реЛрдВред
      рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рдгрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджреЗрдЦреЗрдВред
      рдпрджрд┐ рдЖрдкрдХреА рд╕рд╛рдордЧреНрд░реА рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ TSX рдХреЛрдб рд╢рд╛рдорд┐рд▓ рд╣реИ, рддреЛ рдЖрдкрдХреЛ import { h } from "preact"; рдЖрдпрд╛рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИ рдпрд╛ рдпрд╣ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдХрд┐ рдЖрдкрдХрд╛ JSX рдкреНрд░реИрдЧреНрдорд╛ (pragma) Preact рдХреЗ рд▓рд┐рдП рд╕рд╣реА рдврдВрдЧ рд╕реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред
    5. Astro рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

      рдЖрдк рд╕реАрдзреЗ рдЕрдкрдиреЗ .astro рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ intlayer рд╕реЗ рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рдореБрдЦреНрдп рд╕рд╣рд╛рдпрдХреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдЖрдкрдХреЛ рд╣рд░ рдкреГрд╖реНрда рдкрд░ SEO рдореЗрдЯрд╛рдбреЗрдЯрд╛ (рдЬреИрд╕реЗ hreflang рдФрд░ рдХреИрдиреЛрдирд┐рдХрд▓ рд▓рд┐рдВрдХ) рднреА рдЬреЛрдбрд╝рдирд╛ рдЪрд╛рд╣рд┐рдП рдФрд░ рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рдХреНрд▓рд╛рдЗрдВрдЯ-рд╕рд╛рдЗрдб рд╕рд╛рдордЧреНрд░реА рдХреЗ рд▓рд┐рдП рдПрдХ Preact island рдкреЗрд╢ рдХрд░рдирд╛ рдЪрд╛рд╣рд┐рдПред

      src/pages/[...locale]/index.astro
      ---
      import {
        getIntlayer,
        getLocaleFromPath,
        getLocalizedUrl,
        getHTMLTextDir,
        getPrefix,
        localeMap,
        defaultLocale,
        type LocalesValues,
      } from "intlayer";
      import { PreactIsland } from "../../components/preact/ReactIsland";
      
      export const getStaticPaths = () => {
        return localeMap(({ locale }) => ({
          params: { locale: getPrefix(locale).localePrefix },
        }));
      };
      
      const locale = getLocaleFromPath(Astro.url.pathname) as LocalesValues;
      const { title } = getIntlayer("app", locale);
      ---
      
      <!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>
          <!-- Preact island рднрд╛рд╖рд╛ рд╕реНрд╡рд┐рдЪрд░ рд╕рд╣рд┐рдд рд╕рднреА рдЗрдВрдЯрд░реИрдХреНрдЯрд┐рд╡ рд╕рд╛рдордЧреНрд░реА рдХреЛ рд░реЗрдВрдбрд░ рдХрд░рддрд╛ рд╣реИ -->
          <PreactIsland locale={locale} client:only="preact" />
        </body>
      </html>
      
      рдпрджрд┐ рдЖрдк рдЕрдкрдиреА рд╕рд╛рдордЧреНрд░реА рдХреЛ string рд╡рд┐рд╢реЗрд╖рддрд╛ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ alt, title, href, aria-label, рдЖрджрд┐, рддреЛ рдЖрдк рдлрд╝рдВрдХреНрд╢рди рдХреЗ рдорд╛рди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕реЗ:
      html
      <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)}" />
      

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

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

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

      src/components/preact/PreactIsland.tsx
      /** @jsxImportSource preact */
      import { IntlayerProvider, useIntlayer } from "preact-intlayer";
      import { type LocalesValues } from "intlayer";
      import type { FunctionalComponent } from "preact";
      import { LocaleSwitcher } from "./LocaleSwitcher";
      
      const App: FunctionalComponent = () => {
        const { title } = useIntlayer("app");
      
        return (
          <div>
            <h1>{title}</h1>
            <LocaleSwitcher />
          </div>
        );
      };
      
      export const PreactIsland: FunctionalComponent<{ locale: LocalesValues }> = ({
        locale,
      }) => (
        <IntlayerProvider locale={locale}>
          <App />
        </IntlayerProvider>
      );
      
      locale рдкреНрд░реЙрдк рдХреЛ Astro рдкреГрд╖реНрда (рд╕рд░реНрд╡рд░ рдкрд╣рдЪрд╛рди) рд╕реЗ IntlayerProvider рдХреЛ рдкрд╛рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рд╕реЗ рдпрд╣ рдкреЗрдбрд╝ рдХреЗ рднреАрддрд░ рд╕рднреА Preact рд╣реБрдХ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд░рдВрднрд┐рдХ рднрд╛рд╖рд╛ рдмрди рдЬрд╛рддреА рд╣реИред
      рдиреЛрдЯ: Preact рдореЗрдВ, className рдХреЗ рдмрдЬрд╛рдп HTML class рдкреНрд░реЙрдкрд░реНрдЯреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
    7. рдПрдХ рднрд╛рд╖рд╛ рд╕реНрд╡рд┐рдЪрд░ рдЬреЛрдбрд╝рдирд╛

      рдПрдХ Preact LocaleSwitcher рдШрдЯрдХ рдмрдирд╛рдПрдБ рдЬреЛ рдЙрдкрд▓рдмреНрдз рднрд╛рд╖рд╛рдУрдВ рдХреЛ рдкрдврд╝рддрд╛ рд╣реИ рдФрд░ рдЬрдм рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдПрдХ рдирдИ рднрд╛рд╖рд╛ рдЪреБрдирддрд╛ рд╣реИ рддреЛ рд╕реНрдерд╛рдиреАрдпрдХреГрдд URL рдкрд░ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░рддрд╛ рд╣реИ:

      src/components/preact/LocaleSwitcher.tsx
      /** @jsxImportSource preact */
      import { useLocale } from "preact-intlayer";
      import { getLocalizedUrl, getLocaleName, type LocalesValues } from "intlayer";
      import type { FunctionalComponent } from "preact";
      
      export const LocaleSwitcher: FunctionalComponent = () => {
        const { locale, availableLocales, setLocale } = useLocale({
          onLocaleChange: (newLocale: LocalesValues) => {
            // рднрд╛рд╖рд╛ рдкрд░рд┐рд╡рд░реНрддрди рдкрд░ рд╕реНрдерд╛рдиреАрдпрдХреГрдд URL рдкрд░ рдиреЗрд╡рд┐рдЧреЗрдЯ рдХрд░реЗрдВ
            window.location.href = getLocalizedUrl(
              window.location.pathname,
              newLocale
            );
          },
        });
      
        return (
          <div class="locale-switcher">
            <span class="switcher-label">рднрд╛рд╖рд╛ рдмрджрд▓реЗрдВ:</span>
            <div class="locale-buttons">
              {availableLocales.map((localeItem) => (
                <button
                  key={localeItem}
                  onClick={() => setLocale(localeItem)}
                  class={`locale-btn ${localeItem === locale ? "active" : ""}`}
                  disabled={localeItem === locale}
                >
                  <span class="ls-own-name">{getLocaleName(localeItem)}</span>
                  <span class="ls-current-name">
                    {getLocaleName(localeItem, locale)}
                  </span>
                  <span class="ls-code">{localeItem.toUpperCase()}</span>
                </button>
              ))}
            </div>
          </div>
        );
      };
      

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

      LocaleSwitcher рдХреЛ IntlayerProvider рдХреЗ рднреАрддрд░ рд░реЗрдВрдбрд░ рдХрд┐рдпрд╛ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдП - рдЗрд╕реЗ рдЕрдкрдиреЗ island рдШрдЯрдХ рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВ (рдЬреИрд╕рд╛ рдХрд┐ рдЪрд░рдг 6 рдореЗрдВ рджрд┐рдЦрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ)ред
    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 },
      ];
      
      const SITE_URL = import.meta.env.SITE ?? "http://localhost:4321";
      
      export const GET: APIRoute = async ({ site }) => {
        const xmlOutput = generateSitemap(pathList, { siteUrl: SITE_URL });
      
        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
      
      v9 рдХреЗ рдмрд╛рдж рд╕реЗ, intlayerCompiler рдХреЛ intlayer plugin рдореЗрдВ рд╢рд╛рдорд┐рд▓ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдЗрд╕рд▓рд┐рдП рдЖрдкрдХреЛ рдЗрд╕реЗ рдореИрдиреНрдпреБрдЕрд▓ рд░реВрдк рд╕реЗ рдЬреЛрдбрд╝рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

      intlayerCompiler рдкреНрд▓рдЧрдЗрди рд╢рд╛рдорд┐рд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА vite.config.ts рдЕрдкрдбреЗрдЯ рдХрд░реЗрдВ:

      vite.config.ts
      import { defineConfig } from "vite";
      import { intlayer } from "vite-intlayer";
      
      export default defineConfig({
        plugins: [
          intlayer({
            proxy: {
              ignore: (req) => req.url?.startsWith("/api"),
            },
          }),
        ],
      });
      
      bash
      npm run build # рдпрд╛ npm run dev
      

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

    Intlayer module augmentation рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ TypeScript рдХреЗ рд▓рд╛рднреЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЖрдкрдХреЗ codebase рдХреЛ рдордЬрдмреВрдд рдмрдирд╛рддрд╛ рд╣реИред

    Autocompletion

    Translation error

    Intlayer рдЕрдкрдиреЗ рдХреЛрдбрдмреЗрд╕ рдХреЛ рдЕрдзрд┐рдХ рдордЬрдмреВрдд рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП TypeScript рдХрд╛ рд▓рд╛рдн рдЙрдард╛рдиреЗ рдХреЗ рд▓рд┐рдП рдореЙрдбреНрдпреВрд▓ рдСрдЧрдореЗрдВрдЯреЗрд╢рди (module augmentation) рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИред рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ рдЖрдкрдХреЗ TypeScript рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рд╕реНрд╡рддрдГ рдЙрддреНрдкрдиреНрди рдкреНрд░рдХрд╛рд░ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ рдФрд░ Preact рдХреЗ рд▓рд┐рдП рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:

    tsconfig.json
    {
      compilerOptions: {
        // ...
        jsx: "react-jsx",
        jsxImportSource: "preact", // Preact 10+ рдХреЗ рд▓рд┐рдП рдЕрдиреБрд╢рдВрд╕рд┐рдд
      },
      "include": [
        // ... рдЖрдкрдХрд╛ рдореМрдЬреВрджрд╛ TypeScript рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди
        ".intlayer/**/*.ts", // рд╕реНрд╡рддрдГ рдЙрддреНрдкрдиреНрди рдкреНрд░рдХрд╛рд░реЛрдВ рдХреЛ рд╢рд╛рдорд┐рд▓ рдХрд░реЗрдВ
      ],
    }
    

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

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

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

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

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

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

    VS Code Marketplace рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓реЗрд╢рди

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

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

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


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

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