Кажется, я действительно попал в кроличью нору с этим. Мне поручено реализовать локализацию в проекте Laravel с помощью LaravelGettext (поскольку это, похоже, только один с поддержкой файлов PO). Требования к маршрутизации кажутся довольно простыми, каждый раз, когда вызывается URL-адрес страницы, например. нравится:
https://page.com/user
Например, с de в качестве локали резервной / кэшированной сессии, предполагается, что он перенаправляет на:
https://page.com/de/user
если допустимый префикс локали уже не определен внутри URL-адреса вручную. Предполагается, что каждый последующий URL-адрес будет иметь тот же префикс локали, если не будет изменен.
Концепция кажется простой, но реализация по мере необходимости превратилась для меня в часы поиска в Google, как правильно настроить маршруты. Подходит как
routes\web.php
Route::prefix('{locale?}')->middleware('locale')->group(function() {
//all routes go here
});
App\Middleware\Locale
...
public function handle($request, Closure $next) {
$locale = $request->segment(1);
if (!in_array($locale, config('laravel-gettext.supported-locales'))) {
$segments = $request->segments();
$fallback = session('locale') ?: config('laravel-gettext.fallback-locale');
$segments = array_prepend($segments, $fallback);
return redirect()->to(implode('/', $segments));
}
session(['locale' => $locale]);
app()->setLocale($locale);
LaravelGettext::setLocale($locale);
return $next($request);
}
к сожалению, это не удается с URL-адресами, имеющими несколько сегментов, поскольку префикс неверно их интерпретирует. Не рекомендуется использовать дополнительные префиксы.
Может ли кто-нибудь порекомендовать мне надежное решение? Я очень расстраиваюсь из-за этого.
У меня уже было похожее решение с проверкой локали, полностью переданной на аутсорсинг RouteServiceProvider. Что касается разрешения ссылок без префикса локали, мне было предложено перехватить HttpNotFoundException внутри класса Exceptions \ Handler и перенаправить (301) на ту же ссылку с резервным префиксом локали. У этого была странная проблема, хотя локаль по умолчанию каким-то образом была кэширована и переопределила локали в сеансе, а для LaravelGettext каким-то образом ... не мог понять, что с этим делать.






Это должно помочь. Это мой старый способ, когда я использовал gettext. Это routes.php
$locale = Request::segment(1);
if (in_array($locale, config('app.locales'))){
Config::set('app.locale', $locale);
if ($locale=='bg') $gettext_locale = 'bg_BG';
if ($locale=='en') $gettext_locale = 'en_US';
if ($locale=='ru') $gettext_locale = 'ru_RU';
if ($locale=='ro') $gettext_locale = 'ro_RO';
if ($locale=='sk') $gettext_locale = 'sr_RS';
if ($locale=='mk') $gettext_locale = 'mk_MK';
LaravelGettext::setLocale($gettext_locale);
}else{ // default locale
Config::set('app.locale', 'bg');
LaravelGettext::setLocale('bg_BG');
$locale = '';
}
Route::group([
'prefix' => $locale
], function(){...}
Сейчас я использую такую базу данных: https://gist.github.com/escapeboy/b50f252f095916963e8130bc9dc69f56
Я подозреваю, что использование локали в качестве сегмента uri приведет к многочисленным головным болям, поэтому, предполагая, что это жесткое требование вашей задачи (в отличие от простого удаления его в поддомене), пробовали ли вы добавить глобальное ограничение в свой сегмент uri локали, чтобы он реагирует только на те регионы, которые вы ожидаете? Предположительно, это поможет с префиксом, неверно интерпретирующим URL-адреса с несколькими сегментами.