Ключи никогда не разбиваются — каждый хранится и ищется буквально. Выбирайте это, когда ваши ключи содержат точки или являются естественным текстом: версии, цены, имена файлов, библейские или юридические ссылки. App Version 6.3.8 остаётся именно таким.
Руководство · Вложенность ключей
Плоские или вложенные ключи
По умолчанию Sonenta разбивает ваши ключи по . во вложенное JSON-дерево в бандле CDN — классическая форма i18next. Это идеально для ключей, организованных как checkout.review.confirm, но молча портит ключи, текст которых содержит точку. Это руководство охватывает настройку проекта и соответствующую опцию SDK, чтобы ваши поиски всегда находили нужное.
Ловушка ключей с точками
Ключ — это просто строка. Когда эта строка содержит буквальную точку — версия вроде App Version 6.3.8, цена, имя файла, библейская ссылка вроде Jean 3.16 — разбиение по . превращает один ключ в случайный вложенный объект. Перевод всё ещё хранится, но t("App Version 6.3.8") его больше не находит.
bundle.json 1// your source key — a literal label with dots in it2{ "App Version 6.3.8": "App Version 6.3.8" } 4// nested bundle (default) — split on "." → broken tree5{ "App Version 6": { "3": { "8": "App Version 6.3.8" } } } 7// flat bundle — the key stays literal, lookups just work8{ "App Version 6.3.8": "App Version 6.3.8" } Настройка проекта
Две настройки на уровне проекта определяют форму бандла CDN. Значения по умолчанию воспроизводят текущее поведение i18next, поэтому существующие проекты не затрагиваются, пока вы явно не включите это.
| Настройка | Значения | По умолчанию |
|---|---|---|
| bundle_key_style | nested | flat | nested |
| bundle_key_separator | string | "." |
Задайте их на проекте — в настройках проекта вашего дашборда или через projects API. Выбранный стиль закрепляется в каждом релизе, и каждая опубликованная версия сообщает его обратно, так что любой клиент может настроиться сам.
versions/main 1# the version object reports the active key style2GET /v1/projects/<project_uuid>/versions/main 4{ "slug": "main", "key_style": "flat", "key_separator": "." } Выбор плоского или вложенного режима
Ключи разбиваются по разделителю во вложенное JSON-дерево — классическая раскладка i18next. Выбирайте это для намеренно неймспейсированных ключей вроде checkout.review.confirm. Это значение по умолчанию.
Согласуйте это в SDK
@sonenta/react-i18next (>= 0.11.0) принимает опцию keySeparator: false для буквальных / плоских поисков, строку для вложенного режима, по умолчанию ".". Есть также nsSeparator (по умолчанию ":"). SDK сначала буквальный — он пробует точное совпадение bundle[key] перед любым разбиением, поэтому ключи с точками находятся даже во вложенном режиме. При start() он также автоматически определяет key_style / key_separator из опубликованной версии (по возможности).
main.tsx 1// src/main.tsx — match the bundle in @sonenta/react-i18next >= 0.11.02import { SonentaProvider } from "@sonenta/react-i18next"; 4<SonentaProvider5 projectUuid="<project_uuid>"6 token={import.meta.env.VITE_SONENTA_TOKEN}7 keySeparator={false} // literal lookup — for dotted / natural-text keys8 nsSeparator=":" // default; set false to disable ns parsing too9>10 <App />11</SonentaProvider> 13// then t() treats the whole string as one key — no splitting14t("App Version 6.3.8"); // ✓ exact match Автоопределение читает метаданные версии и требует ключа с project:read. Если это чтение запрещено (403), SDK аккуратно откатывается на свои значения по умолчанию — поэтому при сомнениях задавайте keySeparator явно, чтобы он соответствовал вашему бандлу, а не полагайтесь на определение.
Рекомендация
- Ваши ключи содержат точки? Задайте
bundle_key_style: flatна проекте иkeySeparator={false}в SDK. Буквально с обеих сторон — никаких сюрпризов. - Аккуратно неймспейсированные ключи (
checkout.review.confirm)? Оставьте вложенный режим по умолчанию; менять нечего. - Мигрируете существующее приложение? Значения по умолчанию сохраняют ваше текущее поведение. Переключайтесь на плоский режим только когда встретите ключ с точками, затем перепубликуйте и обновите опцию SDK одновременно.