# Локализация

## Из коробки

Плагин полностью переведён на:

- **ru** — русский
- **en** — English
- **uk** — українська

Все админ-страницы, sidebar, статусы заказа/оплаты, флэш-сообщения, формы, hint-карточки, JS-генерируемые лейблы (drag-кнопки галереи, заголовки матрицы вариаций) — на текущем языке.

## Переключение

В топбаре админки — селектор языка. Активный язык запоминается в cookie `celena_lang`.
Можно также передать в URL: `?lang=en`, `?lang=uk`, `?lang=ru`.

## Файлы локалей

```
plugins/shop/languages/
├── ru.json    — ~280 ключей
├── en.json    — ~280 ключей
└── uk.json    — ~280 ключей
```

Группы ключей в каждом файле:

| Префикс | Что |
|---|---|
| `shop.title`, `shop.cart`, `shop.checkout` | Базовые фронтовые лейблы |
| `shop.menu.*` | 13 пунктов сайдбара админки |
| `shop.status.*` | Статусы заказа |
| `shop.payment.*` | Статусы оплаты |
| `shop.source.*` | Источник заказа |
| `shop.common.*` | Save, Cancel, Delete, All, Search… |
| `shop.products_list.*` / `shop.product.*` | Товары |
| `shop.manufacturers_list.*` / `shop.manufacturer.*` | Производители |
| `shop.attributes_list.*` / `shop.attribute.*` | Атрибуты |
| `shop.promocodes_list.*` / `shop.promocode.*` | Промокоды |
| `shop.shipping_list.*` / `shop.shipping_method.*` | Доставка |
| `shop.payments_list.*` / `shop.payment_method.*` | Оплата |
| `shop.reviews_list.*` | Отзывы |
| `shop.orders_list.*` / `shop.order.*` / `shop.order_create.*` | Заказы |
| `shop.customers_list.*` / `shop.customer.*` | Клиенты |
| `shop.csv.*` | Импорт CSV |
| `shop.export.*` | Экспорт XLSX/CSV |
| `shop.analytics.*` | Аналитика |
| `shop.settings.*` | Настройки |
| `shop.dashboard_widget.*` | Виджет дашборда |
| `shop.flash.*` | ~35 системных сообщений |

## Добавить свой язык

1. Скопируй `plugins/shop/languages/ru.json` в `plugins/shop/languages/<code>.json`, например `de.json`, `fr.json`, `kk.json`.
2. Переведи значения. Структура и ключи менять нельзя.
3. Аналогично — добавь файл в `core/languages/<code>.json` (для общих ядерных лейблов).
4. Перезагрузи админку. В селекторе языка появится новый код.

Доступные локали определяются автоматически из `core/languages/*.json`.

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

```tpl
<h1>{lang key="shop.products_list.title"}</h1>
<button>{lang key="shop.common.save"}</button>
<input placeholder="{lang key="shop.products_list.search_placeholder"}">
```

Подстановки параметров:

```json
"order_created_manual": "Заказ создан: :number"
```
```php
$tr->translate('shop.flash.order_created_manual', ['number' => 'ORD-1234']);
// → "Заказ создан: ORD-1234"
```

## i18n внутри `<script>`

Inline-теги `{lang ...}` работают и внутри `<script>` блоков (специальная обработка в Compiler). CSS-селекторы `[data-x]` и `[data-y]` не интерпретируются как блочные теги — это безопасно.

```html
<script>
var btnText = '{lang key="shop.product.image_make_main_title"}';
var sel = document.querySelector('[data-action]');  // OK, не парсится
</script>
```

## Архитектура

Канонические значения статусов в БД — на латинице (`new`, `paid`, `pending`, `cancelled` и т.д.). Это правильно с точки зрения архитектуры: машинные коды стабильны, переводы — только для отображения. Через `OrdersAdminController::statusLabel($code)` и `paymentLabel($code)` коды резолвятся в подписи на текущем языке.
