Автор:
    Создание:2026-11-03Последнее обновление:2026-11-03

    Плагин Prettier

    prettier-plugin-intlayer упорядочивает ключи ваших переводов в фиксированном порядке при каждом форматировании файлов с помощью Prettier. Диффы остаются компактными, конфликты слияния возникают реже, а отсутствующую локаль легко заметить.

    ts
    // до
    t({ en: "Hello", ru: "Привет", fr: "Bonjour", "en-GB": "Hello", ar: "مرحبا" });
    
    // после
    t({ en: "Hello", ar: "مرحبا", "en-GB": "Hello", fr: "Bonjour", ru: "Привет" });
    

    Установка

    bash
    npm install --save-dev prettier prettier-plugin-intlayer
    

    Требуется Prettier 3 или новее.

    Если в вашем проекте уже используется Prettier, команда intlayer init prettier установит плагин и добавит его в вашу конфигурацию за вас.

    Использование

    Добавьте плагин в конфигурацию Prettier:

    .prettierrc.json
    {
      "plugins": ["prettier-plugin-intlayer"]
    }
    

    Чтобы применять его только к файлам объявлений контента, используйте секцию переопределения (override):

    .prettierrc.json
    {
      "overrides": [
        {
          "files": "*.content.{ts,tsx,js,jsx,mjs,cjs,json}",
          "options": {
            "plugins": ["prettier-plugin-intlayer"],
            "intlayerSortContentKeys": true
          }
        }
      ]
    }
    

    Что подвергается сортировке

    t(): локали

    Закрепленные локали идут первыми (en по умолчанию). Остальные локали следуют в алфавитном порядке.

    ts
    t({
      en: "Invitation not found",
      ar: "الدعوة غير موجودة",
      de: "Einladung nicht gefunden",
      "en-GB": "Invitation not found",
      fr: "Invitation introuvable",
      "he-IL": "ההזמנה לא נמצאה",
    });
    

    plural(): порядок CLDR

    Категории располагаются от наименьшего количества к запасному варианту (fallback): zero, one, two, few, many, other.

    ts
    plural({
      one: "{{count}} вакансия",
      few: "{{count}} вакансии",
      many: "{{count}} вакансий",
      other: "{{count}} вакансий",
    });
    

    enu(): возрастающие пороговые значения

    Условия сортируются по числу, затем по оператору (<1, <=1, 1, >=1, >1). Вариант fallback размещается в самом конце.

    ts
    enu({
      "<-1": "Меньше минус одной машины",
      "0": "Нет машин",
      "2": "Две машины",
      ">=3": "Много машин",
      fallback: "Несколько машин",
    });
    

    Во время выполнения побеждает первое совпавшее условие. Плагин применяет новый порядок только в том случае, если каждое количество по-прежнему разрешается в один и тот же контент. Если порядок определяет итоговый результат, объект остается без изменений. Например, в { '<1': …, '<=-2.3': … } ключ '<1' перехватывает любое отрицательное число.

    select(): по алфавиту

    Варианты сортируются по алфавиту, а fallback идет последним.

    ts
    select({
      draft: "Этот пост является черновиком",
      published: "Этот пост опубликован",
      scheduled: "Этот пост запланирован",
      fallback: "Неизвестный статус",
    });
    

    Без ключа fallback или other в качестве резервного варианта используется последний случай. Этот вариант остается в конце, а сортируются только предшествующие ему варианты.

    Файлы .content.json

    Сериализованная форма сортируется аналогичным образом: { "nodeType": "translation", "translation": { … } }, а также узлы plural, enumeration и select.

    Ключи контента (по желанию)

    При параметре intlayerSortContentKeys: true плагин также сортирует ключи content словаря по алфавиту на каждом уровне вложенности. Это относится только к файлам *.content.*.

    app.content.ts
    export default {
      key: "app",
      content: {
        description: t({ en: "…", fr: "…" }),
        footer: {
          copyright: "© Intlayer",
          links: [{ href: "/doc", label: t({ en: "Docs", fr: "Docs" }) }],
        },
        title: t({ en: "Hello", fr: "Bonjour" }),
      },
    } satisfies Dictionary;
    

    Сортировка продолжается сквозь каждую вспомогательную функцию (t, plural, enu, select, cond, gender, md, insert, nest, file…), чтобы добраться до внутренних объектов. Внутренняя карта ключей каждого хелпера сохраняет свой порядок. Ключи, переданные в cond() и gender(), никогда не переупорядочиваются, поскольку последний ключ является резервным вариантом. Поля, находящиеся на одном уровне с content (key, title, locale…), остаются как есть.

    Опции

    ОпцияПо умолчаниюОписание
    intlayerPinnedLocales["en"]Локали, сохраняемые первыми в t(), в указанном порядке. Передайте [], чтобы сортировать все локали.
    intlayerSortContentKeysfalseВ файлах *.content.* также сортирует ключи контента словаря и вложенные объекты.

    Что остается без изменений

    • Объекты, содержащие spread-оператор (...base), вычисляемый ключ ([key]), метод или дублирующийся ключ.
    • Карты plural() с ключом, не являющимся категорией CLDR.
    • Карты enu(), где новый порядок изменил бы разрешенный контент.
    • Вызовы любых других функций с именами вспомогательных функций, но с аргументом, не являющимся объектом.

    Комментарии перемещаются вместе с ключом, к которому они относятся.

    Поддерживаемые парсеры

    babel, babel-flow, babel-ts, typescript, flow, acorn, espree, meriyah, json, json5 и jsonc. Блоки <script> файлов Vue, Svelte и Astro форматируются с использованием этих парсеров.

    Известное ограничение. Prettier запускает только один плагин на парсер. Если другой плагин также заменяет парсеры JavaScript/TypeScript (например, prettier-plugin-tailwindcss), к этим файлам будет применен только последний указанный плагин. Ограничьте область действия prettier-plugin-intlayer файлами *.content.* с помощью override, чтобы избежать конфликта.