PHP Laravel - 使用LaravelGettext进行多语言环境路由?

问题描述 投票:0回答:1

看来我真的很喜欢这个兔子洞。我的任务是使用LaravelGettext将本地化实现到Laravel项目中(因为这似乎只是支持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,因此会丢失多个网段。也不建议使用可选前缀。

有人能推荐我一个可靠的解决方案吗我对此感到非常沮丧。

php laravel localization
1个回答
0
投票

这应该有所帮助。当我使用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

© www.soinside.com 2019 - 2024. All rights reserved.