Author:
    Creation:2026-08-23Last update:2026-08-24

    Intlayer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдЕрдкрдиреА Elysia backend рд╡реЗрдмрд╕рд╛рдЗрдЯ рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдХрд░реЗрдВ | Internationalization (i18n)

    elysia-intlayer Elysia рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдПрдХ рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рдЕрдВрддрд░реНрд░рд╛рд╖реНрдЯреНрд░реАрдпрдХрд░рдг (i18n) рдкреНрд▓рдЧрдЗрди рд╣реИ, рдЬреЛ рдЖрдкрдХреА backend services рдХреЛ рд╡рд┐рд╢реНрд╡ рд╕реНрддрд░ рдкрд░ рд╕реБрд▓рдн рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдбрд┐рдЬрд╝рд╛рдЗрди рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЬреЛ рдХреНрд▓рд╛рдЗрдВрдЯ рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛рдУрдВ рдХреЗ рдЖрдзрд╛рд░ рдкрд░ рд╕реНрдерд╛рдиреАрдпрдХреГрдд responses рдкреНрд░рджрд╛рди рдХрд░рдХреЗред

    GitHub рдкрд░ package рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рджреЗрдЦреЗрдВред

    рд╡реНрдпрд╛рд╡рд╣рд╛рд░рд┐рдХ рдЙрдкрдпреЛрдЧ рдХреЗ рдорд╛рдорд▓реЗ

    • рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рднрд╛рд╖рд╛ рдореЗрдВ рдмреИрдХрдПрдВрдб рддреНрд░реБрдЯрд┐рдпрд╛рдВ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛: рдЬрдм рдХреЛрдИ рддреНрд░реБрдЯрд┐ рд╣реЛрддреА рд╣реИ, рддреЛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдореВрд▓ рднрд╛рд╖рд╛ рдореЗрдВ рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рд╕реЗ рд╕рдордЭ рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реЛрддрд╛ рд╣реИ рдФрд░ рдирд┐рд░рд╛рд╢рд╛ рдХрдо рд╣реЛрддреА рд╣реИред рдпрд╣ рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ рдЧрддрд┐рд╢реАрд▓ рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧреА рд╣реИ рдЬреЛ рдЯреЛрд╕реНрдЯ рдпрд╛ рдореЛрдбрд▓ рдЬреИрд╕реЗ рдлреНрд░рдВрдЯ-рдПрдВрдб рдШрдЯрдХреЛрдВ рдореЗрдВ рджрд┐рдЦрд╛рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВред
    • рдмрд╣реБрднрд╛рд╖реА рд╕рд╛рдордЧреНрд░реА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛: рдбреЗрдЯрд╛рдмреЗрд╕ рд╕реЗ рд╕рд╛рдордЧреНрд░реА рдЦреАрдВрдЪрдиреЗ рд╡рд╛рд▓реЗ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдЕрдВрддрд░реНрд░рд╛рд╖реНрдЯреНрд░реАрдпрдХрд░рдг рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕ рд╕рд╛рдордЧреНрд░реА рдХреЛ рдХрдИ рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рдкреНрд░рджрд╛рди рдХрд░ рд╕рдХреЗрдВред рдпрд╣ e-commerce рд╕рд╛рдЗрдЯреНрд╕ рдпрд╛ рд╕рд╛рдордЧреНрд░реА рдкреНрд░рдмрдВрдзрди рдкреНрд░рдгрд╛рд▓рд┐рдпреЛрдВ рдЬреИрд╕реЗ рдкреНрд▓реЗрдЯрдлреЙрд░реНрдо рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдЬрд┐рдиреНрд╣реЗрдВ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдкрд╕рдВрдж рдХреА рдЧрдИ рднрд╛рд╖рд╛ рдореЗрдВ рдЙрддреНрдкрд╛рдж рд╡рд┐рд╡рд░рдг, рд▓реЗрдЦ рдФрд░ рдЕрдиреНрдп рд╕рд╛рдордЧреНрд░реА рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
    • рдмрд╣реБрднрд╛рд╖реА рдИрдореЗрд▓ рднреЗрдЬрдирд╛: рдЪрд╛рд╣реЗ рд╡рд╣ рд▓реЗрдирджреЗрди рд╕рдВрдмрдВрдзреА рдИрдореЗрд▓ рд╣реЛ, рд╡рд┐рдкрдгрди рдЕрднрд┐рдпрд╛рди рд╣реЛ, рдпрд╛ рд╕реВрдЪрдирд╛рдПрдВ рд╣реЛрдВ, рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдХреА рднрд╛рд╖рд╛ рдореЗрдВ рдИрдореЗрд▓ рднреЗрдЬрдиреЗ рд╕реЗ рд╕рд╣рднрд╛рдЧрд┐рддрд╛ рдФрд░ рдкреНрд░рднрд╛рд╡рд╢реАрд▓рддрд╛ рдореЗрдВ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╡реГрджреНрдзрд┐ рд╣реЛ рд╕рдХрддреА рд╣реИред
    • рдмрд╣реБрднрд╛рд╖реА рдкреБрд╢ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди: рдореЛрдмрд╛рдЗрд▓ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рдкрд╕рдВрджреАрджрд╛ рднрд╛рд╖рд╛ рдореЗрдВ рдкреБрд╢ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди рднреЗрдЬрдиреЗ рд╕реЗ рдЗрдВрдЯрд░реИрдХреНрд╢рди рдФрд░ рдкреНрд░рддрд┐рдзрд╛рд░рдг рдмрдврд╝ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣ рд╡реНрдпрдХреНрддрд┐рдЧрдд рд╕реНрдкрд░реНрд╢ рдиреЛрдЯрд┐рдлрд┐рдХреЗрд╢рди рдХреЛ рдЕрдзрд┐рдХ рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рдФрд░ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдпреЛрдЧреНрдп рдорд╣рд╕реВрд╕ рдХрд░рд╛рддрд╛ рд╣реИред
    • рдЕрдиреНрдп рд╕рдВрдЪрд╛рд░: рдмреИрдХрдПрдВрдб рд╕реЗ рдХрд┐рд╕реА рднреА рдкреНрд░рдХрд╛рд░ рдХрд╛ рд╕рдВрдЪрд╛рд░, рдЬреИрд╕реЗ SMS рд╕рдВрджреЗрд╢, рд╕рд┐рд╕реНрдЯрдо рдЕрд▓рд░реНрдЯ, рдпрд╛ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЗрдВрдЯрд░рдлреЗрд╕ рдЕрдкрдбреЗрдЯ, рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдХреА рднрд╛рд╖рд╛ рдореЗрдВ рд╣реЛрдиреЗ рд╕реЗ рд▓рд╛рднрд╛рдиреНрд╡рд┐рдд рд╣реЛрддрд╛ рд╣реИ, рд╕реНрдкрд╖реНрдЯрддрд╛ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдФрд░ рд╕рдордЧреНрд░ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рдЕрдиреБрднрд╡ рдХреЛ рдмрдврд╝рд╛рддрд╛ рд╣реИред

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

    рд╢реБрд░реБрдЖрдд рдХрд░реЗрдВ

    ide.intlayer.org

    Application Template рдХреЛ GitHub рдкрд░ рджреЗрдЦреЗрдВред

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

    elysia-intlayer рдХрд╛ рдЙрдкрдпреЛрдЧ рд╢реБрд░реВ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, npm рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреИрдХреЗрдЬ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдВ:

    bash
    npx intlayer init --interactive
    
    --interactive flag рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИред рдпрджрд┐ рдЖрдк рдПрдХ AI рдПрдЬреЗрдВрдЯ рд╣реИрдВ рддреЛ intlayer-cli init рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
    рдпрд╣ рдХрдорд╛рдВрдб рдЖрдкрдХреЗ environment рдХреЛ рдбрд┐рдЯреЗрдХреНрдЯ рдХрд░реЗрдЧрд╛ рдФрд░ рдЖрд╡рд╢реНрдпрдХ рдкреИрдХреЗрдЬ рдЗрдВрд╕реНрдЯреЙрд▓ рдХрд░реЗрдЧрд╛ред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП:
    bash
    npm install intlayer elysia-intlayer
    
    Elysia Bun рд░рдирдЯрд╛рдЗрдо рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред elysia-intlayer AsyncLocalStorage рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИ (Node-рдЖрдзрд╛рд░рд┐рдд Intlayer рдкреНрд▓рдЧрдЗрдиреНрд╕ рджреНрд╡рд╛рд░рд╛ рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА cls-hooked рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЗ рдмрдЬрд╛рдп), рдареАрдХ рдЗрд╕рд▓рд┐рдП рдХреНрдпреЛрдВрдХрд┐ Bun async_hooks.createHook рдХреЛ рд▓рд╛рдЧреВ рдирд╣реАрдВ рдХрд░рддрд╛ред

    рд╕реЗрдЯрдЕрдк

    рдЕрдкрдиреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рд░реВрдЯ рдореЗрдВ intlayer.config.ts рдмрдирд╛рдХрд░ рдЕрдВрддрд░реНрд░рд╛рд╖реНрдЯреНрд░реАрдпрдХрд░рдг рд╕реЗрдЯрд┐рдВрдЧреНрд╕ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ:

    intlayer.config.ts
    import { Locales, type IntlayerConfig } from "intlayer";
    
    const config: IntlayerConfig = {
      internationalization: {
        locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
        /**
         * рдбрд┐рдлрд╝реЙрд▓реНрдЯ locale, рдЬрд┐рд╕реЗ fallback рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдпрджрд┐ рдЕрдиреБрд░реЛрдзрд┐рдд locale рдирд╣реАрдВ рдорд┐рд▓рддрд╛ред
         */
        defaultLocale: Locales.ENGLISH,
      },
    };
    
    export default config;
    

    рдЕрдкрдиреА рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рд┐рдд рдХрд░реЗрдВ

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

    src/index.content.ts
    import { t, type Dictionary } from "intlayer";
    
    const indexContent = {
      key: "index",
      content: {
        exampleOfContent: t({
          hi: "рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рд▓реМрдЯрд╛рдИ рдЧрдИ рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЙрджрд╛рд╣рд░рдг",
          en: "Example of returned content in English",
          fr: "Exemple de contenu renvoy├й en fran├зais",
          es: "Ejemplo de contenido devuelto en espa├▒ol",
        }),
      },
    } satisfies Dictionary;
    
    export default indexContent;
    
    рдЖрдкрдХреА рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рдгрд╛рдПрдВ рдЖрдкрдХреЗ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдореЗрдВ рдХрд╣реАрдВ рднреА рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИрдВ, рдмрд╢рд░реНрддреЗ рдХрд┐ рд╡реЗ contentDir рдирд┐рд░реНрджреЗрд╢рд┐рдХрд╛ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реЛрдВ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, ./src)ред рдФрд░ рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рдгрд╛ рдлрд╝рд╛рдЗрд▓ рдПрдХреНрд╕рдЯреЗрдВрд╢рди рд╕реЗ рдореЗрд▓ рдЦрд╛рдПрдВ (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, .content.{json,ts,tsx,js,jsx,mjs,cjs,md,mdx,yaml,yml})ред
    рдЕрдзрд┐рдХ рд╡рд┐рд╡рд░рдг рдХреЗ рд▓рд┐рдП, рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рдгрд╛ рджрд╕реНрддрд╛рд╡реЗрдЬрд╝ рджреЗрдЦреЗрдВред

    Elysia Application Setup

    elysia-intlayer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреЗ Elysia application рдХреЛ рд╕реЗрдЯрдЕрдк рдХрд░реЗрдВ:

    src/index.ts
    import { Elysia } from "elysia";
    import { intlayer } from "elysia-intlayer";
    
    const app = new Elysia()
      // рдЕрдВрддрд░реНрд░рд╛рд╖реНрдЯреНрд░реАрдпрдХрд░рдг plugin рдХреЛ рд▓реЛрдб рдХрд░реЗрдВ
      .use(intlayer())
      // Routes
      .get("/", ({ intlayer }) => ({
        // рдЗрд╕ request рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рдиреЗ рд╡рд╛рд▓рд╛ Locale, `Accept-Language` negotiated рдпрд╛ storage рд╕реЗ рдкрдврд╝рд╛ рдЧрдпрд╛
        locale: intlayer!.locale,
        greeting: intlayer!.t({
          hi: "рдирдорд╕реНрддреЗ",
          en: "Hello",
          fr: "Bonjour",
          es: "Hola",
        }),
        content: intlayer!.getIntlayer("index").exampleOfContent,
      }))
      .listen(3000);
    
    console.log(
      `ЁЯжК Elysia is running at ${app.server?.hostname}:${app.server?.port}`
    );
    
    рдкреНрд▓рдЧрдЗрди рдЕрдкрдирд╛ context рдПрдХ рдЧреНрд▓реЛрдмрд▓ derive рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕реЗ Elysia Partial<{ intlayer: IntlayerContext }> рдХреЗ рд░реВрдк рдореЗрдВ рдЯрд╛рдЗрдк рдХрд░рддрд╛ рд╣реИред .use(intlayer()) рдХреЗ рдмрд╛рдж рд░рдЬрд┐рд╕реНрдЯрд░ рдХрд┐рдП рдЧрдП routes рдХреЗ рд▓рд┐рдП рд░рдирдЯрд╛рдЗрдо рдкрд░ рдпрд╣ рдорд╛рди рд╣рдореЗрд╢рд╛ рдореМрдЬреВрдж рд░рд╣рддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП strict рдореЛрдб рдореЗрдВ TypeScript рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП non-null assertion (intlayer!.locale) тАФ рдпрд╛ optional chaining тАФ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред

    Route context рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдЙрдкрд▓рдмреНрдз рдХрд░рд╛рддрд╛ рд╣реИ:

    рдкреНрд░реЙрдкрд░реНрдЯреАрд╡рд┐рд╡рд░рдг
    localeрдЗрд╕ рдЕрдиреБрд░реЛрдз рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА locale, рдЬрд┐рд╕рдореЗрдВ locale_storage рдХреЛ locale_detected рдкрд░ рд╡рд░реАрдпрддрд╛ рдорд┐рд▓рддреА рд╣реИред
    locale_storageрдХреНрд▓рд╛рдЗрдВрдЯ рджреНрд╡рд╛рд░рд╛ cookie рдпрд╛ header рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдк рд╕реЗ рдорд╛рдВрдЧреА рдЧрдИ localeред
    locale_detectedрдЕрдиреБрд░реЛрдз рдХреЗ headers рд╕реЗ рдиреЗрдЧреЛрд╢рд┐рдПрдЯ рдХреА рдЧрдИ localeред
    defaultLocaleintlayer.config.ts рдореЗрдВ fallback рдХреЗ рд░реВрдк рдореЗрдВ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХреА рдЧрдИ localeред
    tрдПрдХ рдЕрдиреБрд╡рд╛рдж рдлрд╝рдВрдХреНрд╢рдиред
    getIntlayerрдХреБрдВрдЬреА рджреНрд╡рд╛рд░рд╛ dictionaries рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдлрд╝рдВрдХреНрд╢рдиред
    getDictionarydictionary рдСрдмреНрдЬреЗрдХреНрдЯреНрд╕ рдХреЛ рдкреНрд░реЛрд╕реЗрд╕ рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдлрд╝рдВрдХреНрд╢рдиред

    рд╡рд╣реА helpers standalone exports рдХреЗ рд░реВрдк рдореЗрдВ рднреА рдЙрдкрд▓рдмреНрдз рд╣реИрдВред рдпреЗ AsyncLocalStorage рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдореМрдЬреВрджрд╛ request рдХреЛ рд╣рд▓ рдХрд░рддреЗ рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рдЖрдк рдЗрдиреНрд╣реЗрдВ context рдХреЛ destructure рдХрд┐рдП рдмрд┐рдирд╛ рдХреЙрд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

    src/index.ts
    import { Elysia } from "elysia";
    import { intlayer, t, getDictionary, getIntlayer } from "elysia-intlayer";
    import dictionaryExample from "./index.content";
    
    const app = new Elysia()
      .use(intlayer())
      .get("/t_example", () =>
        t({
          hi: "рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рд▓реМрдЯрд╛рдИ рдЧрдИ рд╕рд╛рдордЧреНрд░реА рдХрд╛ рдЙрджрд╛рд╣рд░рдг",
          en: "Example of returned content in English",
          fr: "Exemple de contenu renvoy├й en fran├зais",
          es: "Ejemplo de contenido devuelto en espa├▒ol",
        })
      )
      .get("/getIntlayer_example", () => getIntlayer("index").exampleOfContent)
      .get(
        "/getDictionary_example",
        () => getDictionary(dictionaryExample).exampleOfContent
      )
      .listen(3000);
    
    рд░рд┐рд╕реНрдкреЙрдиреНрд╕ рдореИрдк рд╣реЛрддреЗ рд╣реА рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рд╕рдВрджрд░реНрдн рдореБрдХреНрдд рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддрд╛рдХрд┐ рд╕реНрдЯреИрдВрдбрдЕрд▓реЛрди helpers рдХрднреА рднреА рдкрд╣рд▓реЗ рд╕реЗ рд╕рдорд╛рдкреНрдд рд╣реЛ рдЪреБрдХреЗ рдЕрдиреБрд░реЛрдз рдХреЗ рд╡рд┐рд░реБрджреНрдз рд╣рд▓ рди рд╣реЛрдВред рдЬрдм рдЙрдиреНрд╣реЗрдВ рдкреНрд▓рдЧрдЗрди рджреНрд╡рд╛рд░рд╛ рд╕рдВрднрд╛рд▓реЗ рдЧрдП рдЕрдиреБрд░реЛрдз рдХреЗ рдмрд╛рд╣рд░ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рддреЛ рд╡реЗ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХреА рдЧрдИ рдбрд┐рдлрд╝реЙрд▓реНрдЯ locale рдкрд░ fallback рдХрд░рддреЗ рд╣реИрдВред

    рдЕрдкрдирд╛ рдПрдкреНрд▓рд┐рдХреЗрд╢рди рдЪрд▓рд╛рдПрдБ

    рдЕрдкрдиреЗ package.json рдореЗрдВ Intlayer рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕ рдЬреЛрдбрд╝реЗрдВред intlayer build рдЖрдкрдХреЗ content declarations рдХреЛ .intlayer рдбрд╛рдпрд░реЗрдХреНрдЯрд░реА рдореЗрдВ рдХрдВрдкрд╛рдЗрд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ TypeScript рдЯрд╛рдЗрдкреНрд╕ рдЬрдирд░реЗрдЯ рдХрд░рддрд╛ рд╣реИ:

    package.json
    {
      "scripts": {
        "dev": "intlayer build && bun run --watch src/index.ts",
        "build": "intlayer build",
        "start": "bun run src/index.ts",
        "i18n:fill": "intlayer fill",
        "i18n:test": "intlayer test"
      }
    }
    

    рдлрд┐рд░ рд╕рд░реНрд╡рд░ рд╢реБрд░реВ рдХрд░реЗрдВ:

    bash
    bun run dev
    

    Accept-Language рдХреЗ рд╕рд╛рде locale negotiation рдХрд╛ рдкрд░реАрдХреНрд╖рдг рдХрд░реЗрдВ:

    bash
    curl -H "Accept-Language: fr" http://localhost:3000/
    # {"locale":"fr","greeting":"Bonjour","content":"Exemple de contenu renvoy├й en fran├зais"}
    
    curl -H "Accept-Language: es" http://localhost:3000/
    # {"locale":"es","greeting":"Hola","content":"Ejemplo de contenido devuelto en espa├▒ol"}
    
    bun run src/index.ts рд╕реЗ рдкрд╣рд▓реЗ intlayer build рдЕрдирд┐рд╡рд╛рд░реНрдп рдирд╣реАрдВ рд╣реИ: рдкреНрд▓рдЧрдЗрди Elysia рдРрдк рдХреЗ рдмреВрдЯ рд╣реЛрдиреЗ рдкрд░ рднреА dictionaries рддреИрдпрд╛рд░ рдХрд░рддрд╛ рд╣реИред рдЗрд╕реЗ рдкрд╣рд▓реЗ рдЪрд▓рд╛рдиреЗ рд╕реЗ рдЬрдирд░реЗрдЯ рдХрд┐рдП рдЧрдП рдЯрд╛рдЗрдкреНрд╕ рдЖрдкрдХреЗ рдПрдбрд┐рдЯрд░ рдХреЗ рд▓рд┐рдП рд╕рд┐рдВрдХ рдореЗрдВ рд░рд╣рддреЗ рд╣реИрдВ рдФрд░ рдкрд╣рд▓реА request рдкрд░ build рдХреА рд▓рд╛рдЧрдд рдирд╣реАрдВ рдЖрддреАред

    рд╕рдВрдЧрддрддрд╛

    elysia-intlayer рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рдВрдЧрдд рд╣реИ:

    • react-intlayer React applications рдХреЗ рд▓рд┐рдП
    • next-intlayer Next.js applications рдХреЗ рд▓рд┐рдП
    • vite-intlayer Vite applications рдХреЗ рд▓рд┐рдП

    рдпрд╣ рд╡рд┐рднрд┐рдиреНрди рд╡рд╛рддрд╛рд╡рд░рдгреЛрдВ рдореЗрдВ рдХрд┐рд╕реА рднреА рдЕрдВрддрд░реНрд░рд╛рд╖реНрдЯреНрд░реАрдпрдХрд░рдг рд╕рдорд╛рдзрд╛рди рдХреЗ рд╕рд╛рде рдирд┐рд░реНрдмрд╛рдз рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ browsers рдФрд░ API requests рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

    рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ, рдкреНрд▓рдЧрдЗрди locale рдХреЛ рдЗрд╕ рдХреНрд░рдо рдореЗрдВ рд╣рд▓ рдХрд░рддрд╛ рд╣реИ:

    1. INTLAYER_LOCALE рдХреБрдХреАред
    2. x-intlayer-locale рд╣реЗрдбрд░ред
    3. Accept-Language рд╣реЗрдбрд░ negotiationред

    рдЖрдк locale рдбрд┐рдЯреЗрдХреНрд╢рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдХреБрдХреА рдФрд░ рд╣реЗрдбрд░ рдХреЛ рдХрд╕реНрдЯрдорд╛рдЗрдЬрд╝ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

    intlayer.config.ts
    import { Locales, type IntlayerConfig } from "intlayer";
    
    const config: IntlayerConfig = {
      // ... рдЕрдиреНрдп configuration options
      routing: {
        storage: [
          { type: "header", name: "my-locale-header" },
          { type: "cookie", name: "my-locale-cookie" },
        ],
      },
    };
    
    export default config;
    
    рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП configuration рдФрд░ advanced topics рдкрд░, рд╣рдорд╛рд░реА documentation рджреЗрдЦреЗрдВред

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

    elysia-intlayer рдЕрдВрддрд░реНрд░рд╛рд╖реНрдЯреНрд░реАрдпрдХрд░рдг рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЛ рдмрдврд╝рд╛рдиреЗ рдХреЗ рд▓рд┐рдП TypeScript рдХреА рдордЬрдмреВрдд рдХреНрд╖рдорддрд╛рдУрдВ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рддрд╛ рд╣реИред TypeScript рдХрд╛ static typing рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рд╣рд░ translation key рдХреЛ рдзреНрдпрд╛рди рдореЗрдВ рд░рдЦрд╛ рдЬрд╛рдП, рдЬрд┐рд╕рд╕реЗ рдЕрдиреБрд╡рд╛рдж рдЧрд╛рдпрдм рд╣реЛрдиреЗ рдХрд╛ рдЬреЛрдЦрд┐рдо рдХрдо рд╣реЛрддрд╛ рд╣реИ рдФрд░ maintainability рдореЗрдВ рд╕реБрдзрд╛рд░ рд╣реЛрддрд╛ рд╣реИред

    рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░реЗрдВ рдХрд┐ autogenerated types (рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ ./types/intlayer.d.ts рдкрд░) рдЖрдкрдХреА tsconfig.json рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВред

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

    VS Code Extension

    Intlayer рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ development experience рдХреЛ рдмреЗрд╣рддрд░ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЖрдзрд┐рдХрд╛рд░рд┐рдХ Intlayer VS Code Extension рдХреЛ install рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

    VS Code Marketplace рд╕реЗ Install рдХрд░реЗрдВ

    рдпрд╣ extension рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:

    • Autocompletion translation keys рдХреЗ рд▓рд┐рдПред
    • Real-time error detection missing translations рдХреЗ рд▓рд┐рдПред
    • Inline previews translated content рдХреЗ рд▓рд┐рдПред
    • Quick actions easily create рдФрд░ update translations рдХреЗ рд▓рд┐рдПред

    Extension рдХреЛ рдХреИрд╕реЗ use рдХрд░реЗрдВ рдЗрд╕ рдмрд╛рд░реЗ рдореЗрдВ рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП, Intlayer VS Code Extension documentation рджреЗрдЦреЗрдВред

    Git Configuration

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

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

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

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

    • рдмреБрдирд┐рдпрд╛рджреА рд╢рдмреНрджрдХреЛрд╢: рдмрд┐рдирд╛ рдкреНрд░рдХрд╛рд░ рдпрд╛ рдЯреВрд▓рд┐рдВрдЧ рдХреЗред
    • Intlayer: рд╡рд┐рд╢реЗрд╖ рд░реВрдк рд╕реЗ Bun рдФрд░ Elysia рдХреЗ рд▓рд┐рдП рдЕрдиреБрдХреВрд▓рд┐рдд, рдмрд┐рд▓реНрдб рд╕рдордп рд╕рдВрдХрд▓рди, рд╕рдЦреНрдд TypeScript рдкреНрд░рдХрд╛рд░ рдФрд░ рдЙрдЪреНрдЪ рдкреНрд░рджрд░реНрд╢рдиред

    рдмреИрдХрдПрдВрдб рдХрд╛ рдЕрдВрддрд░реНрд░рд╛рд╖реНрдЯреНрд░реАрдпрдХрд░рдг рдХрд░рдиреЗ рдХрд╛ рдореБрдЦреНрдп рдХрд╛рд░рдг рдпрд╣ рд╣реИ рдХрд┐ рдЙрдкрдпреЛрдЧрдХрд░реНрддрд╛ рджреНрд╡рд╛рд░рд╛ рдкрдврд╝реЗ рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдЯреЗрдХреНрд╕реНрдЯ рдХрд╛ рдПрдХ рдмрдбрд╝рд╛ рд╣рд┐рд╕реНрд╕рд╛ рдХрднреА рднреА рдлреНрд░рдВрдЯрдПрдВрдб рд╕реЗ рд╣реЛрдХрд░ рдирд╣реАрдВ рдЧреБрдЬрд░рддрд╛: API рддреНрд░реБрдЯрд┐ рд╕рдВрджреЗрд╢, рд▓реЗрди-рджреЗрди рд╕рдВрдмрдВрдзреА рдИрдореЗрд▓, рдкреБрд╢ рд╕реВрдЪрдирд╛рдПрдВ, SMS рдФрд░ PDF рдирд┐рд░реНрдпрд╛рддред рдЗрдиреНрд╣реЗрдВ рдкреНрд░рддрд┐ рд╕рддреНрд░ рдХреЗ рдмрдЬрд╛рдп рдкреНрд░рддрд┐ рдЕрдиреБрд░реЛрдз рд╣рд▓ рдХреА рдЧрдИ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдХреА рднрд╛рд╖рд╛ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИред

    Intlayer рдХреНрдпреЛрдВ рдЪреБрдиреЗрдВ рджреЗрдЦреЗрдВред

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

    рд╣рд╛рдБ, рдорд╛рдЗрдЧреНрд░реЗрд╢рди рдЧрд╛рдЗрдб рдФрд░ JSON рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди рдкреНрд▓рдЧрдЗрди рдХрд╛ рдкрд╛рд▓рди рдХрд░рдХреЗред

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

    рдирд╣реАрдВред npx intlayer extract рдЪрд▓рд╛рдПрдВ рдФрд░ Intlayer рдЖрдкрдХреА source files рдХреЛ рдкрдврд╝рддрд╛ рд╣реИ, user facing strings рдХреЛ рдирд┐рдХрд╛рд▓рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рдХреЗ рдмрдЧрд▓ рдореЗрдВ рдПрдХ .content file рд▓рд┐рдЦрддрд╛ рд╣реИ, рдЗрд╕рд▓рд┐рдП рдЖрдк strings рдХреЛ рдПрдХ catalog рдореЗрдВ рдПрдХ-рдПрдХ рдХрд░рдХреЗ рдХреЙрдкреА рдХрд░рдиреЗ рдХреЗ рдмрдЬрд╛рдп рдПрдХ diff рдХреА рд╕рдореАрдХреНрд╖рд╛ рдХрд░рддреЗ рд╣реИрдВред extract command рджреЗрдЦреЗрдВред

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

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

    • VS Code extension: рдПрдХ рдХреБрдВрдЬреА рд╕реЗ рд╕рд╛рдордЧреНрд░реА рдлрд╝рд╛рдЗрд▓ рддрдХ рдЬрд╛рдПрдВ, рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдирд┐рдХрд╛рд▓реЗрдВ, рдФрд░ рдХрдорд╛рдВрдб рдкреИрд▓реЗрдЯ рд╕реЗ build, fill, test, push рдФрд░ pull рдЪрд▓рд╛рдПрдВред
    • LSP server: LSP рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХрд┐рд╕реА рднреА рд╕рдВрдкрд╛рджрдХ рдореЗрдВ рдкрд░рд┐рднрд╛рд╖рд╛ рдкрд░ рдЬрд╛рдПрдВ, рдЕрдиреБрд╡рд╛рджрд┐рдд рдорд╛рди рдХрд╛ рдкреВрд░реНрд╡рд╛рд╡рд▓реЛрдХрди рджреЗрдЦреЗрдВ, рдФрд░ рдХреБрдВрдЬреА рдкреВрд░реНрдгрддрд╛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВред i18next рдХреЙрд▓ рдХреЛ рднреА рд╕рдВрднрд╛рд▓рддрд╛ рд╣реИред
    • 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 рдирд┐рдпрдо рд╣рд╛рд░реНрдбрдХреЛрдбреЗрдб рд╕реНрдЯреНрд░рд┐рдВрдЧреНрд╕ рдХреЛ рдЪрд┐рд╣реНрдирд┐рдд рдХрд░рддрд╛ рд╣реИред