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

    Как Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ΡŒ Π½Π΅Π΄ΠΎΡΡ‚Π°ΡŽΡ‰ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹ Ρ€Π°Π½ΡŒΡˆΠ΅ Π²Π°ΡˆΠΈΡ… ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ

    ΠžΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° практичСски Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ выбрасываСт ΠΎΡˆΠΈΠ±ΠΊΡƒ. Π’ зависимости ΠΎΡ‚ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π»ΠΈΠ±ΠΎ ΠΏΠΎΠΊΠ°ΠΆΠ΅Ρ‚ английский тСкст японскому ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŽ, Π»ΠΈΠ±ΠΎ Π²Ρ‹Π²Π΅Π΄Π΅Ρ‚ checkout.summary.total прямо Π½Π° страницС Π² ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½Π΅. Оба Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Π° ΠΏΠΎΠΏΠ°Π΄Π°ΡŽΡ‚ Π² Ρ€Π΅Π»ΠΈΠ·, проходят ΠΊΠΎΠ΄-Ρ€Π΅Π²ΡŒΡŽ ΠΈ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π°ΠΌΠΈ, Π° Π½Π΅ Π²Π°ΠΌΠΈ.

    Π‘ΠΎΠ΄Π΅Ρ€ΠΆΠ°Π½ΠΈΠ΅

    Π­Ρ‚ΠΎ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ нСзависимо ΠΎΡ‚ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ

    Π—Π΄Π΅ΡΡŒ Π½Π΅Ρ‚ привязки ΠΊ ΠΊΠ°ΠΊΠΎΠΌΡƒ-Ρ‚ΠΎ ΠΎΠ΄Π½ΠΎΠΌΡƒ стСку. ΠžΠΏΠΈΡΠ°Π½Π½Ρ‹Π΅ Π½ΠΈΠΆΠ΅ ΡƒΡ€ΠΎΠ²Π½ΠΈ обнаруТСния ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΎΠ½ΠΈΡ€ΡƒΡŽΡ‚ Π² i18next, react-i18next, next-intl, react-intl, vue-i18n, next-translate ΠΈΠ»ΠΈ Lingui, ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ всС ΠΎΠ½ΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°ΡŽΡ‚ ΠΊΠ»ΡŽΡ‡ΠΈ ΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²ΠΎ Π΄Π°ΡŽΡ‚ сбои.

    Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ пСрСносимы. Если ваши ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹ сСйчас хранятся Π² JSON-ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°Ρ…, ΠΏΠ»Π°Π³ΠΈΠ½ Sync JSON ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Intlayer ΠΊ этим Ρ„Π°ΠΉΠ»Π°ΠΌ, прСдоставляя ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ Π°ΡƒΠ΄ΠΈΡ‚Π°, автозаполнСния ΠΈ тСстирования Π±Π΅Π· пСрСноса ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° ΠΈ Π±Π΅Π· измСнСния ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΎΠ²:

    intlayer.config.ts
    import { syncJSON } from "@intlayer/sync-json-plugin";
    
    const config = {
      plugins: [
        syncJSON({
          source: ({ key, locale }) => `./locales/${locale}/${key}.json`,
          format: "i18next", // или "icu" для next-intl / react-intl
        }),
      ],
    };
    
    export default config;
    

    Если Π²Ρ‹ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΡΠΎΡ…Ρ€Π°Π½ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ²Ρ‹Ρ‡Π½Ρ‹ΠΉ runtime API, Π°Π΄Π°ΠΏΡ‚Π΅Ρ€Ρ‹ совмСстимости ΡΠΎΠ·Π΄Π°ΡŽΡ‚ псСвдонимы для useTranslation, $t ΠΈ Π΄Ρ€ΡƒΠ³ΠΈΡ… Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΉ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ сборщика. Π’ любом случаС воспринимайтС ΠΏΡ€ΠΈΠ²Π΅Π΄Π΅Π½Π½Ρ‹Π΅ ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΠΊΠ°ΠΊ Π½Π°Π³Π»ΡΠ΄Π½ΡƒΡŽ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΡŽ ΠΊΠΎΠ½Ρ†Π΅ΠΏΡ†ΠΈΠΈ, Π° Π½Π΅ ТСсткоС Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΠ΅.

    ΠŸΠΎΡ‡Π΅ΠΌΡƒ ΠΎΠ½ΠΈ Π½Π΅Π·Π°ΠΌΠ΅Ρ‚Π½Ρ‹

    Π›ΡŽΠ±Π°Ρ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° i18n Ρ€Π°Π·Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΊΠ»ΡŽΡ‡ ΠΏΠΎ ΠΎΠ΄Π½ΠΎΠΉ Ρ†Π΅ΠΏΠΎΡ‡ΠΊΠ΅: Π½Π°ΠΉΡ‚ΠΈ Π² Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ Π»ΠΎΠΊΠ°Π»ΠΈ, ΠΎΡ‚ΠΊΠ°Ρ‚ΠΈΡ‚ΡŒΡΡ ΠΊ Π»ΠΎΠΊΠ°Π»ΠΈ ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ ΠΈ, Ссли Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ Π½Π°ΠΉΠ΄Π΅Π½ΠΎ, Π²Π΅Ρ€Π½ΡƒΡ‚ΡŒ сам строковый ΠΊΠ»ΡŽΡ‡. ИмСнно этот послСдний шаг создаСт ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ. НСт ΠΈΡΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠΉ, Π½Π΅Ρ‚ ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠΉ Π² ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½Π΅ ΠΈ Π½Π΅Ρ‚ ΡƒΠΏΠ°Π²ΡˆΠΈΡ… тСстов, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π½ΠΈΡ‡Ρ‚ΠΎ Π² ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½Π΅ Π½Π΅ считаСт отсутствиС ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° Π°Π½ΠΎΠΌΠ°Π»ΠΈΠ΅ΠΉ.

    Ѐолбэк Π΄Π΅Π»Π°Π΅Ρ‚ ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ Π΅Ρ‰Π΅ Ρ…ΡƒΠΆΠ΅. Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π°, которая ΠΌΠΎΠ»Ρ‡Π° ΠΎΡ‚Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ»Π°ΡΡŒ Π½Π° английском, выглядит ΡΠΎΠ²Π΅Ρ€ΡˆΠ΅Π½Π½ΠΎ Π½ΠΎΡ€ΠΌΠ°Π»ΡŒΠ½ΠΎΠΉ для англоязычного Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ° ΠΈ ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ всС автоматичСскиС ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ. Ошибка Π²ΠΈΠ΄Π½Π° Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎΠΌΡƒ, ΠΊΡ‚ΠΎ Π½Π΅ ΠΏΠΎΠ½ΠΈΠΌΠ°Π΅Ρ‚ этот язык.

    ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ вопрос Π·Π²ΡƒΡ‡ΠΈΡ‚ Π½Π΅ Β«ΠΊΠ°ΠΊ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Ρ‚ΡŒ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹ Π²ΠΎ врСмя выполнСния». А Β«ΠΊΠ°ΠΊ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ Ρ‚Π°ΠΊ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ PR с ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΌ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΎΠΌ Π±Ρ‹Π»ΠΎ Π½Π΅Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠΌΠ΅Ρ€ΠΆΠΈΡ‚ΡŒΒ».

    Π§Π΅Ρ‚Ρ‹Ρ€Π΅ уровня, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΈΡ… ΠΌΠΎΠΆΠ½ΠΎ ΠΏΠΎΠΉΠΌΠ°Ρ‚ΡŒ

    ΠšΠ°ΠΆΠ΄Ρ‹ΠΉ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ отслСТиваСт Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΡƒΠΏΡƒΡΠΊΠ°ΡŽΡ‚ ΠΎΡΡ‚Π°Π»ΡŒΠ½Ρ‹Π΅. Π˜ΠΌΠ΅Π΅Ρ‚ смысл ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ сразу нСсколько.

    Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ ΠžΠ±Π½Π°Ρ€ΡƒΠΆΠΈΠ²Π°Π΅Ρ‚ ΠŸΡ€ΠΎΠΏΡƒΡΠΊΠ°Π΅Ρ‚
    Π’ΠΈΠΏΡ‹ ΠšΠ»ΡŽΡ‡ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ сущСствуСт ΠšΠ»ΡŽΡ‡ сущСствуСт, Π½ΠΎ Π½Π΅ ΠΏΠ΅Ρ€Π΅Π²Π΅Π΄Π΅Π½ Π² ja
    Π›ΠΈΠ½Ρ‚Π΅Ρ€ Π—Π°Ρ…Π°Ρ€Π΄ΠΊΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ строки, Π½Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π½Π½Ρ‹Π΅ Π² i18n ΠšΠ»ΡŽΡ‡ΠΈ, ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π΅
    Аудит ΠŸΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ локалями всСх ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Ρ… ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ВСкст, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²ΠΎΠΎΠ±Ρ‰Π΅ Π½Π΅ Π±Ρ‹Π» ΠΏΠΎΠΌΠ΅Ρ‡Π΅Π½ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΎΠΌ
    ВСсты Ρ€Π΅Π½Π΄Π΅Ρ€Π° ΠšΠ»ΡŽΡ‡ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π°Π·Ρ€Π΅ΡˆΠ°ΡŽΡ‚ΡΡ с ошибками Всё, Ρ‡Ρ‚ΠΎ Π½Π΅ ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΎ тСстами

    Π§Π°Ρ‰Π΅ всСго ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹ ΡƒΠΏΡƒΡΠΊΠ°ΡŽΡ‚ Ρ‚Ρ€Π΅Ρ‚ΡŒΡŽ строчку: ΠΎΠ½ΠΈ ΡƒΠ²Π΅Ρ€Π΅Π½Ρ‹ Π² валидности ΠΊΠ»ΡŽΡ‡Π΅ΠΉ, Π½ΠΎ Π½ΠΈΡ‡Ρ‚ΠΎ Π½Π΅ провСряСт, Ρ‡Ρ‚ΠΎ Π²ΠΎ всСх восСмнадцати локалях Π΄Π΅ΠΉΡΡ‚Π²ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ Π΅ΡΡ‚ΡŒ значСния.

    Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ 1: Π΄Π΅Π»Π°ΠΉΡ‚Π΅ ΠΊΠ»ΡŽΡ‡ Ρ‚ΠΈΠΏΠΎΠΌ, Π° Π½Π΅ строкой

    t("checkout.summry.total") β€” это ΠΎΠΏΠ΅Ρ‡Π°Ρ‚ΠΊΠ°, которая ΡƒΡΠΏΠ΅ΡˆΠ½ΠΎ компилируСтся. Если ваши ΠΊΠ»ΡŽΡ‡ΠΈ β€” ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ строки, ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΠΏΠ΅Ρ€Π΅ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½ΠΈΠ΅ нСсСт риск Π² ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½Π΅, Π° ΠΊΠ°ΠΆΠ΄ΠΎΠ΅ ΡƒΠ΄Π°Π»Π΅Π½ΠΈΠ΅ оставляСт ΠΊΠ»ΡŽΡ‡-сироту.

    Π’ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ ΠΊΠ»ΡŽΡ‡ΠΈ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ это Π² ΠΎΡˆΠΈΠ±ΠΊΡƒ сборки. react-i18next ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ это Ρ‡Π΅Ρ€Π΅Π· declaration merging, next-intl Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ Ρ‚ΠΈΠΏΡ‹ ΠΈΠ· структуры сообщСний, Lingui Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΈΠ΄Π΅Π½Ρ‚ΠΈΡ„ΠΈΠΊΠ°Ρ‚ΠΎΡ€Ρ‹ ΠΈΠ· исходного тСкста, Π° Intlayer создаСт строгиС Ρ‚ΠΈΠΏΡ‹ ΠΈΠ· Ρ„Π°ΠΉΠ»ΠΎΠ² объявлСний ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π°. ВсС Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ Ρ€Π°Π±ΠΎΡ‚Π°ΡŽΡ‚; различаСтся лишь объСм Ρ€ΡƒΡ‡Π½ΠΎΠΉ настройки.

    Π­Ρ‚ΠΎΡ‚ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌ, Π½ΠΎ нСдостаточСн. Π’ΠΈΠΏΡ‹ ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ структуру вашСго ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Они Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ говорят ΠΎ Ρ‚ΠΎΠΌ, Π΅ΡΡ‚ΡŒ Π»ΠΈ Ρƒ этого ΠΊΠ»ΡŽΡ‡Π° ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ Π½Π° корСйский.

    Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ 2: Π»ΠΈΠ½Ρ‚ΠΈΠ½Π³ строк, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ‚Π°ΠΊ ΠΈ Π½Π΅ стали ΠΊΠ»ΡŽΡ‡Π°ΠΌΠΈ

    ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ Π½Π°ΠΉΡ‚ΠΈ, часто оказываСтся Ρ‚Π΅ΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΠΈΠΊΠΎΠ³Π΄Π° Π½Π΅ Π±Ρ‹Π» вынСсСн Π² ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ. Π—Π°Ρ…Π°Ρ€Π΄ΠΊΠΎΠΆΠ΅Π½Π½Ρ‹ΠΉ тСкст Π² ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π΅ Π½Π΅Π²ΠΈΠ΄ΠΈΠΌ для любого Π°ΡƒΠ΄ΠΈΡ‚Π° ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ², ΠΏΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ для инструмСнтов этой строки Π½Π΅ сущСствуСт.

    Плагин ESLint для Intlayer Ρ€Π΅ΡˆΠ°Π΅Ρ‚ эту ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΏΡ€Π°Π²ΠΈΠ»ΠΎΠΌ no-raw-text, Π΄ΠΎΠΏΠΎΠ»Π½Π΅Π½Π½Ρ‹ΠΌ no-unused-content для ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠΉ ситуации: ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ объявлСн, Π½ΠΎ большС Π½ΠΈΠ³Π΄Π΅ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ.

    eslint.config.mjs
    import intlayer from "@intlayer/eslint-plugin";
    
    export default [
      intlayer.configs.recommended,
      {
        rules: {
          "@intlayer/no-raw-text": "error",
          "@intlayer/no-unused-content": "warn",
        },
      },
    ];
    

    no-unused-content ΠΏΡ€Π΅Π΄ΠΎΡ‚Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π±Π΅ΡΠΊΠΎΠ½Ρ‚Ρ€ΠΎΠ»ΡŒΠ½ΠΎΠ΅ разрастаниС ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ². ΠœΠ΅Ρ€Ρ‚Π²Ρ‹Π΅ ΠΊΠ»ΡŽΡ‡ΠΈ Π½Π΅ Π»ΠΎΠΌΠ°ΡŽΡ‚ сборку, Π½ΠΎ Π½Π΅ΠΎΠΏΡ€Π°Π²Π΄Π°Π½Π½ΠΎ ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°ΡŽΡ‚ счСта Π·Π° услуги ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‡ΠΈΠΊΠΎΠ². ΠŸΠΎΠ»Π½Ρ‹ΠΉ список ΠΏΡ€Π°Π²ΠΈΠ» смотритС Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΠΈ ΠΏΠ»Π°Π³ΠΈΠ½Π° ESLint.

    Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ 3: Π°ΡƒΠ΄ΠΈΡ‚ покрытия Π»ΠΎΠΊΠ°Π»Π΅ΠΉ

    ИмСнно этот ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ Π΄Π°Π΅Ρ‚ прямой ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° Π³Π»Π°Π²Π½Ρ‹ΠΉ вопрос. Intlayer поставляСт Π΅Π³ΠΎ Π² Π²ΠΈΠ΄Π΅ CLI-ΠΊΠΎΠΌΠ°Π½Π΄Ρ‹:

    bash
    npx intlayer content test
    

    Она считываСт настроСнныС Π»ΠΎΠΊΠ°Π»ΠΈ ΠΈ ΠΎΠ±ΡŠΡΠ²Π»Π΅Π½Π½Ρ‹Π΅ словари, послС Ρ‡Π΅Π³ΠΎ Π²Ρ‹Π΄Π°Π΅Ρ‚ ΠΎΡ‚Ρ‡Π΅Ρ‚: ΠΊΠ°ΠΊΠΈΠΌ ΠΊΠ»ΡŽΡ‡Π°ΠΌ Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ ΠΊΠ°ΠΊΠΈΡ… языков ΠΈ Π² ΠΊΠ°ΠΊΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅.

    ВаТная Π΄Π΅Ρ‚Π°Π»ΡŒ ΠΏΠ΅Ρ€Π΅Π΄ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ΠΌ Π² скрипты: CLI Π²Ρ‹Π²ΠΎΠ΄ΠΈΡ‚ ΠΎΡ‚Ρ‡Π΅Ρ‚, Π½ΠΎ Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ с ΠΊΠΎΠ΄ΠΎΠΌ 0. Если Π²Ρ‹ вставитС ΠΊΠΎΠΌΠ°Π½Π΄Ρƒ Π² ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ Π² Π½Π°Π΄Π΅ΠΆΠ΄Π΅ ΡΠ»ΠΎΠΌΠ°Ρ‚ΡŒ Π±ΠΈΠ»Π΄, Π²Ρ‹ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Π·Π΅Π»Π΅Π½ΡƒΡŽ Π³Π°Π»ΠΎΡ‡ΠΊΡƒ с простынСй тСкста Π² Π»ΠΎΠ³Π°Ρ…, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ станСт Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ. Для остановки Π±ΠΈΠ»Π΄Π° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½Ρ‹ΠΉ API, описанный Π½ΠΈΠΆΠ΅.

    Π£Ρ€ΠΎΠ²Π΅Π½ΡŒ 4: ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ‡Π΅Ρ€Π΅Π· assertions Π² тСстовом Π½Π°Π±ΠΎΡ€Π΅

    listMissingTranslations() Π²ΠΎΠ·Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Ρ‚Π΅ ΠΆΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ Π°ΡƒΠ΄ΠΈΡ‚Π° Π² Π²ΠΈΠ΄Π΅ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚Π°, Ρ‡Ρ‚ΠΎ идСально ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΈΡ‚ для создания Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰Π΅Π³ΠΎ Π±Π°Ρ€ΡŒΠ΅Ρ€Π° (gate).

    i18n.test.ts
    /* @vitest-environment node */
    import { listMissingTranslations } from "intlayer/cli";
    import { describe, expect, it } from "vitest";
    
    describe("translations", () => {
      it("Π½Π΅ содСрТит пропусков Π² ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… локалях", async () => {
        const result = await listMissingTranslations();
    
        if (result.missingRequiredLocales.length > 0) {
          console.log(result.missingTranslations);
        }
    
        expect(result.missingRequiredLocales).toHaveLength(0);
      });
    });
    

    Π’ΠΎΠ·Π²Ρ€Π°Ρ‰Π°ΡŽΡ‚ΡΡ Ρ‚Ρ€ΠΈ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Ρ… поля:

    • missingTranslations: ΠΏΠΎ ΠΊΠ°ΠΆΠ΄ΠΎΠΌΡƒ ΠΊΠ»ΡŽΡ‡Ρƒ ΡƒΠΊΠ°Π·Π°Π½ΠΎ, ΠΊΠ°ΠΊΠΈΡ… Π»ΠΎΠΊΠ°Π»Π΅ΠΉ Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚ ΠΈ Π² ΠΊΠ°ΠΊΠΎΠΌ Ρ„Π°ΠΉΠ»Π΅. Π­Ρ‚ΠΎ выводится ΠΏΡ€ΠΈ ΠΏΠ°Π΄Π΅Π½ΠΈΠΈ тСста.
    • missingLocales: объСдинСниС всСх Π½Π΅Π΄ΠΎΡΡ‚Π°ΡŽΡ‰ΠΈΡ… Π»ΠΎΠΊΠ°Π»Π΅ΠΉ ΠΏΠΎ всСм ΠΊΠ»ΡŽΡ‡Π°ΠΌ.
    • missingRequiredLocales: ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΎ списком requiredLocales ΠΈΠ· ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ (ΠΈΠ»ΠΈ всСми локалями, Ссли ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ Π½Π΅ Π·Π°Π΄Π°Π½).

    requiredLocales Π΄Π΅Π»Π°Π΅Ρ‚ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ рСалистичной

    ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° восСмнадцати языков вовсС Π½Π΅ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ всС Π²ΠΎΡΠ΅ΠΌΠ½Π°Π΄Ρ†Π°Ρ‚ΡŒ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ Π±Ρ‹Ρ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π²Π΅Π΄Π΅Π½Ρ‹ Π½Π° 100% для Π²Ρ‹ΠΊΠ°Ρ‚Π° Ρ€Π΅Π»ΠΈΠ·Π°. Π£ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° ΠΊΠΎΠΌΠ°Π½Π΄ Π΅ΡΡ‚ΡŒ критичСский ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ языков, Π±Π»ΠΎΠΊΠΈΡ€ΡƒΡŽΡ‰ΠΈΠΉ поставку, ΠΈ ΡƒΡ€ΠΎΠ²Π΅Π½ΡŒ языков, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ допСрСводятся ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ готовности.

    intlayer.config.ts
    import { Locales, type IntlayerConfig } from "intlayer";
    
    const config: IntlayerConfig = {
      internationalization: {
        locales: [
          Locales.ENGLISH,
          Locales.FRENCH,
          Locales.JAPANESE,
          Locales.POLISH,
        ],
        requiredLocales: [Locales.ENGLISH, Locales.FRENCH],
        defaultLocale: Locales.ENGLISH,
      },
    };
    
    export default config;
    

    Π‘Π΅Π· requiredLocales каТдая объявлСнная локаль считаСтся строго ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎΠΉ, ΠΈ Π±ΠΈΠ»Π΄ Π±ΡƒΠ΄Π΅Ρ‚ красным, ΠΏΠΎΠΊΠ° Π½Π΅ подоспССт послСдний ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄. ИмСнно ΠΈΠ·-Π·Π° этого ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ часто просто ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°ΡŽΡ‚ Ρ†Π΅Π»ΠΈΠΊΠΎΠΌ.

    Поиск ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ², ΡƒΠΆΠ΅ ΠΏΠΎΠΏΠ°Π²ΡˆΠΈΡ… Π² ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ΅Π½

    ΠŸΡ€Π΅Π΄Ρ‹Π΄ΡƒΡ‰ΠΈΠ΅ шаги Π·Π°Ρ‰ΠΈΡ‰Π°ΡŽΡ‚ ΠΎΡ‚ появлСния Π½ΠΎΠ²Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. Для прилоТСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ ΡƒΠΆΠ΅ Π²Ρ‹ΠΊΠ°Ρ‡Π΅Π½ΠΎ, эффСктивны Π΄Π²Π° ΠΏΡ€ΠΈΠ΅ΠΌΠ°:

    ΠŸΡΠ΅Π²Π΄ΠΎΠ»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΡ. ЗапуститС Ρ‚Π΅ΡΡ‚ΠΎΠ²ΡƒΡŽ локаль, Π³Π΄Π΅ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ символ трансформируСтся, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€ [!!! ĈΔ₯éçķâũţ !!!]. Всё, Ρ‡Ρ‚ΠΎ останСтся Π½Π° чистом английском, Π·Π°Ρ…Π°Ρ€Π΄ΠΊΠΎΠΆΠ΅Π½ΠΎ Π² ΠΊΠΎΠ΄Π΅. Π­Ρ‚ΠΎ Π½Π°Ρ…ΠΎΠ΄ΠΈΡ‚ Π·Π° 10 ΠΌΠΈΠ½ΡƒΡ‚ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π°ΡƒΠ΄ΠΈΡ‚ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² Π½Π΅ способСн ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΏΠΎ своСй Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π΅.

    ΠšΡ€Π°ΡƒΠ»ΠΈΠ½Π³ собствСнного сайта. Если Ρƒ вас Π»ΠΎΠΊΠ°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Π΅ URL, скачайтС Π²Ρ‹Π±ΠΎΡ€ΠΊΡƒ страниц для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ языка ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½ΠΈΡ‚Π΅ поиск английских строк Π² HTML. Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Π° ΠΏΠΎ адрСсу /ja/, содСрТащая "Add to cart", ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π»ΠΈΠ±ΠΎ Π½Π° ΠΏΡ€ΠΎΠΏΡƒΡ‰Π΅Π½Π½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄, Π»ΠΈΠ±ΠΎ Π½Π° Π½Π΅ΠΏΡ€Π΅Π΄Π²ΠΈΠ΄Π΅Π½Π½Ρ‹ΠΉ фолбэк.

    bash
    curl -s https://example.com/ja/checkout | grep -c "Add to cart"
    

    Π—Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΏΡ€ΠΎΠ±Π΅Π»ΠΎΠ²

    Когда Π²Ρ‹ Π·Π½Π°Π΅Ρ‚Π΅, Ρ‡Π΅Π³ΠΎ Π½Π΅ Ρ…Π²Π°Ρ‚Π°Π΅Ρ‚, intlayer fill заполняСт пустыС значСния, Π° опция autoFill ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠΎΠ·Π΄Π°Π²Π°Ρ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ Π΄Π΅ΠΊΠ»Π°Ρ€Π°Ρ†ΠΈΠΉ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π»ΠΎΠΊΠ°Π»ΠΈ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ ΠΈΡ… добавлСния. Π‘ΠΌ. autoFill.

    Π—Π΄Π΅ΡΡŒ Π²Π°ΠΆΠ½ΠΎ ΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π½Π° Π²Π΅Ρ‰ΠΈ Ρ‚Ρ€Π΅Π·Π²ΠΎ: автоматичСский ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΉ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π°Π΅Ρ‚ Π²ΠΈΠ΄ΠΈΠΌΡƒΡŽ Π±Ρ€Π΅ΡˆΡŒ Π² Π½Π΅Π²ΠΈΠ΄ΠΈΠΌΡƒΡŽ. ΠšΠ»ΡŽΡ‡ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½, тСсты Π·Π΅Π»Π΅Π½Ρ‹Π΅, Π½ΠΎ тСкст Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ Π²Ρ‹Ρ‡ΠΈΡ‚Ρ‹Π²Π°Π». Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ это для снятия Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ Ρ€Π΅Π»ΠΈΠ·Π°, Π½ΠΎ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½ΠΎ ΠΎΡ‚Π΄Π°Π²Π°ΠΉΡ‚Π΅ Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ Ρ‡Π΅Π»ΠΎΠ²Π΅ΠΊΡƒ тСксты, Π²Π»ΠΈΡΡŽΡ‰ΠΈΠ΅ Π½Π° финансовыС ΠΈ ΡŽΡ€ΠΈΠ΄ΠΈΡ‡Π΅ΡΠΊΠΈΠ΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ.

    РаспространСнныС ошибки

    • Π‘Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ фолбэк инструмСнтом Π·Π°Ρ‰ΠΈΡ‚Ρ‹. Π­Ρ‚ΠΎ ΠΌΠ΅Ρ…Π°Π½ΠΈΠ·ΠΌ Π°Π²Π°Ρ€ΠΈΠΉΠ½ΠΎΠ³ΠΎ отобраТСния, Π° Π½Π΅ страховка. Π’ΠΈΡ…ΠΎ показанная английская страница β€” это Π½Π΅Π·Π°ΠΌΠ΅Ρ‡Π΅Π½Π½Ρ‹ΠΉ Π±Π°Π³.
    • ΠŸΠΎΠ»Π°Π³Π°Ρ‚ΡŒΡΡ Π½Π° Π²Ρ‹Π²ΠΎΠ΄ CLI для Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²ΠΊΠΈ CI. intlayer content test Π·Π°Π²Π΅Ρ€ΡˆΠ°Π΅Ρ‚ΡΡ с ΠΊΠΎΠ΄ΠΎΠΌ 0. Π˜ΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠΉΡ‚Π΅ тСсты с ассСртами.
    • Π”Π΅Π»Π°Ρ‚ΡŒ ΠΎΠ±ΡΠ·Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΌΠΈ Π°Π±ΡΠΎΠ»ΡŽΡ‚Π½ΠΎ всС Π»ΠΎΠΊΠ°Π»ΠΈ. ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΡƒ ΠΎΡ‚ΠΊΠ»ΡŽΡ‡Π°Ρ‚ ΠΏΡ€ΠΈ ΠΏΠ΅Ρ€Π²ΠΎΠΉ ΠΆΠ΅ сорванной поставкС.
    • Аудит ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² Π±Π΅Π· ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ³ΠΎ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Π°. Π—Π°Ρ…Π°Ρ€Π΄ΠΊΠΎΠΆΠ΅Π½Π½Ρ‹Π΅ строки ΠΏΠΎ ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΡŽ Π½Π΅ Π²ΠΈΠ΄Π½Ρ‹ Π² ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π°Ρ….
    • ВСстированиС Ρ‚ΠΎΠ»ΡŒΠΊΠΎ языка ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Π­Ρ‚ΠΎ СдинствСнный язык, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π³Π°Ρ€Π°Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎ Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΠΎΠ²Π°Ρ‚ΡŒ.
    • Π—Π°Π²Π΅Ρ€ΡˆΠ΅Π½ΠΈΠ΅ процСсса лишь ΠΌΠ°ΡˆΠΈΠ½Π½Ρ‹ΠΌ Π·Π°ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ΠΌ. Π—Π΅Π»Π΅Π½Ρ‹Π΅ тСсты ΠΏΡ€ΠΈ Π½Π΅Π²Ρ‹Ρ‡ΠΈΡ‚Π°Π½Π½Ρ‹Ρ… тСкстах.

    ΠŸΠΎΠ»Π΅Π·Π½Ρ‹Π΅ ΠΌΠ°Ρ‚Π΅Ρ€ΠΈΠ°Π»Ρ‹

    ΠšΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΈ

    Пока Π½Π΅Ρ‚ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠ΅Π². Π‘ΡƒΠ΄ΡŒΡ‚Π΅ ΠΏΠ΅Ρ€Π²Ρ‹ΠΌ, ΠΊΡ‚ΠΎ подСлится своими мыслями.

    ΠŸΠΎΡ…ΠΎΠΆΠΈΠ΅ сообщСния

    ПослСдниС сообщСния