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

Интерфейс и контент 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`.

```php
$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
```

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

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

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

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

В шаблоне:

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

В PHP:

```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 вручную.
