route()辅助函数在不同的语言环境中

时间:2015-04-08 08:03:01

标签: laravel routing internationalization laravel-5

我正在尝试创建一个语言切换器,以便您可以轻松地动态更改语言(无需重定向到主页)。

我似乎无法实现的是从不同语言环境中的路由名称获取网址。

想象一下你的mydomain.com/events(或mydomain.com/en/events,因为它们是相同的),我想用法语获取网址(mydomain.com/fr/evenements)......

在我的routes.php中,我有:

$locale = Request::segment(1);
if ( !array_key_exists($locale, Config::get('translatable.languages'))) {
    $locale = null;
    App::setlocale(Config::get('translatable.fallback_locale'));
}else{
    App::setLocale($locale);
}

Route::group(array('prefix' => $locale), function(){
    Route::get(Lang::get('routes.events'), array('as' => 'events.index', 'uses' => 'EventController@index'));
});

我试过了

  1. 在调用route($route_name)帮助程序函数之前设置应用程序区域设置
  2. 使用请求的区域设置(在此示例中为“fr”)设置会话变量,然后调用route($route_name)函数。为此,我还在routes.php的顶部添加了:

    if(Session :: has('requested_locale')){     $ locale = Session :: pull('requested_locale'); }

  3. 我不知道如何处理这个...... 我知道有一个包Laravel Localization可以做到这一点,但我需要它没有那个包(如果可能的话)......

1 个答案:

答案 0 :(得分:2)

我在Laravel 5.1上的解决方案是......

  1. 在config / app.php中定义了区域设置,以使用语言文件

    创建路由

    'locale' => 'en', 'locales' => [ 'en'=>'English', 'fr'=>'Français' ],

  2. 我在resources / lang /目录中定义了我的路由(在我的例子中是'en / routes.php'和'fr / routes.php')

    return [ 'about' => 'a-propos', ];

  3. 使用语言键定义路线,例如:

    Route::get(trans('routes.about'), ['as' => 'about', function () { return view('pages.'.App::getLocale().'.about'); }]);

  4. 然后我创建了仅用于切换到另一个区域设置的虚拟路线,仅在当前路线与请求匹配后

  5. `

    Route::matched(function($route) {
    
        $route = Route::current();
    
        $route_name = $route->getName();
        $route_uri = $route->uri();
    
        $locales = Config::get('app.locales');
    
        foreach ($locales as $locale_code => $locale_name) {
    
            if ($locale_code == App::getLocale()) {
                continue;
            }
    
            if (Lang::has('routes.'.$route_name, $locale_code)) {
                $route_uri = $locale_code . '/' . Lang::get('routes.'.$route_name, [], $locale_code);
            }
            else {
                $route_uri = $locale_code . '/' . substr($route_uri, 3);
            }
    
            Route::get($route_uri, ['as' => 'change_locale_to_'.$locale_code, function(){
    
            }]);
        }
    
    });
    

    `

    1. 最后,我在我想要的视图中使用虚拟路线。 $ locale_toggle是一个Locale eloquent Model,我在中间件中设置了一个语言代码路由前缀来处理语言。
    2. <a href="{{ route('change_locale_to_'.$locale_toggle->code, Route::current()->parameters()) }}" class="dropdown-toggle">