Мультиязычность
Мультиязычность
Интерфейс и контент Celena переводятся через простой механизм локализации на основе JSON-файлов.
Определение языка
Класс Celena\Core\I18n\Locale определяет активный язык в таком порядке приоритета:
- Query-параметр
?lang=en(если язык в списке доступных); - cookie
celena_lang; - заголовок
Accept-Languageбраузера; - язык по умолчанию (опция
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", и вывести собственный (так делает раздел документации, ограничивая список тремя языками).
Как добавить язык
- Создайте
core/languages/<code>.json(напримерde.json) — язык появится в списке доступных автоматически. - Добавьте такой же файл в модули/плагины, где нужны переводы.
- По желанию добавьте пункт в переключатель языка в шапке темы.
Перевод интерфейса из админки
Модуль Translations (раздел Переводы в панели) позволяет редактировать строки UI без правки JSON вручную.