当前位置: 首页 > 知识库问答 >
问题:

Laravel在区域设置更改时重定向到路由

湛嘉歆
2023-03-14

我正在尝试在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);
    }
}

共有2个答案

柏夕
2023-03-14

我通过编辑@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));

    }
狄易安
2023-03-14

我想出了解决办法,不再需要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公共功能 所以我的问题是如何让这些重定向工作,我试图搜索谷歌等,我找不到任何答案。这是我在这里的第一篇文章,我的英语