Сущности¶
Сущности в базах данных¶
Таблицы, содержащие языковые данные, имеют суффикс _descriptions. К этому списку таблиц добавляется еще несколько таблиц ядра. Все эти таблицы можно получить в коде вызвав функцию fn_get_description_tables()
Отдельная таблица¶
Наиболее распространенный способ в CS-Cart. Для каждой сущности создается отдельная таблица для мультиязычных данных.
Например, возьмем сущность “товары”. Все данные, независимые от языка, хранятся в основной таблице products, а зависимые от языка — в дополнительной таблице product_descriptions.
В основной таблице, как правило, используется одно поля для первичного ключа (в случае с товарами это product_id). В дополнительной таблице для мультиязычных данных к первичному ключу добавляется дополнительное поле lang_code. Таким образом, первичный ключ в таблице с языковыми данными всегда составной, в случае с товарами это product_id и lang_code.
Объединенная таблица¶
Иногда используется совмещенная таблица с языко-зависимыми данными, в частности для настроек.
Данные настроек, зависимые от языка хранятся в таблице settings_descriptions. Эта таблица хранит данные трех сущностей: setting_objects, setting_sections и setting_variants.
В этом случае в первичный ключ добавляется еще одно поле object_type, которое хранит тип объекта. В случае с settings поле object_type имеет тип char(1), и для каждого типа объекта используется отдельная буква. Первичный ключ в таблице settings_descriptions состоит из полей: object_id, object_type и lang_code.
Изменение сущностей¶
Создание объекта¶
При создании объекта (например, нового товара) берутся все языки, доступные в текущей установке CS-Cart, в том числе и выключенные, и для каждого языка делается одинаковая запись. То есть, если вы создавали продукт с активным русским языком, то после создания продукта для всех доступных языков будут сохранены русские данные (так как других пока все равно нет, а для корректной работы для всех языков записи нужны).
Обновление объекта¶
Обновление объекта происходит только для выбранного языка. Для обновления другого языка нужно переключить язык.
Для большинства сущностей, кроме основного переключателя языка в панели администратора, предусмотрен отдельный переключатель языка для конкретного элемента. То есть на странице редактирования товара можно переключить язык переключателем Language, который находится над вкладками.
Переключение языка интерфейса осуществляется путем передачи GET-параметра sl (например &sl=ru). При этом выбранный язык сохраняется в сессии. Переключения языка редактирования осуществляется путем передачи GET-параметра descr_sl (например, &descr_sl=ru). Это значение тоже сохраняется в сессии.
Добавление и удаление языков¶
Добавление нового языка¶
При установке в CS-Cart нового языка берутся все таблицы (fn_get_description_tables()), и в них дублируются все записи основного языка на новый язык. Т.е. если у нас основным языком стоит английский, и мы устанавливаем русский, то в каждой таблице с переводами для русского языка будут указаны английские данные.
После дублирования данных происходит установка PO-файлов, т.е. обновляются языковые переменные и настройки.
Удаление языка¶
При удалении языка происходит удаление данных из всех языковых таблиц (fn_get_description_tables()). Выборка происходит по полю lang_code.
Предупреждение
Если удалить язык и потом установить его заново, мы потеряем все языковые данные сущностей (например, товаров), а также все наши изменения языковых переменных.