我已经决定使用$ 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中。我目前正在考虑只使用正则表达式替换它,因为它是最直接的解决方案。
答案 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,然后在输入字符串中插入或替换输入字符串作为语言参数。
提醒一下,使用此路由组时,您需要使用操作('HomeController @ index')创建链接,以使区域设置跟随您到下一个链接。链接到/关闭将删除当前选择的任何语言。