Как можно можно вывести определенный столбец в зависимости от локализации проекта на Laravel

95
05 января 2022, 07:40

Это мой первый и тестовый проект на laravel. Подскажите пожалуйста как можно можно вывести определенный атрибут в зависимости от локализации проекта на Laravel. Например умнея есть в базе данных таблица posts и в нем хранятся новости в двух языках: ['ru_title','en_title',''ru_description','en_description'] и есть глобальная самописная функция getLocale() которая возвращает "ru_" или "en_".

function getLocale($data,$table_name){
$locale=\App\Http\Middleware\LocaleMiddleware::getDBLocale();
if ($locale="ru_")
    switch ($table_name) {
        case 'name':
            return $data->ru_name;
        case 'description':
            return $data->ru_description;
        case 'include':
            return $data->ru_include;
        default:
            return null;
    }
else
    switch ($table_name)
    {
        case 'name':
            return $data->en_name;
        case 'description':
            return $data->en_description;
        case 'include':
            return $data->en_include;
        default:
            return null;
    }

Пробовал сделать таким образам работает но это я думаю не правильный подход как и структура BD для мультиязычного сайта Или есть возможность в самой модели изменить название атрибута например protected $atributes=[getLocale(.'name'=>'name']

Answer 1

Подход примерно правильный, но всегда старайтесь гуглить готовые решения:

https://packagist.org/packages/spatie/laravel-translatable

Вот есть еще решения:

https://stackoverflow.com/questions/19088897/multilanguage-database-management-with-laravel

Но как по мне - увеличение таблицы в ширину за счет языков не лучшее решение. Я бы подумал о дополнительной таблице переводов.

Answer 2

Как вариант можно попробовать переписать метод __get у модели

class ModelName extends Model
{
    public function __get($key)
    {
        $locale=\App\Http\Middleware\LocaleMiddleware::getDBLocale();
        return $this->getAttribute($locale.$key);
    }
***
}

И уже потом вызывать $modelName->description

READ ALSO
Ошибка “PHP Notice: Undefined offset: 1 in…”

Ошибка “PHP Notice: Undefined offset: 1 in…”

Перебираю массив на совпадения, те которые совпадают - удаляю

73
Не сохраняется элемент массива в сессии PHP

Не сохраняется элемент массива в сессии PHP

у меня есть корзина с товарами, я делаю проверку при добавлении товара на его наличие в корзине, если он существует - увеличивается количество...

129
равны ли все значения в массиве PHP

равны ли все значения в массиве PHP

Есть массив со структурой -

199
Обнаружено нечисловое значение

Обнаружено нечисловое значение

Вроде код правильный, но пишет ошибку

227