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

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

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