PHP Laravel - маршрутизация на нескольких языках с LaravelGettext?

Кажется, я действительно попал в кроличью нору с этим. Мне поручено реализовать локализацию в проекте 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-адресами, имеющими несколько сегментов, поскольку префикс неверно их интерпретирует. Не рекомендуется использовать дополнительные префиксы.

Может ли кто-нибудь порекомендовать мне надежное решение? Я очень расстраиваюсь из-за этого.

Я подозреваю, что использование локали в качестве сегмента uri приведет к многочисленным головным болям, поэтому, предполагая, что это жесткое требование вашей задачи (в отличие от простого удаления его в поддомене), пробовали ли вы добавить глобальное ограничение в свой сегмент uri локали, чтобы он реагирует только на те регионы, которые вы ожидаете? Предположительно, это поможет с префиксом, неверно интерпретирующим URL-адреса с несколькими сегментами.

user1669496 05.09.2018 15:51

У меня уже было похожее решение с проверкой локали, полностью переданной на аутсорсинг RouteServiceProvider. Что касается разрешения ссылок без префикса локали, мне было предложено перехватить HttpNotFoundException внутри класса Exceptions \ Handler и перенаправить (301) на ту же ссылку с резервным префиксом локали. У этого была странная проблема, хотя локаль по умолчанию каким-то образом была кэширована и переопределила локали в сеансе, а для LaravelGettext каким-то образом ... не мог понять, что с этим делать.

StrikeAgainst 06.09.2018 14:39
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
2
224
1

Ответы 1

Это должно помочь. Это мой старый способ, когда я использовал 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

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