Автор:
    БозданиС:2026-05-10ПослСднСС обновлСниС:2026-09-27

    Sync PO (i18n мосты) - Бинхронизация PO с ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΎΠΉ ICU / i18next

    Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ Intlayer ΠΊΠ°ΠΊ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊ Π²Π°ΡˆΠ΅ΠΌΡƒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰Π΅ΠΌΡƒ стСку i18n. Π­Ρ‚ΠΎΡ‚ ΠΏΠ»Π°Π³ΠΈΠ½ синхронизируСт ваши сообщСния Gettext PO со словарями Intlayer, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ ΠΌΠΎΠ³Π»ΠΈ:

    • Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ процСсс ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° Π½Π° основС PO.
    • Π£ΠΏΡ€Π°Π²Π»ΡΡ‚ΡŒ ΠΈ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΈΡ‚ΡŒ свои сообщСния с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Intlayer (CLI, CI, ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Ρ‹, CMS) Π±Π΅Π· Ρ€Π΅Ρ„Π°ΠΊΡ‚ΠΎΡ€ΠΈΠ½Π³Π° вашСго прилоТСния.
    • Π’Ρ‹ΠΏΡƒΡΠΊΠ°Ρ‚ΡŒ ΡƒΡ‡Π΅Π±Π½Ρ‹Π΅ пособия ΠΈ SEO-ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ экосистСмы, прСдлагая Intlayer Π² качСствС уровня управлСния PO.

    ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΡ ΠΈ тСкущая ΠΎΠ±Π»Π°ΡΡ‚ΡŒ примСнСния:

    • ЭкстСрнализация Π² CMS Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ для ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΎΠ² ΠΈ классичСского тСкста.
    • Пока Π½Π΅Ρ‚ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ вставок, мноТСствСнного числа/ICU ΠΈΠ»ΠΈ Ρ€Π°ΡΡˆΠΈΡ€Π΅Π½Π½Ρ‹Ρ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ срСды выполнСния Π΄Ρ€ΡƒΠ³ΠΈΡ… Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ Π²Π½ΡƒΡ‚Ρ€ΠΈ самих записСй PO.
    • Π’ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ ΠΏΠΎΠΊΠ° Π½Π΅ поддСрТиваСтся для сторонних Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… i18n.

    Когда ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ этот ΠΏΠ»Π°Π³ΠΈΠ½

    • Π’Ρ‹ ΡƒΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Ρ„Π°ΠΉΠ»Ρ‹ Gettext PO для своих ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΎΠ².
    • Π’Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ИИ, тСстированиС Π² CI ΠΈ ΠΎΠΏΠ΅Ρ€Π°Ρ†ΠΈΠΈ с ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ΠΎΠΌ Π±Π΅Π· измСнСния срСды выполнСния Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Π°.

    Установка

    bash
    pnpm add -D @intlayer/sync-po-plugin
    # ΠΈΠ»ΠΈ
    npm i -D @intlayer/sync-po-plugin
    

    ΠŸΠ»Π°Π³ΠΈΠ½Ρ‹

    Π­Ρ‚ΠΎΡ‚ ΠΏΠ°ΠΊΠ΅Ρ‚ прСдоставляСт Π΄Π²Π° ΠΏΠ»Π°Π³ΠΈΠ½Π°:

    • loadPO: Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° PO-Ρ„Π°ΠΉΠ»ΠΎΠ² Π² словари Intlayer.

      • Π­Ρ‚ΠΎΡ‚ ΠΏΠ»Π°Π³ΠΈΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ PO-Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΈΠ· источника ΠΈ ΠΈΡ… добавлСния Π² словари Intlayer. Он ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всю ΠΊΠΎΠ΄ΠΎΠ²ΡƒΡŽ Π±Π°Π·Ρƒ ΠΈ ΠΈΡΠΊΠ°Ρ‚ΡŒ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ PO-Ρ„Π°ΠΉΠ»Ρ‹. Π­Ρ‚ΠΎΡ‚ ΠΏΠ»Π°Π³ΠΈΠ½ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ:
        • Ссли Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ i18n, которая навязываСт ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½ΠΎΠ΅ мСстополоТСниС для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ Π²Π°ΡˆΠΈΡ… PO-Ρ„Π°ΠΉΠ»ΠΎΠ², Π½ΠΎ Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Ρ€Π°Π·ΠΌΠ΅ΡΡ‚ΠΈΡ‚ΡŒ объявлСниС ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° Ρ‚Π°ΠΌ, Π³Π΄Π΅ Π²Π°ΠΌ ΡƒΠ΄ΠΎΠ±Π½ΠΎ Π² вашСй ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ Π±Π°Π·Π΅.
        • Π•Π³ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ ΠΌΠΎΠΆΠ½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡Π°Ρ‚ΡŒ свои сообщСния ΠΈΠ· ΡƒΠ΄Π°Π»Π΅Π½Π½ΠΎΠ³ΠΎ источника (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, CMS, API ΠΈ Ρ‚. Π΄.) ΠΈ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ ΠΈΡ… Π² PO-Ρ„Π°ΠΉΠ»Π°Ρ….

      Под ΠΊΠ°ΠΏΠΎΡ‚ΠΎΠΌ этот ΠΏΠ»Π°Π³ΠΈΠ½ сканируСт всю ΠΊΠΎΠ΄ΠΎΠ²ΡƒΡŽ Π±Π°Π·Ρƒ, ΠΈΡ‰Π΅Ρ‚ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Π΅ PO-Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ ΠΈΡ… Π² словари Intlayer. ΠžΠ±Ρ€Π°Ρ‚ΠΈΡ‚Π΅ Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅, Ρ‡Ρ‚ΠΎ этот ΠΏΠ»Π°Π³ΠΈΠ½ Π½Π΅ записываСт Π²Ρ‹Π²ΠΎΠ΄ ΠΈ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² PO-Ρ„Π°ΠΉΠ»Ρ‹.

    • syncPO: Бинхронизация PO-Ρ„Π°ΠΉΠ»ΠΎΠ² со словарями Intlayer.

      • Π­Ρ‚ΠΎΡ‚ ΠΏΠ»Π°Π³ΠΈΠ½ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для синхронизации PO-Ρ„Π°ΠΉΠ»ΠΎΠ² со словарями Intlayer. Он ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΊΠ°Π½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π·Π°Π΄Π°Π½Π½ΠΎΠ΅ мСстополоТСниС ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ PO, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ для ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½Π½Ρ‹Ρ… PO-Ρ„Π°ΠΉΠ»ΠΎΠ². Π­Ρ‚ΠΎΡ‚ ΠΏΠ»Π°Π³ΠΈΠ½ ΠΏΠΎΠ»Π΅Π·Π΅Π½, Ссли Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚ΡŒ прСимущСства Intlayer, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ Π΄Ρ€ΡƒΠ³ΡƒΡŽ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ i18n.

    ИспользованиС ΠΎΠ±ΠΎΠΈΡ… ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ²

    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: [
        /**
         * Π—Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ всС PO-Ρ„Π°ΠΉΠ»Ρ‹ Π² src, ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΡˆΠ°Π±Π»ΠΎΠ½Ρƒ {key}.i18n.po
         */
        loadPO({
          source: ({ key }) => `./src/**/${key}.i18n.po`,
          locale: Locales.ENGLISH,
          priority: 1, // Π“Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚, Ρ‡Ρ‚ΠΎ эти PO-Ρ„Π°ΠΉΠ»Ρ‹ ΠΈΠΌΠ΅ΡŽΡ‚ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ Π½Π°Π΄ Ρ„Π°ΠΉΠ»Π°ΠΌΠΈ Π² `./locales/en/${key}.po`
        }),
        /**
         * Π—Π°Π³Ρ€ΡƒΠ·ΠΈΡ‚ ΠΈ Π·Π°ΠΏΠΈΡˆΠ΅Ρ‚ Π²Ρ‹Π²ΠΎΠ΄ ΠΈ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ Π² PO-Ρ„Π°ΠΉΠ»Ρ‹ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅ locales
         */
        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;
    

    Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

    • Π§Ρ‚Π΅Π½ΠΈΠ΅: ΠΏΠ»Π°Π³ΠΈΠ½ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Π΅Ρ‚ PO-Ρ„Π°ΠΉΠ»Ρ‹ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ вашСго сборщика source ΠΈ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ ΠΈΡ… ΠΊΠ°ΠΊ словари 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 ΠΈ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚

    Π’Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ нСсколько ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² syncPO для синхронизации Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Ρ… источников PO. Π­Ρ‚ΠΎ ΠΏΠΎΠ»Π΅Π·Π½ΠΎ, ΠΊΠΎΠ³Π΄Π° Ρƒ вас Π΅ΡΡ‚ΡŒ нСсколько источников ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° ΠΈΠ»ΠΈ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ структуры 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

    Быстрый старт

    Π”ΠΎΠ±Π°Π²ΡŒΡ‚Π΅ ΠΏΠ»Π°Π³ΠΈΠ½ Π² свой intlayer.config.ts, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ³Π»ΠΎΡ‰Π°Ρ‚ΡŒ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ PO-Ρ„Π°ΠΉΠ»Ρ‹ ΠΊΠ°ΠΊ словари Intlayer. Π­Ρ‚ΠΎΡ‚ ΠΏΠ»Π°Π³ΠΈΠ½ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° Ρ‡Ρ‚Π΅Π½ΠΈΠ΅ (Π±Π΅Π· записи Π½Π° диск):

    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;
    

    Как это Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚

    • ΠžΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅: создаСт glob ΠΈΠ· вашСго сборщика source ΠΈ собираСт ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ PO-Ρ„Π°ΠΉΠ»Ρ‹.
    • ΠŸΠΎΠ³Π»ΠΎΡ‰Π΅Π½ΠΈΠ΅: Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ PO-Ρ„Π°ΠΉΠ» ΠΊΠ°ΠΊ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ Intlayer с ΡƒΠΊΠ°Π·Π°Π½Π½ΠΎΠΉ локалью locale.
    • Волько Ρ‡Ρ‚Π΅Π½ΠΈΠ΅: Π½Π΅ записываСт ΠΈ Π½Π΅ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ Π²Ρ‹Ρ…ΠΎΠ΄Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹; ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ 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".
    • ΠšΠ»ΡŽΡ‡ΠΈ ΠΈΠ·Π²Π»Π΅ΠΊΠ°ΡŽΡ‚ΡΡ ΠΈΠ· ΠΏΡƒΡ‚Π΅ΠΉ ΠΊ Ρ„Π°ΠΉΠ»Π°ΠΌ ΠΏΡƒΡ‚Π΅ΠΌ Π·Π°ΠΌΠ΅Π½Ρ‹ заполнитСля {key} Π² вашСм сборщикС source.
    • Плагин ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½Π½Ρ‹Π΅ Ρ„Π°ΠΉΠ»Ρ‹ ΠΈ Π½Π΅ создаСт Π½Π΅Π΄ΠΎΡΡ‚Π°ΡŽΡ‰ΠΈΠ΅ Π»ΠΎΠΊΠ°Π»ΠΈ ΠΈΠ»ΠΈ ΠΊΠ»ΡŽΡ‡ΠΈ.
    • ΠŸΡƒΡ‚ΡŒ fill выводится ΠΈΠ· вашСго source ΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ для обновлСния ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… Π·Π½Π°Ρ‡Π΅Π½ΠΈΠΉ Ρ‡Π΅Ρ€Π΅Π· CLI, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΡΠΎΠ³Π»Π°ΡˆΠ°Π΅Ρ‚Π΅ΡΡŒ.

    Π Π°Π·Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ²

    Когда ΠΎΠ΄ΠΈΠ½ ΠΈ Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΊΠ»ΡŽΡ‡ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° сущСствуСт Π² Π½Π΅ΡΠΊΠΎΠ»ΡŒΠΊΠΈΡ… источниках PO:

    1. Плагин с Π½Π°ΠΈΠ²Ρ‹ΡΡˆΠΈΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ опрСдСляСт ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎΠ΅ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.
    2. Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊΠΈ с Π±ΠΎΠ»Π΅Π΅ Π½ΠΈΠ·ΠΊΠΈΠΌ ΠΏΡ€ΠΈΠΎΡ€ΠΈΡ‚Π΅Ρ‚ΠΎΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π² качСствС Ρ€Π΅Π·Π΅Ρ€Π²Π½Ρ‹Ρ… для ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΊΠ»ΡŽΡ‡Π΅ΠΉ.
    3. Π­Ρ‚ΠΎ позволяСт Π²Π°ΠΌ ΡΠΎΡ…Ρ€Π°Π½ΡΡ‚ΡŒ ΡƒΡΡ‚Π°Ρ€Π΅Π²ΡˆΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹, постСпСнно пСрСходя Π½Π° Π½ΠΎΠ²Ρ‹Π΅ структуры.

    CLI

    Π‘ΠΈΠ½Ρ…Ρ€ΠΎΠ½ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ PO-Ρ„Π°ΠΉΠ»Ρ‹ Π±ΡƒΠ΄ΡƒΡ‚ Ρ€Π°ΡΡΠΌΠ°Ρ‚Ρ€ΠΈΠ²Π°Ρ‚ΡŒΡΡ Ρ‚Π°ΠΊ ΠΆΠ΅, ΠΊΠ°ΠΊ ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ„Π°ΠΉΠ»Ρ‹ .content. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ для синхронизированных PO-Ρ„Π°ΠΉΠ»ΠΎΠ² Π±ΡƒΠ΄ΡƒΡ‚ доступны всС ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ intlayer. Π’ΠΊΠ»ΡŽΡ‡Π°Ρ:

    • intlayer content test для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ наличия ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΎΠ²
    • intlayer content list для Π²Ρ‹Π²ΠΎΠ΄Π° списка синхронизированных PO-Ρ„Π°ΠΉΠ»ΠΎΠ²
    • intlayer content fill для заполнСния ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΎΠ²
    • intlayer content push для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ синхронизированных PO-Ρ„Π°ΠΉΠ»ΠΎΠ²
    • intlayer content pull для получСния синхронизированных PO-Ρ„Π°ΠΉΠ»ΠΎΠ²

    Π‘ΠΌ. Intlayer CLI для получСния Π±ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ.

    ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΡ (Ρ‚Π΅ΠΊΡƒΡ‰ΠΈΠ΅)

    • ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΈΠ΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ вставок ΠΈΠ»ΠΈ мноТСствСнного числа/ICU ΠΏΡ€ΠΈ Π½Π°Ρ†Π΅Π»ΠΈΠ²Π°Π½ΠΈΠΈ Π½Π° сторонниС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ.
    • Π’ΠΈΠ·ΡƒΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π΅Π΄Π°ΠΊΡ‚ΠΎΡ€ ΠΏΠΎΠΊΠ° нСдоступСн для срСд выполнСния, ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹Ρ… ΠΎΡ‚ Intlayer.
    • Волько синхронизация PO; Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ², ΠΎΡ‚Π»ΠΈΡ‡Π½Ρ‹Π΅ ΠΎΡ‚ PO, Π½Π΅ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ.

    ΠŸΠΎΡ‡Π΅ΠΌΡƒ это Π²Π°ΠΆΠ½ΠΎ

    • ΠœΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ Ρ€Π΅ΠΊΠΎΠΌΠ΅Π½Π΄ΠΎΠ²Π°Ρ‚ΡŒ ΡƒΡΡ‚ΠΎΡΠ²ΡˆΠΈΠ΅ΡΡ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ i18n ΠΈ ΠΏΠΎΠ·ΠΈΡ†ΠΈΠΎΠ½ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Intlayer ΠΊΠ°ΠΊ Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅.
    • ΠœΡ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΈΡ… SEO/ΠΊΠ»ΡŽΡ‡Π΅Π²Ρ‹Π΅ слова с ΡƒΡ‡Π΅Π±Π½Ρ‹ΠΌΠΈ пособиями, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°ΠΊΠ°Π½Ρ‡ΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΏΡ€Π΅Π΄Π»ΠΎΠΆΠ΅Π½ΠΈΠ΅ΠΌ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ Intlayer для управлСния PO.
    • Π Π°ΡΡˆΠΈΡ€ΡΠ΅Ρ‚ Ρ†Π΅Π»Π΅Π²ΡƒΡŽ Π°ΡƒΠ΄ΠΈΡ‚ΠΎΡ€ΠΈΡŽ с Β«Π½ΠΎΠ²Ρ‹Ρ… ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ²Β» Π΄ΠΎ «любой ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹, ΡƒΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‰Π΅ΠΉ i18nΒ».