我正在尝试在Laravel5.6中实现基于区域设置的简单多语言路由。28,但在语言更改后仍坚持重定向。
每当用户从页面上的表单选择更改区域设置时,我想根据更改的区域设置立即将用户重定向到正确的路由。
我还创建了两个中间件类:
1。SetLocale-如果未使用HTTP\u ACCEPT\u语言或考虑请求的第一段(准确地说是区域设置),则用于设置区域设置
2。LocalerDirect-用于比较用户和请求区域设置,如果不匹配,则重定向。
例如,如果路由是/en/blog/stackoverflow
更改区域设置后,它应该是/gr/blog/stackoverflow
但不会发生重定向。我做错了什么?
非常感谢。
区域设置:
'locales' => [
'en' => 'English',
'es' => 'Spanish',
'gr' => 'Greek'
]
页面:
{!! Form::open(['route' => 'language.change']) !!}
Language:
{!! Form::select('lang', config('translatable.locales'), app()->getLocale(), ['id' => 'language-select']); !!}
{!! Form::close() !!}
<script>
$(function () {
$('#language-select').on('change', function () {
$(this).closest('form').submit();
});
});
</script>
路线:
Route::post('language/change', 'LanguageController@postChangeLanguage')->name('language.change');
Route::group([
'prefix' => '{locale}',
'middleware' => ['setlocale', 'locale-redirect'],
'where' => ['locale' => implode('|', array_keys(config('translatable.locales')))]
], function () {
Route::get('page', function ($locale) {
return view(Helper::getLocaleView($locale, 'page'));
});
Route::get('home', function ($locale) {
return view(Helper::getLocaleView($locale, 'home'));
});
});
Route::get('/', function () {
return redirect()->to('en/home');
});
语言控制器:
class LanguageController extends Controller
{
public function postChangeLanguage(Request $request)
{
$changeLang = $request->input('lang');
$userLang = app()->getLocale();
if ($userLang !== $changeLang && array_key_exists($changeLang, config('translatable.locales')))
{
session(['locale' => $changeLang]);
app()->setLocale($changeLang);
}
return redirect()->back();
}
}
SetLocale中间件:
class SetLocale
{
public function handle($request, Closure $next)
{
if ($request->method() === 'GET')
{
$requestLocale = $request->segment(1);
if (array_key_exists($requestLocale, config('translatable.locales')))
{
session(['locale' => $requestLocale]);
}
else if (!session()->has('locale'))
{
$browserLanguage = substr($_SERVER['HTTP_ACCEPT_LANGUAGE'], 0, 2);
if (array_key_exists($browserLanguage, config('translatable.locales')))
{
session(['locale' => $browserLanguage]);
}
else
{
session(['locale' => config('translatable.fallback_locale')]);
}
}
app()->setLocale(session('locale'));
}
return $next($request);
}
}
LocaleRedirect中间件:
class LocaleRedirect
{
public function handle($request, Closure $next)
{
$requestLocale = $request->segment(1);
$userLocale = session('locale');
if ($requestLocale !== $userLocale)
{
$segments = $request->segments();
array_shift($segments);
array_unshift($segments, $userLocale);
return redirect()->to(implode('/', $segments));
}
return $next($request);
}
}
我通过编辑@khasky答案解决了问题,将其作为公共解决方案
public function changeLanguage(Request $request)
{
$changeLang = $request->lang;
$userLang = session('locale');
session(['locale' => $changeLang]);
app()->setLocale($changeLang);
$segments = str_replace(url('/'), '', url()->previous());
$segments = array_filter(explode('/', $segments));
array_shift($segments);
array_unshift($segments, $changeLang);
return redirect()->to(implode('/', $segments));
}
我想出了解决办法,不再需要LocaleRedirect中间件。
class LanguageController extends Controller
{
public function postChangeLanguage(Request $request)
{
$changeLang = $request->input('lang');
$userLang = session('locale');
if ($userLang !== $changeLang && array_key_exists($changeLang, config('translatable.locales')))
{
session(['locale' => $changeLang]);
app()->setLocale($changeLang);
$segments = str_replace(url('/'), '', url()->previous());
$segments = array_filter(explode('/', $segments));
array_shift($segments);
array_unshift($segments, $changeLang);
return redirect()->to(implode('/', $segments));
}
return redirect()->back();
}
}
我刚开始使用symfony,我正在尝试建立一个multilang网站,但是我在更改区域设置时遇到了一个问题 我读了一些帖子,也读了相关文档,但语言环境没有改变,我尝试: 但是$locale中的值总是'en'(我的默认语言环境) 我也试试 在本例中,$locale是fr,但翻译总是来自消息。ENyml 我想第一次使用$\u SERVER['HTTP\u ACCEPT\u LANGUAGE']检测用户
我在拉拉维尔4号修建路线时遇到了麻烦 我的路线。php是: http://paste.laravel.com/v92 当我打主页没有在我的网址它的工作和Pagecontroller@showHomepage。当我试图在我的网址像en或nl的语言环境达到它也工作和加载Pagecontroller@showHomepage。 所以:/- 在管理组中,任何相同的事情都不起作用。如果我尝试在没有区域设置的
我的Laravel应用程序有默认为英语(在)。有一个中间件可以检查每个请求,并根据用户首选项设置区域设置。 下面是中间件代码 根据url参数lang设置语言环境,例如 除验证错误外,一切正常。当区域设置设置为“ar”时,在,它显示翻译错误,而与中间件设置的语言环境无关。但是,如果区域设置是由中间件设置的,则视图将被翻译,但验证错误仍然是英语。 有人能指出我错在哪里吗。谢谢
我正在编写一个基于API的LaravelAPI。网址。com,用于托管在www.myurl上的应用程序。com在不同于使用Laravel Fortify的Lravel API的服务器上。 当用户在生成的链接上验证他们的电子邮件时,问题就来了,他们不是被重定向到外部应用程序,而是被重定向到API,而是在他们的浏览器上。 文档中声明此配置在“身份验证”中。pgp中间件可以工作: SPA_URL设置为w
我有一个在ApacheHeroku实例上运行的Laravel5构建,我试图确保所有流量都通过https转换,但是我非常迷路。 我有SSL证书,并成功运行。但是使用Heroku,您不能直接编辑服务器上的. htaccess文件。所以他们在这个页面上的建议是建立一个apache_app.conf,并告诉Heroku通过把这个放在Procfile中来阅读它: 然而,当我这样做时,我添加的几乎任何类型的H
我是一个新手,希望在筛选之前进行筛选,该筛选将检查我想要的内容,并将带错误或成功的重定向返回到相同的配置文件。 这是我的过滤前函数 这是我的路线 Route::组(数组) 路由::get('/user/{username}',数组('as'= 和我的ProfileController公共功能 所以我的问题是如何让这些重定向工作,我试图搜索谷歌等,我找不到任何答案。这是我在这里的第一篇文章,我的英语