akserdin
@akserdin
PHP/JS developer

Как рациональнее реализовать мультиязычный сайт на Laravel?

Заказчик хочет магазин с небольшим оборотом товаров + блог. Админка будет на одном, дефолтном языке, но весь контент (название/описание товаров, статьи блога, ну кроме комментов, наверное) должен быть на 3-х языках.

Допустим, маршруты по контенту имеют вид */{lang?}, а контроллер использует переменную $lang, чтобы делать подходящую выборку из базы.

Как лучше - дублировать поля в таблицах (content_ru, content_en ит.п) для каждой модели или же иметь отдельные таблицы и может даже отдельные модели для каждого языка (posts_ru, posts_en)? Чутье подсказывает, что первый вариант явно лучше, но может вообще есть какое-то решение по-умнее, ведь в первом варианте все равно попахивает дублированием кода.

Шаблоны представления: всякие фразы для кнопок типа "Купить" хранить в отдельном классе и
прописывать типа {{ Words::buy($lang) }} Есть еще рациональные варианты?

Да, и это важно, добавление языков на сайт не планируется.

PS. Знаю, про мультиязычность часто спрашивают, но я хочу об этом поговорить тоже :-)
  • Вопрос задан
  • 6759 просмотров
Пригласить эксперта
Ответы на вопрос 3
DmitriyEntelis
@DmitriyEntelis
Думаю за деньги
Условно:
Я бы хранил в таблицу goods данные о товарах которые на зависят от локали (id, цена, итд), а данные зависящие от локали хранил в таблицах вида goods_details_ru, good_details_en, итд.
Это позволит избежать дублирования полей в таблицах (что весьма не круто), даст возможность легко расширять список языков, + понятные запросы без извращений на выборку нужных данных.
Ответ написан
Комментировать
akserdin
@akserdin Автор вопроса
PHP/JS developer
Спасибо за вариант.

Я размышлял, читал, и тут вдруг наткнулся на чудесный туториал.

В нем все-таки используются дополнительные поля в таблице с префиксами языка - field_en, field_fr итп

Затем добавляем методы в Модель:

public function getTitleAttribute()
{
$locale = App::getLocale();
$column = "title_" . $locale;
return $this->{$column};
}
public function getContentAttribute()
{
$locale = App::getLocale();
$column = "content_" . $locale;
return $this->{$column};
}

Тогда в шаблоне можно пользоваться переменными вот так:

{{ $post->title }}

{{ $post->content }}

Ну а для фраз, к-рые касаются только представлений (и не хранятся в БД) есть методы trans() или Lang::get(..)

Если добавится язык - то придется добавить поля в таблицы, да, но это не так страшно, как дублирование кода и излишняя проверочная логика. Как вам такое решение?

PS вот туториал https://medium.com/laravel-4/laravel-4-multisites-...
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы