Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум на Исходниках.RU > WWW - Готовые движки > Мультиязычность в Laravel 5


Автор: JoeUser 14.04.18, 05:26
Приветствую!

Возникла необходимость склепать несколько сайтов небольшого размера. Начал читать доки по Laravel 5. Идеология вроде достаточна понятна. Решил начать с того, что хочу смастерить в самом начале шаблон мультиязычного сайта. Нашел статью по этому вопросу. Прочитал - тоже все понятно. Но возникли вопросы по статье:

1) Автор статьи решил использовать middleware-решение. В комментах ему посоветовали другой вариант - просто использовать локаль в маршрутах. А автор статьи, и комментирующий обозвали друг друга огородостроителями :lol: Кто из них прав? Если оба неправы - то как правильно?

2) Автор статьи в своем решении в некоторых местах парсит URL, потом его склеивает. А нельзя ли это решение упростить? А именно, прописывать в маршрутах URL без языка, до обработки брать текущую локаль из куков, и вставлять язык из куков или по умолчанию и отправлять на последующую обработку? Мне кажется, если получится избавиться от парсинга/склейки URL, то будет кода по-меньше. Ваше мнение?

И вопрос не по статье

Как посоветуете организовать хранение в БД мультиязычных материалов? Например различных новостей, событий, галлерей ... & etc.

Автор: Serafim 14.04.18, 10:51
Ну лично я и то и другое использовал. Т.е. в роутах просто прописан нужный префикс (в домене, типа ru.site.com или en.site.com), потом они в миддлваре уже маппятся на сущности в БД и регаются в DI:
https://github.com/railt/railt.org/blob/mas...ver.php#L60-L67 А в контроллере уже из DI выдираются: https://github.com/railt/railt.org/blob/mas...troller.php#L39

С другой стороны всё зависит от того что тебе надо в итоге получить :-?

Цитата JoeUser @
Как посоветуете организовать хранение в БД мультиязычных материалов? Например различных новостей, событий, галлерей ... & etc.

Я бы через релейшн делал

Автор: JoeUser 14.04.18, 10:57
Цитата Serafim @
Я бы через релейшн делал

Тут вот какая штука ... Возможно биг-босс через пару месяцев скажет "немецкий" убирай, добавляй "польский" и "китайксий упрощенный". Я пока мыслю категорями Друпала - там это искаропки. А вот тут что мутить? Городить подобное ССК?

Автор: Serafim 14.04.18, 10:57
А ещё можно воспользоваться данными ссылками для получения менее субъективной инфы:
1) Discord: https://discord.gg/c8gJfed
2) Telegram: https://t.me/laravelrus

Добавлено
Цитата JoeUser @
Тут вот какая штука ... Возможно биг-босс через пару месяцев скажет "немецкий" убирай, добавляй "польский" и "китайксий упрощенный"

И? Что сложного удалить просто язык из таблицы? Или просто пометить его как deleted =) Все связанные страницы тоже исчезнут.

Так же и добавить новый язык можно запросто.

Автор: JoeUser 14.04.18, 11:00
Цитата Serafim @
Ну лично я и то и другое использовал.

Ну оч бегло глянул твой код ... упоминания о куках не заметил. А мне нужно, чтобы повторный визит (при наличии куков у юзера) сразу же выставлял последний выбранный язык. Как сделать, вернее где?

Добавлено
Цитата Serafim @
И? Что сложного удалить просто язык из таблицы? Или просто пометить его как deleted =) Все связанные страницы тоже исчезнут. Так же и добавить новый язык можно запросто.


Каки таблицы создавать-связывать? А при команде "удаляй" - правильно их чистить?

Автор: Serafim 14.04.18, 11:02
А ещё можно что-то вроде 3х таблиц. Т.е. сама страница одна, а i18n содержимое ссылается как на язык, так и на страницу с инфой о видимости, адресе и проч (т.е. общей инфой).
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    languages    contents             pages
      id <--------- language_id         slug
      title         title               is_visibile
      slug          content             ...
      is_visible    page_id ----------> id


Добавлено
Цитата JoeUser @
Ну оч бегло глянул твой код ... упоминания о куках не заметил. А мне нужно, чтобы повторный визит (при наличии куков у юзера) сразу же выставлял последний выбранный язык. Как сделать, вернее где?

Ну выставляй :-? Просто default language в данном случае будет браться из кук, а не из локали.

Добавлено
Цитата JoeUser @
Каки таблицы создавать-связывать? А при команде "удаляй" - правильно их чистить?

На уровне миграций - это foreign key

Автор: JoeUser 14.04.18, 11:15
Serafim, благодарю! Буду переваривать, когда малеха хмель пройдет :lol:

Добавлено
Цитата Serafim @
Просто default language в данном случае будет браться из кук, а не из локали.

А еще вдогоночку ... брать в boot()? Эта хрень или где в самом начале можно куки считать и инициализировать текущий язык?

Автор: Serafim 14.04.18, 11:31
Цитата JoeUser @
А еще вдогоночку ... брать в boot()

Нет, в провайдерах нельзя. Не везде есть HTTP окружение (есть же ещё CLI) и тем более кукисы (ещё есть stateles API без сессий и кук), а провайдеры - это глобальная фиговина.

Добавлено
Цитата JoeUser @
Эта хрень или где в самом начале можно куки считать и инициализировать текущий язык?

Т.е. либо в провайдере выдёргивать внутри коллбека, вроде:
<{CODE_COLLAPSE_OFF}><{CODE_WRAP_OFF}>
    public function boot(): void
    {
        $this->app->singleton(Language::class, function() {
            $request = $this->app->make(Request::class); //
            ///
            return $language;
        });
    }
     
     
    $this->app->make(Language::class); // Если из под web окружения, то всё ок, если нет, то инициализация зафейлится, т.е. в коллбеке будет пустой объект Request


Тогда объект будет инициализироваться только тогда, когда ты будешь пытаться выдрать Language, а там (в том месте, где будешь пытаться получить эту зависимость) вполне могут быть и кукисы и http окружение.


Либо в миддлваре.

Автор: JoeUser 14.04.18, 11:36
Ясн. Пасиба! Есть фронт работ :)

Powered by Invision Power Board (https://www.invisionboard.com)
© Invision Power Services (https://www.invisionpower.com)