Многоязычный переключатель laravel и изменение локали при загрузке

Я реализовал функцию переключения языка после эта почта, и она работает отлично, но только когда вы нажимаете на переключатель языка, хотя я хотел бы изменить locale и сохранить его в приложении при загрузке страницы.

Моя функция немного отличается от той, что в посте, я добавил else if, чтобы убедиться, что локаль соответствует принятым языкам.

App/Middleware/Localization.php

public function handle($request, Closure $next)
{
    $availableLangs  = array('en', 'hu', 'pt', 'ro', 'sv');
    $userLangs = substr($request->server('HTTP_ACCEPT_LANGUAGE'), 0, 2);

    if (\Session::has('locale'))
    {
        \App::setlocale(\Session::get('locale'));
    }
    else if (in_array($userLangs, $availableLangs))
    {
        \App::setLocale($userLangs);
      // Session::push('locale', $userLangs);
    }
    return $next($request);
}

Как я могу повторно использовать эту функцию или создать новую функцию для достижения того же результата, но при загрузке веб-сайта?

У меня много маршрутов, поэтому я думаю, что мне понадобится функция, чтобы не повторять один и тот же код снова и снова.

Я не использую locale в URL-адресе и не хочу его использовать, поэтому, пожалуйста, не предлагайте решение, включающее эту опцию.

Пример моих URL-адресов (каждый URL-адрес можно просмотреть на всех доступных языках)

domain/city1/
domain/city1/dashboard/
domain/city2/
domain/city2/dashboard/
domain/admin/

Я не хочу:

domain/city1/en/...
domain/city1/pt/...

Я думаю, вам нужно добавить еще одно условие в свой код. Когда по умолчанию загружается страница, вы отправляете это значение «HTTP_ACCEPT_LANGUAGE»? Я думаю, что вы не получите никакого значения, когда страница загружается по умолчанию, поэтому ваше условие else if для проверки значения с принятыми языками не удалось. Я бы посоветовал вам добавить еще одно условие: вы просто используете язык по умолчанию для сеанса и устанавливаете его как локаль.

Ashok 10.04.2019 09:35

Я попробую, я новичок в Laravel, поэтому многого не понимаю. этот код должен работать также при загрузке или только тогда, когда он получает URL-адрес locale/{locale}, как сказано в руководстве?

Sebastiano 10.04.2019 09:42

Да, этот код будет работать, не обязательно всегда передавать локаль в URL-адресе. Мы можем сделать это таким образом.

Ashok 10.04.2019 09:44
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Поиск нового уровня в Laravel с помощью MeiliSearch и Scout
Laravel Scout - это популярный пакет, который предоставляет простой и удобный способ добавить полнотекстовый поиск в ваше приложение Laravel. Он...
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
0
3
1 406
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вероятно, вам нужно что-то подобное, когда при начальной загрузке страницы не будет никакого значения сервера, поэтому он не может установить значение для переменной $userLangs. Таким образом, согласно вашему коду, оператор if терпит неудачу, поскольку нет значения сеанса, и условие elseif также терпит неудачу, поскольку для $userLangs не установлено значение, которое нельзя найти в $ availableLangs. Просто добавьте еще одно условие, чтобы установить язык веб-сайта по умолчанию, когда нет предпочтительного пользовательского языка.

public function handle($request, Closure $next) 
{
    $availableLangs  = array('en', 'hu', 'pt', 'ro', 'sv');
    $userLangs = substr($request->server('HTTP_ACCEPT_LANGUAGE'), 0, 2);

    if (\Session::has('locale'))
    {
        \App::setlocale(\Session::get('locale'));
    }
    else if (in_array($userLangs, $availableLangs))
    {
        \App::setLocale($userLangs);
        Session::put('locale', $userLangs);
    }
    else {
        \App::setLocale('en');
        Session::put('locale', 'en');
    }
    return $next($request);
}

кажется, теперь работает, я сделал то же самое, что и ваш код, но он говорит strtolower() expects parameter 1 to be string, array given, и он исходит из if, потому что, если я прокомментирую, это работает. это \Session::get('locale') массив?

Sebastiano 10.04.2019 09:57

Я думаю, проблема в том, что мы использовали session::push, который я никогда раньше не смотрел. Обновите код следующим образом session::put. Я обновлю свой ответ сейчас. Вам нужно очистить сеанс один раз, поскольку значение в сеансе уже сохранено в виде массива

Ashok 10.04.2019 10:01

Взгляните на эту ссылку: laravel.com/docs/5.0/сессия При необходимости сбросить сеанс. Если ответ работает нормально, проголосуйте за него;)

Ashok 10.04.2019 10:07

да, кажется, работает, хотя мне нужно будет правильно протестировать его на другом компьютере с другой локалью, указанной в массиве, чтобы быть уверенным на 100%, но, по крайней мере, сейчас у меня нет ошибок

Sebastiano 10.04.2019 10:07

Да, хорошо, проверьте с разными значениями локали, также я предпочитаю, чтобы у вас была локаль по умолчанию в файле .env, а не жестко запрограммирована в коде. Вместо жесткого кодирования значения 'en' в коде добавьте его в файл .env и получите доступ к значению .env в коде.

Ashok 10.04.2019 10:09

У меня есть локаль, установленная в .env, но таким образом, когда я перехожу к domain/city1, мой элемент выбора с языками выбирает правильный язык. Я использую этот код <option value = "locale/hu" {{ \Session::get('locale') == 'hu' ? 'selected' : '' }} >HU</option>

Sebastiano 10.04.2019 10:12

Другие вопросы по теме