Задайте питання та отримайте підсумок документа, вказавши цю сторінку та обраного вами постачальника штучного інтелекту
Вміст цієї сторінки перекладено за допомогою штучного інтелекту.
Переглянути останню версію оригінального вмісту англійськоюЯкщо у вас є ідея щодо покращення цієї документації, будь ласка, долучіться, надіславши pull request на GitHub.
Посилання на документацію на GitHubСкопіювати документацію у форматі Markdown в буфер обміну
Що нового в Intlayer v7?
Ласкаво просимо до Intlayer v7! Це велике оновлення вводить суттєві покращення продуктивності, type safety і developer experience. Нижче наведено основні зміни, нотатки щодо міграції та практичні приклади.
Основні моменти
- Підтримка Next.js 16
- Стратегія кешування для прискорення збірок
- Покращене генерування типів TypeScript з типами, специфічними для локалі
- Оптимізація бандла: локалі як рядки замість enum
- Нові режими маршрутизації:
prefix-no-default,prefix-all,no-prefix,search-params - GDPR-сумісність при використанні localStorage
- Гнучка конфігурація збереження: cookies, localStorage, sessionStorage або кілька одночасно
- Розмір пакету Visual Editor зменшено на 30%
- Розширені параметри конфігурації middleware
- Оновлена поведінка команди fill для кращого управління контентом
- Нова секція конфігурації dictionary для кращої організації
- Підвищена стабільність завдяки повним оновленням файлів декларацій контенту
- Інтелектуальне керування повторними спробами для підвищення точності перекладу
- Паралелізація для швидшої обробки перекладів
- Розумне дроблення (smart chunking) для обробки великих файлів у межах лімітів контексту AI
- Автоматичне форматування коду з настроюваною командою formatCommand
Продуктивність: Кешування для швидших збірок
Замість перебудови декларацій контенту за допомогою esbuild при кожній збірці, у v7 реалізовано стратегію кешування, яка пришвидшує процес збірки.
Скопіюйте код у буфер обміну
npx intlayer buildНова система кешування:
- Зберігає скомпільовані декларації контенту, щоб уникнути повторної обробки
- Виявляє зміни та перебудовує лише змінені файли
- Значно скорочує час збірки для великих проєктів
TypeScript: Генерація типів для кожної локалі
Типи TypeScript тепер генеруються для кожної локалі, що забезпечує надійнішу типізацію та усуває union-типи між усіма локалями.
Поведінка 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 як рядки
Тип Locales більше не є enum, тому він тепер повністю піддається tree-shaking і не роздуватиме ваш бандл тисячами невикористаних записів локалі.
v6:
Скопіюйте код у буфер обміну
import { Locales } from "intlayer";// Enum, що включає всі локалі -> не піддається tree-shakingconst locale: Locales = Locales.ENGLISH;v7:
Скопіюйте код у буфер обміну
import { Locales, Locale } from "intlayer";// Тип рядка -> повністю tree-shakeableconst locale: Locale = Locales.ENGLISH;ОскількиLocalesбільше не є enum, вам доведеться змінити тип зLocalesнаLocale, щоб отримувати локаль як тип.
Див. деталі реалізації для додаткової інформації.
Нові режими маршрутизації для більшої гнучкості
v7 вводить уніфіковану конфігурацію routing.mode, яка замінює попередні опції prefixDefault та noPrefix, надаючи більш детальний контроль над структурою URL.
Доступні режими маршрутизації
prefix-no-default(за замовчуванням): локаль за замовчуванням без префікса, інші локалі, з префіксом/dashboard(en) або/fr/dashboard(fr)
prefix-all: У всіх локалей є префікс/en/dashboard(en) або/fr/dashboard(fr)
no-prefix: Жодних префіксів локалі в URL (локаль обробляється через storage/headers)/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, оскільки дозволяє уникнути необхідності отримання згоди на використання cookie для налаштувань локалі.
Опції конфігурації сховища
Нове поле 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
Для production-застосунків, яким потрібно знайти баланс між функціональністю та відповідністю GDPR:
Скопіюйте код у буфер обміну
export 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");Примітка: За замовчуванням файли cookie ввімкнені. Примітка: Перевірте вимоги до cookie відповідно до GDPR для вашого конкретного випадку використання.
Візуальний редактор: пакет на 30% менший
Пакет Візуального редактора оптимізовано, він став на 30% меншим порівняно з попередньою версією завдяки:
- Покращенням продуктивності редактора коду
- Видаленню непотрібних залежностей від базових пакетів Intlayer
- Кращому tree-shaking та бандлінгу модулів
Це призводить до швидшого завантаження та покращеної продуктивності під час виконання вашого додатка.
Автоматичне форматування коду: конфігурація formatCommand
У v7 введено опцію formatCommand у конфігурації редактора, яка дозволяє автоматично форматувати файли вмісту під час їхнього запису Intlayer. Це забезпечує послідовний стиль коду та форматування у ваших файлах декларацій вмісту.
Якщо не вказано, Intlayer спробує автоматично визначити команду форматування, пробуючи знайти одну з наступних команд: prettier, biome, eslint.
Конфігурація
Опція formatCommand приймає рядковий шаблон, у якому {{file}} буде замінено на фактичний шлях до файлу:
Скопіюйте код у буфер обміну
export default { content: { formatCommand: 'bun x biome format "{{file}}" --write --log-level none', },};Підтримувані форматувачі
Ви можете використовувати будь-який форматувач коду, який приймає шляхи до файлів як аргументи:
За допомогою Biome:
Скопіюйте код у буфер обміну
formatCommand: 'bun x biome format "{{file}}" --write --log-level none';За допомогою Prettier:
Скопіюйте код у буфер обміну
formatCommand: 'npx prettier --write "{{file}}" --log-level silent';За допомогою ESLint:
Скопіюйте код у буфер обміну
formatCommand: 'npx eslint --fix "{{file}}" --quiet';За допомогою вбудованого форматувача Bun:
Скопіюйте код у буфер обміну
formatCommand: 'bun format "{{file}}"';Переваги
- Послідовне форматування: Всі файли контенту автоматично форматуються відповідно до правил стилю вашого проєкту
- Developer experience: немає потреби вручну форматувати файли після того, як Intlayer їх записує
- Team consistency: забезпечує, що всі члени команди мають однакове форматування файлів контенту
- CI/CD integration: файли контенту зберігають узгоджене форматування в автоматизованих воркфлоу
Як це працює
Коли Intlayer записує або оновлює файл декларації контенту (.content.ts, .content.js тощо), він автоматично запускає вказану команду форматування для цього файлу. Плейсхолдер {{file}} замінюється на фактичний шлях до файлу, а команда виконується в кореневому каталозі проєкту.
Конфігурація словника: краща організація та структура
v7 додає новий спеціальний розділ конфігурації dictionary, який забезпечує кращу організацію налаштувань, пов'язаних зі словниками, та покращене керування контентом.
Нова структура конфігурації dictionary
Властивість fill була переміщена з розділу content до нового розділу dictionary, що забезпечує чіткіше розмежування відповідальностей:
Конфігурація v6:
Скопіюйте код у буфер обміну
export default { content: { autoFill: "./{{fileName}}.content.json", contentDir: ["src"], },};Конфігурація v7:
Скопіюйте код у буфер обміну
export default { content: { contentDir: ["src"], }, dictionary: { fill: "./{{fileName}}.content.json", },};Переваги нової структури
- Чіткіша організація: налаштування, специфічні для
dictionary, тепер згруповані разом - Кращий розподіл відповідальностей: виявлення
contentта операціїdictionaryчітко розділені - Покращена підтримуваність: легше розуміти та змінювати конфігурації, пов'язані з
dictionary - Майбутнє розширення: секція
dictionaryможе вміщувати додаткові налаштування, специфічні для словників - Комплексне керування dictionary: включає властивості, такі як
title,live,priority,tags,versionтаdescriptionдля створення та керування новими словниками
Використання конфігурації
Конфігурація dictionary виконує дві основні функції:
- Значення за замовчуванням: визначає значення за замовчуванням при створенні файлів декларації
content - Поведінка запасних значень (Fallback Behavior): Надає запасні значення (fallback), коли конкретні поля не визначені, що дозволяє задавати поведінку операцій словника глобально
Розділ словника включає вичерпні властивості для керування словниками:
fill: Поведінка автозаповнення при генерації контентуtitle: Заголовок за замовчуванням для нових словниківlive: Налаштування live-синхронізації для оновлень у реальному часіpriority: Налаштування пріоритетів для визначення словникаtags: Теги за замовчуванням для організації контентуversion: Керування версіями для оновлень словникаdescription: Опис за замовчуванням для нового контенту
Для отримання додаткової інформації про файли декларації контенту та про те, як застосовуються конфігураційні значення, див. Документацію файлу контенту.
Команда fill: оновлена поведінка для кращого управління контентом
v7 вводить покращену поведінку для команди fill, забезпечуючи більш передбачуване та гнучке управління контентом:
Нова поведінка fill
fill: true- Перезаписує поточний файл заповненим контентом для всіх локалейfill: "path/to/file"- Заповнює вказаний файл без зміни поточного файлуfill: false- Повністю відключає автоматичне заповнення
Розширена підтримка складних структур контенту
Команда fill тепер підтримує складні структури декларацій контенту, включно з:
- Складені об'єкти: Оголошення контенту, які посилаються на інші об'єкти
- Деструктуризований контент: Контент, що використовує патерни деструктуризації
- Вкладені посилання: Об'єкти, які посилаються один на одного у складних ієрархіях
- Динамічні структури контенту: Контент з умовними або обчислюваними властивостями
Переваги
- Чіткіший намір: Поведінка тепер більш явна щодо того, що змінюється
- Краще розділення: Файли контенту можна зберігати окремо від заповнених перекладів
- Покращений робочий процес: Розробники отримують більший контроль над тим, де зберігаються переклади
- Підтримка складних структур: Обробка складних архітектур контенту з кількома взаємопов'язаними об'єктами
Приклад використання
Скопіюйте код у буфер обміну
// Перезаписати поточний файл для всіх локалейconst content = { key: "example", fill: true, // Перезаписує цей файл content: { title: "Привіт, світ", },};// Заповнити окремий файл без модифікації поточного файлуconst content = { key: "example", fill: "./translations.json", // Створює/оновлює translations.json content: { title: "Привіт, світ", },};// Вимкнути автозаповненняconst content = { key: "example", fill: false, // Автозаповнення вимкнено content: { title: "Привіт, світ", },};// Складна структура контенту з композиційними об'єктами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} цілком, замість часткових оновлень, забезпечуючи:
- Цілісність даних: повні перезаписи файлів запобігають частковим оновленням, які можуть пошкодити вміст
- Послідовність: усі локалі оновлюються атомарно, зберігаючи синхронізацію
- Надійність: зменшує ризик неповних або пошкоджених файлів вмісту
Інтелектуальне керування повторними спробами
Нові механізми повторних спроб запобігають відправленню контенту у невірних форматах і не дають зламатися всьому процесу заповнення, якщо один запит зазнає невдачі.
Паралелізація для швидшої обробки
Операції перекладу тепер ставляться в чергу і виконуються паралельно. Це значно пришвидшує процес.
Інтелектуальне розбиття на частини для великих файлів
Розвинені стратегії розбиття справляються з великими файлами контенту, не перевищуючи контекстні вікна AI:
Приклад робочого процесу
Скопіюйте код у буфер обміну
// Великий файл контенту автоматично розбивається на частиниconst content = { key: "large-documentation", fill: true, content: { // Великий контент автоматично розбивається для обробки AI introduction: "..." // 5000+ символів sections: [ // Кілька великих секцій ] }};Система автоматично:
- Аналізує розмір і структуру контенту
- Розбиває контент на частини відповідним чином
- Обробляє частини паралельно
- Перевіряє й повторює у разі потреби
- Відновлює повний файл
Нотатки щодо міграції з v6
Вилучені конфігурації
middleware.cookieName: Замінено наrouting.storagemiddleware.serverSetCookie: Замінено наrouting.storagemiddleware.prefixDefault: Замінено наrouting.modemiddleware.noPrefix: Замінено наrouting.mode
Нові конфігурації
editor.formatCommand: Нова опція для автоматичного форматування коду файлів контенту
Відповідність налаштувань при міграції
Відповідність конфігурацій
Відкрийте таблицю в модальному вікні, щоб чітко переглянути всі дані
| Конфігурація v6 | Конфігурація v7 |
|---|---|
content.autoFill: xxx | dictionary.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 { content: { autoFill: "./{{fileName}}.content.json", contentDir: ["src"], }, middleware: { headerName: "x-intlayer-locale", cookieName: "intlayer-locale", prefixDefault: false, basePath: "", serverSetCookie: "always", noPrefix: false, },};Після (v7):
Скопіюйте код у буфер обміну
export default { content: { contentDir: ["src"], }, dictionary: { fill: "./{{fileName}}.content.json", }, routing: { mode: "prefix-no-default", storage: "localStorage", // або 'cookie', якщо вам потрібне збереження в cookie headerName: "x-intlayer-locale", basePath: "", }, editor: { formatCommand: 'bun x biome format "{{file}}" --write --log-level none', // Необов'язково: автоматичне форматування },};Відповідність вмісту словника
Відкрийте таблицю в модальному вікні, щоб чітко переглянути всі дані
| Вміст словника (v6) | Вміст словника (v7) |
|---|---|
autoFill: xxx | fill: xxx |
Приклад міграції
До (v6):
Скопіюйте код у буфер обміну
const content = { key: "example", autoFill: true, // Перезаписує цей файл content: { title: "Hello World", },};Після (v7):
Скопіюйте код у буфер обміну
const content = { key: "example", fill: true, // Перезаписує цей файл content: { title: "Hello World", },};Нотатки міграції з v5 до v6
Перегляньте нотатки міграції з v5 до v6 для отримання додаткової інформації.