@intlayer/docs 5.8.0-canary.0 → 5.8.1-canary.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/blog/ar/intlayer_with_next-i18next.md +2 -2
- package/blog/ar/next-i18next_vs_next-intl_vs_intlayer.md +96 -219
- package/blog/ar/react-i18next_vs_react-intl_vs_intlayer.md +88 -129
- package/blog/ar/vue-i18n_vs_intlayer.md +268 -0
- package/blog/de/intlayer_with_next-i18next.md +2 -2
- package/blog/de/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/de/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/de/vue-i18n_vs_intlayer.md +268 -0
- package/blog/en/intlayer_with_next-i18next.md +2 -2
- package/blog/en/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/en/react-i18next_vs_react-intl_vs_intlayer.md +88 -120
- package/blog/en/vue-i18n_vs_intlayer.md +276 -0
- package/blog/en-GB/intlayer_with_next-i18next.md +2 -2
- package/blog/en-GB/next-i18next_vs_next-intl_vs_intlayer.md +85 -218
- package/blog/en-GB/react-i18next_vs_react-intl_vs_intlayer.md +80 -130
- package/blog/en-GB/vue-i18n_vs_intlayer.md +258 -0
- package/blog/es/intlayer_with_next-i18next.md +2 -2
- package/blog/es/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/es/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/es/vue-i18n_vs_intlayer.md +268 -0
- package/blog/fr/intlayer_with_next-i18next.md +2 -2
- package/blog/fr/next-i18next_vs_next-intl_vs_intlayer.md +91 -214
- package/blog/fr/react-i18next_vs_react-intl_vs_intlayer.md +86 -127
- package/blog/fr/vue-i18n_vs_intlayer.md +269 -0
- package/blog/hi/intlayer_with_next-i18next.md +2 -2
- package/blog/hi/next-i18next_vs_next-intl_vs_intlayer.md +97 -220
- package/blog/hi/react-i18next_vs_react-intl_vs_intlayer.md +89 -130
- package/blog/hi/vue-i18n_vs_intlayer.md +268 -0
- package/blog/it/intlayer_with_next-i18next.md +2 -2
- package/blog/it/next-i18next_vs_next-intl_vs_intlayer.md +91 -214
- package/blog/it/react-i18next_vs_react-intl_vs_intlayer.md +86 -127
- package/blog/it/vue-i18n_vs_intlayer.md +268 -0
- package/blog/ja/intlayer_with_next-i18next.md +2 -2
- package/blog/ja/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/ja/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/ja/vue-i18n_vs_intlayer.md +268 -0
- package/blog/ko/intlayer_with_next-i18next.md +2 -2
- package/blog/ko/next-i18next_vs_next-intl_vs_intlayer.md +95 -217
- package/blog/ko/react-i18next_vs_react-intl_vs_intlayer.md +89 -130
- package/blog/ko/vue-i18n_vs_intlayer.md +268 -0
- package/blog/pt/intlayer_with_next-i18next.md +2 -2
- package/blog/pt/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/pt/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/pt/vue-i18n_vs_intlayer.md +268 -0
- package/blog/ru/intlayer_with_next-i18next.md +2 -2
- package/blog/ru/next-i18next_vs_next-intl_vs_intlayer.md +94 -217
- package/blog/ru/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/ru/vue-i18n_vs_intlayer.md +268 -0
- package/blog/zh/intlayer_with_next-i18next.md +2 -2
- package/blog/zh/next-i18next_vs_next-intl_vs_intlayer.md +93 -216
- package/blog/zh/react-i18next_vs_react-intl_vs_intlayer.md +87 -128
- package/blog/zh/vue-i18n_vs_intlayer.md +269 -0
- package/dist/cjs/generated/blog.entry.cjs +41 -0
- package/dist/cjs/generated/blog.entry.cjs.map +1 -1
- package/dist/esm/generated/blog.entry.mjs +41 -0
- package/dist/esm/generated/blog.entry.mjs.map +1 -1
- package/dist/types/generated/blog.entry.d.ts +1 -0
- package/dist/types/generated/blog.entry.d.ts.map +1 -1
- package/docs/ar/formatters.md +417 -31
- package/docs/ar/how_works_intlayer.md +2 -4
- package/docs/ar/interest_of_intlayer.md +7 -10
- package/docs/ar/intlayer_CMS.md +2 -3
- package/docs/ar/intlayer_visual_editor.md +2 -3
- package/docs/ar/intlayer_with_tanstack.md +1 -1
- package/docs/ar/introduction.md +4 -4
- package/docs/de/formatters.md +444 -34
- package/docs/de/introduction.md +2 -2
- package/docs/en/dictionary/enumeration.md +2 -2
- package/docs/en/dictionary/function_fetching.md +2 -2
- package/docs/en/dictionary/get_started.md +2 -2
- package/docs/en/dictionary/translation.md +2 -2
- package/docs/en/formatters.md +383 -15
- package/docs/en/how_works_intlayer.md +2 -4
- package/docs/en/interest_of_intlayer.md +48 -29
- package/docs/en/intlayer_CMS.md +2 -3
- package/docs/en/intlayer_visual_editor.md +2 -3
- package/docs/en/intlayer_with_create_react_app.md +2 -2
- package/docs/en/intlayer_with_express.md +2 -2
- package/docs/en/intlayer_with_tanstack.md +1 -1
- package/docs/en/introduction.md +4 -4
- package/docs/en/packages/express-intlayer/index.md +2 -2
- package/docs/en/packages/intlayer/getConfiguration.md +2 -3
- package/docs/en/packages/intlayer/getEnumeration.md +2 -7
- package/docs/en/packages/intlayer/getHTMLTextDir.md +2 -4
- package/docs/en/packages/intlayer/getLocaleLang.md +2 -4
- package/docs/en/packages/intlayer/getLocaleName.md +2 -3
- package/docs/en/packages/intlayer/getLocalizedUrl.md +2 -8
- package/docs/en/packages/intlayer/getMultilingualUrls.md +2 -7
- package/docs/en/packages/intlayer/getPathWithoutLocale.md +2 -3
- package/docs/en/packages/intlayer/getTranslation.md +2 -4
- package/docs/en/packages/intlayer/index.md +2 -2
- package/docs/en/packages/next-intlayer/index.md +2 -2
- package/docs/en/packages/next-intlayer/t.md +2 -2
- package/docs/en/packages/next-intlayer/useDictionary.md +2 -2
- package/docs/en/packages/next-intlayer/useIntlayer.md +2 -2
- package/docs/en/packages/next-intlayer/useLocale.md +2 -2
- package/docs/en/packages/react-intlayer/index.md +2 -2
- package/docs/en/packages/react-intlayer/t.md +2 -2
- package/docs/en/packages/react-intlayer/useI18n.md +2 -2
- package/docs/en/packages/react-intlayer/useIntlayer.md +2 -2
- package/docs/en/packages/react-intlayer/useLocale.md +2 -2
- package/docs/en/packages/react-scripts-intlayer/index.md +2 -2
- package/docs/en/packages/solid-intlayer/index.md +2 -2
- package/docs/en/packages/vite-intlayer/index.md +2 -2
- package/docs/en-GB/formatters.md +402 -16
- package/docs/en-GB/how_works_intlayer.md +2 -4
- package/docs/en-GB/interest_of_intlayer.md +7 -10
- package/docs/en-GB/intlayer_with_tanstack.md +1 -1
- package/docs/en-GB/introduction.md +2 -2
- package/docs/es/formatters.md +438 -28
- package/docs/es/how_works_intlayer.md +2 -4
- package/docs/es/interest_of_intlayer.md +7 -10
- package/docs/es/intlayer_with_tanstack.md +1 -1
- package/docs/es/introduction.md +2 -2
- package/docs/fr/formatters.md +438 -28
- package/docs/fr/how_works_intlayer.md +2 -4
- package/docs/fr/interest_of_intlayer.md +7 -10
- package/docs/fr/intlayer_with_tanstack.md +1 -1
- package/docs/fr/introduction.md +2 -2
- package/docs/hi/formatters.md +430 -39
- package/docs/hi/how_works_intlayer.md +2 -4
- package/docs/hi/interest_of_intlayer.md +7 -10
- package/docs/hi/intlayer_with_tanstack.md +1 -1
- package/docs/hi/introduction.md +2 -2
- package/docs/it/formatters.md +438 -30
- package/docs/it/how_works_intlayer.md +2 -4
- package/docs/it/interest_of_intlayer.md +7 -10
- package/docs/it/intlayer_with_tanstack.md +1 -1
- package/docs/it/introduction.md +2 -2
- package/docs/ja/formatters.md +435 -47
- package/docs/ja/how_works_intlayer.md +2 -4
- package/docs/ja/interest_of_intlayer.md +7 -10
- package/docs/ja/intlayer_with_tanstack.md +1 -1
- package/docs/ja/introduction.md +2 -2
- package/docs/ko/formatters.md +432 -41
- package/docs/ko/how_works_intlayer.md +2 -4
- package/docs/ko/interest_of_intlayer.md +7 -10
- package/docs/ko/intlayer_with_tanstack.md +1 -1
- package/docs/ko/introduction.md +2 -2
- package/docs/pt/formatters.md +416 -30
- package/docs/pt/how_works_intlayer.md +2 -4
- package/docs/pt/intlayer_with_tanstack.md +1 -1
- package/docs/pt/introduction.md +2 -2
- package/docs/ru/autoFill.md +2 -2
- package/docs/ru/configuration.md +1 -40
- package/docs/ru/formatters.md +438 -28
- package/docs/ru/how_works_intlayer.md +5 -7
- package/docs/ru/index.md +1 -1
- package/docs/ru/interest_of_intlayer.md +8 -11
- package/docs/ru/intlayer_CMS.md +7 -8
- package/docs/ru/intlayer_cli.md +4 -7
- package/docs/ru/intlayer_visual_editor.md +5 -6
- package/docs/ru/intlayer_with_angular.md +1 -1
- package/docs/ru/intlayer_with_create_react_app.md +5 -5
- package/docs/ru/intlayer_with_lynx+react.md +1 -1
- package/docs/ru/intlayer_with_nextjs_15.md +3 -3
- package/docs/ru/intlayer_with_nextjs_page_router.md +2 -2
- package/docs/ru/intlayer_with_nuxt.md +1 -1
- package/docs/ru/intlayer_with_react_native+expo.md +2 -2
- package/docs/ru/intlayer_with_tanstack.md +3 -3
- package/docs/ru/intlayer_with_vite+preact.md +3 -3
- package/docs/ru/intlayer_with_vite+react.md +3 -3
- package/docs/ru/intlayer_with_vite+solid.md +1 -1
- package/docs/ru/intlayer_with_vite+svelte.md +1 -1
- package/docs/ru/intlayer_with_vite+vue.md +2 -2
- package/docs/ru/introduction.md +5 -5
- package/docs/ru/locale_mapper.md +1 -1
- package/docs/ru/packages/@intlayer/api/index.md +2 -2
- package/docs/ru/packages/@intlayer/chokidar/index.md +1 -1
- package/docs/ru/packages/@intlayer/cli/index.md +2 -2
- package/docs/ru/packages/@intlayer/config/index.md +2 -2
- package/docs/ru/packages/@intlayer/core/index.md +2 -2
- package/docs/ru/packages/@intlayer/design-system/index.md +2 -2
- package/docs/ru/packages/@intlayer/dictionary-entry/index.md +2 -2
- package/docs/ru/packages/@intlayer/editor/index.md +1 -1
- package/docs/ru/packages/@intlayer/editor-react/index.md +1 -1
- package/docs/ru/packages/@intlayer/webpack/index.md +1 -1
- package/docs/ru/packages/angular-intlayer/index.md +1 -1
- package/docs/ru/packages/express-intlayer/index.md +3 -3
- package/docs/ru/packages/express-intlayer/t.md +1 -1
- package/docs/ru/packages/intlayer/getEnumeration.md +3 -8
- package/docs/ru/packages/intlayer/getTranslation.md +3 -5
- package/docs/ru/packages/intlayer/getTranslationContent.md +1 -3
- package/docs/ru/packages/intlayer/index.md +3 -3
- package/docs/ru/packages/intlayer-cli/index.md +1 -1
- package/docs/ru/packages/intlayer-editor/index.md +2 -2
- package/docs/ru/packages/lynx-intlayer/index.md +1 -1
- package/docs/ru/packages/next-intlayer/index.md +4 -4
- package/docs/ru/packages/next-intlayer/t.md +4 -4
- package/docs/ru/packages/next-intlayer/useLocale.md +3 -3
- package/docs/ru/packages/nuxt-intlayer/index.md +1 -1
- package/docs/ru/packages/preact-intlayer/index.md +1 -1
- package/docs/ru/packages/react-intlayer/index.md +4 -4
- package/docs/ru/packages/react-intlayer/t.md +4 -4
- package/docs/ru/packages/react-native-intlayer/index.md +1 -1
- package/docs/ru/packages/react-scripts-intlayer/index.md +3 -3
- package/docs/ru/packages/solid-intlayer/index.md +3 -3
- package/docs/ru/packages/svelte-intlayer/index.md +1 -1
- package/docs/ru/packages/vite-intlayer/index.md +3 -3
- package/docs/ru/packages/vue-intlayer/index.md +1 -1
- package/docs/ru/per_locale_file.md +1 -1
- package/docs/ru/roadmap.md +3 -5
- package/docs/ru/vs_code_extension.md +1 -1
- package/docs/zh/formatters.md +446 -38
- package/docs/zh/how_works_intlayer.md +2 -4
- package/docs/zh/interest_of_intlayer.md +7 -10
- package/docs/zh/intlayer_with_tanstack.md +1 -1
- package/docs/zh/introduction.md +2 -2
- package/frequent_questions/ar/domain_routing.md +1 -1
- package/frequent_questions/en/domain_routing.md +1 -1
- package/frequent_questions/en-GB/domain_routing.md +1 -1
- package/frequent_questions/es/domain_routing.md +1 -1
- package/frequent_questions/fr/domain_routing.md +1 -1
- package/frequent_questions/hi/domain_routing.md +1 -1
- package/frequent_questions/it/domain_routing.md +1 -1
- package/frequent_questions/ko/domain_routing.md +1 -1
- package/frequent_questions/pt/domain_routing.md +1 -1
- package/frequent_questions/ru/domain_routing.md +1 -1
- package/frequent_questions/ru/get_locale_cookie.md +4 -4
- package/frequent_questions/ru/static_rendering.md +1 -2
- package/frequent_questions/zh/domain_routing.md +1 -1
- package/package.json +9 -11
- package/src/generated/blog.entry.ts +42 -1
|
@@ -0,0 +1,268 @@
|
|
|
1
|
+
---
|
|
2
|
+
createdAt: 2024-08-11
|
|
3
|
+
updatedAt: 2025-08-23
|
|
4
|
+
title: vue-i18n против Intlayer
|
|
5
|
+
description: Сравнение vue-i18n и Intlayer для интернационализации (i18n) в приложениях Vue/Nuxt
|
|
6
|
+
keywords:
|
|
7
|
+
- vue-i18n
|
|
8
|
+
- Intlayer
|
|
9
|
+
- Интернационализация
|
|
10
|
+
- i18n
|
|
11
|
+
- Блог
|
|
12
|
+
- Vue
|
|
13
|
+
- Nuxt
|
|
14
|
+
- JavaScript
|
|
15
|
+
slugs:
|
|
16
|
+
- blog
|
|
17
|
+
- vue-i18n-vs-intlayer
|
|
18
|
+
---
|
|
19
|
+
|
|
20
|
+
# vue-i18n ПРОТИВ Intlayer | Интернационализация Vue (i18n)
|
|
21
|
+
|
|
22
|
+
Это руководство сравнивает два популярных варианта i18n для **Vue 3** (и **Nuxt**): **vue-i18n** и **Intlayer**.
|
|
23
|
+
Мы сосредотачиваемся на современном инструментировании Vue (Vite, Composition API) и оцениваем:
|
|
24
|
+
|
|
25
|
+
1. **Архитектуру и организацию контента**
|
|
26
|
+
2. **TypeScript и безопасность**
|
|
27
|
+
3. **Обработку отсутствующих переводов**
|
|
28
|
+
4. **Маршрутизацию и стратегию URL**
|
|
29
|
+
5. **Производительность и поведение загрузки**
|
|
30
|
+
6. **Опыт разработчика (DX), инструменты и сопровождение**
|
|
31
|
+
7. **SEO и масштабируемость для крупных проектов**
|
|
32
|
+
|
|
33
|
+
> **кратко**: Оба решения могут локализовать приложения Vue. Если вам нужен **контент, ограниченный компонентом**, **строгие типы TypeScript**, **проверка отсутствующих ключей во время сборки**, **деревья сжатые словари**, а также **встроенные помощники для маршрутизации и SEO** плюс **Визуальный редактор и AI-переводы**, то **Intlayer** - более полный и современный выбор.
|
|
34
|
+
|
|
35
|
+
---
|
|
36
|
+
|
|
37
|
+
## Общее позиционирование
|
|
38
|
+
|
|
39
|
+
- **vue-i18n** - де-факто библиотека i18n для Vue. Гибкое форматирование сообщений (стиль ICU), блоки SFC `<i18n>` для локальных сообщений и большая экосистема. Безопасность и масштабное сопровождение в основном на вашей стороне.
|
|
40
|
+
- **Intlayer** - компонентно-ориентированная модель контента для Vue/Vite/Nuxt с **строгой типизацией TS**, **проверками во время сборки**, **деревьями сжатия**, **помощниками для маршрутизации и SEO**, опциональным **Визуальным редактором/CMS** и **AI-поддержкой переводов**.
|
|
41
|
+
|
|
42
|
+
---
|
|
43
|
+
|
|
44
|
+
## Сравнение функций бок о бок (с фокусом на Vue)
|
|
45
|
+
|
|
46
|
+
| Функция | **Intlayer** | **vue-i18n** |
|
|
47
|
+
| --------------------------------------------------------- | -------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------- |
|
|
48
|
+
| **Переводы рядом с компонентами** | ✅ Да, контент расположен рядом с компонентом (например, `MyComp.content.ts`) | ✅ Да, через SFC-блоки `<i18n>` (опционально) |
|
|
49
|
+
| **Интеграция с TypeScript** | ✅ Продвинутая, автоматически сгенерированные **строгие** типы и автозаполнение ключей | ✅ Хорошая типизация; **строгая безопасность ключей требует дополнительной настройки/дисциплины** |
|
|
50
|
+
| **Обнаружение отсутствующих переводов** | ✅ Предупреждения/ошибки во время сборки и отображение в TS | ⚠️ Запасные варианты и предупреждения во время выполнения |
|
|
51
|
+
| **Богатый контент (компоненты/Markdown)** | ✅ Прямая поддержка сложных узлов и файлов с содержимым Markdown | ⚠️ Ограничено (компоненты через `<i18n-t>`, Markdown через внешние плагины) |
|
|
52
|
+
| **Перевод с использованием ИИ** | ✅ Встроенные рабочие процессы с использованием ваших ключей провайдера ИИ | ❌ Не встроено |
|
|
53
|
+
| **Визуальный редактор / CMS** | ✅ Бесплатный визуальный редактор и опциональная CMS | ❌ Не встроено (используйте внешние платформы) |
|
|
54
|
+
| **Локализованная маршрутизация** | ✅ Хелперы для Vue Router/Nuxt для генерации локализованных путей, URL и `hreflang` | ⚠️ Не является ядром (используйте Nuxt i18n или кастомную настройку Vue Router) |
|
|
55
|
+
| **Динамическая генерация маршрутов** | ✅ Да | ❌ Не предоставляется (предоставляется Nuxt i18n) |
|
|
56
|
+
| **Плюрализация и форматирование** | ✅ Шаблоны перечислений; форматтеры на основе Intl | ✅ Сообщения в стиле ICU; форматтеры Intl |
|
|
57
|
+
| **Форматы контента** | ✅ `.ts`, `.js`, `.json`, `.md`, `.txt` (YAML в разработке) | ✅ `.json`, `.js` (плюс SFC-блоки `<i18n>`) |
|
|
58
|
+
| **Поддержка ICU** | ⚠️ В разработке | ✅ Да |
|
|
59
|
+
| **SEO-хелперы (sitemap, robots, метаданные)** | ✅ Встроенные хелперы (независимые от фреймворка) | ❌ Не является ядром (Nuxt i18n/сообщество) |
|
|
60
|
+
| **SSR/SSG** | ✅ Работает с Vue SSR и Nuxt; не блокирует статическую генерацию | ✅ Работает с Vue SSR/Nuxt |
|
|
61
|
+
| **Tree-shaking (отгрузка только используемого контента)** | ✅ По компонентам во время сборки | ⚠️ Частично; требует ручного разделения кода/асинхронных сообщений |
|
|
62
|
+
| **Ленивая загрузка** | ✅ По локалям / по словарям | ✅ Поддержка асинхронных сообщений локалей |
|
|
63
|
+
| **Удаление неиспользуемого контента** | ✅ Да (во время сборки) | ❌ Не встроено |
|
|
64
|
+
| **Поддерживаемость крупных проектов** | ✅ Поощряет модульную структуру, удобную для дизайн-систем | ✅ Возможно, но требует строгой дисциплины в работе с файлами/пространствами имён |
|
|
65
|
+
| **Экосистема / сообщество** | ⚠️ Меньше, но быстро растёт | ✅ Большое и зрелое в экосистеме Vue |
|
|
66
|
+
|
|
67
|
+
---
|
|
68
|
+
|
|
69
|
+
## Глубокое сравнение
|
|
70
|
+
|
|
71
|
+
### 1) Архитектура и масштабируемость
|
|
72
|
+
|
|
73
|
+
- **vue-i18n**: Обычно используется **централизованные каталоги** для каждой локали (опционально разделённые на файлы/пространства имён). Блоки SFC `<i18n>` позволяют использовать локальные сообщения, но по мере роста проектов команды часто возвращаются к общим каталогам.
|
|
74
|
+
- **Intlayer**: Продвигает использование **словарей для каждого компонента**, хранящихся рядом с самим компонентом. Это снижает конфликты между командами, облегчает поиск контента и естественным образом ограничивает расхождение и неиспользуемые ключи.
|
|
75
|
+
|
|
76
|
+
**Почему это важно:** В больших Vue-приложениях или дизайн-системах **модульный контент** масштабируется лучше, чем монолитные каталоги.
|
|
77
|
+
|
|
78
|
+
---
|
|
79
|
+
|
|
80
|
+
### 2) TypeScript и безопасность
|
|
81
|
+
|
|
82
|
+
- **vue-i18n**: Хорошая поддержка TS; для **строгой типизации ключей** обычно требуются пользовательские схемы/дженерики и тщательные соглашения.
|
|
83
|
+
- **Intlayer**: **Генерирует строгие типы** из вашего контента, обеспечивая **автодополнение в IDE** и **ошибки на этапе компиляции** для опечаток/отсутствующих ключей.
|
|
84
|
+
|
|
85
|
+
**Почему это важно:** Строгая типизация выявляет ошибки **до** выполнения программы.
|
|
86
|
+
|
|
87
|
+
---
|
|
88
|
+
|
|
89
|
+
### 3) Обработка отсутствующих переводов
|
|
90
|
+
|
|
91
|
+
- **vue-i18n**: **Время выполнения** - предупреждения/запасные варианты (например, fallback локаль или ключ).
|
|
92
|
+
- **Intlayer**: **Время сборки** - обнаружение с предупреждениями/ошибками по локалям и ключам.
|
|
93
|
+
|
|
94
|
+
**Почему это важно:** Контроль на этапе сборки поддерживает чистый и согласованный UI в продакшене.
|
|
95
|
+
|
|
96
|
+
---
|
|
97
|
+
|
|
98
|
+
### 4) Маршрутизация и стратегия URL (Vue Router/Nuxt)
|
|
99
|
+
|
|
100
|
+
- **Обе** системы могут работать с локализованными маршрутами.
|
|
101
|
+
- **Intlayer** предоставляет помощники для **генерации локализованных путей**, **управления префиксами локалей** и генерации **`<link rel="alternate" hreflang>`** для SEO. В Nuxt он дополняет маршрутизацию фреймворка.
|
|
102
|
+
|
|
103
|
+
**Почему это важно:** Меньше пользовательских прослоек и **чище SEO** для разных локалей.
|
|
104
|
+
|
|
105
|
+
---
|
|
106
|
+
|
|
107
|
+
### 5) Производительность и поведение загрузки
|
|
108
|
+
|
|
109
|
+
- **vue-i18n**: Поддерживает асинхронные сообщения локалей; избегать избыточного объединения бандлов - ваша задача (аккуратно разделяйте каталоги).
|
|
110
|
+
- **Intlayer**: Выполняет **tree-shaking** на этапе сборки и **ленивую загрузку по словарю/локали**. Неиспользуемый контент не включается в сборку.
|
|
111
|
+
|
|
112
|
+
**Почему это важно:** Меньшие бандлы и более быстрая загрузка для многоязычных Vue-приложений.
|
|
113
|
+
|
|
114
|
+
---
|
|
115
|
+
|
|
116
|
+
### 6) Опыт разработчика и инструменты
|
|
117
|
+
|
|
118
|
+
- **vue-i18n**: Зрелая документация и сообщество; обычно вы будете полагаться на **внешние платформы локализации** для редакционных процессов.
|
|
119
|
+
- **Intlayer**: В комплекте **бесплатный визуальный редактор**, опциональная **CMS** (дружелюбная к Git или внешняя), расширение для **VSCode**, утилиты **CLI/CI** и **переводы с помощью ИИ** с использованием ваших собственных ключей провайдера.
|
|
120
|
+
|
|
121
|
+
**Почему это важно:** Меньше затрат на эксплуатацию и более короткий цикл разработка–контент.
|
|
122
|
+
|
|
123
|
+
---
|
|
124
|
+
|
|
125
|
+
### 7) SEO, SSR и SSG
|
|
126
|
+
|
|
127
|
+
- **Обе** работают с Vue SSR и Nuxt.
|
|
128
|
+
- **Intlayer**: Добавляет **SEO помощники** (карты сайта/метаданные/`hreflang`), которые не зависят от фреймворка и хорошо интегрируются с Vue/Nuxt сборками.
|
|
129
|
+
|
|
130
|
+
**Почему это важно:** Международное SEO без сложных настроек.
|
|
131
|
+
|
|
132
|
+
---
|
|
133
|
+
|
|
134
|
+
## Почему Intlayer? (Проблема и подход)
|
|
135
|
+
|
|
136
|
+
Большинство i18n стеков (включая **vue-i18n**) начинают с **централизованных каталогов**:
|
|
137
|
+
|
|
138
|
+
```bash
|
|
139
|
+
.
|
|
140
|
+
├── locales
|
|
141
|
+
│ ├── en.json
|
|
142
|
+
│ ├── es.json
|
|
143
|
+
│ └── fr.json
|
|
144
|
+
└── src
|
|
145
|
+
└── components
|
|
146
|
+
└── MyComponent.vue
|
|
147
|
+
```
|
|
148
|
+
|
|
149
|
+
Или с папками для каждого языка:
|
|
150
|
+
|
|
151
|
+
```bash
|
|
152
|
+
.
|
|
153
|
+
├── locales
|
|
154
|
+
│ ├── en
|
|
155
|
+
│ │ ├── footer.json
|
|
156
|
+
│ │ └── navbar.json
|
|
157
|
+
│ ├── fr
|
|
158
|
+
│ │ ├── footer.json
|
|
159
|
+
│ │ └── navbar.json
|
|
160
|
+
│ └── es
|
|
161
|
+
│ ├── footer.json
|
|
162
|
+
│ └── navbar.json
|
|
163
|
+
└── src
|
|
164
|
+
└── components
|
|
165
|
+
└── MyComponent.vue
|
|
166
|
+
```
|
|
167
|
+
|
|
168
|
+
Это часто замедляет разработку по мере роста приложений:
|
|
169
|
+
|
|
170
|
+
1. **Для нового компонента** вы создаёте/редактируете удалённые каталоги, настраиваете пространства имён и переводите (часто вручную копируя/вставляя из AI-инструментов).
|
|
171
|
+
2. **При изменении компонентов** вы ищете общие ключи, переводите, синхронизируете локали, удаляете неиспользуемые ключи и выравниваете структуры JSON.
|
|
172
|
+
|
|
173
|
+
**Intlayer** ограничивает область видимости контента **на уровне компонента** и хранит его **рядом с кодом**, как мы уже делаем с CSS, историями, тестами и документацией:
|
|
174
|
+
|
|
175
|
+
```bash
|
|
176
|
+
.
|
|
177
|
+
└── components
|
|
178
|
+
└── MyComponent
|
|
179
|
+
├── MyComponent.content.ts
|
|
180
|
+
└── MyComponent.vue
|
|
181
|
+
```
|
|
182
|
+
|
|
183
|
+
**Объявление контента** (на компонент):
|
|
184
|
+
|
|
185
|
+
```ts fileName="./components/MyComponent/MyComponent.content.ts"
|
|
186
|
+
import { t, type Dictionary } from "intlayer";
|
|
187
|
+
|
|
188
|
+
const componentExampleContent = {
|
|
189
|
+
key: "component-example",
|
|
190
|
+
content: {
|
|
191
|
+
greeting: t({
|
|
192
|
+
en: "Hello World",
|
|
193
|
+
es: "Hola Mundo",
|
|
194
|
+
fr: "Bonjour le monde",
|
|
195
|
+
}),
|
|
196
|
+
},
|
|
197
|
+
} satisfies Dictionary;
|
|
198
|
+
|
|
199
|
+
export default componentExampleContent;
|
|
200
|
+
```
|
|
201
|
+
|
|
202
|
+
**Использование во Vue** (Composition API):
|
|
203
|
+
|
|
204
|
+
```vue fileName="./components/MyComponent/MyComponent.vue"
|
|
205
|
+
<script setup lang="ts">
|
|
206
|
+
import { useIntlayer } from "vue-intlayer"; // Интеграция с Vue
|
|
207
|
+
const { greeting } = useIntlayer("component-example");
|
|
208
|
+
</script>
|
|
209
|
+
|
|
210
|
+
<template>
|
|
211
|
+
<span>{{ greeting }}</span>
|
|
212
|
+
</template>
|
|
213
|
+
```
|
|
214
|
+
|
|
215
|
+
Этот подход:
|
|
216
|
+
|
|
217
|
+
- **Ускоряет разработку** (объявляйте один раз; автозаполнение в IDE/ИИ).
|
|
218
|
+
- **Очищает кодовую базу** (1 компонент = 1 словарь).
|
|
219
|
+
- **Облегчает дублирование/миграцию** (копируйте компонент вместе с его содержимым).
|
|
220
|
+
- **Избегает "мертвых" ключей** (неиспользуемые компоненты не импортируют содержимое).
|
|
221
|
+
- **Оптимизирует загрузку** (лениво загружаемые компоненты приносят с собой своё содержимое).
|
|
222
|
+
|
|
223
|
+
---
|
|
224
|
+
|
|
225
|
+
## Дополнительные возможности Intlayer (актуально для Vue)
|
|
226
|
+
|
|
227
|
+
- **Поддержка нескольких фреймворков**: работает с Vue, Nuxt, Vite, React, Express и другими.
|
|
228
|
+
- **Управление содержимым на базе JavaScript**: объявляйте в коде с полной гибкостью.
|
|
229
|
+
- **Файл декларации для каждого локаля**: Задайте все локали и позвольте инструментам сгенерировать остальное.
|
|
230
|
+
- **Типобезопасная среда**: Сильная конфигурация TypeScript с автодополнением.
|
|
231
|
+
- **Упрощённый доступ к контенту**: Один хук/композабл для получения всего контента словаря.
|
|
232
|
+
- **Организованная кодовая база**: 1 компонент = 1 словарь в одной папке.
|
|
233
|
+
- **Расширенная маршрутизация**: Хелперы для локализованных путей и метаданных **Vue Router/Nuxt**.
|
|
234
|
+
- **Поддержка Markdown**: Импорт удалённого/локального Markdown по локалям; доступ к frontmatter из кода.
|
|
235
|
+
- **Бесплатный визуальный редактор и опциональная CMS**: Создание контента без платной платформы локализации; синхронизация, удобная для Git.
|
|
236
|
+
- **Контент с поддержкой tree-shaking**: Поставляется только используемый контент; поддержка ленивой загрузки.
|
|
237
|
+
- **Дружелюбность к статической генерации**: Не блокирует SSG.
|
|
238
|
+
- **Переводы с поддержкой ИИ**: Переводите на 231 язык, используя собственного провайдера ИИ/ключ API.
|
|
239
|
+
- **Сервер MCP и расширение VSCode**: Автоматизируйте рабочие процессы i18n и создание контента прямо в вашей IDE.
|
|
240
|
+
- **Взаимодействие**: Интеграция с **vue-i18n**, **react-i18next** и **react-intl** при необходимости.
|
|
241
|
+
|
|
242
|
+
---
|
|
243
|
+
|
|
244
|
+
## Когда что выбирать?
|
|
245
|
+
|
|
246
|
+
- **Выбирайте vue-i18n**, если хотите использовать **стандартный подход Vue**, вам удобно самостоятельно управлять каталогами/пространствами имён, и ваше приложение **маленькое или среднего размера** (или вы уже используете Nuxt i18n).
|
|
247
|
+
- **Выбирайте Intlayer**, если для вас важны **контент, ограниченный компонентом**, **строгий TypeScript**, **гарантии на этапе сборки**, **tree-shaking** и **встроенные инструменты маршрутизации/SEO/редактирования** - особенно для **больших, модульных кодовых баз Vue/Nuxt**.
|
|
248
|
+
|
|
249
|
+
---
|
|
250
|
+
|
|
251
|
+
## Практические заметки по миграции (vue-i18n → Intlayer)
|
|
252
|
+
|
|
253
|
+
- **Начинайте по функциям**: Переносите по одному маршруту/виду/компоненту за раз в локальные словари Intlayer.
|
|
254
|
+
- **Промежуточный мост во время миграции**: Сохраняйте каталоги vue-i18n параллельно; постепенно заменяйте обращения к переводам.
|
|
255
|
+
- **Включайте строгие проверки**: Позвольте обнаружению на этапе сборки выявлять отсутствующие ключи/локали на раннем этапе.
|
|
256
|
+
- **Используйте помощники для роутера/SEO**: Стандартизируйте определение локали и теги `hreflang`.
|
|
257
|
+
- **Измеряйте размеры бандлов**: Ожидайте **снижения размера бандла** за счёт исключения неиспользуемого контента.
|
|
258
|
+
|
|
259
|
+
---
|
|
260
|
+
|
|
261
|
+
## Заключение
|
|
262
|
+
|
|
263
|
+
И **vue-i18n**, и **Intlayer** хорошо локализуют Vue-приложения. Разница в том, **сколько вам нужно построить самостоятельно**, чтобы получить надёжную и масштабируемую систему:
|
|
264
|
+
|
|
265
|
+
- С **Intlayer** вы получаете **модульный контент**, **строгую типизацию TS**, **безопасность на этапе сборки**, **оптимизированные бандлы с tree-shaking**, а также **инструменты для роутера, SEO и редактора** прямо «из коробки».
|
|
266
|
+
- Если ваша команда ставит в приоритет **поддерживаемость и скорость** в многоязычном приложении на Vue/Nuxt с компонентной архитектурой, Intlayer предлагает сегодня **самый полный** опыт.
|
|
267
|
+
|
|
268
|
+
Обратитесь к документу ['Почему Intlayer?'](https://intlayer.org/doc/why) для получения дополнительной информации.
|