【问题标题】:How to set default locale without prefix in Laravel 8如何在 Laravel 8 中设置不带前缀的默认语言环境
【发布时间】:2021-04-21 19:32:03
【问题描述】:

我编写了一个多语言应用程序。我不想为默认语言使用语言环境前缀,所以例如我的 URL 结构应该是这样的:

https://example.com/about-us
https://example.com/contant
https://example.com/es/about-us
https://example.com/es/contant
https://example.com/de/about-us
https://example.com/de/contant

我使用Route::group 将我的路线按locale 前缀分组:

Route::group([
    'prefix' => '{locale}',
    'where' => ['locale' => '[a-z]{2}'],
    'middleware' => 'setlocale'
], function () {
    Route::get('/{page}', [PageController::class, 'show'])->name('page');
});

在我的中间件 setlocale 中,我为 URL 设置了区域设置和前缀:

    public function handle(Request $request, Closure $next)
    {
        if (in_array($request->segment(1), ['es', 'de'])) {
            URL::defaults(['locale' => $request->segment(1)]);
            app()->setLocale($request->segment(1));
        } else {
            URL::defaults(['locale' => 'en']);
            app()->setLocale('en');
        }
        return $next($request);
    }

然后我的控制器打印数据:

class PageController extends Controller
{
    public function show($lang, Page $page)
    {
        dd($page);
    }
}

这适用于 de 和 es 前缀,但不能没有它们 - 对于英语语言。我试图复制Route::get('/{page}', [PageController::class, 'show'])->name('page'); 并将其粘贴到Route::group 之外,但随后只有一个参数被传递给PageController,我收到以下错误:

Too few arguments to function App\Http\Controllers\PageController::show(), 1 passed in /Users/mati/Sites/laravel-app/vendor/laravel/framework/src/Illuminate/Routing/Controller.php on line 54 and exactly 2 expected

【问题讨论】:

  • 您不需要将语言环境传递给控制器​​...stackoverflow.com/questions/65594630/… 看看这是否对您有帮助
  • 谢谢!但是我仍然对blade 文件有疑问。没有我们的 URL 前缀,我有以下错误:Missing required parameter for [Route: homepage] [URI: {locale}] [Missing parameter: locale]. (View: /Users/mati/Sites/laravel-app/resources/views/partials/navbar.blade.php)。我的刀片文件包含<a class="navbar-brand" href="{{ route('homepage') }}">
  • locale 是必需参数,因此必须将某些内容设置为默认值或传递给助手
  • 谢谢!我忘了为这个特定的路由传递中间件。
  • 如果他们点击包含语言环境前缀的 url 在会话中设置它,然后将他们重定向到没有语言环境前缀的 url 并使用会话语言环境作为语言环境,你想要吗?

标签: php laravel


【解决方案1】:

你可以这样做。

检查第一个 slug 是语言前缀而不是默认语言,然后像前缀一样使用它,否则不使用任何内容(null)。

Route::prefix(parseLocale())->group(function () {
     Route::get('/{page}', [PageController::class, 'show'])->name('page');
}

function parseLocale(){
    $locale = request()->segment(1);
    $locales = config('translatable.locales');
    $default = config('app.fallback_locale');

    if ($locale !== $default && in_array($locale, $locales)) {
        app()->setLocale($locale);
        return $locale;
    }
}

在此示例中,config('translatable.locales') 是语言环境数组。

然后从控制器中删除无用的$lang参数:

class PageController extends Controller
{
    public function show(Page $page)
    {
        dd($page);
    }
}

【讨论】:

    【解决方案2】:

    这个完整的解决方案:

    https://example.com/
    https://example.com/contact
    https://example.com/en/
    https://example.com/en/contact
    

    文件'routes/web.php'

    if(!function_exists('parseLocale')) {
        function parseLocale()
        {
            $locale = request()->segment(1);
            if (in_array($locale, ['js', 'css'])) // for speed up :)
                return $locale;
            if (array_key_exists($locale, config('languages'))) {
                app()->setLocale($locale);
                return $locale;
            }
            app()->setLocale('es');  // this default locale
            return '/';
        }
    }
    
    /** Here route */
    Route::prefix(parseLocale())->group(function () {
    
    Route::get('/', [App\Http\Controllers\PropertiesController::class, 'home']);
    Route::get('/contact', function () {
            return view('contact');
        });
    
    });
    

    文件'config/languages.php'

    <?php
    
    return [
        'en' => [
            'display' => 'English',
        ],
        'es' => [
            'display' => 'Español',
        ],
    ];
    

    文件 *.blade.php

    <a href="{{ $init['lang'] }}">Home</a>
    <a href="{{ $init['lang'] }}contact">Contact</a>
    

    文件'app/Providers/AppServiceProvider.php'

    public function boot()
        {
            View::composer('*', function ($view) {
                    $view->with('init', $this->loadTranslate());
            });
        }
    
     private function loadTranslate()
        {
    $locale = app()->getLocale();
            if ($locale == 'es') $lang = '';
            else $lang = $locale . '/';
    
    return [
                'lang' => '/' . $lang,
            ];
        }
    

    【讨论】:

      猜你喜欢
      • 2016-09-07
      • 2020-04-05
      • 2014-09-14
      • 2012-02-07
      • 1970-01-01
      • 1970-01-01
      • 2016-09-09
      • 2014-01-01
      • 1970-01-01
      相关资源
      最近更新 更多