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

    vue-i18n VS Intlayer: Π‘Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊ ΠΈΠ½Ρ‚Π΅Ρ€Π½Π°Ρ†ΠΈΠΎΠ½Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ (i18n) для Vue

    vue-i18n β€” эталонная i18n-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° для Vue. Intlayer β€” Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Π° Π½Π° основС компилятора с ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ΠΎΠΌ, ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΌ ΠΎΠ±Π»Π°ΡΡ‚ΡŒΡŽ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°, ΠΈ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠ΅ΠΉ с Vue (vue-intlayer). Π­Ρ‚Π° ΡΡ‚Π°Ρ‚ΡŒΡ рассматриваСт, Π²ΠΎ Ρ‡Ρ‚ΠΎ обходится каТдая ΠΈΠ· Π½ΠΈΡ… послС сборки прилоТСния.

    Π”Π°Π½Π½Ρ‹Π΅ взяты ΠΈΠ· Benchmark Bloom, open-source Π½Π°Π±ΠΎΡ€Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ собираСт ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ с ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ ΠΈ записываСт, Ρ‡Ρ‚ΠΎ Π±Ρ€Π°ΡƒΠ·Π΅Ρ€ Π½Π° самом Π΄Π΅Π»Π΅ Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅Ρ‚ ΠΈ выполняСт.

    tl;dr: На ΠΎΠ΄Π½ΠΎΠΌ ΠΈ Ρ‚ΠΎΠΌ ΠΆΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ Vite + Vue 3 vue-i18n ΠΎΡ‚Π΄Π°Ρ‘Ρ‚ 134,9 ΠšΠ‘ gzip-сТатого JavaScript Π½Π° страницу ΠΏΡ€ΠΎΡ‚ΠΈΠ² 41,3 ΠšΠ‘ для прилоТСния Π±Π΅Π· i18n. Intlayer ΠΎΡ‚Π΄Π°Ρ‘Ρ‚ 57,1 ΠšΠ‘. Один Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Ρ€Π°Π½Ρ‚Π°ΠΉΠΌ vue-i18n вСсит 24,3 ΠšΠ‘ gzip (Π² 6 Ρ€Π°Π· большС 3,9 ΠšΠ‘ Ρƒ Intlayer), каТдая страница нСсёт 90 % строк Ρ‡ΡƒΠΆΠΈΡ… страниц, Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, скомпилированный ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎ, тянСт Π·Π° собой 196 ΠšΠ‘, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ привязан ΠΊ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΠΎΠΌΡƒ Π΄Π΅Ρ€Π΅Π²Ρƒ сообщСний. АдаптСр @intlayer/vue-i18n сохраняСт API vue-i18n ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Π» 47,0 ΠšΠ‘ Π½Π° страницу.

    ΠšΠΎΡ€ΠΎΡ‚ΠΊΠΎ

    • vue-i18n β€” Π΄Π΅-Ρ„Π°ΠΊΡ‚ΠΎ i18n-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ° для Vue 2 / Vue 3 ΠΈ ядро @nuxtjs/i18n. БообщСния Π² стилС ICU, Π±Π»ΠΎΠΊΠΈ <i18n> Π² SFC, Π΄ΠΈΡ€Π΅ΠΊΡ‚ΠΈΠ²Π° v-t, Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Ρ‚Π΅Ρ€Ρ‹ d() / n(), большая экосистСма. БообщСния Ρ€Π΅Π³ΠΈΡΡ‚Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ Π½Π° глобальном экзСмплярС Π² createI18n(); лСнивая Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΏΠΎ Π»ΠΎΠΊΠ°Π»ΠΈ β€” это Ρ€ΡƒΡ‡Π½ΠΎΠΉ ΠΏΠ°Ρ‚Ρ‚Π΅Ρ€Π½ с setLocaleMessage(), Π° Ρ€Π°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Π°ΠΌ Π²Π°ΠΌ Π½ΡƒΠΆΠ½ΠΎ ΡΡ‚Ρ€ΠΎΠΈΡ‚ΡŒ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ.
    • Intlayer β€” модСль ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π°, ориСнтированная Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹. Π‘Π»ΠΎΠ²Π°Ρ€ΠΈ .content.ts Π»Π΅ΠΆΠ°Ρ‚ рядом с ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΠ½ΠΈ ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°ΡŽΡ‚, компилятор Π½Π° этапС сборки (vite-intlayer) выполняСт tree-shaking ΠΈ Π»Π΅Π½ΠΈΠ²ΡƒΡŽ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ ΠΏΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌ ΠΈ ΠΏΠΎ локалям, строгиС Ρ‚ΠΈΠΏΡ‹ TypeScript Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈΠ· вашСго ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π°, Π° ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹ приводят ΠΊ ошибкС Π½Π° этапС сборки. Π’ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ Ρ…Π΅Π»ΠΏΠ΅Ρ€Ρ‹ для Ρ€ΠΎΡƒΡ‚Π΅Ρ€Π° / SEO, Visual Editor / CMS ΠΈ ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ ИИ.
    Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°Π—Π²Ρ‘Π·Π΄Ρ‹ GitHubВсСго ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ²ΠŸΠΎΡΠ»Π΅Π΄Π½ΠΈΠΉ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠŸΠ΅Ρ€Π²Π°Ρ вСрсияВСрсия NPMΠ—Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ NPM
    aymericzip/intlayerGitHub Repo starsGitHub commit activityLast CommitΠΠΏΡ€Π΅Π»ΡŒ 2024npmnpm downloads
    intlify/vue-i18nGitHub Repo starsGitHub commit activityLast CommitΠ”Π΅ΠΊ 2016npmnpm downloads
    Π‘Π΅ΠΉΠ΄ΠΆΠΈ ΠΎΠ±Π½ΠΎΠ²Π»ΡΡŽΡ‚ΡΡ автоматичСски. Π‘Π½ΠΈΠΌΠΊΠΈ Π±ΡƒΠ΄ΡƒΡ‚ ΠΌΠ΅Π½ΡΡ‚ΡŒΡΡ со Π²Ρ€Π΅ΠΌΠ΅Π½Π΅ΠΌ.

    Π‘Ρ€Π°Π²Π½Π΅Π½ΠΈΠ΅ возмоТностСй Π±ΠΎΠΊ ΠΎ Π±ΠΎΠΊ

    Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒvue-intlayer (Intlayer)vue-i18n
    ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹ рядом с ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌΠΈβœ… Π”Π°, .content.ts располагаСтся рядом с ΠΊΠ°ΠΆΠ΄Ρ‹ΠΌ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌβœ… Π§Π΅Ρ€Π΅Π· Π±Π»ΠΎΠΊΠΈ SFC <i18n> (ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½ΠΎ); ΠΎΠ±Ρ‹Ρ‡Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡŽΡ‚ΡΡ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ
    Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ с TypeScriptβœ… Π‘Ρ‚Ρ€ΠΎΠ³ΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹ автоматичСски Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΡŽΡ‚ΡΡ ΠΈΠ· ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π°βœ… Π₯ΠΎΡ€ΠΎΡˆΠΈΠ΅ Ρ‚ΠΈΠΏΡ‹; строгая Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ‚ΡŒ ΠΊΠ»ΡŽΡ‡Π΅ΠΉ Ρ‚Ρ€Π΅Π±ΡƒΠ΅Ρ‚ Ρ‚ΠΈΠΏΠΈΠ·Π°Ρ†ΠΈΠΈ схСмы ΠΈ дисциплины
    ΠžΠ±Π½Π°Ρ€ΡƒΠΆΠ΅Π½ΠΈΠ΅ ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΎΠ²βœ… Ошибка TypeScript + ошибка/ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π²ΠΎ врСмя ΡΠ±ΠΎΡ€ΠΊΠΈβš οΈ Fallback Π²ΠΎ врСмя выполнСния + ΠΏΡ€Π΅Π΄ΡƒΠΏΡ€Π΅ΠΆΠ΄Π΅Π½ΠΈΠ΅ Π² консоли
    Π‘ΠΎΠ³Π°Ρ‚Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ (ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ / Markdown)βœ… ΠŸΡ€ΡΠΌΠ°Ρ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ°βš οΈ Π˜Π½Ρ‚Π΅Ρ€ΠΏΠΎΠ»ΡΡ†ΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² <i18n-t>; Markdown Ρ‡Π΅Ρ€Π΅Π· внСшниС ΠΏΠ»Π°Π³ΠΈΠ½Ρ‹
    ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ICU⚠️ Π’ Ρ€Π°Π±ΠΎΡ‚Π΅βœ… Π”Π°
    Π€ΠΎΡ€ΠΌΠ°Ρ‚ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ (Π΄Π°Ρ‚Ρ‹, числа, Π²Π°Π»ΡŽΡ‚Ρ‹)βœ… Π€ΠΎΡ€ΠΌΠ°Ρ‚Ρ‚Π΅Ρ€Ρ‹ Π½Π° основС Intlβœ… d() / n() с datetimeFormats / numberFormats
    Локализованная ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΡβœ… Π₯Π΅Π»ΠΏΠ΅Ρ€Ρ‹ для Vue Router / Nuxt, getMultilingualUrls⚠️ НС Π² ядрС (@nuxtjs/i18n ΠΈΠ»ΠΈ собствСнная настройка Ρ€ΠΎΡƒΡ‚Π΅Ρ€Π°)
    SEO-Ρ…Π΅Π»ΠΏΠ΅Ρ€Ρ‹ (hreflang, sitemap, robots)βœ… ВстроСнныС Ρ…Π΅Π»ΠΏΠ΅Ρ€Ρ‹βŒ НС Π² ядрС
    Tree-shaking (ΠΎΡ‚Π΄Π°Π²Π°Ρ‚ΡŒ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹ΠΉ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚)βœ… По ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌ, ΠΏΠΎ локалям, автоматичСски ΠΊΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ΠΎΠΌβš οΈ Π’Ρ€ΡƒΡ‡Π½ΡƒΡŽ: Ρ€Π°Π·Π±ΠΈΠ²Π°Ρ‚ΡŒ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΈ, setLocaleMessage() Π½Π° ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚
    ЛСнивая Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ°βœ… importMode: 'dynamic' (ΠΎΠ΄Π½Π° строка ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ)βœ… Π ΡƒΡ‡Π½ΠΎΠΉ import() + setLocaleMessage()
    ΠžΡ‡ΠΈΡΡ‚ΠΊΠ° Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π°βœ… ΠœΡ‘Ρ€Ρ‚Π²Ρ‹Π΅ словари ΡƒΠ΄Π°Π»ΡΡŽΡ‚ΡΡ Π½Π° этапС ΡΠ±ΠΎΡ€ΠΊΠΈβŒ НС встроСно
    ΠŸΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ° ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄ΠΎΠ² (CLI / CI)βœ… npx intlayer content test⚠️ Π‘Ρ‚ΠΎΡ€ΠΎΠ½Π½ΠΈΠ΅ инструмСнты (vue-i18n-extract)
    ΠŸΠ΅Ρ€Π΅Π²ΠΎΠ΄ с ΠΏΠΎΠΌΠΎΡ‰ΡŒΡŽ Π˜Π˜βœ… ВстроСн, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ ваши собствСнныС ΠΊΠ»ΡŽΡ‡ΠΈ ΠΏΡ€ΠΎΠ²Π°ΠΉΠ΄Π΅Ρ€Π°βŒ НСт
    Visual Editor / CMSβœ… БСсплатный Visual Editor + ΠΎΠΏΡ†ΠΈΠΎΠ½Π°Π»ΡŒΠ½Π°Ρ CMS❌ НСт (внСшниС ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡ‹ Π»ΠΎΠΊΠ°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ)
    MCP-сСрвСр ΠΈ Agent Skillsβœ… Π”Π°βŒ НСт
    ЭкосистСма / ΡΠΎΠΎΠ±Ρ‰Π΅ΡΡ‚Π²ΠΎβš οΈ МСньшС, Π½ΠΎ быстро Ρ€Π°ΡΡ‚Ρ‘Ρ‚βœ… Π‘ΠΎΠ»ΡŒΡˆΠ°Ρ ΠΈ зрСлая Π² экосистСмС Vue

    Π‘Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊ

    Π§Ρ‚ΠΎ ΠΈΠ·ΠΌΠ΅Ρ€ΡΠ»ΠΎΡΡŒ

    Набор Benchmark Bloom собираСт ΠΎΠ΄Π½ΠΎ ΠΈ Ρ‚ΠΎ ΠΆΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Vite + Vue 3 с ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΎΠΉ: 10 страниц (home, about, blog, careers, contact, FAQ, pricing, products, settings, team), 10 Π»ΠΎΠΊΠ°Π»Π΅ΠΉ (en, fr, es, de, it, pt, zh, ja, ko, ru), ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹Π΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ ΠΈ ΠΎΠ΄ΠΈΠ½Π°ΠΊΠΎΠ²Ρ‹ΠΉ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚. Π‘Ρ‚Ρ€Π°Π½ΠΈΡ†Ρ‹ ΠΈΠ·ΠΌΠ΅Ρ€ΡΡŽΡ‚ΡΡ Π² en ΠΈ fr.

    ОбС Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ Ρ‚Π΅ΡΡ‚ΠΈΡ€ΠΎΠ²Π°Π»ΠΈΡΡŒ Π² ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ static β€” Ρ‚ΠΎΠΉ, с ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²ΠΎ Vue-ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ²: для vue-i18n JSON ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π»ΠΎΠΊΠ°Π»ΠΈ импортируСтся ΠΈ пСрСдаётся Π² createI18n({ messages }); для Intlayer β€” importMode: 'static' ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ. Π’ этом Ρ€Π΅ΠΆΠΈΠΌΠ΅ Intlayer Ρ‚ΠΎΠΆΠ΅ ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ всС Π»ΠΎΠΊΠ°Π»ΠΈ, Π½ΠΎ компилятор ΠΏΠΎ-ΠΏΡ€Π΅ΠΆΠ½Π΅ΠΌΡƒ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ ΠΏΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌ, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ страница нСсёт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ словари Ρ‚Π΅Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΠ½Π° Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΡ‚.

    Для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ сборки Π½Π°Π±ΠΎΡ€ записываСт:

    • Lib size: gzip-Ρ€Π°Π·ΠΌΠ΅Ρ€ пустого ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ i18n-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ. Ѐиксированная ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ Ρ€Π°Π½Ρ‚Π°ΠΉΠΌΠ°.
    • Page JS: gzip JavaScript, Π·Π°Π³Ρ€ΡƒΠΆΠ°Π΅ΠΌΡ‹ΠΉ Π½Π° страницу, усрСднённый ΠΏΠΎ всСм страницам ΠΈ локалям.
    • Locale leak %: доля ΠΏΠ΅Ρ€Π΅Π²Π΅Π΄Ρ‘Π½Π½Ρ‹Ρ… строк Π² Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠΌ JS, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ Π»ΠΎΠΊΠ°Π»ΠΈ, ΠΊΠΎΡ‚ΠΎΡ€ΡƒΡŽ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ просматриваСт (ΠΎΡ‚ΠΏΠ΅Ρ‡Π°Ρ‚ΠΊΠΈ ΠΏΠΎ en ΠΈ fr, Ρ‚Π°ΠΊ Ρ‡Ρ‚ΠΎ 50 % ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚ «вторая измСряСмая локаль присутствуСт ΠΏΠΎΠ»Π½ΠΎΡΡ‚ΡŒΡŽΒ»; ΠΏΡ€ΠΈ 10 ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Π½Π½Ρ‹Ρ… локалях Ρ€Π΅Π°Π»ΡŒΠ½Ρ‹Π΅ ΠΏΠΎΡ‚Π΅Ρ€ΠΈ Π²Ρ‹ΡˆΠ΅).
    • Page leak %: доля ΠΏΠ΅Ρ€Π΅Π²Π΅Π΄Ρ‘Π½Π½Ρ‹Ρ… строк Π² Π·Π°Π³Ρ€ΡƒΠΆΠ΅Π½Π½ΠΎΠΌ JS, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΡ€ΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ°Ρ‚ страницС, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΉ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»ΡŒ Π½Π΅ находится.
    • Component avg: срСдний gzip-Ρ€Π°Π·ΠΌΠ΅Ρ€ ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°, скомпилированного ΠΈΠ·ΠΎΠ»ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎ. ΠŸΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, сколько i18n-Ρ€Π°Π½Ρ‚Π°ΠΉΠΌΠ° ΠΈ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³Π° тянСт Π·Π° собой ΠΎΠ΄ΠΈΠ½ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚.
    • E2E reactivity: Ρ€Π΅Π°Π»ΡŒΠ½ΠΎΠ΅ врСмя ΠΌΠ΅ΠΆΠ΄Ρƒ Π²Ρ‹Π±ΠΎΡ€ΠΎΠΌ Π½ΠΎΠ²ΠΎΠΉ Π»ΠΎΠΊΠ°Π»ΠΈ ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠ΅ΠΌ html[lang] Π² DOM (Playwright, 5 ΠΈΡ‚Π΅Ρ€Π°Ρ†ΠΈΠΉ).
    • Page load: PerformanceNavigationTiming.duration.
    Π¦ΠΈΡ„Ρ€Ρ‹ Π½ΠΈΠΆΠ΅ взяты ΠΈΠ· ΠΏΡ€ΠΎΠ³ΠΎΠ½Π° ΠΎΡ‚ 2026-09-12 с vue-i18n 11.4.0 ΠΈ intlayer 9.5.0 / 9.5.1. ВСстовоС ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π°ΠΌΠ΅Ρ€Π΅Π½Π½ΠΎ нСбольшоС (нСсколько дСсятков строк Π½Π° локаль), поэтому ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚Ρ‹ ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ ΠΎΠΏΠΈΡΡ‹Π²Π°ΡŽΡ‚ Π·Π°ΠΊΠΎΠ½ΠΎΠΌΠ΅Ρ€Π½ΠΎΡΡ‚ΡŒ: ΠΎΠ½ΠΈ растут вмСстС с вашим ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚ΠΎΠΌ, Ρ‚ΠΎΠ³Π΄Π° ΠΊΠ°ΠΊ ΡΡ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ Ρ€Π°Π½Ρ‚Π°ΠΉΠΌΠ° остаётся фиксированной.

    Π Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ Π½Π° Vite + Vue 3

    Π’Ρ‹Π±Π΅Ρ€ΠΈΡ‚Π΅ ΠΌΠ΅Ρ‚Ρ€ΠΈΠΊΠΈ ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ вас ΠΈΠ½Ρ‚Π΅Ρ€Π΅ΡΡƒΡŽΡ‚:

    ΠœΠ΅Ρ‚Ρ€ΠΈΠΊΠ°

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

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

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

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

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

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

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

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

    Π’ΠΈΠ΄

    БиблиотСкаБтратСгияLib size (gz)Lib size (min)Page JS ср. (gz)Locale leakPage leakComponent ср. (gz)Π Π΅Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ E2EPage load
    base (Π±Π΅Π· i18n)-0,0 ΠšΠ‘0,0 ΠšΠ‘41,3 ΠšΠ‘0,0 %-1,1 ΠšΠ‘1,8 мс10,8 мс
    vue-i18nstatic24,3 ΠšΠ‘83,2 ΠšΠ‘134,9 ΠšΠ‘50,0 %90,0 %196,0 ΠšΠ‘2,8 мс13,6 мс
    vue-intlayerstatic3,9 ΠšΠ‘11,1 ΠšΠ‘57,1 ΠšΠ‘56,8 %0,0 %7,7 ΠšΠ‘4,5 мс13,8 мс
    @intlayer/vue-i18n (compat)static7,9 ΠšΠ‘23,2 ΠšΠ‘47,0 ΠšΠ‘15,0 %0,0 %8,4 ΠšΠ‘1,5 мс9,3 мс
    Π‘Ρ‚ΠΎΠ»Π±Π΅Ρ† page-leak для Π±Π°Π·ΠΎΠ²ΠΎΠ³ΠΎ прилоТСния оставлСн пустым: Π±Π΅Π· i18n-Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ снятиС ΠΎΡ‚ΠΏΠ΅Ρ‡Π°Ρ‚ΠΊΠΎΠ² ΠΏΠΎΠ΄Ρ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ Тёстко Π·Π°ΠΊΠΎΠ΄ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹Π΅ строки Π² ΠΎΠ±Ρ‰ΠΈΡ… Ρ‡Π°Π½ΠΊΠ°Ρ…, ΠΈ число Π½Π΅ ΠΈΠΌΠ΅Π΅Ρ‚ смысла.

    Как это Ρ‡ΠΈΡ‚Π°Ρ‚ΡŒ

    • Π‘Ρ‚ΠΎΠΈΠΌΠΎΡΡ‚ΡŒ Ρ€Π°Π½Ρ‚Π°ΠΉΠΌΠ°. vue-i18n β€” ΠΎΠ΄ΠΈΠ½ ΠΈΠ· самых тяТёлых Ρ€Π°Π½Ρ‚Π°ΠΉΠΌΠΎΠ² Π²ΠΎ всём Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠ΅: 24,3 ΠšΠ‘ gzip / 83,2 ΠšΠ‘ Π² ΠΌΠΈΠ½ΠΈΡ„ΠΈΡ†ΠΈΡ€ΠΎΠ²Π°Π½Π½ΠΎΠΌ Π²ΠΈΠ΄Π΅ для пустого ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ Π΅Π³ΠΎ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚. vue-intlayer стоит 3,9 ΠšΠ‘ gzip. Π­Ρ‚ΠΎΡ‚ Ρ€Π°Π·Ρ€Ρ‹Π² оплачиваСтся Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ страницС нСзависимо ΠΎΡ‚ Ρ‚ΠΎΠ³ΠΎ, сколько Ρƒ вас строк.
    • JavaScript Π½Π° страницу. ΠŸΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π±Π΅Π· i18n вСсит 41,3 ΠšΠ‘. vue-i18n ΡƒΠ²Π΅Π»ΠΈΡ‡ΠΈΠ²Π°Π΅Ρ‚ Π΅Π³ΠΎ Π±ΠΎΠ»Π΅Π΅ Ρ‡Π΅ΠΌ Π²Ρ‚Ρ€ΠΎΠ΅ β€” Π΄ΠΎ 134,9 ΠšΠ‘; Intlayer Π²Ρ‹Ρ…ΠΎΠ΄ΠΈΡ‚ Π½Π° 57,1 ΠšΠ‘, +15,8 ΠšΠ‘, большая Ρ‡Π°ΡΡ‚ΡŒ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… β€” Π΄Π΅ΡΡΡ‚ΡŒ ΡƒΠΏΠ°ΠΊΠΎΠ²Π°Π½Π½Ρ‹Ρ… Π»ΠΎΠΊΠ°Π»Π΅ΠΉ (см. ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΡƒΠ½ΠΊΡ‚).
    • Π£Ρ‚Π΅Ρ‡ΠΊΠ°. Π‘ createI18n({ messages: { en, fr, ... } }) каТдая страница ΠΎΡ‚Π΄Π°Ρ‘Ρ‚ всС Π»ΠΎΠΊΠ°Π»ΠΈ ΠΈ строки всСх страниц: 50 % ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ Π»ΠΎΠΊΠ°Π»Π΅ΠΉ (ΠΏΠΎ Π΄Π²ΡƒΠΌ измСряСмым локалям) ΠΈ 90 % ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ страниц. Π Π΅ΠΆΠΈΠΌ static Ρƒ Intlayer Ρ‚ΠΎΠΆΠ΅ ΡƒΠΏΠ°ΠΊΠΎΠ²Ρ‹Π²Π°Π΅Ρ‚ всС Π»ΠΎΠΊΠ°Π»ΠΈ (ΠΎΡ‚ΡΡŽΠ΄Π° сопоставимый ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ Π»ΠΎΠΊΠ°Π»Π΅ΠΉ), Π½ΠΎ Π΄Π°Ρ‘Ρ‚ 0 % ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ страниц: страница подтягиваСт Ρ‚ΠΎΠ»ΡŒΠΊΠΎ словари Ρ‚Π΅Ρ… ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ², ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΡ‚. ΠŸΠ΅Ρ€Π΅Ρ…ΠΎΠ΄ Π½Π° importMode: 'dynamic' ΡƒΠ±ΠΈΡ€Π°Π΅Ρ‚ ΠΈ ΡƒΡ‚Π΅Ρ‡ΠΊΡƒ Π»ΠΎΠΊΠ°Π»Π΅ΠΉ; эта конфигурация Π½Π΅ Π²Ρ…ΠΎΠ΄ΠΈΠ»Π° Π² Π΄Π°Π½Π½Ρ‹ΠΉ ΠΏΡ€ΠΎΠ³ΠΎΠ½ для Vue.
    • Π Π°Π·ΠΌΠ΅Ρ€ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² β€” Ρ‚ΠΎ мСсто, Π³Π΄Π΅ проявляСтся Π°Ρ€Ρ…ΠΈΡ‚Π΅ΠΊΡ‚ΡƒΡ€Π°. ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, Π²Ρ‹Π·Ρ‹Π²Π°ΡŽΡ‰ΠΈΠΉ useI18n(), компилируСтся Π² срСднСм Π² 196 ΠšΠ‘, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ t() привязан ΠΊ Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½ΠΎΠΌΡƒ экзСмпляру, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π΄Π΅Ρ€ΠΆΠΈΡ‚ всС сообщСния всСх Π»ΠΎΠΊΠ°Π»Π΅ΠΉ. Π’ΠΎΡ‚ ΠΆΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ с useIntlayer() компилируСтся Π² 7,7 ΠšΠ‘: ΠΎΠ½ обращаСтся Ρ‚ΠΎΠ»ΡŒΠΊΠΎ ΠΊ своСму ΡΠ»ΠΎΠ²Π°Ρ€ΡŽ.
    • Π Π΅Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ Π½Π΅ являСтся ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΠΎΠΉ Π½ΠΈ для ΠΎΠ΄Π½ΠΎΠΉ ΠΈΠ· Π½ΠΈΡ… (2–5 мс). БистСма рСактивности Vue Π΄Π΅Π»Π°Π΅Ρ‚ ΠΏΠ΅Ρ€Π΅ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅ Π»ΠΎΠΊΠ°Π»ΠΈ Π΄Π΅ΡˆΡ‘Π²Ρ‹ΠΌ, ΠΊΠ°ΠΊ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ сообщСния находятся Π² памяти.
    • @intlayer/vue-i18n, drop-in Π°Π΄Π°ΠΏΡ‚Π΅Ρ€, сохраняСт API vue-i18n ΠΈ ΠΏΠΎΠΊΠ°Π·Π°Π» 47,0 ΠšΠ‘ Π½Π° страницу ΠΈ 8,4 ΠšΠ‘ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, ΠΏΡ€ΠΈ этом ΠΊΠΎΠ΄ прилоТСния Π½Π΅ измСнялся.
    Для справки: Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΏΡ€ΠΎΠ³ΠΎΠ½ ΠΈΠ·ΠΌΠ΅Ρ€ΠΈΠ» fluent-vue Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ 171,8 ΠšΠ‘ Π½Π° страницу, 29,7 ΠšΠ‘ Ρ€Π°Π½Ρ‚Π°ΠΉΠΌΠ° ΠΈ 217 ΠšΠ‘ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚.
    Полная Ρ‚Π°Π±Π»ΠΈΡ†Π° со всСми Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°ΠΌΠΈ ΠΈ всСми стратСгиями Π² ΠΎΡ‚Ρ‡Ρ‘Ρ‚Π΅ benchmark ΠΏΠΎ Vue.

    ΠžΡ‚ΠΊΡƒΠ΄Π° Ρ€Π°Π·Ρ€Ρ‹Π²? Π“Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ экзСмпляр ΠΏΡ€ΠΎΡ‚ΠΈΠ² скомпилированных словарСй

    vue-i18n β€” это Ρ€Π°Π½Ρ‚Π°ΠΉΠΌ. createI18n() создаёт Π³Π»ΠΎΠ±Π°Π»ΡŒΠ½Ρ‹ΠΉ экзСмпляр, хранящий Π΄Π΅Ρ€Π΅Π²ΠΎ сообщСний для ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π»ΠΎΠΊΠ°Π»ΠΈ; useI18n() привязываСт ΠΊ Π½Π΅ΠΌΡƒ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚; t("footer.github") ΠΈΡ‰Π΅Ρ‚ ΠΊΠ»ΡŽΡ‡ Π²ΠΎ врСмя Ρ€Π΅Π½Π΄Π΅Ρ€Π°. ИмСнно это Π΄Π΅Π»Π°Π΅Ρ‚ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½Ρ‹ΠΌΠΈ Π±Π»ΠΎΠΊΠΈ SFC <i18n>, v-t ΠΈ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ сообщСний Π²ΠΎ врСмя выполнСния, ΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ поэтому Π³Ρ€Π°Ρ„ зависимостСй ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π° Π²ΠΊΠ»ΡŽΡ‡Π°Π΅Ρ‚ всё Π΄Π΅Ρ€Π΅Π²ΠΎ:

    bash
    .
    β”œβ”€β”€ locales
    β”‚   β”œβ”€β”€ en.json
    β”‚   β”œβ”€β”€ fr.json
    β”‚   └── ...                        # ΠΎΠ΄ΠΈΠ½ Ρ„Π°ΠΉΠ» Π½Π° локаль, всС страницы Π²Π½ΡƒΡ‚Ρ€ΠΈ
    └── src
        β”œβ”€β”€ i18n.ts                    # createI18n({ messages: { en, fr, ... } })
        β”œβ”€β”€ main.ts
        └── components
            └── Footer.vue             # const { t } = useI18n(); t("footer.github")
    

    ΠžΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΡ ΠΎΠ·Π½Π°Ρ‡Π°Π΅Ρ‚, Ρ‡Ρ‚ΠΎ Π²Ρ‹ Ρ€Π°Π·Π±ΠΈΠ²Π°Π΅Ρ‚Π΅ en.json Π½Π° Ρ„Π°ΠΉΠ»Ρ‹ ΠΏΠΎ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Π°ΠΌ, Π²Ρ‹ Π²Ρ‹Π·Ρ‹Π²Π°Π΅Ρ‚Π΅ setLocaleMessage() Π² guard Ρ€ΠΎΡƒΡ‚Π΅Ρ€Π° ΠΈ Π²Ρ‹ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚Π΅ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΠΎΡΡ‚ΡŒ соотвСтствия ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΎΠ² Ρ„Π°ΠΉΠ»Π°ΠΌ ΠΏΠΎ ΠΌΠ΅Ρ€Π΅ пСрСмСщСния ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ². Π Π°Π½Ρ‚Π°ΠΉΠΌ Π½Π΅ ΠΌΠΎΠΆΠ΅Ρ‚ ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ это Π·Π° вас, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ Π½Π΅ Π·Π½Π°Π΅Ρ‚, ΠΊΠ°ΠΊΠΈΠ΅ ΠΊΠ»ΡŽΡ‡ΠΈ запросит ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚.

    Intlayer пСрСносит это Π·Π½Π°Π½ΠΈΠ΅ Π½Π° этап сборки. ΠšΠΎΠ½Ρ‚Π΅Π½Ρ‚ ΠΎΠ±ΡŠΡΠ²Π»ΡΠ΅Ρ‚ΡΡ рядом с ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ, Π° vite-intlayer опрСдСляСт, ΠΊΠ°ΠΊΠΎΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚ ΠΊΠ°ΠΊΠΎΠΉ ΡΠ»ΠΎΠ²Π°Ρ€ΡŒ:

    bash
    .
    β”œβ”€β”€ intlayer.config.ts
    └── src
        β”œβ”€β”€ main.ts                    # createApp(App).use(intlayer)
        └── components
            └── Footer
                β”œβ”€β”€ Footer.vue         # useIntlayer("footer")
                └── Footer.content.ts
    

    ΠšΠΎΠΌΠΏΠΈΠ»ΡΡ‚ΠΎΡ€ Π³Π΅Π½Π΅Ρ€ΠΈΡ€ΡƒΠ΅Ρ‚ для ΠΊΠ°ΠΆΠ΄ΠΎΠ³ΠΎ словаря ΠΈ ΠΊΠ°ΠΆΠ΄ΠΎΠΉ Π»ΠΎΠΊΠ°Π»ΠΈ Ρ€ΠΎΠ²Π½ΠΎ Ρ‚ΠΎΡ‚ JSON, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π½ΡƒΠΆΠ΅Π½ этому ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρƒ, ΠΈ отбрасываСт словари, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π½ΠΈΠΊΡ‚ΠΎ Π½Π΅ ΠΈΠΌΠΏΠΎΡ€Ρ‚ΠΈΡ€ΡƒΠ΅Ρ‚. ΠžΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Π°ΠΌ β€” слСдствиС ограничСния ΠΏΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌ, Π° Π½Π΅ ΠΎΡ‚Π΄Π΅Π»ΡŒΠ½Π°Ρ Π·Π°Π΄Π°Ρ‡Π°.

    Π§Ρ‚ΠΎΠ±Ρ‹ Ρ‚Π°ΠΊΠΆΠ΅ ΠΎΡ‚Π±Ρ€ΠΎΡΠΈΡ‚ΡŒ Π½Π΅ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡ‹Π΅ Π»ΠΎΠΊΠ°Π»ΠΈ, установитС dictionary.importMode: 'dynamic' Π² intlayer.config.ts. Π‘ΠΌ. Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ΠΏΠΎ ΠΎΠΏΡ‚ΠΈΠΌΠΈΠ·Π°Ρ†ΠΈΠΈ Π±Π°Π½Π΄Π»Π°.

    ΠžΠΏΡ‹Ρ‚ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠ°

    Настройка

    vue-i18n

    src/i18n.ts
    import { createI18n } from "vue-i18n";
    import en from "../locales/en.json";
    import fr from "../locales/fr.json";
    
    export const i18n = createI18n({
      legacy: false,
      locale: "en",
      fallbackLocale: "en",
      messages: { en, fr },
    });
    
    src/main.ts
    import { createApp } from "vue";
    import App from "./App.vue";
    import router from "./router";
    import { i18n } from "./i18n";
    
    createApp(App).use(router).use(i18n).mount("#app");
    

    Intlayer

    intlayer.config.ts
    import { type IntlayerConfig, Locales } from "intlayer";
    
    const config: IntlayerConfig = {
      internationalization: {
        locales: [Locales.ENGLISH, Locales.FRENCH],
        defaultLocale: Locales.ENGLISH,
      },
    };
    
    export default config;
    
    vite.config.ts
    import { defineConfig } from "vite";
    import vue from "@vitejs/plugin-vue";
    import { intlayer } from "vite-intlayer";
    
    export default defineConfig({
      plugins: [intlayer(), vue()],
    });
    
    src/main.ts
    import { createApp } from "vue";
    import { intlayer } from "vue-intlayer";
    import App from "./App.vue";
    import router from "./router";
    
    createApp(App).use(intlayer).use(router).mount("#app");
    

    ΠšΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚

    vue-i18n

    locales/en.json
    {
      "counter": {
        "label": "Counter",
        "increment": "Increment"
      }
    }
    
    src/components/Counter.vue
    <script setup lang="ts">
    import { ref } from "vue";
    import { useI18n } from "vue-i18n";
    
    const { t, n } = useI18n();
    const count = ref(0);
    </script>
    
    <template>
      <div>
        <p>{{ n(count) }}</p>
        <button :aria-label="t('counter.label')" @click="count++">
          {{ t("counter.increment") }}
        </button>
      </div>
    </template>
    

    t('counter.label') остаётся строкой, ΠΏΠΎΠΊΠ° Π²Ρ‹ сами Π½Π΅ Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΡƒΠ΅Ρ‚Π΅ схСму сообщСний; ΠΎΠΏΠ΅Ρ‡Π°Ρ‚ΠΊΠ° ΠΎΡ‚Ρ€Π΅Π½Π΄Π΅Ρ€ΠΈΡ‚ ΠΊΠ»ΡŽΡ‡.

    Intlayer

    src/components/Counter/Counter.content.ts
    import { t, type Dictionary } from "intlayer";
    
    const counterContent = {
      key: "counter",
      content: {
        label: t({ en: "Counter", fr: "Compteur" }),
        increment: t({ en: "Increment", fr: "IncrΓ©menter" }),
      },
    } satisfies Dictionary;
    
    export default counterContent;
    
    src/components/Counter/Counter.vue
    <script setup lang="ts">
    import { ref } from "vue";
    import { useIntlayer } from "vue-intlayer";
    import { useNumber } from "vue-intlayer/format";
    
    const { label, increment } = useIntlayer("counter");
    const number = useNumber();
    const count = ref(0);
    </script>
    
    <template>
      <div>
        <p>{{ number.value(count) }}</p>
        <button :aria-label="label" @click="count++">
          {{ increment }}
        </button>
      </div>
    </template>
    

    label ΠΈ increment Ρ‚ΠΈΠΏΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Ρ‹; ΠΎΠΏΠ΅Ρ‡Π°Ρ‚ΠΊΠ° β€” это ошибка TypeScript, ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰Π΅Π΅ французскоС Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅ β€” ошибка сборки.

    ЛСнивая Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° ΠΏΠΎ Π»ΠΎΠΊΠ°Π»ΠΈ

    vue-i18n

    src/i18n.ts
    import { nextTick } from "vue";
    import { createI18n } from "vue-i18n";
    
    export const i18n = createI18n({
      legacy: false,
      locale: "en",
      fallbackLocale: "en",
    });
    
    export const loadLocaleMessages = async (locale: string) => {
      const messages = await import(`../locales/${locale}.json`);
      i18n.global.setLocaleMessage(locale, messages.default);
      await nextTick();
      i18n.global.locale.value = locale;
    };
    

    Π—Π°Ρ‚Π΅ΠΌ Π²Ρ‹Π·ΠΎΠ²ΠΈΡ‚Π΅ loadLocaleMessages() ΠΈΠ· guard Ρ€ΠΎΡƒΡ‚Π΅Ρ€Π° ΠΈ ΡΠ°ΠΌΠΎΡΡ‚ΠΎΡΡ‚Π΅Π»ΡŒΠ½ΠΎ Ρ€Π°Π·Π±Π΅ΠΉΡ‚Π΅ locales/{locale}.json ΠΏΠΎ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Π°ΠΌ, Ссли Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½ΠΈΠ΅ ΠΏΠΎ страницам.

    Intlayer

    intlayer.config.ts
    const config: IntlayerConfig = {
      // ...
      dictionary: {
        importMode: "dynamic",
      },
    };
    

    Π‘ΠΎΡ…Ρ€Π°Π½ΠΈΡ‚Π΅ API vue-i18n, ΠΏΠΎΠ»ΡƒΡ‡ΠΈΡ‚Π΅ Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚ Intlayer

    @intlayer/vue-i18n β€” это drop-in Π°Π΄Π°ΠΏΡ‚Π΅Ρ€: useI18n(), t(), d(), n(), интСрполяция {name} ΠΈ {0}, мноТСствСнныС Ρ„ΠΎΡ€ΠΌΡ‹ Ρ‡Π΅Ρ€Π΅Π· pipe ("car | cars"), v-t ΠΈ i18n.global.locale ΠΏΡ€ΠΎΠ΄ΠΎΠ»ΠΆΠ°ΡŽΡ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ, Π½ΠΎ ΠΎΠ±ΡΠ»ΡƒΠΆΠΈΠ²Π°ΡŽΡ‚ΡΡ ΠΈΠ· словарСй Intlayer, скомпилированных vite-intlayer.

    vite.config.ts
    import { defineConfig } from "vite";
    import vue from "@vitejs/plugin-vue";
    import vueI18nVitePlugin from "@intlayer/vue-i18n/plugin";
    
    export default defineConfig({
      plugins: [vue(), vueI18nVitePlugin()],
    });
    

    Π’ Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΠ΅ compat-сборка Ρ‚ΠΎΠ³ΠΎ ΠΆΠ΅ прилоТСния ΡƒΠΌΠ΅Π½ΡŒΡˆΠΈΠ»Π°ΡΡŒ с 134,9 ΠšΠ‘ Π΄ΠΎ 47,0 ΠšΠ‘ Π½Π° страницу ΠΈ с 196 ΠšΠ‘ Π΄ΠΎ 8,4 ΠšΠ‘ Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚, ΠΏΡ€ΠΈ этом ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π½Π΅ мСнялись. Π’Π°ΡˆΠΈ ΡΡƒΡ‰Π΅ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠ΅ locales/{locale}.json ΠΌΠΎΠ³ΡƒΡ‚ ΠΎΡΡ‚Π°Π²Π°Ρ‚ΡŒΡΡ источником истины Ρ‡Π΅Ρ€Π΅Π· ΠΏΠ»Π°Π³ΠΈΠ½ синхронизации JSON.

    Π‘ΠΌ. руководство ΠΏΠΎ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ с vue-i18n ΠΈ Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π°Ρ†ΠΈΡŽ ΠΏΠΎ совмСстимости. Π£ ΠΏΠΎΠ»ΡŒΠ·ΠΎΠ²Π°Ρ‚Π΅Π»Π΅ΠΉ Nuxt Ρ‚ΠΎΡ‚ ΠΆΠ΅ ΠΏΡƒΡ‚ΡŒ Ρ‡Π΅Ρ€Π΅Π· ΡΠΎΠ²ΠΌΠ΅ΡΡ‚ΠΈΠΌΠΎΡΡ‚ΡŒ с @nuxtjs/i18n.

    Когда Ρ‡Ρ‚ΠΎ Π²Ρ‹Π±ΠΈΡ€Π°Ρ‚ΡŒ?

    • Π’Ρ‹Π±ΠΈΡ€Π°ΠΉΡ‚Π΅ vue-i18n, Ссли Π²Π°ΠΌ Π½ΡƒΠΆΠ΅Π½ стандартный ΠΏΠΎΠ΄Ρ…ΠΎΠ΄ Vue, Π²Ρ‹ ΠΏΠΎΠ»Π°Π³Π°Π΅Ρ‚Π΅ΡΡŒ Π½Π° ICU-сообщСния ΠΈΠ»ΠΈ Π±Π»ΠΎΠΊΠΈ SFC <i18n>, ΡƒΠΆΠ΅ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ @nuxtjs/i18n ΠΈΠ»ΠΈ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Π° ΠΎΠΆΠΈΠ΄Π°Π΅Ρ‚ Ρ†Π΅Π½Ρ‚Ρ€Π°Π»ΠΈΠ·ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ JSON. Π—Π°Π»ΠΎΠΆΠΈΡ‚Π΅ врСмя Π½Π° Ρ€Π°Π·Π±ΠΈΠ΅Π½ΠΈΠ΅ ΠΊΠ°Ρ‚Π°Π»ΠΎΠ³ΠΎΠ² ΠΈ Π»Π΅Π½ΠΈΠ²ΡƒΡŽ Π·Π°Π³Ρ€ΡƒΠ·ΠΊΡƒ ΠΏΠΎ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚Π°ΠΌ, Ссли Ρ€Π°Π·ΠΌΠ΅Ρ€ Π±Π°Π½Π΄Π»Π° ΠΈΠΌΠ΅Π΅Ρ‚ Π·Π½Π°Ρ‡Π΅Π½ΠΈΠ΅.
    • Π’Ρ‹Π±ΠΈΡ€Π°ΠΉΡ‚Π΅ Intlayer, Ссли Π²Π°ΠΌ Π½ΡƒΠΆΠ½Ρ‹ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚, ΠΎΠ³Ρ€Π°Π½ΠΈΡ‡Π΅Π½Π½Ρ‹ΠΉ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ, строгий TypeScript, ошибки ΠΎΡ‚ΡΡƒΡ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΡ… ΠΊΠ»ΡŽΡ‡Π΅ΠΉ Π½Π° этапС сборки, tree-shaking ΠΈ лСнивая Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠ° Π±Π΅Π· усилий ΠΈ встроСнныС рСдакторскиС инструмСнты (Visual Editor, CMS, ИИ-ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄, MCP-сСрвСр). ОсобСнно Π°ΠΊΡ‚ΡƒΠ°Π»ΡŒΠ½ΠΎ для Π±ΠΎΠ»ΡŒΡˆΠΈΡ… ΠΌΠΎΠ΄ΡƒΠ»ΡŒΠ½Ρ‹Ρ… ΠΊΠΎΠ΄ΠΎΠ²Ρ‹Ρ… Π±Π°Π· Vue / Nuxt ΠΈ Π΄ΠΈΠ·Π°ΠΉΠ½-систСм.
    • Π’Ρ‹Π±ΠΈΡ€Π°ΠΉΡ‚Π΅ @intlayer/vue-i18n, Ссли Π²Ρ‹ ΡƒΠΆΠ΅ Π½Π° vue-i18n ΠΈ Ρ…ΠΎΡ‚ΠΈΡ‚Π΅ Π²Ρ‹ΠΈΠ³Ρ€Ρ‹Ρˆ Π² Ρ€Π°Π·ΠΌΠ΅Ρ€Π΅ Π±Π°Π½Π΄Π»Π° Π±Π΅Π· пСрСписывания.

    Часто Π·Π°Π΄Π°Π²Π°Π΅ΠΌΡ‹Π΅ вопросы

    И Ρ‚ΠΎ, ΠΈ Π΄Ρ€ΡƒΠ³ΠΎΠ΅, Π² зависимости ΠΎΡ‚ Π²Ρ‹Π±Ρ€Π°Π½Π½ΠΎΠ³ΠΎ ΠΏΠΎΠ΄Ρ…ΠΎΠ΄Π°. vue-intlayer, это Π½Π°Ρ‚ΠΈΠ²Π½Ρ‹ΠΉ Ρ€Π°Π½Ρ‚Π°ΠΉΠΌ с собствСнным ΠΊΠΎΠΌΠΏΠΎΠ½ΡƒΠ΅ΠΌΡ‹ΠΌ ΠΌΠ΅Ρ‚ΠΎΠ΄ΠΎΠΌ useIntlayer(). @intlayer/vue-i18n, это Π°Π΄Π°ΠΏΡ‚Π΅Ρ€ совмСстимости, ΡΠΎΡ…Ρ€Π°Π½ΡΡŽΡ‰ΠΈΠΉ API vue-i18n ΠΈ Π·Π°ΠΌΠ΅Π½ΡΡŽΡ‰ΠΈΠΉ Π΅Π³ΠΎ привязку, Ρ‡Ρ‚ΠΎ позволяСт ΠΌΠΈΠ³Ρ€ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π±Π΅Π· измСнСния ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠ² ΠΈ Π·Π°Ρ‚Π΅ΠΌ постСпСнно ΠΎΠ±Π½ΠΎΠ²Π»ΡΡ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹.

    АдаптСр ΠΈΡ… Π½Π΅ считываСт. ΠŸΠ΅Ρ€Π΅Π½Π΅ΡΠΈΡ‚Π΅ эти сообщСния Π² JSON-Ρ„Π°ΠΉΠ»Ρ‹ Π»ΠΎΠΊΠ°Π»Π΅ΠΉ ΠΈΠ»ΠΈ Π² Ρ„Π°ΠΉΠ» .content.ts рядом с ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ прСдставляСт собой Π°Π½Π°Π»ΠΎΠ³ΠΈΡ‡Π½ΡƒΡŽ идСю со сгСнСрированными Ρ‚ΠΈΠΏΠ°ΠΌΠΈ. Π­Ρ‚ΠΎ СдинствСнная функция vue-i18n, которая Π½Π΅ пСрСносится.

    Π”Π°. Intlayer с Nuxt ΠΎΡ…Π²Π°Ρ‚Ρ‹Π²Π°Π΅Ρ‚ ΠΌΠ½ΠΎΠ³ΠΎΡΠ·Ρ‹Ρ‡Π½ΡƒΡŽ ΠΌΠ°Ρ€ΡˆΡ€ΡƒΡ‚ΠΈΠ·Π°Ρ†ΠΈΡŽ, middleware для опрСдСлСния Π»ΠΎΠΊΠ°Π»ΠΈ ΠΈ Π³Π΅Π½Π΅Ρ€Π°Ρ†ΠΈΡŽ sitemap. Если Π²Ρ‹ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚Π΅ @nuxtjs/i18n, Π°Π΄Π°ΠΏΡ‚Π΅Ρ€ совмСстимости Nuxt i18n являСтся ΠΏΡƒΡ‚Π΅ΠΌ ΠΌΠΈΠ³Ρ€Π°Ρ†ΠΈΠΈ.

    Π”Π°. Плагин синхронизации JSON считываСт ΠΈΡ… с Π΄ΠΈΠ°Π»Π΅ΠΊΡ‚ΠΎΠΌ vue-i18n ({name}, {0}, мноТСствСнныС Ρ„ΠΎΡ€ΠΌΡ‹ с Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»Π΅ΠΌ "car | cars") ΠΈ записываСт ΠΏΠ΅Ρ€Π΅Π²ΠΎΠ΄Ρ‹ ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎ ΠΏΡ€ΠΈ ΠΎΠ±Π½ΠΎΠ²Π»Π΅Π½ΠΈΠΈ Ρ‡Π΅Ρ€Π΅Π· CLI ΠΈΠ»ΠΈ CMS.

    Нативная ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° ICU находится Π² Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠ΅. АдаптСр @intlayer/vue-i18n ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ синтаксис сообщСний vue-i18n, Π²ΠΊΠ»ΡŽΡ‡Π°Ρ мноТСствСнныС Ρ„ΠΎΡ€ΠΌΡ‹ с Ρ€Π°Π·Π΄Π΅Π»ΠΈΡ‚Π΅Π»Π΅ΠΌ ΠΈ ΠΈΠΌΠ΅Π½ΠΎΠ²Π°Π½Π½ΡƒΡŽ/ΡΠΏΠΈΡΠΎΡ‡Π½ΡƒΡŽ ΠΈΠ½Ρ‚Π΅Ρ€ΠΏΠΎΠ»ΡΡ†ΠΈΡŽ. О ΠΌΠΎΠ΄Π΅Π»ΠΈ ΠΏΠ»ΡŽΡ€Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ Intlayer см. содСрТимоС пСрСчислСния.

    БвязанныС сравнСния

    Бправочная докумСнтация:

    ΠžΡ‚Ρ‡Ρ‘Ρ‚Ρ‹ benchmark:

    Π§Ρ‚ΠΎΠ±Ρ‹ ΠΏΠΎΠ½ΡΡ‚ΡŒ, ΠΎΡ‚ΠΊΡƒΠ΄Π° взялись эти Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠΈ, ΠΏΡ€ΠΎΡ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ i18n Π² JavaScript.

    Π—Π²Ρ‘Π·Π΄Ρ‹ GitHub

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

    Star History Chart

    ΠΠΊΡ‚ΠΈΠ²Π½ΠΎΡΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ²

    Π—Π²Ρ‘Π·Π΄Ρ‹ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚ ΠΏΠΎΠΏΡƒΠ»ΡΡ€Π½ΠΎΡΡ‚ΡŒ. ΠšΠΎΠΌΠΌΠΈΡ‚Ρ‹ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°ΡŽΡ‚, сколько Ρ€Π°Π±ΠΎΡ‚Ρ‹ вкладываСтся Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚. На ΠΌΠΎΠΌΠ΅Π½Ρ‚ написания Ρƒ Intlayer ΠΎΠΊΠΎΠ»ΠΎ 7 500 ΠΊΠΎΠΌΠΌΠΈΡ‚ΠΎΠ²: большС, Ρ‡Π΅ΠΌ Ρƒ Π±ΠΎΠ»ΡŒΡˆΠΈΠ½ΡΡ‚Π²Π° сравниваСмых здСсь Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊ, ΠΈ ΠΏΡ€ΠΈΠΌΠ΅Ρ€Π½ΠΎ Π² 5 Ρ€Π°Π· большС, Ρ‡Π΅ΠΌ Ρƒ next-intl ΠΈΠ»ΠΈ next-i18next.

    • intlify/vue-i18n
    • aymericzip/intlayer

    ΠšΠΎΠΌΠΌΠΈΡ‚Ρ‹ Π² основной Π²Π΅Ρ‚ΠΊΠ΅, источник: GitHub API.

    Intlayer это ΠΌΠΎΠ½ΠΎΡ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΉ, поэтому Π² счёт входят всС ΠΏΠ°ΠΊΠ΅Ρ‚Ρ‹ для Ρ„Ρ€Π΅ΠΉΠΌΠ²ΠΎΡ€ΠΊΠΎΠ², CLI ΠΈ докумСнтация. Π‘Ρ‡ΠΈΡ‚Π°ΠΉΡ‚Π΅ ΠΊΠΎΠΌΠΌΠΈΡ‚Ρ‹ ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»Π΅ΠΌ активности, Π° Π½Π΅ качСства.

    Π—Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ npm

    • vue-i18n
    • vue-intlayer

    Π˜ΡΡ‚ΠΎΡ‡Π½ΠΈΠΊ: API Π·Π°Π³Ρ€ΡƒΠ·ΠΎΠΊ рССстра npm.

    Число Π·Π°Π³Ρ€ΡƒΠ·ΠΎΠΊ Π²ΠΎΠ·Π½Π°Π³Ρ€Π°ΠΆΠ΄Π°Π΅Ρ‚ самыС старыС Ρ€Π΅ΡˆΠ΅Π½ΠΈΡ, Π° Π½Π΅ Π»ΡƒΡ‡ΡˆΠΈΠ΅. Π‘ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΡƒ, Π²Ρ‹ΠΏΡƒΡ‰Π΅Π½Π½ΡƒΡŽ ΠΌΠ½ΠΎΠ³ΠΎ Π»Π΅Ρ‚ Π½Π°Π·Π°Π΄, Π΄ΠΎ сих ΠΏΠΎΡ€ устанавливаСт ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ Π²Ρ‹Π±Ρ€Π°Π» Π΅Ρ‘ Ρ‚ΠΎΠ³Π΄Π°, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ запуск CI ΠΈ ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ зависящий ΠΎΡ‚ Π½Π΅Ρ‘ ΠΏΠ°ΠΊΠ΅Ρ‚. Π­Ρ‚Π° Ρ†ΠΈΡ„Ρ€Π° измСряСт ΠΈΠ½Π΅Ρ€Ρ†ΠΈΡŽ, Π° Π½Π΅ осознанный Π²Ρ‹Π±ΠΎΡ€.

    ИИ-ассистСнты ΡƒΡΠΈΠ»ΠΈΠ²Π°ΡŽΡ‚ этот эффСкт. next-intl, i18next ΠΈ vue-i18n ΠΏΠΎΠ²ΡΡŽΠ΄Ρƒ Π²ΡΡ‚Ρ€Π΅Ρ‡Π°ΡŽΡ‚ΡΡ Π² ΠΊΠΎΠ΄Π΅, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ ΠΎΠ½ΠΈ ΠΎΠ±ΡƒΡ‡Π°Π»ΠΈΡΡŒ, поэтому ассистСнты ΠΏΡ€Π΅Π΄Π»Π°Π³Π°ΡŽΡ‚ ΠΈΡ… ΠΏΠΎ ΡƒΠΌΠΎΠ»Ρ‡Π°Π½ΠΈΡŽ, Π½Π΅ сравнивая Π°Π»ΡŒΡ‚Π΅Ρ€Π½Π°Ρ‚ΠΈΠ²Ρ‹. КаТдая подсказка добавляСт Π·Π°Π³Ρ€ΡƒΠ·ΠΊΠΈ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΏΠΎΠ΄ΠΏΠΈΡ‚Ρ‹Π²Π°ΡŽΡ‚ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ. Π‘Ρ€Π°Π²Π½ΠΈΠ²Π°ΠΉΡ‚Π΅ ΠΏΠΎ Π±Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊΡƒ, Π° Π½Π΅ ΠΏΠΎ числу Π·Π°Π³Ρ€ΡƒΠ·ΠΎΠΊ.

    Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

    vue-i18n β€” зрСлая, гибкая ΠΈ Π³Π»ΡƒΠ±ΠΎΠΊΠΎ интСгрированная с Vue Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°. Π‘Π΅Π½Ρ‡ΠΌΠ°Ρ€ΠΊ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚, Π²ΠΎ Ρ‡Ρ‚ΠΎ обходится Π΅Ρ‘ runtime-first Π΄ΠΈΠ·Π°ΠΉΠ½ Π² сборкС Vite: Ρ€Π°Π½Ρ‚Π°ΠΉΠΌ 24 ΠšΠ‘ gzip, 134,9 ΠšΠ‘ Π½Π° страницу для прилоТСния, ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠ΅ вСсит 41 ΠšΠ‘ Π±Π΅Π· i18n, 90 % ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° Ρ‡ΡƒΠΆΠΈΡ… страниц Π½Π° ΠΊΠ°ΠΆΠ΄ΠΎΠΉ страницС ΠΈ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹, ΠΊΠ°ΠΆΠ΄Ρ‹ΠΉ ΠΈΠ· ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… достигаСт 196 ΠšΠ‘, ΠΏΠΎΡ‚ΠΎΠΌΡƒ Ρ‡Ρ‚ΠΎ висит Π½Π° глобальном Π΄Π΅Ρ€Π΅Π²Π΅ сообщСний.

    Intlayer пСрСносит Ρ€Π°Π±ΠΎΡ‚Ρƒ Π² компилятор. Π‘Π»ΠΎΠ²Π°Ρ€ΠΈ ΠΏΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π°ΠΌ ΠΈ очистка ΠΌΡ‘Ρ€Ρ‚Π²ΠΎΠ³ΠΎ ΠΊΠΎΠ½Ρ‚Π΅Π½Ρ‚Π° β€” это Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ сборки, Π° Π½Π΅ соглашСния. На Ρ‚ΠΎΠΌ ΠΆΠ΅ ΠΏΡ€ΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠΈ: Ρ€Π°Π½Ρ‚Π°ΠΉΠΌ 3,9 ΠšΠ‘, 57,1 ΠšΠ‘ Π½Π° страницу, 0 % ΡƒΡ‚Π΅Ρ‡ΠΊΠΈ страниц, ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹ Π² 25 Ρ€Π°Π· мСньшС. А Ссли пСрСписываниС Π½Π΅ рассматриваСтся, @intlayer/vue-i18n ΠΏΡ€ΠΎΡ…ΠΎΠ΄ΠΈΡ‚ Π±ΠΎΠ»ΡŒΡˆΡƒΡŽ Ρ‡Π°ΡΡ‚ΡŒ ΠΏΡƒΡ‚ΠΈ, Π½Π΅ затрагивая ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Ρ‹.

    ВсС сырыС Π΄Π°Π½Π½Ρ‹Π΅, тСстовыС прилоТСния ΠΈ скрипты находятся Π² Ρ€Π΅ΠΏΠΎΠ·ΠΈΡ‚ΠΎΡ€ΠΈΠΈ Benchmark Bloom. ЗапуститС Π΅Π³ΠΎ сами.

    ΠŸΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅Π΅ см. Π² Π΄ΠΎΠΊΡƒΠΌΠ΅Π½Ρ‚Π΅ Β«ΠŸΠΎΡ‡Π΅ΠΌΡƒ Intlayer?Β».

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

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

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

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