Спросите свой вопрос и получите сводку документа, используя эту страницу и выбранного вами поставщика AI
Содержимое этой страницы было переведено с помощью ИИ.
Смотреть последнюю версию оригинального контента на английскомЕсли у вас есть идея по улучшению этой документации, не стесняйтесь внести свой вклад, подав запрос на вытягивание на GitHub.
Ссылка на документацию GitHubКопировать Markdown документа в буфер обмена
Новый Intlayer v7 - Что нового?
Добро пожаловать в Intlayer v7! Этот крупный релиз представляет значительные улучшения в производительности, безопасности типов и опыте разработчика. Ниже приведены основные моменты, а также заметки по миграции и практические примеры.
Основные моменты
- Стратегия кэширования для ускорения сборок
- Улучшенная генерация типов TypeScript с типами, специфичными для локали
- Оптимизация бандла: локали как строки вместо enum
- Новые режимы маршрутизации:
prefix-no-default,prefix-all,no-prefix,search-params - Хранение локали в соответствии с GDPR с использованием localStorage по умолчанию
- Гибкая конфигурация хранения: cookies, localStorage, sessionStorage или несколько одновременно
- Размер пакета Visual Editor уменьшен на 30%
- Расширенные опции конфигурации middleware
- Обновленное поведение команды fill для лучшего управления контентом
- Повышенная стабильность с полным обновлением файлов деклараций контента
- Интеллектуальное управление повторными попытками для точности перевода
- Параллелизация для ускорения обработки переводов
- Умное разбиение на чанки для работы с большими файлами в пределах ограничений AI контекста
Производительность: Кэширование для ускорения сборок
Вместо повторной сборки деклараций контента с помощью esbuild при каждой сборке, в версии 7 реализована стратегия кэширования, которая ускоряет процесс сборки.
Копировать код в буфер обмена
npx intlayer buildНовая система кэширования:
- Сохраняет скомпилированные декларации контента, чтобы избежать повторной обработки
- Обнаруживает изменения и перестраивает только изменённые файлы
- Значительно сокращает время сборки для крупных проектов
TypeScript: Генерация типов, специфичных для локали
Типы TypeScript теперь генерируются для каждой локали отдельно, обеспечивая более строгую типизацию и устраняя объединённые типы для всех локалей.
Поведение в v6:
Копировать код в буфер обмена
const content = getIntlayer("my-title-content", "en");// typeof content = { title: "My title" } | { title: "Mon titre" } | { title: "Mi título" }Поведение в v7:
Копировать код в буфер обмена
const content = getIntlayer("my-title-content", "en");// typeof content = { title: "My title" }Преимущества:
- Более точное автозаполнение в вашей IDE
- Лучшая типобезопасность без смешения типов между локалями
- Повышенная производительность за счёт уменьшения сложности типов
Оптимизация бандла: Локали как строки
Тип Locales больше не является перечислением (enum), что означает, что он теперь полностью поддаётся tree-shaking и не будет раздувать ваш бандл тысячами неиспользуемых записей локалей.
v6:
Копировать код в буфер обмена
import { Locales } from "intlayer";// Перечисление, включающее все локали -> не поддаётся tree-shakingconst locale: Locales = Locales.ENGLISH;v7:
Копировать код в буфер обмена
import { Locales, Locale } from "intlayer";// Тип строки -> полностью поддаётся tree-shakingconst locale: Locale = Locales.ENGLISH;ПосколькуLocalesбольше не является перечислением (enum), вам нужно будет изменить тип сLocalesнаLocale, чтобы получить локаль в виде типа.
Подробнее смотрите в реализации.
Новые режимы маршрутизации для большей гибкости
В версии 7 введена единая конфигурация routing.mode, которая заменяет предыдущие опции prefixDefault и noPrefix, предоставляя более детальный контроль над структурой URL.
Доступные режимы маршрутизации
prefix-no-default(по умолчанию): у локали по умолчанию нет префикса, у остальных локалей префикс есть/dashboard(en) или/fr/dashboard(fr)
prefix-all: у всех локалей есть префикс/en/dashboard(en) или/fr/dashboard(fr)
no-prefix: Нет префиксов локали в URL (локаль обрабатывается через хранилище/заголовки)/dashboardдля всех локалей
search-params: Локаль передается как параметр запроса/dashboard?locale=enили/dashboard?locale=fr
Базовая конфигурация
Копировать код в буфер обмена
// intlayer.config.tsexport default { internationalization: { locales: ["en", "fr", "es"], defaultLocale: "en", }, routing: { mode: "prefix-no-default", // по умолчанию },};Соответствие GDPR: хранение в localStorage / cookies
v7 уделяет приоритетное внимание конфиденциальности пользователей, используя localStorage в качестве механизма хранения по умолчанию вместо cookies. Это изменение помогает соблюдать требования GDPR, избегая необходимости получать согласие на использование cookies для предпочтений локали.
Опции конфигурации хранения
Новое поле routing.storage также доступно в дополнение к предыдущим опциям middleware.cookieName и middleware.serverSetCookie, предлагая гибкие конфигурации хранения:
Копировать код в буфер обмена
// Отключить хранениеstorage: false// Простые типы храненияstorage: 'cookie'storage: 'localStorage'storage: 'sessionStorage'// Cookie с пользовательскими атрибутамиstorage: { type: 'cookie', name: 'custom-locale', domain: '.example.com', secure: true, sameSite: 'strict'}// localStorage с пользовательским ключомstorage: { type: 'localStorage', name: 'custom-locale'}// Несколько типов хранения для резервированияstorage: ['cookie', 'localStorage']Пример конфигурации, соответствующей GDPR
Для производственных приложений, которым нужно сбалансировать функциональность и соответствие GDPR:
Копировать код в буфер обмена
// intlayer.config.tsexport default { internationalization: { locales: ["en", "fr", "es"], defaultLocale: "en", }, routing: { mode: "prefix-no-default", storage: [ { type: "localStorage", // Основное хранилище (не требует согласия) name: "user-locale", }, { type: "cookie", // Дополнительное хранение в cookie (требуется согласие) name: "user-locale", secure: true, sameSite: "strict", httpOnly: false, }, ], },};Включение / отключение хранения cookie
Пример с использованием React / Next.js:
Можно определить глобально:
Копировать код в буфер обмена
<IntlayerProvider isCookieEnabled={false}> <App /></IntlayerProvider>Можно переопределить локально для каждого хука:
Копировать код в буфер обмена
const { setLocale } = useLocale({ isCookieEnabled: false });setLocale("en");Примечание: По умолчанию куки включены. Примечание: Ознакомьтесь с требованиями GDPR к куки для вашего конкретного случая.
Визуальный редактор: пакет стал на 30% меньше
Пакет Визуального редактора был оптимизирован и стал на 30% меньше по сравнению с предыдущей версией благодаря:
- Улучшению производительности редактора кода
- Удалению ненужных зависимостей от основных пакетов Intlayer
- Лучшей tree-shaking и упаковке модулей
Это приводит к более быстрой загрузке и улучшенной производительности приложения во время выполнения.
Команда fill: обновленное поведение для лучшего управления контентом
v7 вводит улучшенное поведение команды fill, обеспечивая более предсказуемое и гибкое управление контентом:
Новое поведение fill
fill: true. Перезаписывает текущий файл заполненным контентом для всех локалейfill: "path/to/file". Заполняет указанный файл без изменения текущего файлаfill: false. Полностью отключает авто-заполнение
Расширенная поддержка сложных структур контента
Команда fill теперь поддерживает сложные структуры деклараций контента, включая:
- Составные объекты: декларации контента, которые ссылаются на другие объекты
- Деструктурированный контент: контент, использующий паттерны деструктуризации
- Вложенные ссылки: объекты, которые вызывают друг друга в сложных иерархиях
- Динамические структуры контента: контент с условными или вычисляемыми свойствами
Преимущества
- Более ясное намерение: поведение теперь более явно указывает, что именно изменяется
- Лучшее разделение: Файлы с контентом могут храниться отдельно от заполненных переводов
- Улучшенный рабочий процесс: Разработчики получают больше контроля над тем, где хранятся переводы
- Поддержка сложных структур: Обработка сложных архитектур контента с множеством взаимосвязанных объектов
Пример использования
Копировать код в буфер обмена
// Перезаписать текущий файл со всеми локалямиconst content = { key: "example", fill: true, // Перезаписывает этот файл content: { title: "Hello World", },};// Заполнить отдельный файл без изменения текущего файлаconst content = { key: "example", fill: "./translations.json", // Создаёт/обновляет translations.json content: { title: "Hello World", },};// Отключить авто-заполнениеconst content = { key: "example", fill: false, // Авто-заполнение отключено content: { title: "Hello World", },};// Сложная структура контента с составными объектамиconst sharedContent = { buttons: { save: "Сохранить", // Кнопка сохранить cancel: "Отмена", // Кнопка отмены },};const content = { key: "complex-example", fill: true, content: { // Ссылки на другие объекты sharedContent, // Деструктурированный контент ...sharedContent, // Вложенные ссылки sections: [ { ...sharedContent.buttons, header: "Раздел 1", }, ], },};Повышенная стабильность и управление переводами
v7 вводит несколько улучшений, чтобы сделать перевод контента более надежным и эффективным:
Полные обновления файлов декларации контента
Система теперь обновляет файлы .content.{ts,js,cjs,mjs}, а не частично, обеспечивая:
- Целостность данных: Полная перезапись файла предотвращает частичные обновления, которые могут повредить содержимое
- Согласованность: Все локали обновляются атомарно, поддерживая синхронизацию
- Надежность: Снижает риск неполных или поврежденных файлов содержимого
Интеллектуальное управление повторными попытками
Новые механизмы повторных попыток предотвращают отправку содержимого в неправильных форматах и избегают срыва всего процесса заполнения, если один из запросов не удался.
Параллелизация для ускорения обработки
Операции перевода теперь выполняются в очереди с параллельным запуском, что значительно ускоряет процесс.
Умное разбиение на части для больших файлов
Продвинутые стратегии разбиения обрабатывают большие файлы содержимого, не превышая контекстные окна ИИ:
Пример рабочего процесса
Копировать код в буфер обмена
// Большой файл содержимого автоматически разбивается на частиconst content = { key: "large-documentation", fill: true, content: { // Большое содержимое автоматически разбивается на части для обработки ИИ introduction: "..." // более 5000 символов sections: [ // Несколько больших разделов ] }};Система автоматически:
- Анализирует размер и структуру содержимого
- Соответствующим образом разбивает содержимое на части
- Обрабатывает части параллельно
- Проверяет и при необходимости повторяет попытки
- Восстанавливает полный файл
Заметки по миграции с версии v6
Удалённые конфигурации
middleware.cookieName: заменён наrouting.storagemiddleware.serverSetCookie: заменён наrouting.storagemiddleware.prefixDefault: заменён наrouting.modemiddleware.noPrefix: заменён наrouting.mode
Сопоставление миграции
Сопоставление конфигураций
Открыть таблицу в модальном окне для четкого просмотра всех данных
| Конфигурация v6 | Конфигурация v7 |
|---|---|
autoFill: xxx | fill: xxx |
prefixDefault: false | mode: 'prefix-no-default' |
prefixDefault: true | mode: 'prefix-all' |
noPrefix: true | mode: 'no-prefix' |
cookieName: 'my-locale' | storage: { type: 'cookie', name: 'my-locale' } |
serverSetCookie: 'never' | storage: false или удалите cookie из массива storage` |
Пример миграции
До (v6):
Копировать код в буфер обмена
export default { middleware: { headerName: "x-intlayer-locale", cookieName: "intlayer-locale", prefixDefault: false, basePath: "", serverSetCookie: "always", noPrefix: false, },};После (v7):
Копировать код в буфер обмена
export default { routing: { mode: "prefix-no-default", storage: "localStorage", // или 'cookie', если требуется хранение в cookie headerName: "x-intlayer-locale", basePath: "", },};Соответствие содержимого словаря
Открыть таблицу в модальном окне для четкого просмотра всех данных
| Содержимое словаря v6 | Содержимое словаря v7 |
|---|---|
autoFill: xxx | fill: xxx |
Пример миграции
До (v6):
Копировать код в буфер обмена
const content = { key: "example", autoFill: true, // Перезаписывает этот файл content: { title: "Привет, мир", },};После (v7):
Копировать код в буфер обмена
const content = { key: "example", fill: true, // Перезаписывает этот файл content: { title: "Привет, мир", },};Заметки по миграции с v5 на v6
Подробнее смотрите в заметках по миграции с v5 на v6.