在laravel中生成语言更改URL

时间:2016-11-04 12:21:25

标签: php laravel url locale

我已经决定使用$ locale-variable为我的所有路由添加前缀。这是从谷歌搜索中找到的代码:

$locale = Request::segment(1);

if (in_array($locale, Config::get('app.available_locales'))) {
    App::setLocale($locale);
} else {
    $locale = null;
}

Route::group(array('prefix' => $locale), function() {

    //All my routes

});

现在,我想动态生成URL:s以在区域设置之间跳转。我想要一种方法来生成当前的url或路由,但是替换$ locale-parameter。你应该能够编写类似于这个伪代码的东西:

route(Route::Current(), [$locale => 'foo'])

问题:

我想获取当前的网址并在其中替换一个参数。我该怎么做?

更新1:

给我的路线命名,我能够做到这一点:

route('index', 'foo') //Gives mywebsite.com?foo

然而,这不会产生想要的结果mywebsite.com/foo。它改为生成mywebsite.com?foo。我的猜测是路由不明白这个路由是嵌套的并且带有片段前缀,因此它将我的参数视为参数。指定它是我想要更改的语言环境没有帮助:

route('index', ['locale' => 'foo']) //Gives mywebsite.com?locale=foo

更新2:

更改前缀改为:

Route::group(array('prefix' => '{locale?}'), function() {

使route()有效:

route('index', ['locale' => 'foo']) //Gives mywebsite.com/foo
然而,它会破坏组内的一些url:s,因为其中一些以变量开头。路由组内的以下路由停止工作:

Route::get('/{id}', 'FooController@showFoo');

由于routes.php将url mywebsite.com/foo解释为'foo'现在是该语言。如果有一些方法可以在routes.php中为locale设置一个默认值,这样你就可以把它写成{route}而不是{route?}并让它重定向到默认语言环境,如果它丢失了,那么问题就解决了

更新3:

向'prefix'=>方向前进“{locale?}”反而导致太多的子问题值得追求。问题出现在从当前URL生成URL但将语言插入URL中。我目前正在考虑只使用正则表达式替换它,因为它是最直接的解决方案。

2 个答案:

答案 0 :(得分:0)

我没有对此进行测试,但您可以尝试这样做。 如果没有给出参数,您可以轻松地重定向到默认的区域设置路由。如果给出第一个参数,则需要检查它是否是正确的区域设置。

use Illuminate\Support\Facades\Request;

$defaultLocale = 'en';

Route::get('/', function() use ($defaultLocale) {
    return redirect('/' . $defaultLocale);
});

Route::group(array('prefix' => '{locale}'), function($locale) use ($defaultLocale) {

     if(!in_array($locale, Config::get('app.available_locales'))) {
          return redirect('/' . $defaultLocale . '/' . Request::path());
     }

     // All your routes

});

答案 1 :(得分:-1)

所以我最终没有用laravel魔法解决这个问题,我编写了自己的代码。

Route :: Group保持不变,我用来创建URL的代码:不同语言的代码如下:

<a href="{{ change_locale_url('en') }}"</a>

change_locale_url-function只是一个正则表达式函数,它使用URL :: Current来获取当前url,然后在输入字符串中插入或替换输入字符串作为语言参数。

  • 当我在mywebsite.com/about上时,该函数会输出mywebsite.com/en/about
  • 当我在www.mywebsite.com/de/about时,该功能输出www.mywebsite.com/en/about
  • 当我在http://mywebsite.com时,该函数会输出http://mywebsite.com/en

提醒一下,使用此路由组时,您需要使用操作('HomeController @ index')创建链接,以使区域设置跟随您到下一个链接。链接到/关闭将删除当前选择的任何语言。