PHP Laravel - многоязычная маршрутизация с LaravelGettext? - PullRequest
0 голосов
/ 05 сентября 2018

Кажется, с этим я действительно попал в кроличью нору. Мне поручено внедрить локализацию в проект Laravel с помощью LaravelGettext (так как кажется, что это только один с поддержкой PO-файла). Требования к маршрутизации кажутся довольно простыми, каждый раз, когда URL-адрес страницы называется, например, как это:

https://page.com/user

Например, de в качестве резервной / кэшированной локали сеанса предполагается перенаправить на:

https://page.com/de/user

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

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

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

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

1 Ответ

0 голосов
/ 06 сентября 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...