Версия для печати
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум на Исходниках.RU > WWW - Готовые движки > Мультиязычность в Laravel 5 |
Автор: JoeUser 14.04.18, 05:26 |
Приветствую! Возникла необходимость склепать несколько сайтов небольшого размера. Начал читать доки по Laravel 5. Идеология вроде достаточна понятна. Решил начать с того, что хочу смастерить в самом начале шаблон мультиязычного сайта. Нашел статью по этому вопросу. Прочитал - тоже все понятно. Но возникли вопросы по статье: 1) Автор статьи решил использовать middleware-решение. В комментах ему посоветовали другой вариант - просто использовать локаль в маршрутах. А автор статьи, и комментирующий обозвали друг друга огородостроителями Кто из них прав? Если оба неправы - то как правильно? 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 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 @ И? Что сложного удалить просто язык из таблицы? Или просто пометить его как 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 в данном случае будет браться из кук, а не из локали. Добавлено На уровне миграций - это foreign key |
Автор: JoeUser 14.04.18, 11:15 |
Serafim, благодарю! Буду переваривать, когда малеха хмель пройдет Добавлено А еще вдогоночку ... брать в boot()? Эта хрень или где в самом начале можно куки считать и инициализировать текущий язык? |
Автор: Serafim 14.04.18, 11:31 |
Нет, в провайдерах нельзя. Не везде есть 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 |
Ясн. Пасиба! Есть фронт работ |