Сущности¶
Сущности в базах данных¶
Таблицами, содержащими языковые данные, считаются таблицы с суфиксом _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.
Предупреждение
Если удалить язык и потом установить его заново, мы потеряем все языковые данные сущностей (например, товаров), а так же все наши изменения языковых переменных.