Мультиязычность

Мультиязычность

Интерфейс и контент Celena переводятся через простой механизм локализации на основе JSON-файлов.

Определение языка

Класс Celena\Core\I18n\Locale определяет активный язык в таком порядке приоритета:

  1. Query-параметр ?lang=en (если язык в списке доступных);
  2. cookie celena_lang;
  3. заголовок Accept-Language браузера;
  4. язык по умолчанию (опция app.locale, например en).

Список доступных языков формируется автоматически по наличию файлов core/languages/*.json. Сейчас это ru, en, uk, pl, ro.

$active = $locale->detect($request);  // 'en' | 'ru' | 'uk' | …
$locale->remember($active);           // запомнить в cookie на год

Файлы переводов

Строки хранятся в JSON и загружаются автоматически из трёх мест:

core/languages/{lang}.json
modules/<Module>/languages/{lang}.json
plugins/<slug>/languages/{lang}.json

Формат — вложенный объект; ключи разворачиваются в «плоские» с точками:

{
  "landing": {
    "nav": { "services": "Услуги", "contact": "Контакты" }
  }
}

→ доступно как ключ landing.nav.services.

Использование

В шаблоне:

{lang key="landing.nav.services"}
{lang key="greeting" name="{user.name}"}   <!-- подстановка :name -->

В PHP:

$t = app(\Celena\Core\I18n\Translator::class);
echo $t->translate('landing.nav.services');
echo $t->translate('greeting', ['name' => 'Анна']);

Fallback

Если ключа нет в текущем языке — берётся из языка-fallback (en), а если и там нет — возвращается сам ключ. Так непереведённая строка не «ломает» страницу.

SEO для языков

Хук template.globals задаёт две переменные для каждой страницы:

  • {locale} — текущий язык для атрибута <html lang>;
  • {canonical_self} — самоссылающийся canonical: для языка по умолчанию это чистый URL, для остальных — ?lang=xx.

Альтернативные языковые версии указываются через <link rel="alternate" hreflang="…">. Шаблон может отключить стандартный блок hreflang, передав no_hreflang="1", и вывести собственный (так делает раздел документации, ограничивая список тремя языками).

Как добавить язык

  1. Создайте core/languages/<code>.json (например de.json) — язык появится в списке доступных автоматически.
  2. Добавьте такой же файл в модули/плагины, где нужны переводы.
  3. По желанию добавьте пункт в переключатель языка в шапке темы.

Перевод интерфейса из админки

Модуль Translations (раздел Переводы в панели) позволяет редактировать строки UI без правки JSON вручную.