На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Положения
1. Раздел "Готовые движки" предназначен для поиска и обсуждения готовых веб-решений.
2. Ответы с предложением разработать свой собственный движок будут удаляться без предупреждения.
  
    > Мультиязычность в Laravel 5
      Приветствую!

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

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

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

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

      Как посоветуете организовать хранение в БД мультиязычных материалов? Например различных новостей, событий, галлерей ... & etc.
        Ну лично я и то и другое использовал. Т.е. в роутах просто прописан нужный префикс (в домене, типа 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.

        Я бы через релейшн делал
          Цитата Serafim @
          Я бы через релейшн делал

          Тут вот какая штука ... Возможно биг-босс через пару месяцев скажет "немецкий" убирай, добавляй "польский" и "китайксий упрощенный". Я пока мыслю категорями Друпала - там это искаропки. А вот тут что мутить? Городить подобное ССК?
            А ещё можно воспользоваться данными ссылками для получения менее субъективной инфы:
            1) Discord: https://discord.gg/c8gJfed
            2) Telegram: https://t.me/laravelrus

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

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

            Так же и добавить новый язык можно запросто.
              Цитата Serafim @
              Ну лично я и то и другое использовал.

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

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


              Каки таблицы создавать-связывать? А при команде "удаляй" - правильно их чистить?
                А ещё можно что-то вроде 3х таблиц. Т.е. сама страница одна, а i18n содержимое ссылается как на язык, так и на страницу с инфой о видимости, адресе и проч (т.е. общей инфой).
                ExpandedWrap disabled
                  languages    contents             pages
                    id <--------- language_id         slug
                    title         title               is_visibile
                    slug          content             ...
                    is_visible    page_id ----------> id


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

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

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

                На уровне миграций - это foreign key
                Сообщение отредактировано: Serafim -
                  Serafim, благодарю! Буду переваривать, когда малеха хмель пройдет :lol:

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

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

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

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

                    Т.е. либо в провайдере выдёргивать внутри коллбека, вроде:
                    ExpandedWrap disabled
                      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 окружение.


                    Либо в миддлваре.
                    Сообщение отредактировано: Serafim -
                      Ясн. Пасиба! Есть фронт работ :)
                      0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                      0 пользователей:


                      Рейтинг@Mail.ru
                      [ Script execution time: 0,0311 ]   [ 15 queries used ]   [ Generated: 28.03.24, 23:39 GMT ]