Forum categories

Пока в планах - Отдельная таблица для пользовательских локализаций вальюшек


webitproff
webitproff • 2026-07-17 09:46 #1

Штатная функция cot_build_extrafields_data() для типов input, textarea (и всех остальных, кроме select/radio/checklistbox) не ищет переводы в языковом массиве. Она просто пропускает значение через cot_parse(). Поэтому ключ $L['xtra_xtu001_about_extra_value'] и не работает.

Реализуемое решение (без правки ядра):
В хуках вывода плагина (например, xtradbrowusers.users.details.tags.php, xtradbrowusers.usertags.php, xtradbrowusers.users.loop.php) сразу после получения $value добавить проверку:

$value = $xtra_data[$exfld['field_name']] ?? null;

// Локализация значения для input/textarea/etc.
$langKey = 'xtra_' . $exfld['field_name'] . '_value';
if (isset($L[$langKey])) {
    $value = $L[$langKey];
}

После этого присваивать теги как обычно. В языковой файл (xtradbrowusers.ru.lang.php) можно будет писать:

$L['xtra_xtu001_about_extra_value'] = 'Мы работаем с разными поставщиками...';

Таким образом, меняются только несколько файлов плагина, движок не трогается. Это даст возможность задать перевод для любого текстового значения экстраполя прямо в языковых файлах.


Пока в планах - Отдельная таблица для пользовательских локализаций вальюшек

Создание отдельной таблицы для мультиязычных вариантов — более гибкое и мощное решение, но оно требует существенной доработки плагина. Если нужно, чтобы пользователь сам вводил переводы значений экстраполей для нескольких языков, вот реализуемый пример без правки ядра Cotonti.

1. Дополнительная таблица для переводов

Создаём таблицу cot_xtradbrowusers_i18n:

CREATE TABLE cot_xtradbrowusers_i18n (
    id INT UNSIGNED NOT NULL,
    field_name VARCHAR(255) NOT NULL,
    lang CHAR(2) NOT NULL DEFAULT 'ru',
    value TEXT,
    PRIMARY KEY (id, field_name, lang),
    CONSTRAINT fk_xtradbrowusers_i18n FOREIGN KEY (id) REFERENCES cot_xtradbrowusers(id) ON DELETE CASCADE
);

Здесь lang — двухбуквенный код языка (ru, en, uk и т.д.).

2. Изменения в функциях плагина

a) Сохранение переводов
В хуках users.edit.update.done и users.profile.update.done после сохранения основного значения для каждого поля читаем из $_POST дополнительные значения с суффиксами языка (например, rxtra_phone_extra_ru, rxtra_phone_extra_en) и записываем их в новую таблицу.

b) Загрузка переводов
Функция xtradbrowusers_load_i18n($userId, $lang) возвращает массив переводов для заданного языка. При выводе в шаблонах (в хуках users.details.tags, users.loop и т.д.) вместо сырого значения подставляется перевод для текущего языка, если он существует. Если перевода нет — используется основное значение.

3. Пример кода для сохранения перевода

В xtradbrowusers.users.edit.update.done.php после строки $data[$fieldName] = cot_import_extrafields(...):

foreach (['ru', 'en', 'uk'] as $lang) {
    $translatedValue = cot_import('rxtra_' . $fieldName . '_' . $lang, 'P', 'HTM');
    if ($translatedValue !== null) {
        Cot::$db->query(
            "INSERT INTO " . Cot::$db->xtradbrowusers_i18n . " (id, field_name, lang, value)
             VALUES (?, ?, ?, ?)
             ON DUPLICATE KEY UPDATE value = ?",
            [$id, $fieldName, $lang, $translatedValue, $translatedValue]
        );
    }
}

4. Вывод перевода в шаблоне

В хуке users.details.tags.php:

$lang = Cot::$usr['lang'] ?? Cot::$cfg['defaultlang'] ?? 'ru';
$translatedValue = Cot::$db->query(
    "SELECT value FROM " . Cot::$db->xtradbrowusers_i18n . " WHERE id = ? AND field_name = ? AND lang = ?",
    [$urr['user_id'], $exfld['field_name'], $lang]
)->fetchColumn();

$displayValue = $translatedValue ?: $value;

Плюсы и минусы

Плюсы:

  • Полная свобода: пользователи могут вводить переводы для любого количества языков.
  • Не зависит от языковых файлов, поэтому переводы динамические.
  • Совместимо с любыми типами полей (input, textarea и т.д.).

Минусы:

  • Усложнение плагина: нужно добавлять поля ввода в формы, новые методы сохранения/загрузки, создавать таблицу.
  • Придётся обновлять все шаблоны форм, чтобы выводить дополнительные поля для каждого языка.

Вывод

Если вам нужна именно пользовательская локализация значений, и вы готовы к расширению функционала, вариант с отдельной таблицей — правильный путь. Если же достаточно статических переводов, задаваемых администратором в языковых файлах, проще использовать описанный ранее метод с константами $L.

🗿

🧙‍♂️ Well met, good traveler! Fate has guided your steps to our humble realm. Here, wise sages and masters of the coding craft ⚒️📜 gather to unravel the mysteries of the code ✨⚙️, share their knowledge, and add new chapters to our chronicles.
⬅️ To the left lie ancient scrolls 📚 filled with forgotten wisdom. ⬆️ Straight ahead, friendly folk offer counsel 💬 to those in need. ➡️ To the right, you may become a chronicler ✍️ yourself, sharing your craft and leaving words of wisdom for those yet to come.
📝 Delay no longer—tell us the name by which you are known, complete the rite of registration 🛡️, and join our fellowship!
🏰 Our brotherhood holds no secret initiation, yet many halls remain closed to wandering guests, for some knowledge 💎 is reserved for those who choose to walk this path beside us.