【发布时间】:2020-10-16 10:01:16
【问题描述】:
我有 9 种不同语言的 Laravel 应用程序:
/resources
-- /lang
-- -- /en_US.json
-- -- /fr_FR.json
-- -- /...
我正在尝试设置本地化 URL,例如:
Route::get(__("link.projects"), 'GuestController@projects');
网站上的所有内容都以正确的语言显示,但路由会返回 404 页面,默认后备语言除外。
我的网页.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);
}
}
在生产中使用后备语言 URL,我可以将内容本地化,但 web.php 中的 URL 不允许翻译。 我不想在 URL 中有前缀,因为不同的语言环境是由域设置的。
【问题讨论】:
-
路由在中间件运行之前就已注册... 可能您可以在 Http 内核处理请求之前设置语言环境(仅基于主机),但是会话内容必须使用中间件完成
-
你知道如何从web.php中获取当前域吗?在那种情况下,我想可以做一个简单的 if 语句,然后直接强制本地化@lagbox