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

#laravel #localization #multilingual

#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/...
  

Комментарии:

1. Я думаю, вам нужно добавить еще одно условие else в ваш код. При загрузке страницы по умолчанию вы отправляете это значение ‘HTTP_ACCEPT_LANGUAGE’? Я думаю, вы не получите никакого значения при загрузке страницы по умолчанию, поэтому ваше условие else if для проверки значения с помощью принятых языков не удалось. Я бы посоветовал вам добавить еще одно условие, при котором вы просто устанавливаете язык по умолчанию для сеанса и устанавливаете его в качестве локали

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

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

Ответ №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);
}
  

Комментарии:

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

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

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

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

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