Цель
Сделать так, чтобы названия категорий (например, "Новости", "Блог") в ссылках на сайте автоматически переводились в зависимости от текущего языка, используя файлы локализации темы.
Концептуальный трек
Например, есть некая тема сайта cleancot.
Модуль page активен.
Сайт поддерживает несколько языков (например, ru и en).
Категории уже созданы в админке (Структура → Категории).
Шаг 1: Подготовка структуры категорий
Создадим категории в админке:
Зайди в Администрирование → Структура → Категории.
Добавим категории для модуля page, например:
Код: news, Название: "Новости".
Код: blog, Название: "Блог".
Поле "Название" (title) будет основой для локализации по умолчанию.
Запомним коды категорий:
Код (c=) используется в URL (например, page?c=news).
Шаг 2: Определение ключей локализации
Для каждой категории создадим уникальный ключ в файлах локализации, привязанный к её коду.
Префикс для ключей выберем, например, pagecat_ (чтобы не путать с другими строками).
Пример ключей:
pagecat_news — для категории news.
pagecat_blog — для категории blog.
Шаг 3: Редактирование файлов локализации темы
Добавим переводы в файлы локализации темы.
themes/cleancot/lang/cleancot.ru.lang.php
<?php
// Локализация названий категорий модуля "Pages"
$L['pagecat_news'] = 'Новости';
$L['pagecat_blog'] = 'Блог';
themes/cleancot/lang/cleancot.en.lang.php
<?php
// Localization of "Pages" module category titles
$L['pagecat_news'] = 'News';
$L['pagecat_blog'] = 'Blog';
Где:
$L['pagecat_<код категории>'] — формат ключа, где <код категории> — это news, blog и т.д.
Русский и английский варианты соответствуют языку файла.
Шаг 4: Использование в шаблонах
Теперь в произвольных ссылках можно использовать эти ключи через {PHP.L.pagecat_<код>}.
Пример в меню (header.tpl)
<ul class="nav">
<!-- Ссылка на категорию 'news' -->
<li class="nav-item">
<a class="nav-link" href="{PHP|cot_url('page', 'c=news')}" title="{PHP.L.pagecat_news}">
<i class="fa-solid fa-newspaper me-1"></i> {PHP.L.pagecat_news}
</a>
</li>
<!-- Ссылка на категорию 'blog' -->
<li class="nav-item">
<a class="nav-link" href="{PHP|cot_url('page', 'c=blog')}" title="{PHP.L.pagecat_blog}">
<i class="fa-solid fa-blog me-1"></i> {PHP.L.pagecat_blog}
</a>
</li>
</ul>
{PHP|cot_url('page', 'c=news')} — генерирует URL (/page?c=news).
{PHP.L.pagecat_news} — выводит "Новости" на русском или "News" на английском, в зависимости от текущего языка ({PHP.lang}).
Динамическая ссылка для текущей категории
Если категория берётся из контекста (например, {PAGE_CAT}):
<a href="{PHP|cot_url('page', 'c={PAGE_CAT}')}" title="{PHP.L.pagecat_{PAGE_CAT}}">{PHP.L.pagecat_{PAGE_CAT}}</a>
{PAGE_CAT} — код текущей категории (например, news).
{PHP.L.pagecat_{PAGE_CAT}} — подставляет pagecat_news, если {PAGE_CAT} = news.
Шаг 5: Настройка многоязычности
Проверить текущий язык:
{PHP.lang} — текущий язык сайта (например, ru или en), задаётся в config.php или через переключатель языка.
Cotonti автоматически подтянет нужный файл локализации (cleancot.ru.lang.php или cleancot.en.lang.php).
Убедитесь, что локализация работает:
Должен быть включён механизм локализации.
Если переключить язык на en, {PHP.L.pagecat_news} выведет "News".
Шаг 6: Тестирование
Вставить код в header.tpl или другой шаблон.
Переключить язык сайта:
Русский: "Новости", "Блог".
Английский: "News", "Blog".
Проверить ссылки: они должны вести на /page?c=news и /page?c=blog.
Альтернативные решения
1. Использование встроенной i18n-структуры Cotonti
Вместо файлов локализации темы можно переводить названия категорий через админку:
Администрирование → Структура → Категории → [Выбрать категорию] → Переводы.
Добавить перевод (например, "News" для news на английском).
В шаблоне:
<!-- IF {PHP.cfg.defaultlang} === {PHP.lang} -->
{PHP.structure.page.news.title}
<!-- ELSE -->
{PHP.i18n_structure.news.en.title}
<!-- ENDIF -->
Плюсы: Не требует ручного редактирования файлов.
Минусы: Нужно заполнять переводы для каждой категории в админке; могут быть сложности для динамических ссылок, но смотря в какой локации.
2. Динамическая локализация через PHP
Создать плагин или хук в page.php:
function localize_category_title($cat_code) {
global $L;
$key = 'pagecat_' . $cat_code;
return isset($L[$key]) ? $L[$key] : $cat_code;
}
В шаблоне:
<a href="{PHP|cot_url('page', 'c=news')}">{PHP|localize_category_title('news')}</a>
Плюсы: Гибкость, можно добавить логику (например, fallback на {PHP.structure.page.news.title}).
Минусы: Нужно писать код, сложнее для новичков.
3. Использование глобальных строк локализации
Вместо уникальных ключей для категорий используй общие строки:
// cleancot.ru.lang.php
$L['News'] = 'Новости';
$L['Blog'] = 'Блог';
В шаблоне:
<a href="{PHP|cot_url('page', 'c=news')}">{PHP.L.News}</a>
Плюсы: Просто и быстро.
Минусы: Не связано с реальной структурой категорий, конфликты с другими модулями.
4. JSON-файлы локализации
Храним переводы в JSON (например, themes/cleancot/lang/page_categories.json):
{
"news": {"ru": "Новости", "en": "News"},
"blog": {"ru": "Блог", "en": "Blog"}
}
Парсим через плагин и выводим в шаблон.(его нужно создать)
Плюсы: Удобно для больших проектов.
Минусы: Требует дополнительного кода.
Что выбрать?
Файлы локализации темы (основной способ) — лучший баланс простоты и гибкости.
i18n-структура — если уже используешь многоязычность через админку.
PHP-решение — для автоматизации и сложной логики.
Если вы хотите знать больше, - дополнительно иллюстрация логики как альтернатива, но так делать не желательно:
<!-- Проверяем, существует ли путь к категории 'news' в структуре страниц -->
<!-- IF {PHP.structure.page.news.path} -->
<!-- Создаём пункт меню в навигации -->
<li class="nav-item">
<!-- Ссылка на категорию 'news' с динамическим URL и атрибутом title -->
<a class="nav-link" href="{PHP|cot_url('page','c=news')}" title="{PHP.structure.page.news.title}">
<!-- Иконка газеты из FontAwesome с небольшим отступом справа -->
<i class="fa-solid fa-newspaper me-1"></i>
<!-- Проверяем, совпадает ли язык по умолчанию с текущим языком сайта -->
<!-- IF {PHP.cfg.defaultlang} === {PHP.lang} -->
<!-- Если да, выводим заголовок категории 'news' на языке по умолчанию -->
{PHP.structure.page.news.title}
<!-- Иначе, если текущий язык отличается от языка по умолчанию -->
<!-- ELSE -->
<!-- Проверяем, есть ли перевод заголовка категории 'news' на английский -->
<!-- IF {PHP.i18n_structure.news.en.title} -->
<!-- Если перевод есть, выводим английский заголовок -->
{PHP.i18n_structure.news.en.title}
<!-- Если перевода на английский нет -->
<!-- ELSE -->
<!-- Выводим стандартную локализованную строку 'News' -->
{PHP.L.News}
<!-- Конец проверки наличия английского перевода -->
<!-- ENDIF -->
<!-- Конец проверки языка -->
<!-- ENDIF -->
</a>
</li>
<!-- Конец условия существования пути категории 'news' -->
<!-- ENDIF -->