【问题标题】:Laravel default locale not in urlLaravel 默认语言环境不在 url
【发布时间】:2018-04-25 13:21:16
【问题描述】:

假设我在网站上有 3 种(或更多语言)。英语、意大利语、法语。英语是默认设置。

我希望主页网址是:

  • mysite.com/ - 英文版
  • mysite.com/it - 意大利语版
  • mysite.com/fr - 法语版

我的路线目前是

Route::get('/{locale}', 'HomeController@index')->name('home');

这适用于法语、意大利语,但显然不适用于仅 mysite.com/ 的英语

我不想要另一条路线

Route::get('/', 'HomeController@index')

因为这样我就可以简单地用任何语言打电话回家了

{{ route('home', $locale) }}

什么是最好的解决方案?

【问题讨论】:

  • 写一个if 语句来检查`routes 中的$locale 并重定向到你的家乡路线?

标签: laravel routes localization locale


【解决方案1】:

我的旧解决方案之一,但仍然可以工作: 在 routes.php 的开头

$locale = Request::segment(1);

if(in_array($locale, ['en','fr','it'])){
    app()->setLocale($locale);
}else{
    app()->setLocale('en');

    $locale = '';
}

然后

Route::group([
  'prefix' => $locale
], function(){ 
   Route::get('/demo', 'TestController@demo')->name('demo');
   ...
})

重要提示:在这种情况下,您应该始终使用命名路由。生成的 URL 将用于当前语言环境:

route('demo') 将在应用语言环境为英语时返回 /demo,在应用语言环境为意大利语时返回 /it/demo!

【讨论】:

    【解决方案2】:

    Laravel 允许在路由定义中使用可选参数,因此您可以将 local 路由参数设置为可选参数:

    Route::get('/{locale?}', 'HomeController@index')->name('home');
    

    在您的 HomeController 中,检查参数以了解是否存在语言环境

    public function index(Request $request, $locale = null) {
      if (empty($locale)) {
        $locale = 'en'; // english by default
      }
    
      ...
    }
    

    希望对你有帮助:)

    【讨论】:

    • 这是一个很好的解决方案。你会为其他页面做什么。我想你不能这样做:Route::get('/{locale?}/my-page', 'HomeController@my-page')->name('my-page');
    • 没有。可选参数需要放在路由的末尾,否则Router不知道如何匹配URL到路由
    猜你喜欢
    • 1970-01-01
    • 2020-07-07
    • 2020-04-05
    • 2011-10-29
    • 2016-09-07
    • 2014-03-31
    • 2017-06-02
    • 2013-12-01
    相关资源
    最近更新 更多