Php 无前缀路由的Laravel定位
我有一个使用9种不同语言的Laravel应用程序:Php 无前缀路由的Laravel定位,php,laravel,routes,Php,Laravel,Routes,我有一个使用9种不同语言的Laravel应用程序: /resources -- /lang -- -- /en_US.json -- -- /fr_FR.json -- -- /... 我正在尝试设置本地化URL,如下所示: Route::get(__("link.projects"), 'GuestController@projects'); 网站上的所有内容都以正确的语言显示,但路由返回404页,默认回退语言除外 My web.php Route::group(['m
/resources
-- /lang
-- -- /en_US.json
-- -- /fr_FR.json
-- -- /...
我正在尝试设置本地化URL,如下所示:
Route::get(__("link.projects"), 'GuestController@projects');
网站上的所有内容都以正确的语言显示,但路由返回404页,默认回退语言除外
My web.php
Route::group(['middleware' => ['web', 'locale']], function () {
/* GUEST */
Route::get('/', 'GuestController@index');
Route::get(__("link.projects"), 'GuestController@projects');
Route::get(__("link.participants"), 'GuestController@participants');
Route::get(__("link.participant")."/{public_id}", 'GuestController@participant');
Route::get(__("link.about"), 'GuestController@about');
Route::get(__("link.contact"), 'GuestController@contact');
});
我的区域设置中间件:
<?php
namespace App\Http\Middleware;
use Closure;
class SetLocale
{
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle($request, Closure $next)
{
if($request->getHost() == "domain.com") {
$locale = 'en_US';
} elseif($request->getHost() == "domain.dk") {
$locale = 'da_DK';
} elseif($request->getHost() == "domain.de") {
$locale = 'de_DE';
} elseif($request->getHost() == "domain.se") {
$locale = 'sv_SE';
} elseif($request->getHost() == "domain.fi") {
$locale = 'fi_FI';
} elseif($request->getHost() == "domain.es") {
$locale = 'es_ES';
} elseif($request->getHost() == "domain.fr") {
$locale = 'fr_FR';
} elseif($request->getHost() == "domain.it") {
$locale = 'it_IT';
} elseif($request->getHost() == "domain.nl") {
$locale = 'nl_NL';
} else {
$locale = 'en_US';
}
if (in_array($locale, [
"en_US",
"da_DK",
"de_DE",
"sv_SE",
"fi_FI",
"es_ES",
"fr_FR",
"it_IT",
"nl_NL"
]
)) {
session()->put('locale', $locale);
} else {
session()->put('locale', 'en_US');
}
if(session()->has('locale')) {
app()->setLocale(session('locale'));
}
return $next($request);
}
}
我想我为你找到了一个完美的解决方案
在谷歌快速搜索后,我发现以下内容:
看看
我处理这个问题的方法是使用两条路径,一条用于主页(通常包含更复杂的逻辑,如新闻、文章、横幅等),另一条用于任何其他页面
路线
// Home page
Route::get('/', [
'as' => 'home',
'uses' => 'PageController@index'
]);
// Catch all page controller (place at the very bottom)
Route::get('{slug}', [
'uses' => 'PageController@getPage'
])->where('slug', '([A-Za-z0-9\-\/]+)');
上面要注意的重要部分是链接在路由末尾的->where()
方法。这允许您声明路由参数的正则表达式模式匹配。在本例中,我允许{slug}
参数使用字母数字字符、连字符和前斜杠
这将匹配像这样的鼻涕虫
test-page
test-page/sub-page
another-page/sub-page
您可以设置自己的模式。好的,所以我稍微休息了一下,想出了一个可能的解决方案,似乎效果很好
$locales = array("en_US","de_DE","es_ES","it_IT","fr_FR","da_DK","sv_SE","fi_FI","nl_NL");
foreach($locales as $locale) {
/* GUEST */
Route::get(__("link.projects", [], $locale), 'GuestController@projects');
Route::get(__("link.participants", [], $locale), 'GuestController@participants');
Route::get(__("link.participant", [], $locale)."/{public_id}", 'GuestController@participant');
Route::get(__("link.about", [], $locale), 'GuestController@about');
Route::get(__("link.contact", [], $locale), 'GuestController@contact');
Route::get(__("link.cookies", [], $locale), 'GuestController@cookies');
Route::get(__("link.terms_of_use", [], $locale), 'GuestController@terms_of_use');
Route::get(__("link.privacy_policy", [], $locale), 'GuestController@privacy_policy');
Route::get(__("link.disclaimer", [], $locale), 'GuestController@disclaimer');
}
让我知道这是否有任何潜在的中断,但对我来说它正在工作。在中间件运行之前,路由已经注册。。。在Http内核(仅基于主机)处理请求之前,您可能会设置语言环境,但是会话内容必须使用中间件完成。您知道如何从web.php获取当前域吗?在这种情况下,我想可能会生成一个简单的if语句,然后直接强制本地化@lagbox这仍然使用URL中的前缀来确定本地化。我将尝试研究一下。您还可以从配置文件(如config/locales.php
)获取语言数组,这样会更具可读性和灵活性动态,完美。已更新以包含来自configs的阵列-但是对于答案,我将保留它。谢谢让我们假设用户进入。“kontakt”来自德语。但应用程序的默认语言环境是“en”。所以用户将看到英文翻译。我正在用你的方法处理我的路线,但这个问题太令人不安了。