Я реализовал функцию переключения языка после эта почта, и она работает отлично, но только когда вы нажимаете на переключатель языка, хотя я хотел бы изменить 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/...
Я попробую, я новичок в Laravel, поэтому многого не понимаю. этот код должен работать также при загрузке или только тогда, когда он получает URL-адрес locale/{locale}
, как сказано в руководстве?
Да, этот код будет работать, не обязательно всегда передавать локаль в URL-адресе. Мы можем сделать это таким образом.
Вероятно, вам нужно что-то подобное, когда при начальной загрузке страницы не будет никакого значения сервера, поэтому он не может установить значение для переменной $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')
массив?
Я думаю, проблема в том, что мы использовали session::push, который я никогда раньше не смотрел. Обновите код следующим образом session::put
. Я обновлю свой ответ сейчас. Вам нужно очистить сеанс один раз, поскольку значение в сеансе уже сохранено в виде массива
Взгляните на эту ссылку: laravel.com/docs/5.0/сессия При необходимости сбросить сеанс. Если ответ работает нормально, проголосуйте за него;)
да, кажется, работает, хотя мне нужно будет правильно протестировать его на другом компьютере с другой локалью, указанной в массиве, чтобы быть уверенным на 100%, но, по крайней мере, сейчас у меня нет ошибок
Да, хорошо, проверьте с разными значениями локали, также я предпочитаю, чтобы у вас была локаль по умолчанию в файле .env, а не жестко запрограммирована в коде. Вместо жесткого кодирования значения 'en' в коде добавьте его в файл .env и получите доступ к значению .env в коде.
У меня есть локаль, установленная в .env, но таким образом, когда я перехожу к domain/city1
, мой элемент выбора с языками выбирает правильный язык. Я использую этот код <option value = "locale/hu" {{ \Session::get('locale') == 'hu' ? 'selected' : '' }} >HU</option>
Я думаю, вам нужно добавить еще одно условие в свой код. Когда по умолчанию загружается страница, вы отправляете это значение «HTTP_ACCEPT_LANGUAGE»? Я думаю, что вы не получите никакого значения, когда страница загружается по умолчанию, поэтому ваше условие else if для проверки значения с принятыми языками не удалось. Я бы посоветовал вам добавить еще одно условие: вы просто используете язык по умолчанию для сеанса и устанавливаете его как локаль.