Как структурировать модели для многоязычного использования

#php #mysql #internationalization #multilingual

#php #mysql #интернационализация #многоязычный

Вопрос:

Мне любопытно, какая хорошая структура модели подходит для многоязычной среды. Я буду использовать базу данных продуктов в качестве примера….

 products
----------------------------------------------------------------
    products_id  |   products_customizer_id  |  date_added

products_description
----------------------------------------------------------------
    id  |  language_id  |  sku  |   description
  

Я бы хотел использовать геттеры и сеттеры… Я застрял в вопросе: должен ли я иметь 1 модель продукта или одну для описания, а другую для продуктов?

обновление Чтобы было ясно, я вынужден использовать эту структуру базы данных… Мне интересно, как настроить мои php-модели… Я хотел бы иметь возможность делать…

 $product->setCustomizerId(4);
$product->setSku('BJKDJ423');
$product->setDescription('A spanish walrus');

$product->save();
  

И разумно сохранять каждое поле в каждой базе данных …. это хорошая / плохая идея, почему или почему нет?

Комментарии:

1. Нет, он говорит о моделях, а не о структуре базы данных

Ответ №1:

Это не так уж далеко от того, как я бы это сделал… Я, как правило, придерживаюсь формата, хотя, например, с суффиксом для всех таблиц, специфичных для языка _lang . Итак, у меня было бы 3 таблицы (используя InnoDB с внешними ключами для ссылочной целостности).

 product
----------------------------------------------------------------
id | ... fields ...


language
----------------------------------------------------------------
id | ... fields ...


product_lang
----------------------------------------------------------------
language_id | product_id | name | description | ... etc ...
  

Я бы, вероятно, использовал строку ISO для идентификатора языка, например en-GB , и автоматически добавляемый INT для идентификатора продукта. Первичный ключ в product_lang таблице будет составным ключом, созданным из полей language_id and product_id — таким образом, вы избежите ненужного поля и любых ограничений INT, которые могли бы иметь.

В противном случае да, вы в значительной степени там.

—- РЕДАКТИРОВАТЬ, ЧТОБЫ ОТРАЗИТЬ ОБНОВЛЕННЫЙ ВОПРОС —-

Хорошо — модель…

Ваша модель должна отражать то, как вы будете использовать ее в бизнес-смысле, а не в смысле базы данных… У меня была бы модель продукта, которая обертывает данные по мере их использования, поэтому что-то вроде:

 class MyProduct {
  private $_id;
  private $_sku;
  private $_name;
  private $_description;
  ...

  public function setId($iId) {
    $this->_id = (int) $iId;
  }

  public function getId() {
    return $this->_id;
  }

  ... and so on ...
}
  

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

Помимо загрузки в настройках i18n

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

Поскольку язык будет установлен в этом MyApp объекте, и этот объект также будет содержать ваш соединитель базы данных, вы можете просто заставить этот объект автоматически устанавливать статический MyDBConnector::setLang($sLang) параметр при создании экземпляра.

Таким образом, чтобы запустить все приложение на любой странице, вам нужно просто сделать что-то вроде

 require_once '/path/to/app.ini.php';
$oApp = MyApp::getInstance();
  

Ответ №2:

Я использую полностью гибкую структуру модели, которая предоставляет описание, имя, заголовок в виде массива в моих моделях, таких как:

 class Models_Product {

public function getNames(){ return $this->names; }
public function getName($lang){ return $this->name[$lang]; }

}
  

Промойте и повторите для всех свойств.

Примечание: для настройки версии «setNames (array $ values)» мало пользы, ИМО должно быть создано только setName ($ lang, $value).