Мультиязычные экстраполя пользователей в Cotonti
Плагин xtradbrowusers позволяет добавлять произвольные поля к профилям пользователей Cotonti и, обеспечивает встроенную мультиязычность, без вмешательства в ядро системы и не требует установки дополнительных модулей интернационализации.
Мультиязычные дополнительные поля в Cotonti: обзор функционала плагина xtradbrowusers
Плагин xtradbrowusers позволяет добавлять произвольные поля к профилям пользователей Cotonti и, начиная с версии 1.0.1, предлагает встроенную мультиязычность. Она реализована без вмешательства в ядро системы и не требует установки дополнительных модулей интернационализации. Это значит, что для любого текстового дополнительного поля можно задать переводы на нескольких языках, которые будут автоматически показываться посетителям в зависимости от выбранного ими языка интерфейса.
Полное описание базового функционала (установка, создание полей, общие принципы вывода) вынесено в основной README. Здесь мы сосредоточимся исключительно на мультиязычных возможностях.
Как устроено хранение переводов
Мультиязычность базируется на двух таблицах. Основная таблица плагина хранит оригинальные значения всех дополнительных полей — точно так же, как и при выключенной мультиязычности. Для переводов создана отдельная связанная таблица, где каждая строка однозначно идентифицируется по ID пользователя, имени поля и двухбуквенному коду языка. Такой подход гарантирует, что:
- оригинальные данные никогда не теряются и не затираются переводами;
- переводы можно добавлять, изменять или удалять независимо для каждого языка;
- при удалении пользователя все связанные переводы удаляются автоматически благодаря каскадному удалению на уровне базы данных.
Таким образом, даже если вы решите отключить мультиязычность, все ранее введённые оригинальные значения останутся нетронутыми, а таблица переводов просто перестанет использоваться.
Настройка мультиязычности
Вся настройка сосредоточена в конфигурации плагина, доступной через стандартный интерфейс Cotonti («Администрирование → Расширения → Конфигурация плагинов»). Вы управляете следующими параметрами:
- Главный переключатель — включает или выключает всю мультиязычную логику. Когда мультиязычность отключена, плагин ведёт себя как классический набор дополнительных полей без какой‑либо работы с переводами.
- Основной язык — код языка, значение для которого считается оригиналом и хранится в основной таблице. Обычно он совпадает с языком сайта по умолчанию (
defaultlang). - Первый дополнительный язык — его код и отдельный флаг активации. Если флаг включён, для этого языка становятся доступны поля ввода переводов во всех поддерживаемых формах.
- Второй дополнительный язык — аналогичная пара «код + флаг активации».
Таким образом, вы сами определяете, какие языки используются, и можете в любой момент включить или отключить любой из них, не теряя уже сохранённые переводы.
Где и как заполняются переводы
Поля для ввода переводов автоматически добавляются во все формы, где происходит редактирование дополнительных данных пользователя.
Редактирование администратором (users.edit.tpl).
Когда администратор заходит в карточку пользователя для редактирования, для каждого дополнительного поля отображается не только основное поле, но и дополнительные текстовые поля для каждого активного языка, подписанные соответствующим кодом (например, «О себе (EN)», «О себе (UA)»). Администратор может заполнить переводы сразу для всех целевых языков или оставить их пустыми. После сохранения основное значение попадает в главную таблицу, а переводы — в таблицу переводов.
Редактирование профиля самим пользователем (users.profile.tpl).
Если вы хотите дать пользователям возможность самостоятельно вводить мультиязычную информацию, они увидят те же поля переводов в своём профиле. Это особенно полезно, когда пользователи заполняют анкеты на нескольких языках для международной аудитории.
Регистрация нового пользователя.
На данный момент форма регистрации (users.register.tpl) не поддерживает ввод переводов. Заполненные при регистрации значения сохраняются только как оригинал (для основного языка). Добавление мультиязычности в регистрацию возможно в будущих версиях плагина.
Автоматический вывод на нужном языке
Когда посетитель заходит на страницу, плагин определяет его текущий язык интерфейса (обычно это язык, выбранный пользователем в настройках профиля, или язык сайта по умолчанию). Для каждого дополнительного поля выполняется простой алгоритм:
- Если язык посетителя совпадает с основным языком, показывается оригинальное значение из главной таблицы.
- Если язык посетителя отличается от основного, плагин ищет перевод для этого языка в таблице переводов. Если перевод найден, отображается он.
- Если перевод не найден, отображается оригинальное значение.
Эта логика работает во всех публичных шаблонах, куда интегрирован плагин:
- Публичный профиль пользователя (
users.details.tpl). - Список пользователей (
users.tpl). - Везде, где используются пользовательские теги, предоставляемые функцией
cot_generate_usertags()(форумы, посты, виджеты и т.д.). - В мета‑тегах страницы (
header.tpl), что позволяет динамически формировать заголовки и описания с учётом языка.
Таким образом, один и тот же профиль автоматически подстраивается под язык каждого посетителя без каких‑либо дополнительных действий.
Интеллектуальный fallback для основного языка
Разработчики учли ситуацию, когда оригинальное поле для основного языка пустое, но один или несколько переводов заполнены. Если посетитель просматривает сайт на основном языке, плагин не оставит его перед пустым блоком, а попытается подставить первый непустой перевод из списка активных дополнительных языков. Это делает интерфейс более дружелюбным и гарантирует, что информация не будет потеряна для основной аудитории только потому, что не был заполнен оригинал.
Примеры из реальной практики
Представьте сайт, где основной язык — русский, а дополнительные — английский и украинский.
Сценарий 1: администратор заполняет переводы.
Пользователь оставил поле «О себе» на русском: «Разработчик Cotonti». Администратор при редактировании профиля добавляет в поле EN перевод «Cotonti developer», а в поле UA — «Розробник Cotonti». Результат:
- Посетитель с английским интерфейсом увидит «Cotonti developer».
- Посетитель с украинским интерфейсом увидит «Розробник Cotonti».
- Посетитель с русским (или любым другим, для которого нет перевода) увидит оригинал «Разработчик Cotonti».
Сценарий 2: основной язык пуст, но есть переводы.
Пользователь не заполнил поле «О себе» на русском, но администратор внёс английский и украинский переводы. Посетитель с русским языком интерфейса не увидит пустого блока — плагин автоматически подставит английский перевод как первый доступный. Таким образом, информация остаётся видимой для всех, даже если основная версия не была введена.
Сценарий 3: пользователь сам управляет переводами.
Пользователь в своём профиле сразу заполняет поле «Дополнительный телефон» на русском, английском и украинском. После сохранения все три варианта сохраняются в базе, и каждый посетитель видит номер в привычном для себя языковом контексте.
Ограничения текущей версии
На момент версии 1.0.1 мультиязычность не интегрирована в следующие части:
- Форма регистрации (
users.register.tpl) — новые пользователи не могут ввести переводы при регистрации; все значения записываются только как оригинал. - Поля с встроенной языковой поддержкой Cotonti (
select,radio,checklistbox) — для них по‑прежнему используется стандартный механизм локализации через языковые файлы движка. Мультиязычность плагина на них не распространяется.
Эти моменты могут быть доработаны в следующих версиях.
Ниже памятка, объясняющая, почему при включённой мультиязычности плагина групповой (циклический) вывод не показывает поля для переводов, и как корректно организовать индивидуальный вывод.
Важно: мультиязычность + групповой вывод
Когда в настройках плагина активирована мультиязычность, в формах редактирования (администратор, профиль) для каждого дополнительного поля становятся доступны отдельные текстовые поля для поддерживаемых языков. Однако эти поля не попадают в универсальный групповой цикл <!-- BEGIN: XTRA_EXTRAFLD -->. Причина в том, что цикл обрабатывает только основные (оригинальные) значения, а теги переводов (_EN, _UA и т.п.) назначаются отдельно и не участвуют в итерациях цикла.
Это значит, что если в шаблоне используется только групповой блок, посетитель увидит лишь исходное поле, но не сможет заполнить переводы. Никаких ошибок не возникнет, но мультиязычный функционал останется неиспользованным.
Как правильно выводить поля при включённой мультиязычности
Чтобы предоставить возможность заполнять переводы, нужно перейти на индивидуальный вывод нужных полей. Для каждого поля вы указываете основной элемент и следом за ним – поля для каждого активного языка, используя соответствующие TPL‑теги.
Пример для поля about_extra (доступны языки en, ua):
<!-- IF {PHP|cot_plugin_active('xtradbrowusers')} -->
<!-- IF {USERS_EDIT_XTRA_ABOUT_EXTRA} -->
<div class="mb-3">
<label>{USERS_EDIT_XTRA_ABOUT_EXTRA_TITLE}:</label>
{USERS_EDIT_XTRA_ABOUT_EXTRA}
</div>
<!-- IF {USERS_EDIT_XTRA_ABOUT_EXTRA_EN} -->
<div class="mb-3">
<label>{USERS_EDIT_XTRA_ABOUT_EXTRA_EN_TITLE}:</label>
{USERS_EDIT_XTRA_ABOUT_EXTRA_EN}
</div>
<!-- ENDIF -->
<!-- IF {USERS_EDIT_XTRA_ABOUT_EXTRA_UA} -->
<div class="mb-3">
<label>{USERS_EDIT_XTRA_ABOUT_EXTRA_UA_TITLE}:</label>
{USERS_EDIT_XTRA_ABOUT_EXTRA_UA}
</div>
<!-- ENDIF -->
<!-- ENDIF -->
<!-- ENDIF -->
Таким образом, и оригинал, и переводы будут доступны в форме. Групповой цикл в этом случае использовать нельзя, иначе поля переводов не отобразятся. Такой подход гарантирует полную функциональность мультиязычности.
Мультиязычность значений, где она работает?
Мы предусмотрели, что мультиязычность имеет смысл только для полей, в которых пользователь вводит произвольный текст на естественном языке. Это прежде всего:
input(обычное текстовое поле)textarea(многострочная область ввода)
Именно для этих двух типов перевод через таблицу cot_xtradbrowusers_i18n действительно востребован: один и тот же текст (например, «О себе» или «Дополнительный телефон») может быть представлен на разных языках.
Для всех остальных типов полей (radio, datetime, file, country, range, checklistbox, double, inputint и т.п.) перевод не имеет практического смысла — это либо предопределённые варианты выбора, либо числа, либо загружаемые файлы. Наша функция xtradbrowusers_i18n_get_value() корректно не обрабатывает такие поля (она исключает select, radio, checklistbox, checkbox), однако в формах редактирования (edit.tags, profile.tags) дополнительные текстовые поля для переводов пока отображаются для всех типов полей, включая бессмысленные.
Это означает, что администратор или пользователь технически может заполнить поле «перевода» для, скажем, даты или радиокнопки. Эти данные сохранятся в таблице cot_xtradbrowusers_i18n, но никогда не будут использованы при выводе на сайте, потому что алгоритм подстановки перевода не вызывается для не‑текстовых типов. В результате в базе появятся «бесполезные» записи, которые не навредят работе плагина, но могут ввести в заблуждение.
Чтобы избежать путаницы, особенно для новичков, хуки вывода полей (users.edit.tags.php, users.profile.tags.php и т.д.), выполняют проверку типа поля перед выводом блока переводов. Поля переводов должны отображаться только для типов input и textarea. Это небольшая доработка, которая делает интерфейс чище и логичнее. В будущей версии плагина такое поведение станет стандартным.
Для локализации названий полей или их значений, где тип поля, например select, radio, checklistbox, checkbox) - используйте файл локализации палгина или своей темы:
пример
// Примеры локализации заголовков (_TITLE) для всех демонстрационных полей
$L['xtra_phone_extra_title'] = 'Дополнительный телефон';
$L['xtra_about_extra_title'] = 'О себе';
$L['xtra_hire_date_title'] = 'Дата найма';
$L['xtra_salary_title'] = 'Зарплата';
$L['xtra_department_title'] = 'Отдел';
$L['xtra_experience_years_title'] = 'Стаж (лет)';
$L['xtra_skill_level_title'] = 'Уровень квалификации';
$L['xtra_has_car_title'] = 'Наличие автомобиля';
$L['xtra_last_promotion_title'] = 'Дата последнего повышения';
$L['xtra_resume_file_title'] = 'Резюме (файл)';
$L['xtra_residence_country_title'] = 'Страна проживания';
$L['xtra_english_level_title'] = 'Уровень английского';
$L['xtra_interests_title'] = 'Интересы';
$L['xtra_work_schedule_title'] = 'График работы';
$L['xtra_emergency_contact_title'] = 'Экстренный контакт';
// Примеры локализации значений для select, radio, checklistbox
$L['department_not_specified'] = 'Не указан';
$L['department_it'] = 'IT-отдел';
$L['department_marketing'] = 'Маркетинг';
$L['department_sales'] = 'Продажи';
$L['department_support'] = 'Поддержка';
$L['skill_level_junior'] = 'Младший';
$L['skill_level_middle'] = 'Средний';
$L['skill_level_senior'] = 'Старший';
$L['skill_level_lead'] = 'Ведущий';
$L['has_car_yes'] = 'Да';
$L['has_car_no'] = 'Нет';
$L['interests_sport'] = 'Спорт';
$L['interests_music'] = 'Музыка';
$L['interests_it'] = 'IT';
$L['interests_travel'] = 'Путешествия';
$L['work_schedule_full_time'] = 'Полный день';
$L['work_schedule_shift'] = 'Сменный';
$L['work_schedule_remote'] = 'Удалённая работа';
$L['work_schedule_flexible'] = 'Гибкий график';
в шаблонах, такие поля выводятся индивидуально и без дополнительных тегов для локализации и заполнения переводов, - пример
<!-- IF {PHP|cot_plugin_active('xtradbrowusers')} -->
<!-- IF {USERS_EDIT_XTRA_DEPARTMENT} -->
<div class="mb-3">
<label>{USERS_EDIT_XTRA_DEPARTMENT_TITLE}:</label>
{USERS_EDIT_XTRA_DEPARTMENT}
</div>
<!-- ENDIF -->
<!-- ENDIF -->
Заключение
Мультиязычность в xtradbrowusers — это продуманное и независимое от ядра решение для сайтов, которым нужны профили пользователей на нескольких языках. Она легко настраивается, не требует правки системных файлов и позволяет гибко управлять переводами через привычные формы редактирования. Благодаря автоматическому выбору языка и интеллектуальному fallback посетители всегда видят информацию на понятном им языке.
За полной информацией об установке, базовых возможностях и выводе полей обращайтесь к основному README плагина.
Сам плагин мультиязычных экстраполей пользователей сайта в маркетплейсе расширений для Cotonti CMF со всеми ссылками на сопряженный контент.
Исходный код последней актуальной “Extrafields Users Custom” версии в репозитории на GitHubавтора плагина.
Отзывы
Отзывов пока нет
Комментарии (0)
Рекомендуемые товары и услуги
Extrafields Users Custom
Установка, интеграция и адаптация плагинов под Cotonti CMF
Обсуждение страницы в Telegram
Автор контента
Оффлайн
Carbonate Sodium
Последняя авторизация: 19.07.2026 22:29
Чем могу помочь?
Оказываю весь спектр услуг по CMF Cotonti. Разработка открытых и закрытых корпоративных интернет порталов, небольших социальных сетей, торговые площадки, маркетплейсы, биржи фриланса, каталоги товаров оптовых поставщиков, интернет-магазин под заказ, чтобы делать совместные покупки и групповые совместные продажи от имени нескольких продавцов.
Разработки на GitHub бесплатно
Telegram
- Страница размещена: 18.07.2026 01:04
- Последнее обновление: 18.07.2026 08:56
- Язык:
Связанные статьи
Плагин Userfields для Cotonti (без экстраполей). Дополнительные поля пользователя.
Плагин Userfields для Cotonti 0.9.26 Выводим дополнительные поля пользователя где угодно, в любом
Мультистраничные статьи в Cotonti
Инструкция: мультистраничные статьи в CotontiМультистраничные статьи нужны, чтобы длинные тексты
Bookmark (Закладки) в редакторе CKEditor. Руководство
Инструкция объясняет, как использовать функцию Bookmark в редакторе CKEditor для создания якорей
English