#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 в коде.