Багатомовність
Багатомовність
Інтерфейс і контент 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.