Author:
    Creation:2025-01-02Last update:2025-10-29

    Intlayer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреЗ react-i18next JSON рдЕрдиреБрд╡рд╛рджреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХреИрд╕реЗ рдХрд░реЗрдВ

    www.youtube.com

    Intlayer рдХреНрдпрд╛ рд╣реИ?

    Intlayer рдПрдХ рдЕрднрд┐рдирд╡, рдУрдкрди-рд╕реЛрд░реНрд╕ рдЕрдВрддрд░рд░рд╛рд╖реНрдЯреНрд░реАрдпрдХрд░рдг рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╣реИ рдЬрд┐рд╕реЗ рдкрд╛рд░рдВрдкрд░рд┐рдХ i18n рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рдХрдорд┐рдпреЛрдВ рдХреЛ рджреВрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдпрд╣ React рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рд╕рд╛рдордЧреНрд░реА рдкреНрд░рдмрдВрдзрди рдХреЗ рд▓рд┐рдП рдПрдХ рдЖрдзреБрдирд┐рдХ рджреГрд╖реНрдЯрд┐рдХреЛрдг рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИред

    react-i18next рдХреЗ рд╕рд╛рде рдПрдХ рдареЛрд╕ рддреБрд▓рдирд╛ рдХреЗ рд▓рд┐рдП рд╣рдорд╛рд░реЗ react-i18next vs. react-intl vs. Intlayer рдмреНрд▓реЙрдЧ рдкреЛрд╕реНрдЯ рджреЗрдЦреЗрдВред

    Intlayer рдХреЛ react-i18next рдХреЗ рд╕рд╛рде рдХреНрдпреЛрдВ рдорд┐рд▓рд╛рдПрдВ?

    рдЬрдмрдХрд┐ Intlayer рдПрдХ рдЙрддреНрдХреГрд╖реНрдЯ рд╕реНрд╡рддрдВрддреНрд░ i18n рд╕рдорд╛рдзрд╛рди рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ (рд╣рдорд╛рд░реЗ React рдПрдХреАрдХрд░рдг рдЧрд╛рдЗрдб рджреЗрдЦреЗрдВ), рдЖрдк рдЗрд╕реЗ рдХрдИ рдХрд╛рд░рдгреЛрдВ рд╕реЗ react-i18next рдХреЗ рд╕рд╛рде рдорд┐рд▓рд╛рдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВ:

    1. рдореМрдЬреВрджрд╛ рдХреЛрдбрдмреЗрд╕: рдЖрдкрдХреЗ рдкрд╛рд╕ рдПрдХ рд╕реНрдерд╛рдкрд┐рдд react-i18next рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╣реИ рдФрд░ рдЖрдк рдзреАрд░реЗ-рдзреАрд░реЗ Intlayer рдХреЗ рдмреЗрд╣рддрд░ рдбреЗрд╡рд▓рдкрд░ рдЕрдиреБрднрд╡ рдХреА рдУрд░ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
    2. рдкреБрд░рд╛рдиреЗ рдЖрд╡рд╢реНрдпрдХрддрд╛рдПрдБ: рдЖрдкрдХреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдХреЛ рдореМрдЬреВрджрд╛ react-i18next рдкреНрд▓рдЧрдЗрдиреНрд╕ рдпрд╛ рд╡рд░реНрдХрдлрд╝реНрд▓реЛрдЬрд╝ рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
    3. рдЯреАрдо рдХреА рдкрд░рд┐рдЪрд┐рддрддрд╛: рдЖрдкрдХреА рдЯреАрдо react-i18next рдХреЗ рд╕рд╛рде рд╕рд╣рдЬ рд╣реИ рд▓реЗрдХрд┐рди рдмреЗрд╣рддрд░ рд╕рд╛рдордЧреНрд░реА рдкреНрд░рдмрдВрдзрди рдЪрд╛рд╣рддреА рд╣реИред
    4. Intlayer рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ: рдЖрдк Intlayer рдХреА рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рдгрд╛, рдЕрдиреБрд╡рд╛рдж рд╕реНрд╡рдЪрд╛рд▓рди, рдЕрдиреБрд╡рд╛рдж рдкрд░реАрдХреНрд╖рдг, рдФрд░ рдЕрдиреНрдп рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

    рдЗрд╕рдХреЗ рд▓рд┐рдП, Intlayer рдХреЛ react-i18next рдХреЗ рд▓рд┐рдП рдПрдХ рдПрдбреЗрдкреНрдЯрд░ рдХреЗ рд░реВрдк рдореЗрдВ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рддрд╛рдХрд┐ CLI рдпрд╛ CI/CD рдкрд╛рдЗрдкрд▓рд╛рдЗрдиреЛрдВ рдореЗрдВ рдЖрдкрдХреЗ JSON рдЕрдиреБрд╡рд╛рджреЛрдВ рдХреЛ рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдХрд░рдиреЗ, рдЖрдкрдХреЗ рдЕрдиреБрд╡рд╛рджреЛрдВ рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ, рдФрд░ рдЕрдзрд┐рдХ рдореЗрдВ рдорджрдж рдорд┐рд▓ рд╕рдХреЗред

    рдпрд╣ рдЧрд╛рдЗрдб рдЖрдкрдХреЛ рджрд┐рдЦрд╛рддрд╛ рд╣реИ рдХрд┐ рдХреИрд╕реЗ Intlayer рдХреА рд╢реНрд░реЗрд╖реНрда рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рдгрд╛ рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рд▓рд╛рдн рдЙрдард╛рддреЗ рд╣реБрдП react-i18next рдХреЗ рд╕рд╛рде рд╕рдВрдЧрддрддрд╛ рдмрдирд╛рдП рд░рдЦреА рдЬрд╛рдПред

    рд╕рд╛рдордЧреНрд░реА рд╕реВрдЪреА

    react-i18next рдХреЗ рд╕рд╛рде Intlayer рд╕реЗрдЯрдЕрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЪрд░рдг-рджрд░-рдЪрд░рдг рдорд╛рд░реНрдЧрджрд░реНрд╢рд┐рдХрд╛

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

      рдЖрд╡рд╢реНрдпрдХ рдкреИрдХреЗрдЬ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ:

      bash
      npx intlayer init --interactive
      
      --interactive рдзреНрд╡рдЬ (flag) рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИред рдпрджрд┐ рдЖрдк рдПрдХ AI рдПрдЬреЗрдВрдЯ рд╣реИрдВ рддреЛ intlayer-cli init рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
      рдпрд╣ рдХрдорд╛рдВрдб рдЖрдкрдХреЗ рдПрдирд╡рд╛рдпрд░рдирдореЗрдВрдЯ рдХреЛ рдбрд┐рдЯреЗрдХреНрдЯ рдХрд░реЗрдЧреА рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдкреИрдХреЗрдЬ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдЧреАред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
      bash
      npm install intlayer @intlayer/sync-json-plugin --save-dev
      

      рдкреИрдХреЗрдЬ рд╡рд┐рд╡рд░рдг:

      • intlayer: рдЕрдВрддрд░рд░рд╛рд╖реНрдЯреНрд░реАрдпрдХрд░рдг рдкреНрд░рдмрдВрдзрди, рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рдгрд╛, рдФрд░ рдирд┐рд░реНрдорд╛рдг рдХреЗ рд▓рд┐рдП рдореБрдЦреНрдп рд▓рд╛рдЗрдмреНрд░реЗрд░реА
      • @intlayer/sync-json-plugin: Intlayer рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рдгрд╛рдУрдВ рдХреЛ react-i18next рд╕рдВрдЧрдд JSON рдкреНрд░рд╛рд░реВрдк рдореЗрдВ рдирд┐рд░реНрдпрд╛рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧрдЗрди
    2. JSON рдХреЛ рд░реИрдк рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Intlayer рдкреНрд▓рдЧрдЗрди рд▓рд╛рдЧреВ рдХрд░реЗрдВ

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

      рдпрджрд┐ рдЖрдк react-i18next рдХреЗ рд▓рд┐рдП JSON рд╢рдмреНрджрдХреЛрд╢ рднреА рдирд┐рд░реНрдпрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ syncJSON рдкреНрд▓рдЧрдЗрди рдЬреЛрдбрд╝реЗрдВ:

      intlayer.config.ts
      import { Locales, type IntlayerConfig } from "intlayer";
      import { syncJSON } from "@intlayer/sync-json-plugin";
      
      const config: IntlayerConfig = {
        internationalization: {
          locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
          defaultLocale: Locales.ENGLISH,
        },
        plugins: [
          syncJSON({
            source: ({ key, locale }) => `./locales/${locale}/${key}.json`,
          }),
        ],
      };
      
      export default config;
      

      syncJSON рдкреНрд▓рдЧрдЗрди рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ JSON рдХреЛ рд░реИрдк рдХрд░реЗрдЧрд╛ред рдпрд╣ JSON рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкрдврд╝реЗрдЧрд╛ рдФрд░ рд▓рд┐рдЦреЗрдЧрд╛ рдмрд┐рдирд╛ рд╕рд╛рдордЧреНрд░реА рд╕рдВрд░рдЪрдирд╛ рдХреЛ рдмрджрд▓реЗред

      рдпрджрд┐ рдЖрдк JSON рдХреЛ intlayer рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рдгрд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ (.content рдлрд╝рд╛рдЗрд▓реЗрдВ) рдХреЗ рд╕рд╛рде рд╕рд╣-рдЕрд╕реНрддрд┐рддреНрд╡ рдореЗрдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ Intlayer рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХрд╛рд░реНрдп рдХрд░реЗрдЧрд╛:

      plaintext
      1. JSON рдФрд░ рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рдгрд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рджреЛрдиреЛрдВ рдХреЛ рд▓реЛрдб рдХрд░реЗрдЧрд╛ рдФрд░ рдЙрдиреНрд╣реЗрдВ intlayer рд╢рдмреНрджрдХреЛрд╢ рдореЗрдВ рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░реЗрдЧрд╛ред
      2. рдпрджрд┐ JSON рдФрд░ рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рдгрд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдмреАрдЪ рд╕рдВрдШрд░реНрд╖ рд╣реЛрддрд╛ рд╣реИ, рддреЛ Intlayer рдЙрди рд╕рднреА рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХреЛ рдорд░реНрдЬ рдХрд░рдиреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░реЗрдЧрд╛ред рдпрд╣ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдФрд░ рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рдгрд╛ рдлрд╝рд╛рдЗрд▓ рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░реЗрдЧрд╛ (рд╕рднреА рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░рдиреЗ рдпреЛрдЧреНрдп рд╣реИрдВ)ред

      рдпрджрд┐ JSON рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП CLI рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдпрд╛ CMS рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рдХрд┐рдП рдЬрд╛рддреЗ рд╣реИрдВ, рддреЛ Intlayer рдирдИ рдЕрдиреБрд╡рд╛рджреЛрдВ рдХреЗ рд╕рд╛рде JSON рдлрд╝рд╛рдЗрд▓ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░реЗрдЧрд╛ред

      syncJSON рдкреНрд▓рдЧрдЗрди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рджреЗрдЦрдиреЗ рдХреЗ рд▓рд┐рдП, рдХреГрдкрдпрд╛ syncJSON рдкреНрд▓рдЧрдЗрди рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджреЗрдЦреЗрдВред

    3. рдкреНрд░рддрд┐-рдХрдВрдкреЛрдиреЗрдВрдЯ JSON рдЕрдиреБрд╡рд╛рдж рд▓рд╛рдЧреВ рдХрд░реЗрдВ

      рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, Intlayer рджреЛрдиреЛрдВ JSON рдФрд░ рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рдгрд╛ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд▓реЛрдб, рдорд░реНрдЬ рдФрд░ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░реЗрдЧрд╛ред рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рдгрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджреЗрдЦреЗрдВред рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рдЪрд╛рд╣реЗрдВ, рддреЛ Intlayer рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдЕрдкрдиреЗ рдХреЛрдбрдмреЗрд╕ рдореЗрдВ рдХрд╣реАрдВ рднреА рд╕реНрдерд╛рдиреАрдпрдХреГрдд JSON рдХреЗ рдкреНрд░рддрд┐-рдХрдВрдкреЛрдиреЗрдВрдЯ рдкреНрд░рдмрдВрдзрди рдХреЛ рднреА рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

      рдЗрд╕рдХреЗ рд▓рд┐рдП, рдЖрдк loadJSON рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

      intlayer.config.ts
      import { Locales, type IntlayerConfig } from "intlayer";
      import { loadJSON, syncJSON } from "@intlayer/sync-json-plugin";
      
      const config: IntlayerConfig = {
        internationalization: {
          locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
          defaultLocale: Locales.ENGLISH,
        },
      
        // рдЕрдкрдиреЗ рд╡рд░реНрддрдорд╛рди JSON рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ Intlayer рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдХ рдореЗрдВ рд░рдЦреЗрдВ
        plugins: [
          /**
           * src рдореЗрдВ рд╕рднреА JSON рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд▓реЛрдб рдХрд░реЗрдЧрд╛ рдЬреЛ рдкреИрдЯрд░реНрди {key}.i18n.json рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИрдВ
           */
          loadJSON({
            source: ({ key }) => `./src/**/${key}.i18n.json`,
            locale: Locales.ENGLISH,
            priority: 1, // рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдпреЗ JSON рдлрд╝рд╛рдЗрд▓реЗрдВ `./locales/en/${key}.json` рдореЗрдВ рдлрд╝рд╛рдЗрд▓реЛрдВ рд╕реЗ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд▓реЗрдВ
          }),
          /**
           * рд▓реЛрдб рдХрд░реЗрдЧрд╛, рдФрд░ рдЖрдЙрдЯрдкреБрдЯ рдФрд░ рдЕрдиреБрд╡рд╛рджреЛрдВ рдХреЛ locales рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ JSON рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╡рд╛рдкрд╕ рд▓рд┐рдЦреЗрдЧрд╛
           */
          syncJSON({
            source: ({ key, locale }) => `./locales/${locale}/${key}.json`,
            priority: 0,
          }),
        ],
      };
      
      export default config;
      

      рдпрд╣ src рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рд╕рднреА JSON рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд▓реЛрдб рдХрд░реЗрдЧрд╛ рдЬреЛ рдкреИрдЯрд░реНрди {key}.i18n.json рд╕реЗ рдореЗрд▓ рдЦрд╛рддреА рд╣реИрдВ рдФрд░ рдЙрдиреНрд╣реЗрдВ Intlayer рд╢рдмреНрджрдХреЛрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЛрдб рдХрд░реЗрдЧрд╛ред

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

    рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдк рд╕реЗ рдЙрддреНрдкрдиреНрди Intlayer рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЕрдирджреЗрдЦрд╛ рдХрд░рдирд╛ рдЕрдиреБрд╢рдВрд╕рд┐рдд рд╣реИ:

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

    рдпреЗ рдлрд╝рд╛рдЗрд▓реЗрдВ рдЖрдкрдХреЗ рдмрд┐рд▓реНрдб рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рджреМрд░рд╛рди рдкреБрдирдГ рдЙрддреНрдкрдиреНрди рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ рдФрд░ рдЗрдиреНрд╣реЗрдВ рд╕рдВрд╕реНрдХрд░рдг рдирд┐рдпрдВрддреНрд░рдг рдореЗрдВ рдХрдорд┐рдЯ рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИред

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

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

    VS Code рдорд╛рд░реНрдХреЗрдЯрдкреНрд▓реЗрд╕ рд╕реЗ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ

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

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

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

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