Автор:
    БозданиС:2026-04-20ПослСднСС обновлСниС:2026-05-18

    Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ i18n для Next.js - ΠžΡ‚Ρ‡Π΅Ρ‚ ΠΎ Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠ΅ 2026

    Π­Ρ‚Π° страница прСдставляСт собой ΠΎΡ‚Ρ‡Π΅Ρ‚ ΠΎ Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠ΅ i18n-Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ для Next.js.

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

    Π˜Π½Ρ‚Π΅Ρ€Π°ΠΊΡ‚ΠΈΠ²Π½Ρ‹ΠΉ Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊ

    ДинамичСская Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° JSON

    ЛСнивая Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΎΠ² Π²ΠΎ врСмя выполнСния

    ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΉ JSON (пространства ΠΈΠΌΠ΅Π½)

    ΠŸΡ€ΠΎΡΡ‚Ρ€Π°Π½ΡΡ‚Π²Π° ΠΈΠΌΠ΅Π½ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ страницы

    Π‘Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ I18n

    Π§Ρ‚ΠΎ это Π·Π° ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠ°?

    ΠžΠ±Ρ‰ΠΈΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΠ°ΠΊΠ΅Ρ‚Π° Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈΠ½Ρ‚Π΅Ρ€Π½Π°Ρ†ΠΈΠΎΠ½Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ gzip. Он Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π² сСбя Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€ ΠΈ Π»ΠΎΠ³ΠΈΠΊΡƒ извлСчСния ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° послС tree-shaking ΠΈ ΠΌΠΈΠ½ΠΈΡ„ΠΈΠΊΠ°Ρ†ΠΈΠΈ.

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

    МСньший Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ сниТаСт Π½Π°Ρ‡Π°Π»ΡŒΠ½ΡƒΡŽ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ JavaScript, Ρ‡Ρ‚ΠΎ ускоряСт Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ ΠΈ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° Π½Π° ΠΊΠ»ΠΈΠ΅Π½Ρ‚Π΅.

    Π’ΠΈΠ΄

    Бсылка Π½Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹:

    ΠŸΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ ΠΏΠΎΠ»Π½Ρ‹Π΅ Π΄Π°Π½Π½Ρ‹Π΅ Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠ°

    ΠŸΠΎΠ»Π½Ρ‹ΠΉ Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠ° ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΉΡ‚ΠΈ здСсь.

    Π’Π²Π΅Π΄Π΅Π½ΠΈΠ΅

    Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈΠ½Ρ‚Π΅Ρ€Π½Π°Ρ†ΠΈΠΎΠ½Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ ΡΠ΅Ρ€ΡŒΠ΅Π·Π½ΠΎΠ΅ влияниС Π½Π° вашС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅. Основной риск Π·Π°ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ΡΡ Π² Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ΅ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ страницы ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ языка, ΠΊΠΎΠ³Π΄Π° ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ посСщаСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Ρƒ страницу.

    По ΠΌΠ΅Ρ€Π΅ роста вашСго прилоТСния Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±Π°Π½Π΄Π»Π° ΠΌΠΎΠΆΠ΅Ρ‚ расти ΡΠΊΡΠΏΠΎΠ½Π΅Π½Ρ†ΠΈΠ°Π»ΡŒΠ½ΠΎ, Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅Ρ‚ Π·Π°ΠΌΠ΅Ρ‚Π½ΠΎ ΡΠ½ΠΈΠ·ΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ.

    НапримСр, Π² Ρ…ΡƒΠ΄ΡˆΠΈΡ… случаях послС ΠΈΠ½Ρ‚Π΅Ρ€Π½Π°Ρ†ΠΈΠΎΠ½Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ваша страница ΠΌΠΎΠΆΠ΅Ρ‚ ΡΡ‚Π°Ρ‚ΡŒ ΠΏΠΎΡ‡Ρ‚ΠΈ Π² 4 Ρ€Π°Π·Π° большС.

    Π•Ρ‰Π΅ ΠΎΠ΄Π½ΠΈΠΌ послСдствиСм использования Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ i18n являСтся Π·Π°ΠΌΠ΅Π΄Π»Π΅Π½ΠΈΠ΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ. ΠŸΡ€Π΅Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² Π² ΠΌΡƒΠ»ΡŒΡ‚ΠΈΡΠ·Ρ‹Ρ‡Π½Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ Π½Π° Ρ€Π°Π·Π½Ρ‹Ρ… языках ΠΎΡ‚Π½ΠΈΠΌΠ°Π΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎ Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ.

    ΠŸΠΎΡΠΊΠΎΠ»ΡŒΠΊΡƒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ° слоТна, сущСствуСт мноТСство Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ - ΠΎΠ΄Π½ΠΈ ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹ Π½Π° DX, Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Π½Π° ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒ ΠΈΠ»ΠΈ ΠΌΠ°ΡΡˆΡ‚Π°Π±ΠΈΡ€ΡƒΠ΅ΠΌΠΎΡΡ‚ΡŒ ΠΈ Ρ‚Π°ΠΊ Π΄Π°Π»Π΅Π΅.

    Intlayer пытаСтся ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ всС эти аспСкты.

    TL;DR

    • Intlayer ΠΈ next-translate: Π›ΡƒΡ‡ΡˆΠΈΠ΅ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚Ρ‹ для ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ Next.js, ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‰ΠΈΠ΅ ΠΌΠΈΠ½ΠΈΠΌΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΈ Π»ΡƒΡ‡ΡˆΡƒΡŽ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΡƒ статичСского Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Π°.
    • next-intl: Π‘Π°ΠΌΡ‹ΠΉ ΠΌΠΎΠ΄Π½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, Π½ΠΎ тяТСлый ΠΈ слоТный Π² ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ для Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ.
    • next-i18next: ΠŸΠΎΠΏΡƒΠ»ΡΡ€Π½Ρ‹ΠΉ ΠΈ Π±ΠΎΠ³Π°Ρ‚Ρ‹ΠΉ ΠΏΠ»Π°Π³ΠΈΠ½Π°ΠΌΠΈ, Π½ΠΎ ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ вСс Π±Π°Π½Π΄Π»Π° (~3Γ— Intlayer).
    • Π˜Π·Π±Π΅Π³Π°ΠΉΡ‚Π΅: gt-next ΠΈ lingo.dev ΠΈΠ·-Π·Π° ΡΠ΅Ρ€ΡŒΠ΅Π·Π½Ρ‹Ρ… ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ с ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΡŒΡŽ, привязки ΠΊ Π²Π΅Π½Π΄ΠΎΡ€Ρƒ ΠΈ Π±Π°Π³ΠΎΠ², Π»ΠΎΠΌΠ°ΡŽΡ‰ΠΈΡ… сборку.

    ΠŸΡ€ΠΎΠ²Π΅Ρ€ΡŒΡ‚Π΅ своС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅

    Π§Ρ‚ΠΎΠ±Ρ‹ Π²Ρ‹ΡΠ²ΠΈΡ‚ΡŒ эти ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, я создал бСсплатный сканСр, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΠΎΠ²Π°Ρ‚ΡŒ здСсь.

    ΠŸΡ€ΠΎΠ±Π»Π΅ΠΌΠ°

    БущСствуСт Π΄Π²Π° основных способа ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ влияниС ΠΌΡƒΠ»ΡŒΡ‚ΠΈΡΠ·Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ прилоТСния Π½Π° ваш Π±Π°Π½Π΄Π»:

    • Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ вашСго JSON (ΠΈΠ»ΠΈ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π°) ΠΏΠΎ Ρ„Π°ΠΉΠ»Π°ΠΌ / ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹ΠΌ / пространствам ΠΈΠΌΠ΅Π½ (namespaces), Ρ‡Ρ‚ΠΎΠ±Ρ‹ сборщик ΠΌΠΎΠ³ ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ (tree-shake) Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ для ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠΉ страницы.
    • ДинамичСская Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° страницы Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π° языкС ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Ρ.

    ВСхничСскиС ограничСния этих ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ΠΎΠ²:

    ДинамичСская Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ°

    Π”Π°ΠΆΠ΅ Ссли Π²Ρ‹ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚Π΅ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Ρ‹ Ρ‚ΠΈΠΏΠ° [locale]/page.tsx, с Webpack ΠΈΠ»ΠΈ Turbopack, ΠΈ Π΄Π°ΠΆΠ΅ Ссли ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ generateStaticParams, сборщик Π½Π΅ рассматриваСт locale ΠΊΠ°ΠΊ ΡΡ‚Π°Ρ‚ΠΈΡ‡Π΅ΡΠΊΡƒΡŽ константу. Π­Ρ‚ΠΎ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ ΠΎΠ½ ΠΌΠΎΠΆΠ΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ для всСх языков Π² ΠΊΠ°ΠΆΠ΄ΡƒΡŽ страницу. Основной способ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΡ‚ΡŒ это - Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ Ρ‡Π΅Ρ€Π΅Π· динамичСский ΠΈΠΌΠΏΠΎΡ€Ρ‚ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, import('./locales/${locale}.json')).

    На этапС сборки Next.js создаСт ΠΎΠ΄ΠΈΠ½ JS-Π±Π°Π½Π΄Π» Π½Π° локаль (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ./locales_fr_12345.js). Когда сайт отправляСтся ΠΊΠ»ΠΈΠ΅Π½Ρ‚Ρƒ ΠΈ страница запускаСтся, Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ выполняСт Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ HTTP-запрос для Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΠ³ΠΎ JS-Ρ„Π°ΠΉΠ»Π° (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ./locales_fr_12345.js).

    Π”Ρ€ΡƒΠ³ΠΎΠΉ способ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ Ρ‚ΠΎΠΉ ΠΆΠ΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹ - использованиС fetch() для динамичСской Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ JSON. Π’Π°ΠΊ Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ Tolgee, ΠΊΠΎΠ³Π΄Π° JSON находится Π² /public, ΠΈΠ»ΠΈ next-translate, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ полагаСтся Π½Π° getStaticProps для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π°. ΠŸΡ€ΠΎΡ†Π΅ΡΡ Ρ‚ΠΎΡ‚ ΠΆΠ΅: Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ Π΄Π΅Π»Π°Π΅Ρ‚ Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ HTTP-запрос для Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ рСсурса.

    Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π°

    Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ синтаксис Ρ‚ΠΈΠΏΠ° const t = useTranslation() + t('my-object.my-sub-object.my-key'), вСсь JSON ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ Π΄ΠΎΠ»ΠΆΠ΅Π½ Π±Ρ‹Ρ‚ΡŒ Π² Π±Π°Π½Π΄Π»Π΅, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° ΠΌΠΎΠ³Π»Π° Π΅Π³ΠΎ ΠΏΡ€ΠΎΠ°Π½Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ ΠΈ Ρ€Π°Π·Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡. Π‘ΠΎΠ»ΡŒΡˆΠ°Ρ Ρ‡Π°ΡΡ‚ΡŒ этого ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π² сборку, Π΄Π°ΠΆΠ΅ Ссли ΠΎΠ½ Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ Π½Π° страницС.

    Π§Ρ‚ΠΎΠ±Ρ‹ ΡΠΌΡΠ³Ρ‡ΠΈΡ‚ΡŒ это, Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ просят вас ΡƒΠΊΠ°Π·Ρ‹Π²Π°Ρ‚ΡŒ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ страницы, ΠΊΠ°ΠΊΠΈΠ΅ пространства ΠΈΠΌΠ΅Π½ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ - Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, next-i18next, next-intl, lingui, next-translate, next-international.

    Напротив, Paraglide добавляСт Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ шаг ΠΏΠ΅Ρ€Π΅Π΄ сборкой, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€Π΅Π²Ρ€Π°Ρ‚ΠΈΡ‚ΡŒ JSON Π² плоскиС символы, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ const en_my_var = () => 'my value'. ВСорСтичСски это позволяСт ΠΈΡΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ Π½Π° страницС. Как ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄ΠΈΠΌ, Ρƒ этого ΠΌΠ΅Ρ‚ΠΎΠ΄Π° всС ΠΆΠ΅ Π΅ΡΡ‚ΡŒ свои компромиссы.

    НаконСц, Intlayer примСняСт ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡŽ Π½Π° этапС сборки, поэтому useIntlayer('my-key') замСняСтся Π½Π° ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ Π½Π°ΠΏΡ€ΡΠΌΡƒΡŽ.

    ΠœΠ΅Ρ‚ΠΎΠ΄ΠΎΠ»ΠΎΠ³ΠΈΡ

    Для этого Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠ° ΠΌΡ‹ сравнили ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠ΅ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ:

    • Base App (Π‘Π΅Π· Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ i18n)
    • next-intlayer (v8.7.12)
    • next-i18next (v16.0.5)
    • next-intl (v4.9.1)
    • @lingui/core (v5.3.0)
    • next-translate (v3.1.2)
    • next-international (v1.3.1)
    • @inlang/paraglide-js (v2.15.1)
    • @tolgee/react (v7.0.0)
    • @lingo.dev/compiler (v0.4.0)
    • wuchale (v0.22.11)
    • gt-next (v6.16.5)

    Π― использовал Next.js вСрсии 16.2.4 с App Router.

    Π― построил ΠΌΡƒΠ»ΡŒΡ‚ΠΈΡΠ·Ρ‹Ρ‡Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с 10 страницами ΠΈ 10 языками.

    Π― сравнил Ρ‡Π΅Ρ‚Ρ‹Ρ€Π΅ стратСгии Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ:

    БтратСгияБСз пространств ΠΈΠΌΠ΅Π½ (глобальная)Π‘ пространствами ΠΈΠΌΠ΅Π½ (локальная/scoped)
    БтатичСская Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ°Static: ВсС Π² памяти ΠΏΡ€ΠΈ запускС.Scoped static: Π Π°Π·Π΄Π΅Π»Π΅Π½ΠΎ ΠΏΠΎ пространствам ΠΈΠΌΠ΅Π½; всС загруТаСтся ΠΏΡ€ΠΈ запускС.
    ДинамичСская Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ°Dynamic: Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΏΠΎ Ρ‚Ρ€Π΅Π±ΠΎΠ²Π°Π½ΠΈΡŽ для Π»ΠΎΠΊΠ°Π»ΠΈ.Scoped dynamic: Гранулярная Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΏΠΎ пространствам ΠΈΠΌΠ΅Π½ ΠΈ локалям.

    РСзюмС стратСгий

    • БтатичСская (Static): ΠŸΡ€ΠΎΡΡ‚ΠΎΡ‚Π°; отсутствиС Π·Π°Π΄Π΅Ρ€ΠΆΠ΅ΠΊ сСти послС Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ. ΠœΠΈΠ½ΡƒΡ: большой Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±Π°Π½Π΄Π»Π°.
    • ДинамичСская (Dynamic): Π£ΠΌΠ΅Π½ΡŒΡˆΠ°Π΅Ρ‚ Π½Π°Ρ‡Π°Π»ΡŒΠ½Ρ‹ΠΉ вСс (лСнивая Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ°). ИдСально ΠΏΡ€ΠΈ Π½Π°Π»ΠΈΡ‡ΠΈΠΈ мноТСства Π»ΠΎΠΊΠ°Π»Π΅ΠΉ.
    • Π›ΠΎΠΊΠ°Π»ΡŒΠ½Π°Ρ статичСская (Scoped static): ΠŸΠΎΠ·Π²ΠΎΠ»ΡΠ΅Ρ‚ ΠΎΡ€Π³Π°Π½ΠΈΠ·ΠΎΠ²Π°Ρ‚ΡŒ ΠΊΠΎΠ΄ (логичСскоС Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅) Π±Π΅Π· слоТных Π΄ΠΎΠΏΠΎΠ»Π½ΠΈΡ‚Π΅Π»ΡŒΠ½Ρ‹Ρ… сСтСвых запросов.
    • Π›ΠΎΠΊΠ°Π»ΡŒΠ½Π°Ρ динамичСская (Scoped dynamic): Π›ΡƒΡ‡ΡˆΠΈΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ для раздСлСния ΠΊΠΎΠ΄Π° ΠΈ ΠΏΡ€ΠΎΠΈΠ·Π²ΠΎΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. ΠœΠΈΠ½ΠΈΠΌΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚ использованиС памяти, загруТая Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π½ΡƒΠΆΠ½ΠΎ для Ρ‚Π΅ΠΊΡƒΡ‰Π΅Π³ΠΎ прСдставлСния ΠΈ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΠΉ Π»ΠΎΠΊΠ°Π»ΠΈ.

    Π§Ρ‚ΠΎ я измСрял:

    Π― запускал ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ ΠΌΡƒΠ»ΡŒΡ‚ΠΈΡΠ·Ρ‹Ρ‡Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠΌ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€Π΅ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ стСка, Π° Π·Π°Ρ‚Π΅ΠΌ записывал, Ρ‡Ρ‚ΠΎ Π½Π° самом Π΄Π΅Π»Π΅ ΠΏΠ΅Ρ€Π΅Π΄Π°Π²Π°Π»ΠΎΡΡŒ ΠΏΠΎ сСти ΠΈ сколько Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ это Π·Π°Π½ΠΈΠΌΠ°Π»ΠΎ. Π Π°Π·ΠΌΠ΅Ρ€Ρ‹ ΡƒΠΊΠ°Π·Π°Π½Ρ‹ послС ΠΎΠ±Ρ‹Ρ‡Π½ΠΎΠ³ΠΎ Π²Π΅Π±-сТатия, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ это Π±Π»ΠΈΠΆΠ΅ ΠΊ Ρ‚ΠΎΠΌΡƒ, Ρ‡Ρ‚ΠΎ ΡΠΊΠ°Ρ‡ΠΈΠ²Π°ΡŽΡ‚ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΠΈ, Ρ‡Π΅ΠΌ количСство исходного ΠΊΠΎΠ΄Π°.

    • Π Π°Π·ΠΌΠ΅Ρ€ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ ΠΈΠ½Ρ‚Π΅Ρ€Π½Π°Ρ†ΠΈΠΎΠ½Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ: ПослС сборки, tree-shaking ΠΈ ΠΌΠΈΠ½ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ, Ρ€Π°Π·ΠΌΠ΅Ρ€ i18n-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ - это Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€ΠΎΠ² (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, NextIntlClientProvider) + ΠΊΠΎΠ΄ Ρ…ΡƒΠΊΠΎΠ² (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, useTranslations) Π² пустом ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π΅. Π­Ρ‚ΠΎ Π½Π΅ Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ Ρ„Π°ΠΉΠ»ΠΎΠ² ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π°. Π­Ρ‚ΠΎ ΠΎΡ‚Π²Π΅Ρ‚ Π½Π° вопрос, насколько "дорогая" Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° сама ΠΏΠΎ сСбС Π΄ΠΎ добавлСния вашСго ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π°.

    • JavaScript Π½Π° страницу: Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Π° Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠ° - сколько скриптов Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ ΠΏΡ€ΠΈ посСщСнии, усрСднСнноС ΠΏΠΎ страницам Π² Π½Π°Π±ΠΎΡ€Π΅ (ΠΈ ΠΏΠΎ локалям, Π³Π΄Π΅ ΠΎΡ‚Ρ‡Π΅Ρ‚ ΠΈΡ… ΠΎΠ±ΡŠΠ΅Π΄ΠΈΠ½ΡΠ΅Ρ‚). ВяТСлыС страницы - это ΠΌΠ΅Π΄Π»Π΅Π½Π½Ρ‹Π΅ страницы.

    • Π£Ρ‚Π΅Ρ‡ΠΊΠ° ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… Π»ΠΎΠΊΠ°Π»Π΅ΠΉ: Π­Ρ‚ΠΎ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ Ρ‚ΠΎΠΉ ΠΆΠ΅ страницы, Π½ΠΎ Π½Π° Π΄Ρ€ΡƒΠ³ΠΎΠΌ языкС, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΠΎ загруТаСтся Π½Π° ΠΏΡ€ΠΎΠ²Π΅Ρ€ΡΠ΅ΠΌΡƒΡŽ страницу. Π­Ρ‚ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° слСдуСт ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ страницы /fr/about Π² Π±Π°Π½Π΄Π»Π΅ страницы /en/about).

    • Π£Ρ‚Π΅Ρ‡ΠΊΠ° ΠΈΠ· Π΄Ρ€ΡƒΠ³ΠΈΡ… ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΎΠ²: Π’Π° ΠΆΠ΅ идСя для Π΄Ρ€ΡƒΠ³ΠΈΡ… экранов Π² ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ: ΠΏΠΎΠΏΠ°Π΄Π°Π΅Ρ‚ Π»ΠΈ ΠΈΡ… тСкст Π² сборку, ΠΊΠΎΠ³Π΄Π° Π²Ρ‹ ΠΎΡ‚ΠΊΡ€Ρ‹Π»ΠΈ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΎΠ΄Π½Ρƒ страницу (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ страницы /en/about Π² Π±Π°Π½Π΄Π»Π΅ страницы /en/contact). Высокий ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΡƒΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ Π½Π° ΠΏΠ»ΠΎΡ…ΠΎΠ΅ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ΠΈΠ΅ ΠΈΠ»ΠΈ слишком ΡˆΠΈΡ€ΠΎΠΊΠΈΠ΅ Π±Π°Π½Π΄Π»Ρ‹.

    • Π‘Ρ€Π΅Π΄Π½ΠΈΠΉ Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±Π°Π½Π΄Π»Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°: ΠžΠ±Ρ‰ΠΈΠ΅ элСмСнты ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΡΠΊΠΎΠ³ΠΎ интСрфСйса ΠΈΠ·ΠΌΠ΅Ρ€ΡΡŽΡ‚ΡΡ ΠΏΠΎ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ, Π° Π½Π΅ прячутся Π²Π½ΡƒΡ‚Ρ€ΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ гигантского числа прилоТСния. Π­Ρ‚ΠΎ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Π½Π΅ Ρ€Π°Π·Π΄ΡƒΠ²Π°Π΅Ρ‚ Π»ΠΈ интСрнационализация ΠΎΠ±Ρ‹Ρ‡Π½Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹. НапримСр, Ссли ваш ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ пСрСрСндСриваСтся, ΠΎΠ½ Π±ΡƒΠ΄Π΅Ρ‚ Π·Π°Π³Ρ€ΡƒΠΆΠ°Ρ‚ΡŒ всС эти Π΄Π°Π½Π½Ρ‹Π΅ ΠΈΠ· памяти. ΠŸΡ€ΠΈΠ²ΡΠ·ΠΊΠ° гигантского JSON-Ρ„Π°ΠΉΠ»Π° ΠΊ Π»ΡŽΠ±ΠΎΠΌΡƒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ ΠΏΠΎΠ΄ΠΎΠ±Π½Π° ΠΏΠΎΠ΄ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡŽ большого Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ…, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ Π·Π°ΠΌΠ΅Π΄Π»ΠΈΡ‚ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π²Π°ΡˆΠΈΡ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ².

    • Π‘ΠΊΠΎΡ€ΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ языка: Π― ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π°ΡŽ язык с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ собствСнного элСмСнта управлСния прилоТСния ΠΈ засСкаю врСмя, ΠΏΠΎΠΊΠ° страница явно Π½Π΅ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡΡ - Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ ΠΏΠΎΡΠ΅Ρ‚ΠΈΡ‚Π΅Π»ΡŒ, Π° Π½Π΅ Π»Π°Π±ΠΎΡ€Π°Ρ‚ΠΎΡ€Π½Ρ‹ΠΉ ΠΌΠΈΠΊΡ€ΠΎ-шаг.

    • Π Π°Π±ΠΎΡ‚Π° ΠΏΠΎ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Ρƒ послС смСны языка: Π‘ΠΎΠ»Π΅Π΅ ΡƒΠ·ΠΊΠΎΠ΅ наблюдСниС: сколько усилий ΠΏΠΎΡ‚Ρ€Π΅Π±ΠΎΠ²Π°Π»ΠΎΡΡŒ интСрфСйсу для пСрСрисовки Π½Π° Π½ΠΎΠ²ΠΎΠΌ языкС послС Π½Π°Ρ‡Π°Π»Π° ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΡ. ПолСзно, ΠΊΠΎΠ³Π΄Π° "ΠΎΡ‰ΡƒΡ‰Π°Π΅ΠΌΠΎΠ΅" врСмя ΠΈ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠ° расходятся.

    • ВрСмя Π½Π°Ρ‡Π°Π»ΡŒΠ½ΠΎΠΉ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ страницы: ΠžΡ‚ ΠΏΠ΅Ρ€Π΅Ρ…ΠΎΠ΄Π° Π΄ΠΎ Ρ‚ΠΎΠ³ΠΎ ΠΌΠΎΠΌΠ΅Π½Ρ‚Π°, ΠΊΠΎΠ³Π΄Π° Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ считаСт страницу ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠΉ для протСстированных сцСнариСв. Π₯ΠΎΡ€ΠΎΡˆΠΎ для сравнСния "Ρ…ΠΎΠ»ΠΎΠ΄Π½Ρ‹Ρ… стартов".

    • ВрСмя Π³ΠΈΠ΄Ρ€Π°Ρ‚Π°Ρ†ΠΈΠΈ: Когда ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ прСдоставляСт Ρ‚Π°ΠΊΠΈΠ΅ Π΄Π°Π½Π½Ρ‹Π΅ - сколько Π²Ρ€Π΅ΠΌΠ΅Π½ΠΈ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ Ρ‚Ρ€Π°Ρ‚ΠΈΡ‚ Π½Π° ΠΏΡ€Π΅Π²Ρ€Π°Ρ‰Π΅Π½ΠΈΠ΅ сСрвСрного HTML Π² Π½Π΅Ρ‡Ρ‚ΠΎ, Π½Π° Ρ‡Ρ‚ΠΎ ΠΌΠΎΠΆΠ½ΠΎ Π½Π°ΠΆΠ°Ρ‚ΡŒ. ΠŸΡ€ΠΎΡ‡Π΅Ρ€ΠΊ Π² Ρ‚Π°Π±Π»ΠΈΡ†Π°Ρ… ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ данная рСализация Π½Π΅ прСдоставила Π½Π°Π΄Π΅ΠΆΠ½Ρ‹Ρ… Π΄Π°Π½Π½Ρ‹Ρ… ΠΏΠΎ Π³ΠΈΠ΄Ρ€Π°Ρ‚Π°Ρ†ΠΈΠΈ Π² этом Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠ΅.

    Π—Π²Π΅Π·Π΄Ρ‹ Π½Π° GitHub

    Π—Π²Π΅Π·Π΄Ρ‹ Π½Π° GitHub - это ΡΠΈΠ»ΡŒΠ½Ρ‹ΠΉ ΠΈΠ½Π΄ΠΈΠΊΠ°Ρ‚ΠΎΡ€ популярности ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°, довСрия сообщСства ΠΈ долгосрочной Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎΡΡ‚ΠΈ. Π₯отя ΠΎΠ½ΠΈ Π½Π΅ ΡΠ²Π»ΡΡŽΡ‚ΡΡ прямым ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ тСхничСского качСства, ΠΎΠ½ΠΈ ΠΎΡ‚Ρ€Π°ΠΆΠ°ΡŽΡ‚, сколько Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² ΡΡ‡ΠΈΡ‚Π°ΡŽΡ‚ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΏΠΎΠ»Π΅Π·Π½Ρ‹ΠΌ, слСдят Π·Π° Π΅Π³ΠΎ прогрСссом ΠΈ, вСроятно, Π±ΡƒΠ΄ΡƒΡ‚ Π΅Π³ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚ΡŒ. Для ΠΎΡ†Π΅Π½ΠΊΠΈ цСнности ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π·Π²Π΅Π·Π΄Ρ‹ ΠΏΠΎΠΌΠΎΠ³Π°ΡŽΡ‚ ΡΡ€Π°Π²Π½ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΠΎΠΏΡƒΠ»ΡΡ€Π½ΠΎΡΡ‚ΡŒ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ² ΠΈ Π΄Π°ΡŽΡ‚ прСдставлСниС ΠΎ ростС экосистСмы.

    Star History Chart

    Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π² дСталях

    1 - РСшСния, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… слСдуСт ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ

    НСкоторых Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ, Ρ‚Π°ΠΊΠΈΡ… ΠΊΠ°ΠΊ gt-next ΠΈΠ»ΠΈ lingo.dev, явно Π»ΡƒΡ‡ΡˆΠ΅ ΠΈΠ·Π±Π΅Π³Π°Ρ‚ΡŒ. Они ΡΠΎΡ‡Π΅Ρ‚Π°ΡŽΡ‚ Π² сСбС привязку ΠΊ Π²Π΅Π½Π΄ΠΎΡ€Ρƒ с загрязнСниСм вашСй ΠΊΠΎΠ΄ΠΎΠ²ΠΎΠΉ Π±Π°Π·Ρ‹. НСсмотря Π½Π° ΠΌΠ½ΠΎΠ³ΠΈΠ΅ часы ΠΏΠΎΠΏΡ‹Ρ‚ΠΎΠΊ ΠΈΡ… Π²Π½Π΅Π΄Ρ€ΠΈΡ‚ΡŒ, ΠΌΠ½Π΅ Ρ‚Π°ΠΊ ΠΈ Π½Π΅ ΡƒΠ΄Π°Π»ΠΎΡΡŒ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ ΠΈΡ… Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ - Π½ΠΈ Π½Π° TanStack Start, Π½ΠΈ Π½Π° Next.js.

    ВстрСчСнныС ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹:

    (General Translation) (gt-next@6.16.5):

    • Для прилоТСния вСсом 110 ΠšΠ‘ gt-next добавляСт Π±ΠΎΠ»Π΅Π΅ 440 ΠšΠ‘ свСрху.
    • Quota Exceeded, please upgrade your plan (ΠšΠ²ΠΎΡ‚Π° ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ΅Π½Π°, поТалуйста, ΠΎΠ±Π½ΠΎΠ²ΠΈΡ‚Π΅ Ρ‚Π°Ρ€ΠΈΡ„Π½Ρ‹ΠΉ ΠΏΠ»Π°Π½) ΠΏΡ€ΠΈ самой ΠΏΠ΅Ρ€Π²ΠΎΠΉ сборкС с General Translation.
    • ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹ Π½Π΅ ΠΎΡ‚ΠΎΠ±Ρ€Π°ΠΆΠ°ΡŽΡ‚ΡΡ; я ΠΏΠΎΠ»ΡƒΡ‡Π°ΡŽ ΠΎΡˆΠΈΠ±ΠΊΡƒ Error: <T> used on the client-side outside of <GTProvider>, Ρ‡Ρ‚ΠΎ каТСтся Π±Π°Π³ΠΎΠΌ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ.
    • ΠŸΡ€ΠΈ Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠΈ gt-next я Ρ‚Π°ΠΊΠΆΠ΅ столкнулся с ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ Π² Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ΅: does not provide an export named 'printAST' - @formatjs/icu-messageformat-parser, которая ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΠ»Π° ΠΊ ΠΏΠΎΠ»ΠΎΠΌΠΊΠ΅ прилоТСния. ПослС сообщСния ΠΎΠ± этой ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ΅ ΡΠΎΠΏΡ€ΠΎΠ²ΠΎΠΆΠ΄Π°ΡŽΡ‰ΠΈΠΉ исправил Π΅Π΅ Π² Ρ‚Π΅Ρ‡Π΅Π½ΠΈΠ΅ 24 часов.
    • Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ статичСский Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³ страниц Next.js.

    (Lingo.dev) (@lingo.dev/compiler@0.4.0):

    • ΠšΠ²ΠΎΡ‚Π° AI ΠΏΡ€Π΅Π²Ρ‹ΡˆΠ΅Π½Π°, Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ Π±Π»ΠΎΠΊΠΈΡ€ΡƒΠ΅Ρ‚ сборку - Π²Ρ‹ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚Π΅ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π² ΠΏΡ€ΠΎΠ΄Π°ΠΊΡˆΠ½ Π±Π΅Π· ΠΎΠΏΠ»Π°Ρ‚Ρ‹.
    • ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ пропустил ΠΏΠΎΡ‡Ρ‚ΠΈ 40% ΠΏΠ΅Ρ€Π΅Π²Π΅Π΄Π΅Π½Π½ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π°. МнС ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΏΠ΅Ρ€Π΅ΠΏΠΈΡΠ°Ρ‚ΡŒ всС Π²Ρ‹Π·ΠΎΠ²Ρ‹ .map Π² плоскиС Π±Π»ΠΎΠΊΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², Ρ‡Ρ‚ΠΎΠ±Ρ‹ это Π·Π°Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ.
    • Π˜Ρ… CLI Ρ€Π°Π±ΠΎΡ‚Π°Π΅Ρ‚ с ошибками ΠΈ пСриодичСски сбрасываСт ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ Ρ„Π°ΠΉΠ» Π±Π΅Π· ΠΏΡ€ΠΈΡ‡ΠΈΠ½Ρ‹.
    • ΠŸΡ€ΠΈ сборкС ΠΎΠ½ ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽ удалял сгСнСрированныС JSON-Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΡ€ΠΈ Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠΈ Π½ΠΎΠ²ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π°. Π’ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ нСсколько ΠΊΠ»ΡŽΡ‡Π΅ΠΉ ΠΌΠΎΠ³Π»ΠΈ ΡΡ‚Π΅Ρ€Π΅Ρ‚ΡŒ Π±ΠΎΠ»Π΅Π΅ 300 ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΊΠ»ΡŽΡ‡Π΅ΠΉ.

    2 - Π­ΠΊΡΠΏΠ΅Ρ€ΠΈΠΌΠ΅Π½Ρ‚Π°Π»ΡŒΠ½Ρ‹Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ

    (Wuchale) (wuchale@0.22.11):

    ИдСя Wuchale интСрСсна, Π½ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ ΠΏΠΎΠΊΠ° Π½Π΅ ТизнСспособСн. Π― столкнулся с ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠ°ΠΌΠΈ рСактивности ΠΈ Π±Ρ‹Π» Π²Ρ‹Π½ΡƒΠΆΠ΄Π΅Π½ ΠΏΡ€ΠΈΠ½ΡƒΠ΄ΠΈΡ‚Π΅Π»ΡŒΠ½ΠΎ ΠΏΠ΅Ρ€Π΅Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ²Π°Ρ‚ΡŒ ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π·Π°Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ. ДокумСнтация Ρ‚Π°ΠΊΠΆΠ΅ довольно нСясная, Ρ‡Ρ‚ΠΎ затрудняСт Π½Π°Ρ‡Π°Π»ΠΎ Ρ€Π°Π±ΠΎΡ‚Ρ‹.

    (Paraglide) (@inlang/paraglide-js@2.15.1):

    Paraglide ΠΏΡ€Π΅Π΄Π»Π°Π³Π°Π΅Ρ‚ ΠΈΠ½Π½ΠΎΠ²Π°Ρ†ΠΈΠΎΠ½Π½Ρ‹ΠΉ, Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΏΡ€ΠΎΠ΄ΡƒΠΌΠ°Π½Π½Ρ‹ΠΉ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄. Π’Π΅ΠΌ Π½Π΅ ΠΌΠ΅Π½Π΅Π΅, Π² этом Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠ΅ Ρ€Π°Π·Ρ€Π΅ΠΊΠ»Π°ΠΌΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ tree-shaking Π½Π΅ сработал для ΠΌΠΎΠΈΡ… настроСк Next.js ΠΈΠ»ΠΈ TanStack Start. ΠŸΡ€ΠΎΡ†Π΅ΡΡ Ρ€Π°Π±ΠΎΡ‚Ρ‹ ΠΈ DX слоТнСС, Ρ‡Π΅ΠΌ Ρƒ Π΄Ρ€ΡƒΠ³ΠΈΡ… Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠ². Π›ΠΈΡ‡Π½ΠΎ ΠΌΠ½Π΅ Π½Π΅ нравится Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎΡΡ‚ΡŒ ΠΏΠ΅Ρ€Π΅Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ JS-Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΠ΅Ρ€Π΅Π΄ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ ΠΏΡƒΡˆΠ΅ΠΌ, Ρ‡Ρ‚ΠΎ создаСт постоянный риск ΠΊΠΎΠ½Ρ„Π»ΠΈΠΊΡ‚ΠΎΠ² слияния Π² PR. Π˜Π½ΡΡ‚Ρ€ΡƒΠΌΠ΅Π½Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ каТСтся Π±ΠΎΠ»Π΅Π΅ ΠΎΡ€ΠΈΠ΅Π½Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΌ Π½Π° Vite, Ρ‡Π΅ΠΌ Π½Π° Next.js. НаконСц, ΠΏΠΎ ΡΡ€Π°Π²Π½Π΅Π½ΠΈΡŽ с Π΄Ρ€ΡƒΠ³ΠΈΠΌΠΈ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡΠΌΠΈ, Paraglide Π½Π΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π΅ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, React context) для получСния Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Π»ΠΎΠΊΠ°Π»ΠΈ для Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Π° ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π°. Для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΎΠ±Ρ€Π°Π±Π°Ρ‚Ρ‹Π²Π°Π΅ΠΌΠΎΠ³ΠΎ ΡƒΠ·Π»Π° ΠΎΠ½ Π·Π°ΠΏΡ€Π°ΡˆΠΈΠ²Π°Π΅Ρ‚ локаль ΠΈΠ· localStorage / ΠΊΡƒΠΊΠΈ ΠΈ Ρ‚.Π΄. Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠ²ΠΎΠ΄ΠΈΡ‚ ΠΊ Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΡŽ Π½Π΅Π½ΡƒΠΆΠ½ΠΎΠΉ Π»ΠΎΠ³ΠΈΠΊΠΈ, которая влияСт Π½Π° Ρ€Π΅Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ².

    ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ ΠΏΠΎ paraglide: Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅ внСдряСт ΠΊΠΎΠ΄ Π² Π²Π°ΡˆΡƒ ΠΊΠΎΠ΄ΠΎΠ²ΡƒΡŽ Π±Π°Π·Ρƒ для ΠΈΠΌΠΏΠΎΡ€Ρ‚Π°, Π² Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Π΅ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ 'Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ' Π² ΠΎΡ‚Ρ‡Π΅Ρ‚Π΅ ΠΎ Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠ΅ практичСски Ρ€Π°Π²Π΅Π½ 0. ГСнСрация ΠΊΠΎΠ΄Π° - это Ρ…ΠΎΡ€ΠΎΡˆΠΎ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠ°Ρ функция Π±ΡƒΠ΄Π΅Ρ‚ Π²ΠΊΠ»ΡŽΡ‡Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΡƒΡŽ Π»ΠΎΠ³ΠΈΠΊΡƒ (всС прСфиксы ΠΏΡ€ΠΎΡ‚ΠΈΠ² отсутствия прСфиксов, ΠΊΡƒΠΊΠΈ ΠΏΡ€ΠΎΡ‚ΠΈΠ² Ρ…Ρ€Π°Π½ΠΈΠ»ΠΈΡ‰Π° ΠΈ Ρ‚.Π΄.). Π’ сравнСнии с этим, Intlayer выполняСт Ρ„ΠΈΠ»ΡŒΡ‚Ρ€Π°Ρ†ΠΈΡŽ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ внСдрСния ΠΏΠ΅Ρ€Π΅ΠΌΠ΅Π½Π½Ρ‹Ρ… окруТСния Π² сборку, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π·Π°ΡΡ‚Π°Π²ΠΈΡ‚ΡŒ сборщик ΠΈΡΠΊΠ»ΡŽΡ‡ΠΈΡ‚ΡŒ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ Π² зависимости ΠΎΡ‚ Π»ΠΎΠ³ΠΈΠΊΠΈ. Благодаря этому paraglide ΠΈ intlayer ΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ΡΡ Π² 6-10 Ρ€Π°Π· Π»Π΅Π³Ρ‡Π΅, Ρ‡Π΅ΠΌ i18next ΠΈΠ»ΠΈ next-intl.

    3 - ΠŸΡ€ΠΈΠ΅ΠΌΠ»Π΅ΠΌΡ‹Π΅ Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ

    (Tolgee) (@tolgee/react@7.0.0):

    Tolgee Ρ€Π΅ΡˆΠ°Π΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΈΠ΅ ΠΈΠ· упомянутых Ρ€Π°Π½Π΅Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌ. МнС показалось, Ρ‡Ρ‚ΠΎ Π΅Π³ΠΎ слоТнСС Π²Π½Π΅Π΄Ρ€ΠΈΡ‚ΡŒ, Ρ‡Π΅ΠΌ Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½Ρ‹Π΅ инструмСнты. Он Π½Π΅ обСспСчиваСт Ρ‚ΠΈΠΏΠΎΠ±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ затрудняСт ΠΎΡ‚Π»ΠΎΠ² ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΊΠ»ΡŽΡ‡Π΅ΠΉ Π½Π° этапС компиляции. МнС ΠΏΡ€ΠΈΡˆΠ»ΠΎΡΡŒ ΠΎΠ±Π΅Ρ€Π½ΡƒΡ‚ΡŒ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Tolgee своими собствСнными, Ρ‡Ρ‚ΠΎΠ±Ρ‹ Π΄ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΎΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΊΠ»ΡŽΡ‡Π΅ΠΉ.

    (Next Intl) (next-intl@4.9.1):

    next-intl - самый ΠΌΠΎΠ΄Π½Ρ‹ΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‡Π°Ρ‰Π΅ всСго ΠΏΡ€ΠΎΠ΄Π²ΠΈΠ³Π°ΡŽΡ‚ AI-Π°Π³Π΅Π½Ρ‚Ρ‹, Π½ΠΎ, Π½Π° ΠΌΠΎΠΉ взгляд, ΠΎΡˆΠΈΠ±ΠΎΡ‡Π½ΠΎ. ΠΠ°Ρ‡Π°Ρ‚ΡŒ Ρ€Π°Π±ΠΎΡ‚Ρƒ Π»Π΅Π³ΠΊΠΎ. На ΠΏΡ€Π°ΠΊΡ‚ΠΈΠΊΠ΅ оптимизация для ограничСния ΡƒΡ‚Π΅Ρ‡Π΅ΠΊ слоТна. Π‘ΠΎΡ‡Π΅Ρ‚Π°Π½ΠΈΠ΅ динамичСской Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ + пространств ΠΈΠΌΠ΅Π½ + Ρ‚ΠΈΠΏΠΎΠ² TypeScript сильно замСдляСт Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΡƒ. ΠŸΠ°ΠΊΠ΅Ρ‚ Ρ‚Π°ΠΊΠΆΠ΅ довольно тяТСлый (~13 ΠšΠ‘ для NextIntlClientProvider + useTranslations, Ρ‡Ρ‚ΠΎ Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ Π² 2 Ρ€Π°Π·Π° большС next-intlayer). next-intl Ρ€Π°Π½ΡŒΡˆΠ΅ Π±Π»ΠΎΠΊΠΈΡ€ΠΎΠ²Π°Π» статичСский Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³ страниц Next.js. Он прСдоставляСт ΠΏΠΎΠΌΠΎΡ‰Π½ΠΈΠΊ ΠΏΠΎΠ΄ Π½Π°Π·Π²Π°Π½ΠΈΠ΅ΠΌ setRequestLocale(). ΠšΠ°ΠΆΠ΅Ρ‚ΡΡ, это частично Ρ€Π΅ΡˆΠ΅Π½ΠΎ для Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹Ρ… Ρ„Π°ΠΉΠ»ΠΎΠ² Ρ‚ΠΈΠΏΠ° en.json / fr.json, Π½ΠΎ статичСский Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³ всС Ρ€Π°Π²Π½ΠΎ ломаСтся, ΠΊΠΎΠ³Π΄Π° ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ Ρ€Π°Π·Π΄Π΅Π»Π΅Π½ Π½Π° пространства ΠΈΠΌΠ΅Π½, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ en/shared.json / fr/shared.json / es/shared.json.

    (Next I18next) (next-i18next@16.0.5):

    next-i18next, вСроятно, являСтся самым популярным Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ΠΎΠΌ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ Π±Ρ‹Π» ΠΎΠ΄Π½ΠΈΠΌ ΠΈΠ· ΠΏΠ΅Ρ€Π²Ρ‹Ρ… i18n-Ρ€Π΅ΡˆΠ΅Π½ΠΈΠΉ для JavaScript-ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΉ. Π£ Π½Π΅Π³ΠΎ ΠΌΠ½ΠΎΠ³ΠΎ ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² ΠΎΡ‚ сообщСства. Π£ Π½Π΅Π³ΠΎ Ρ‚Π΅ ΠΆΠ΅ основныС нСдостатки, Ρ‡Ρ‚ΠΎ ΠΈ Ρƒ next-intl. ΠŸΠ°ΠΊΠ΅Ρ‚ особСнно тяТСлый (~18 ΠšΠ‘ для I18nProvider + useTranslation, ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π² 3 Ρ€Π°Π·Π° тяТСлСС next-intlayer).

    Π€ΠΎΡ€ΠΌΠ°Ρ‚Ρ‹ сообщСний Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π°Π·Π»ΠΈΡ‡Π°ΡŽΡ‚ΡΡ: next-intl ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ICU MessageFormat, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ i18next ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ свой собствСнный Ρ„ΠΎΡ€ΠΌΠ°Ρ‚.

    (Next International) (next-international@1.3.1):

    next-international Ρ‚Π°ΠΊΠΆΠ΅ Ρ€Π΅ΡˆΠ°Π΅Ρ‚ Π²Ρ‹ΡˆΠ΅ΡƒΠΊΠ°Π·Π°Π½Π½Ρ‹Π΅ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹, Π½ΠΎ Π½Π΅ сильно отличаСтся ΠΎΡ‚ next-intl ΠΈΠ»ΠΈ next-i18next. Он Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ scopedT() для ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΎΠ² Π²Π½ΡƒΡ‚Ρ€ΠΈ пространств ΠΈΠΌΠ΅Π½, Π½ΠΎ Π΅Π³ΠΎ использованиС практичСски Π½Π΅ влияСт Π½Π° Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±Π°Π½Π΄Π»Π°.

    (Lingui) (@lingui/core@5.3.0):

    Lingui часто хвалят. Π›ΠΈΡ‡Π½ΠΎ ΠΌΠ½Π΅ Ρ€Π°Π±ΠΎΡ‡ΠΈΠΉ процСсс с lingui extract / lingui compile показался Π±ΠΎΠ»Π΅Π΅ слоТным, Ρ‡Π΅ΠΌ Ρƒ Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ², Π±Π΅Π· явных прСимущСств. Π― Ρ‚Π°ΠΊΠΆΠ΅ Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ» Π½Π΅ΠΏΠΎΡΠ»Π΅Π΄ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒΠ½Ρ‹ΠΉ синтаксис, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΏΡƒΡ‚Π°Π΅Ρ‚ AI (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, t(), t'', i18n.t(), <Trans>).

    4 - Π Π΅ΠΊΠΎΠΌΠ΅Π½Π΄Π°Ρ†ΠΈΠΈ

    (Next Translate) (next-translate@3.1.2):

    next-translate - моя основная рСкомСндация, Ссли Π²Π°ΠΌ нравится API Π² стилС t(). Он элСгантСн благодаря next-translate-plugin, загруТая пространства ΠΈΠΌΠ΅Π½ Ρ‡Π΅Ρ€Π΅Π· getStaticProps с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π·Π°Π³Ρ€ΡƒΠ·Ρ‡ΠΈΠΊΠ° Webpack / Turbopack. Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ самый Π»Π΅Π³ΠΊΠΈΠΉ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ (~2.5 ΠšΠ‘). Π§Ρ‚ΠΎ касаСтся пространств ΠΈΠΌΠ΅Π½, ΠΈΡ… ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ страницы ΠΈΠ»ΠΈ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Π° Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³Π΅ Ρ…ΠΎΡ€ΠΎΡˆΠΎ ΠΏΡ€ΠΎΠ΄ΡƒΠΌΠ°Π½ΠΎ ΠΈ ΠΏΡ€ΠΎΡ‰Π΅ Π² обслуТивании, Ρ‡Π΅ΠΌ основныС Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ next-intl ΠΈΠ»ΠΈ next-i18next. Π’ вСрсии 3.1.2 я Π·Π°ΠΌΠ΅Ρ‚ΠΈΠ», Ρ‡Ρ‚ΠΎ статичСский Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³ Π½Π΅ Ρ€Π°Π±ΠΎΡ‚Π°Π»; Next.js откатывался ΠΊ динамичСскому Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΠ½Π³Ρƒ.

    (Intlayer) (next-intlayer@8.7.12):

    Π― Π½Π΅ Π±ΡƒΠ΄Ρƒ Π»ΠΈΡ‡Π½ΠΎ ΡΡƒΠ΄ΠΈΡ‚ΡŒ ΠΎ next-intlayer Ρ€Π°Π΄ΠΈ ΠΎΠ±ΡŠΠ΅ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΠΈ, Ρ‚Π°ΠΊ ΠΊΠ°ΠΊ это ΠΌΠΎΠ΅ собствСнноС Ρ€Π΅ΡˆΠ΅Π½ΠΈΠ΅.

    Π›ΠΈΡ‡Π½ΠΎΠ΅ ΠΏΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅

    Π­Ρ‚ΠΎ ΠΏΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅ являСтся Π»ΠΈΡ‡Π½Ρ‹ΠΌ ΠΈ Π½Π΅ влияСт Π½Π° Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠ°. Π’ ΠΌΠΈΡ€Π΅ i18n часто ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ консСнсус Π²ΠΎΠΊΡ€ΡƒΠ³ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½Π° const t = useTranslation('xx') + <>{t('xx.xx')}</>.

    Π’ React-прилоТСниях Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ Ρ„ΡƒΠ½ΠΊΡ†ΠΈΠΈ Π² качСствС ReactNode, Π½Π° ΠΌΠΎΠΉ взгляд, являСтся Π°Π½Ρ‚ΠΈΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ΠΎΠΌ. Π­Ρ‚ΠΎ Ρ‚Π°ΠΊΠΆΠ΅ добавляСт лишнюю ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ ΠΈ Π½Π°ΠΊΠ»Π°Π΄Π½Ρ‹Π΅ расходы Π½Π° Π²Ρ‹ΠΏΠΎΠ»Π½Π΅Π½ΠΈΠ΅ JavaScript (хотя ΠΎΠ½ΠΈ ΠΏΠΎΡ‡Ρ‚ΠΈ Π½Π΅Π·Π°ΠΌΠ΅Ρ‚Π½Ρ‹).