Author:
    Creation:2026-05-10Last update:2026-05-10

    Sync PO (i18n рдмреНрд░рд┐рдЬ) - ICU / i18next рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде Sync PO

    рдЕрдкрдиреЗ рдореМрдЬреВрджрд╛ i18n рд╕реНрдЯреИрдХ рдХреЗ рдРрдб-рдСрди рдХреЗ рд░реВрдк рдореЗрдВ Intlayer рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред рдпрд╣ рдкреНрд▓рдЧрдЗрди рдЖрдкрдХреЗ Gettext PO рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ Intlayer рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдХ рдореЗрдВ рд░рдЦрддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЖрдк:

    • рдЕрдкрдиреЗ рдореМрдЬреВрджрд╛ PO-рдЖрдзрд╛рд░рд┐рдд рдЕрдиреБрд╡рд╛рдж рд╡рд░реНрдХрдлрд╝реНрд▓реЛ рдХреЛ рдмрдирд╛рдП рд░рдЦ рд╕рдХреЗрдВред
    • рдЕрдкрдиреЗ рдРрдк рдХреЛ рд░рд┐рдлреИрдХреНрдЯрд░ рдХрд┐рдП рдмрд┐рдирд╛ Intlayer (CLI, CI, рдкреНрд░рджрд╛рддрд╛, CMS) рдХреЗ рд╕рд╛рде рдЕрдкрдиреЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдФрд░ рдЕрдиреБрд╡рд╛рдж рдХрд░ рд╕рдХреЗрдВред
    • рдкреНрд░рддреНрдпреЗрдХ рдкрд╛рд░рд┐рд╕реНрдерд┐рддрд┐рдХреА рддрдВрддреНрд░ рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╣реБрдП рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдФрд░ SEO рд╕рд╛рдордЧреНрд░реА рднреЗрдЬ рд╕рдХреЗрдВ, рдЬрдмрдХрд┐ Intlayer рдХреЛ PO рдкреНрд░рдмрдВрдзрди рдкрд░рдд рдХреЗ рд░реВрдк рдореЗрдВ рд╕реБрдЭрд╛ рд╕рдХреЗрдВред

    рдиреЛрдЯреНрд╕ рдФрд░ рд╡рд░реНрддрдорд╛рди рджрд╛рдпрд░рд╛:

    • CMS рдХреЗ рд▓рд┐рдП рдмрд╛рд╣рд░реАрдХрд░рдг рдЕрдиреБрд╡рд╛рджреЛрдВ рдФрд░ рдХреНрд▓рд╛рд╕рд┐рдХ рдЯреЗрдХреНрд╕реНрдЯ рдХреЗ рд▓рд┐рдП рдХрд╛рдо рдХрд░рддрд╛ рд╣реИред
    • PO рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐рдпреЛрдВ рдХреЗ рднреАрддрд░ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐, рдмрд╣реБрд╡рдЪрди/ICU, рдпрд╛ рдЕрдиреНрдп рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреА рдЙрдиреНрдирдд рд░рдирдЯрд╛рдЗрдо рд╕реБрд╡рд┐рдзрд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдЕрднреА рддрдХ рдХреЛрдИ рд╕рдорд░реНрдерди рдирд╣реАрдВ рд╣реИред
    • рд╡рд┐рдЬрд╝реБрдЕрд▓ рдПрдбрд┐рдЯрд░ рдЕрднреА рддрдХ рддреГрддреАрдп-рдкрдХреНрд╖ i18n рдЖрдЙрдЯрдкреБрдЯ рдХреЗ рд▓рд┐рдП рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИред

    рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрдм рдХрд░реЗрдВ

    • рдЖрдк рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рдЕрдкрдиреЗ рдЕрдиреБрд╡рд╛рджреЛрдВ рдХреЗ рд▓рд┐рдП Gettext PO рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВред
    • рдЖрдк рдЕрдкрдиреЗ рд░реЗрдВрдбрд░рд┐рдВрдЧ рд░рдирдЯрд╛рдЗрдо рдХреЛ рдмрджрд▓реЗ рдмрд┐рдирд╛ AI-рд╕рд╣рд╛рдпрддрд╛ рдкреНрд░рд╛рдкреНрдд рдлрд┐рд▓, CI рдореЗрдВ рдЯреЗрд╕реНрдЯ рдФрд░ рдХрдВрдЯреЗрдВрдЯ рдСрдкреНрд╕ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

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

    bash
    pnpm add -D @intlayer/sync-po-plugin
    # рдпрд╛
    npm i -D @intlayer/sync-po-plugin
    

    рдкреНрд▓рдЧрдЗрдиреНрд╕

    рдпрд╣ рдкреИрдХреЗрдЬ рджреЛ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдкреНрд░рджрд╛рди рдХрд░рддрд╛ рд╣реИ:

    • loadPO: Intlayer рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдореЗрдВ PO рдлрд╝рд╛рдЗрд▓реЗрдВ рд▓реЛрдб рдХрд░реЗрдВред

      • рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕реНрд░реЛрдд рд╕реЗ PO рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдФрд░ рдЗрд╕реЗ Intlayer рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдореЗрдВ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдпрд╣ рдкреВрд░реЗ рдХреЛрдбрдмреЗрд╕ рдХреЛ рд╕реНрдХреИрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ PO рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЦреЛрдЬ рд╕рдХрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ:
        • рдпрджрд┐ рдЖрдк рдПрдХ i18n рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдЖрдкрдХреА PO рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд▓реЛрдб рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдерд╛рди рд▓рд╛рдЧреВ рдХрд░рддреА рд╣реИ, рд▓реЗрдХрд┐рди рдЖрдк рдЕрдкрдиреА рд╕рд╛рдордЧреНрд░реА рдШреЛрд╖рдгрд╛ рдХреЛ рдЕрдкрдиреЗ рдХреЛрдб рдмреЗрд╕ рдореЗрдВ рдЬрд╣рд╛рдВ рдЪрд╛рд╣реЗрдВ рд╡рд╣рд╛рдВ рд░рдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
        • рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рддрдм рднреА рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдЬрдм рдЖрдк рд░рд┐рдореЛрдЯ рд╕реНрд░реЛрдд (рдЬреИрд╕реЗ: CMS, рдПрдХ API, рдЖрджрд┐) рд╕реЗ рдЕрдкрдиреЗ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рдФрд░ рдЕрдкрдиреЗ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ PO рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред

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

    • syncPO: Intlayer рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХреЗ рд╕рд╛рде PO рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░реЗрдВред

      • рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдХрд╛ рдЙрдкрдпреЛрдЧ Intlayer рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХреЗ рд╕рд╛рде PO рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдпрд╣ рджрд┐рдП рдЧрдП рд╕реНрдерд╛рди рдХреЛ рд╕реНрдХреИрди рдХрд░ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рд╡рд┐рд╢рд┐рд╖реНрдЯ PO рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рдкреИрдЯрд░реНрди рд╕реЗ рдореЗрд▓ рдЦрд╛рдиреЗ рд╡рд╛рд▓реЗ PO рдХреЛ рд▓реЛрдб рдХрд░ рд╕рдХрддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рджреВрд╕рд░реА i18n рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реБрдП Intlayer рдХреЗ рд▓рд╛рдн рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ рддреЛ рдпрд╣ рдкреНрд▓рдЧрдЗрди рдЙрдкрдпреЛрдЧреА рд╣реИред

    рджреЛрдиреЛрдВ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдирд╛

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

    syncPO рдкреНрд▓рдЧрдЗрди

    рддреНрд╡рд░рд┐рдд рд╢реБрд░реБрдЖрдд

    рдкреНрд▓рдЧрдЗрди рдХреЛ рдЕрдкрдиреЗ intlayer.config.ts рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ рдФрд░ рдЗрд╕реЗ рдЕрдкрдиреА рдореМрдЬреВрджрд╛ PO рд╕рдВрд░рдЪрдирд╛ рдкрд░ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВред

    intlayer.config.ts
    import { Locales, type IntlayerConfig } from "intlayer";
    import { syncPO } from "@intlayer/sync-po-plugin";
    
    const config: IntlayerConfig = {
      internationalization: {
        locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
        defaultLocale: Locales.ENGLISH,
      },
    
      // рдЕрдкрдиреА рд╡рд░реНрддрдорд╛рди PO рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ Intlayer рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХреЗ рд╕рд╛рде рд╕рд┐рдВрдХ рдореЗрдВ рд░рдЦреЗрдВ
      plugins: [
        syncPO({
          // рдкреНрд░рддрд┐-рд▓реЛрдХреЗрд▓, рдкреНрд░рддрд┐-рдиреЗрдорд╕реНрдкреЗрд╕ рд▓реЗрдЖрдЙрдЯ
          source: ({ key, locale }) => `./locales/${locale}/${key}.po`,
        }),
      ],
    };
    
    export default config;
    

    рд╡реИрдХрд▓реНрдкрд┐рдХ: рдкреНрд░рддрд┐ рд▓реЛрдХреЗрд▓ рдПрдХрд▓ рдлрд╝рд╛рдЗрд▓:

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

    рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

    • рдкрдврд╝реЗрдВ: рдкреНрд▓рдЧрдЗрди рдЖрдкрдХреЗ source рдмрд┐рд▓реНрдбрд░ рд╕реЗ PO рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдЦреЛрдЬ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЙрдиреНрд╣реЗрдВ Intlayer рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИред
    • рд▓рд┐рдЦреЗрдВ: рдмрд┐рд▓реНрдб рдФрд░ рдлрд┐рд▓ рдХреЗ рдмрд╛рдж, рдпрд╣ рд╕реНрдерд╛рдиреАрдпрдХреГрдд PO рдХреЛ рд╡рд╛рдкрд╕ рдЙрдиреНрд╣реАрдВ рдкрдереЛрдВ рдкрд░ рд▓рд┐рдЦрддрд╛ рд╣реИ (рдЙрдЪрд┐рдд Gettext рд╣реЗрдбрд░ рдХреЗ рд╕рд╛рде)ред
    • рдСрдЯреЛ-рдлрд┐рд▓: рдкреНрд▓рдЧрдЗрди рдкреНрд░рддреНрдпреЗрдХ рд╢рдмреНрджрдХреЛрд╢ рдХреЗ рд▓рд┐рдП рдПрдХ autoFill рдкрде рдШреЛрд╖рд┐рдд рдХрд░рддрд╛ рд╣реИред intlayer fill рдЪрд▓рд╛рдиреЗ рд╕реЗ рдбрд┐рдлрд╝реЙрд▓реНрдЯ рд░реВрдк рд╕реЗ рдЖрдкрдХреА PO рдлрд╝рд╛рдЗрд▓реЛрдВ рдореЗрдВ рдХреЗрд╡рд▓ рдЧрд╛рдпрдм рдЕрдиреБрд╡рд╛рдж рдЕрдкрдбреЗрдЯ рд╣реЛрддреЗ рд╣реИрдВред

    API:

    ts
    syncPO({
      source: ({ key, locale }) => string, // рдЖрд╡рд╢реНрдпрдХ
      location?: string, // рд╡реИрдХрд▓реНрдкрд┐рдХ рд▓реЗрдмрд▓, рдбрд┐рдлрд╝реЙрд▓реНрдЯ: "sync-po::path/to/source"
      priority?: number, // рд╕рдВрдШрд░реНрд╖ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рд╡реИрдХрд▓реНрдкрд┐рдХ рдкреНрд░рд╛рдердорд┐рдХрддрд╛, рдбрд┐рдлрд╝реЙрд▓реНрдЯ: 0
    });
    

    рдПрдХрд╛рдзрд┐рдХ PO рд╕реНрд░реЛрдд рдФрд░ рдкреНрд░рд╛рдердорд┐рдХрддрд╛

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

    рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рдкреНрд░рдгрд╛рд▓реА

    рдЬрдм рдХрдИ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдПрдХ рд╣реА рд╢рдмреНрджрдХреЛрд╢ рдХреБрдВрдЬреА рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╣реИрдВ, рддреЛ priority рдкреИрд░рд╛рдореАрдЯрд░ рдпрд╣ рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ рдХрд┐ рдХреМрди рд╕рд╛ рдкреНрд▓рдЧрдЗрди рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд▓реЗрддрд╛ рд╣реИ:

    • рдЙрдЪреНрдЪ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╕рдВрдЦреНрдпрд╛рдПрдБ рдХрдо рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╡рд╛рд▓реА рд╕рдВрдЦреНрдпрд╛рдУрдВ рдкрд░ рдЬреАрддрддреА рд╣реИрдВ
    • .content рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ 0 рд╣реИ
    • рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреА рдбрд┐рдлрд╝реЙрд▓реНрдЯ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ 0 рд╣реИ
    • рд╕рдорд╛рди рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╡рд╛рд▓реЗ рдкреНрд▓рдЧрдЗрдиреНрд╕ рдХреЛ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди рдореЗрдВ рджрд┐рдЦрд╛рдИ рджреЗрдиреЗ рд╡рд╛рд▓реЗ рдХреНрд░рдо рдореЗрдВ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
    intlayer.config.ts
    import { Locales, type IntlayerConfig } from "intlayer";
    import { syncPO } from "@intlayer/sync-po-plugin";
    
    const config: IntlayerConfig = {
      internationalization: {
        locales: [Locales.ENGLISH, Locales.FRENCH],
        defaultLocale: Locales.ENGLISH,
      },
    
      plugins: [
        // рдкреНрд░рд╛рдердорд┐рдХ PO рд╕реНрд░реЛрдд (рдЙрдЪреНрдЪрддрдо рдкреНрд░рд╛рдердорд┐рдХрддрд╛)
        syncPO({
          source: ({ key, locale }) => `./locales/${locale}/${key}.po`,
          location: "main-translations",
          priority: 10,
        }),
    
        // рдлреЙрд▓рдмреИрдХ PO рд╕реНрд░реЛрдд (рдХрдо рдкреНрд░рд╛рдердорд┐рдХрддрд╛)
        syncPO({
          source: ({ locale }) => `./fallback-locales/${locale}.po`,
          location: "fallback-translations",
          priority: 5,
        }),
    
        // рд▓реАрдЧреЗрд╕реА PO рд╕реНрд░реЛрдд (рд╕рдмрд╕реЗ рдХрдо рдкреНрд░рд╛рдердорд┐рдХрддрд╛)
        syncPO({
          source: ({ locale }) => `/my/other/app/legacy/${locale}/messages.po`,
          location: "legacy-translations",
          priority: 1,
        }),
      ],
    };
    
    export default config;
    

    Load PO рдкреНрд▓рдЧрдЗрди

    рддреНрд╡рд░рд┐рдд рд╢реБрд░реБрдЖрдд

    рдореМрдЬреВрджрд╛ PO рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ Intlayer рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкреНрд▓рдЧрдЗрди рдХреЛ рдЕрдкрдиреЗ intlayer.config.ts рдореЗрдВ рдЬреЛрдбрд╝реЗрдВред рдпрд╣ рдкреНрд▓рдЧрдЗрди рдХреЗрд╡рд▓ рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП рд╣реИ (рдбрд┐рд╕реНрдХ рдкрд░ рдХреЛрдИ рд▓реЗрдЦрди рдирд╣реАрдВ):

    intlayer.config.ts
    import { Locales, type IntlayerConfig } from "intlayer";
    import { loadPO } from "@intlayer/sync-po-plugin";
    
    const config: IntlayerConfig = {
      internationalization: {
        locales: [Locales.ENGLISH, Locales.FRENCH, Locales.SPANISH],
        defaultLocale: Locales.ENGLISH,
      },
    
      plugins: [
        // рдЕрдкрдиреЗ рд╕реНрд░реЛрдд рдЯреНрд░реА рдореЗрдВ рдХрд╣реАрдВ рднреА рд╕реНрдерд┐рдд PO рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ
        loadPO({
          source: ({ key }) => `./src/**/${key}.i18n.po`,
          // рдкреНрд░рддрд┐ рдкреНрд▓рдЧрдЗрди рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдПрдХ рдПрдХрд▓ рд▓реЛрдХреЗрд▓ рд▓реЛрдб рдХрд░реЗрдВ (рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди defaultLocale рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ)
          locale: Locales.ENGLISH,
          priority: 0,
        }),
      ],
    };
    
    export default config;
    

    рд╡реИрдХрд▓реНрдкрд┐рдХ: рдкреНрд░рддрд┐-рд▓реЛрдХреЗрд▓ рд▓реЗрдЖрдЙрдЯ, рдЕрднреА рднреА рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП (рдХреЗрд╡рд▓ рдЪрдпрдирд┐рдд рд▓реЛрдХреЗрд▓ рд▓реЛрдб рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ):

    intlayer.config.ts
    import { Locales, type IntlayerConfig } from "intlayer";
    import { loadPO } from "@intlayer/sync-po-plugin";
    
    const config: IntlayerConfig = {
      internationalization: {
        locales: [Locales.ENGLISH, Locales.FRENCH],
        defaultLocale: Locales.ENGLISH,
      },
      plugins: [
        loadPO({
          // рдЗрд╕ рдкреИрдЯрд░реНрди рд╕реЗ рдХреЗрд╡рд▓ Locales.FRENCH рдХреЗ рд▓рд┐рдП рдлрд╝рд╛рдЗрд▓реЗрдВ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рдПрдВрдЧреА
          source: ({ key, locale }) => `./locales/${locale}/${key}.po`,
          locale: Locales.FRENCH,
        }),
      ],
    };
    
    export default config;
    

    рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ

    • рдЦреЛрдЬ: рдЖрдкрдХреЗ source рдмрд┐рд▓реНрдбрд░ рд╕реЗ рдПрдХ рдЧреНрд▓рдм рдмрдирд╛рддрд╛ рд╣реИ рдФрд░ рдорд┐рд▓рд╛рди рдХрд░рдиреЗ рд╡рд╛рд▓реА PO рдлрд╝рд╛рдЗрд▓реЗрдВ рдПрдХрддреНрд░ рдХрд░рддрд╛ рд╣реИред
    • рдкреНрд░рд╛рдкреНрддрд┐: рдкреНрд░рддреНрдпреЗрдХ PO рдлрд╝рд╛рдЗрд▓ рдХреЛ рдкреНрд░рджрд╛рди рдХрд┐рдП рдЧрдП locale рдХреЗ рд╕рд╛рде Intlayer рд╢рдмреНрджрдХреЛрд╢ рдХреЗ рд░реВрдк рдореЗрдВ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИред
    • рдХреЗрд╡рд▓-рдкрдврд╝рдиреЗ рдХреЗ рд▓рд┐рдП: рдЖрдЙрдЯрдкреБрдЯ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд▓рд┐рдЦрддрд╛ рдпрд╛ рдкреНрд░рд╛рд░реВрдкрд┐рдд рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИ; рдпрджрд┐ рдЖрдкрдХреЛ рд░рд╛рдЙрдВрдб-рдЯреНрд░рд┐рдк рд╕рд┐рдВрдХ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ рддреЛ syncPO рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВред
    • рдСрдЯреЛ-рдлрд┐рд▓ рддреИрдпрд╛рд░: рдПрдХ fill рдкрде рдкрд░рд┐рднрд╛рд╖рд┐рдд рдХрд░рддрд╛ рд╣реИ рддрд╛рдХрд┐ intlayer content fill рдЧрд╛рдпрдм рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЛ рдкреЙрдкреНрдпреБрд▓реЗрдЯ рдХрд░ рд╕рдХреЗред

    API

    ts
    loadPO({
      // рдЖрдкрдХреЗ PO рдХреЗ рдкрде рдмрдирд╛рдПрдВред `locale` рд╡реИрдХрд▓реНрдкрд┐рдХ рд╣реИ рдпрджрд┐ рдЖрдкрдХреА рд╕рдВрд░рдЪрдирд╛ рдореЗрдВ рдХреЛрдИ рд▓реЛрдХреЗрд▓ рд╕реЗрдЧрдореЗрдВрдЯ рдирд╣реАрдВ рд╣реИ
      source: ({ key, locale }) => string,
    
      // рдЗрд╕ рдкреНрд▓рдЧрдЗрди рдЗрдВрд╕реНрдЯреЗрдВрд╕ рджреНрд╡рд╛рд░рд╛ рд▓реЛрдб рдХрд┐рдП рдЧрдП рд╢рдмреНрджрдХреЛрд╢реЛрдВ рдХреЗ рд▓рд┐рдП рд▓рдХреНрд╖рд┐рдд рд▓реЛрдХреЗрд▓
      // рдХреЙрдиреНрдлрд╝рд┐рдЧрд░реЗрд╢рди configuration.internationalization.defaultLocale рдХреЗ рд▓рд┐рдП рдбрд┐рдлрд╝реЙрд▓реНрдЯ
      locale?: Locale,
    
      // рд╕реНрд░реЛрдд рдХреА рдкрд╣рдЪрд╛рди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╡реИрдХрд▓реНрдкрд┐рдХ рд▓реЗрдмрд▓
      location?: string, // рдбрд┐рдлрд╝реЙрд▓реНрдЯ: "plugin"
    
      // рдЕрдиреНрдп рд╕реНрд░реЛрддреЛрдВ рдХреЗ рдЦрд┐рд▓рд╛рдл рд╕рдВрдШрд░реНрд╖ рд╕рдорд╛рдзрд╛рди рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХреА рдЬрд╛рдиреЗ рд╡рд╛рд▓реА рдкреНрд░рд╛рдердорд┐рдХрддрд╛
      priority?: number, // рдбрд┐рдлрд╝реЙрд▓реНрдЯ: 0
    });
    

    рд╡реНрдпрд╡рд╣рд╛рд░ рдФрд░ рдкрд░рдВрдкрд░рд╛рдПрдВ

    • рдпрджрд┐ рдЖрдкрдХреЗ source рдорд╛рд╕реНрдХ рдореЗрдВ рд▓реЛрдХреЗрд▓ рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рд╢рд╛рдорд┐рд▓ рд╣реИ, рддреЛ рдХреЗрд╡рд▓ рдЪрдпрдирд┐рдд locale рдХреА рдлрд╝рд╛рдЗрд▓реЗрдВ рдкреНрд░рд╛рдкреНрдд рдХреА рдЬрд╛рддреА рд╣реИрдВред
    • рдпрджрд┐ рдЖрдкрдХреЗ рдорд╛рд╕реНрдХ рдореЗрдВ рдХреЛрдИ {key} рд╕реЗрдЧрдореЗрдВрдЯ рдирд╣реАрдВ рд╣реИ, рддреЛ рдбрд┐рдХреНрд╢рдирд░реА рдХреБрдВрдЬреА "index" рд╣реИред
    • рдХреБрдВрдЬрд┐рдпрд╛рдБ рдЖрдкрдХреЗ source рдмрд┐рд▓реНрдбрд░ рдореЗрдВ {key} рдкреНрд▓реЗрд╕рд╣реЛрд▓реНрдбрд░ рдХреЛ рдкреНрд░рддрд┐рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдХреЗ рдлрд╝рд╛рдЗрд▓ рдкрдереЛрдВ рд╕реЗ рд▓реА рдЧрдИ рд╣реИрдВред
    • рдкреНрд▓рдЧрдЗрди рдХреЗрд╡рд▓ рдЦреЛрдЬреА рдЧрдИ рдлрд╝рд╛рдЗрд▓реЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЧрд╛рдпрдм рд▓реЛрдХреЗрд▓ рдпрд╛ рдХреБрдВрдЬрд┐рдпреЛрдВ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдирд╣реАрдВ рдХрд░рддрд╛ рд╣реИред
    • fill рдкрде рдЖрдкрдХреЗ source рд╕реЗ рдЕрдиреБрдорд╛рдирд┐рдд рд╣реИ рдФрд░ рдЬрдм рдЖрдк рдСрдкреНрдЯ-рдЗрди рдХрд░рддреЗ рд╣реИрдВ рддреЛ CLI рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЧрд╛рдпрдм рдорд╛рдиреЛрдВ рдХреЛ рдЕрдкрдбреЗрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред

    рд╕рдВрдШрд░реНрд╖ рд╕рдорд╛рдзрд╛рди

    рдЬрдм рдПрдХ рд╣реА рдЕрдиреБрд╡рд╛рдж рдХреБрдВрдЬреА рдХрдИ PO рд╕реНрд░реЛрддреЛрдВ рдореЗрдВ рдореМрдЬреВрдж рд╣реЛрддреА рд╣реИ:

    1. рдЙрдЪреНрдЪрддрдо рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╡рд╛рд▓рд╛ рдкреНрд▓рдЧрдЗрди рдЕрдВрддрд┐рдо рдорд╛рди рдирд┐рд░реНрдзрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИ
    2. рдЧрд╛рдпрдм рдХреБрдВрдЬрд┐рдпреЛрдВ рдХреЗ рд▓рд┐рдП рдирд┐рдореНрди рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╕реНрд░реЛрддреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдлреЙрд▓рдмреИрдХ рдХреЗ рд░реВрдк рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ
    3. рдпрд╣ рдЖрдкрдХреЛ рдирдИ рд╕рдВрд░рдЪрдирд╛рдУрдВ рдореЗрдВ рдзреАрд░реЗ-рдзреАрд░реЗ рдорд╛рдЗрдЧреНрд░реЗрдЯ рдХрд░рддреЗ рд╣реБрдП рд▓реАрдЧреЗрд╕реА рдЕрдиреБрд╡рд╛рджреЛрдВ рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИ

    CLI

    рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХреА рдЧрдИ PO рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдЕрдиреНрдп .content рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреА рддрд░рд╣ рдорд╛рдирд╛ рдЬрд╛рдПрдЧрд╛ред рдЗрд╕рдХрд╛ рдорддрд▓рдм рд╣реИ, рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХреА рдЧрдИ PO рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЗ рд▓рд┐рдП рд╕рднреА intlayer рдХрдорд╛рдВрдб рдЙрдкрд▓рдмреНрдз рд╣реЛрдВрдЧреЗред рдЗрд╕рдореЗрдВ рд╢рд╛рдорд┐рд▓ рд╣реИрдВ:

    • рдЧрд╛рдпрдм рдЕрдиреБрд╡рд╛рдж рд╣реИрдВ рдпрд╛ рдирд╣реАрдВ, рдпрд╣ рдкрд░реАрдХреНрд╖рдг рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП intlayer content test
    • рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХреА рдЧрдИ PO рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рд╕реВрдЪреАрдмрджреНрдз рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП intlayer content list
    • рдЧрд╛рдпрдм рдЕрдиреБрд╡рд╛рджреЛрдВ рдХреЛ рднрд░рдиреЗ рдХреЗ рд▓рд┐рдП intlayer content fill
    • рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХреА рдЧрдИ PO рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкреБрд╢ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП intlayer content push
    • рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝ рдХреА рдЧрдИ PO рдлрд╝рд╛рдЗрд▓реЛрдВ рдХреЛ рдкреБрд▓ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП intlayer content pull

    рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдХреЗ рд▓рд┐рдП Intlayer CLI рджреЗрдЦреЗрдВред

    рд╕реАрдорд╛рдПрдБ (рд╡рд░реНрддрдорд╛рди)

    • рддреГрддреАрдп-рдкрдХреНрд╖ рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд▓рдХреНрд╖рд┐рдд рдХрд░рддреЗ рд╕рдордп рдХреЛрдИ рдкреНрд░рд╡рд┐рд╖реНрдЯрд┐ рдпрд╛ рдмрд╣реБрд╡рдЪрди/ICU рд╕рдорд░реНрдерди рдирд╣реАрдВред
    • рд╡рд┐рдЬрд╝реБрдЕрд▓ рдПрдбрд┐рдЯрд░ рдЕрднреА рддрдХ рдЧреИрд░-Intlayer рд░рдирдЯрд╛рдЗрдо рдХреЗ рд▓рд┐рдП рдЙрдкрд▓рдмреНрдз рдирд╣реАрдВ рд╣реИред
    • рдХреЗрд╡рд▓ PO рд╕рд┐рдВрдХреНрд░рдирд╛рдЗрдЬрд╝реЗрд╢рди; рдЧреИрд░-PO рдХреИрдЯрд▓реЙрдЧ рдкреНрд░рд╛рд░реВрдк рд╕рдорд░реНрдерд┐рдд рдирд╣реАрдВ рд╣реИрдВред

    рдпрд╣ рдХреНрдпреЛрдВ рдорд╛рдпрдиреЗ рд░рдЦрддрд╛ рд╣реИ

    • рд╣рдо рд╕реНрдерд╛рдкрд┐рдд i18n рд╕рдорд╛рдзрд╛рдиреЛрдВ рдХреА рд╕рд┐рдлрд╛рд░рд┐рд╢ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдФрд░ Intlayer рдХреЛ рдРрдб-рдСрди рдХреЗ рд░реВрдк рдореЗрдВ рд╕реНрдерд╛рди рджреЗ рд╕рдХрддреЗ рд╣реИрдВред
    • рд╣рдо рдЙрдирдХреЗ SEO/рдХреАрд╡рд░реНрдбреНрд╕ рдХрд╛ рд▓рд╛рдн рдЙрдард╛рддреЗ рд╣реИрдВ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓реНрд╕ рдХреЗ рд╕рд╛рде рдЬреЛ PO рдХреЛ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП Intlayer рдХрд╛ рд╕реБрдЭрд╛рд╡ рджреЗрддреЗ рд╣реБрдП рд╕рдорд╛рдкреНрдд рд╣реЛрддреЗ рд╣реИрдВред
    • рд▓рдХреНрд╖рд┐рдд рджрд░реНрд╢рдХреЛрдВ рдХреЛ "рдирдП рдкреНрд░реЛрдЬреЗрдХреНрдЯ" рд╕реЗ "i18n рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдХрд┐рд╕реА рднреА рдЯреАрдо" рддрдХ рд╡рд┐рд╕реНрддрд╛рд░рд┐рдд рдХрд░рддрд╛ рд╣реИред