Задать вопрос

Как вывести мультиязычное меню?

Доброго дня всем

Пытаюсь сделать мультиязычный сайт. С переключением языков разобрался, затык в выводе данных из базы, пока только меню. Есть таблица с пунктами меню. Поля title_ru и title_ua. Также есть переменная $lang, в которую попадает значение выбранного языка. Для получения меню в шаблоне blade есть код
<ul>
    @foreach($menus as $menu)
        <li>
            <a href='{{ route($menu->path) }}'>{{ $menu->title_.$lang }}</a>
        </li>
    @endforeach
</ul>

В итоге получаю пункты меню ru и ua.
Вопрос - как правильно написать этот код - {{ $menu->title_.$lang }}, чтобы выводились значения полей {{ $menu->title_ru }} и {{ $menu->title_ua }}.
Т.е., как правильно объединить две переменные?

Спасибо
  • Вопрос задан
  • 154 просмотра
Подписаться 1 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 2
greabock
@greabock
Могу
Самый простой путь:
$menu->{'title_'.$lang}

Чуть сложнее:
class Menu {
    public function getTitile ($lang) 
    {
        return $this->getAttribute('title_' . $lang);
    }
}

{{$menu->getTitle($lang)}}

Если совпадает с локалью:
class Menu {
    public function getTitleAttribute() 
    {
        return $this->getAttribute('title_' . app('locale'));
    }
}

{{$menu->title}}

Но стоит отметить, что мультиязычные приложения пишутся совсем не так.
Ответ написан
Razgelday
@Razgelday
Не стоит придумывать велосипед - в Laravel уже есть встроенный механизм для локализации, лучше использовать его: https://laravel.com/docs/master/localization

Он дает очень удобные возможности для локализации в Blade и в PHP:

// Вар 1 - переводы задаются в JSON /resources/lang/en.json

<a href='{{ route($menu->path) }}'>@lang( $menu->title )</a>

// Вар 2 - переводы задаются по ключам в файле /resources/lang/en/messages.php

<a href='{{ route($menu->path) }}'>@lang( 'messages.menu.' . $menu->path )</a>

// Вар 3

<a href='{{ route($menu->path) }}'>{{ $menu->titleLocalized }}</a>

public function getTitleLocalizedAttribute() {
    return __( $this->title );
}
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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