Автор:
    Дата створення:2026-05-10Останнє оновлення:2026-05-10

    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.UKRAINIAN будуть завантажені за цим шаблоном
          source: ({ key, locale }) => `./locales/${locale}/${key}.po`,
          locale: Locales.UKRAINIAN,
        }),
      ],
    };
    
    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».