# Багатомовність

Інтерфейс і контент 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.
