【问题标题】:Generating language changing urls in laravel在 laravel 中生成语言更改 url
【发布时间】:2017-03-18 06:43:28
【问题描述】:

我决定在我的所有路由前加上一个 $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 参数。你应该可以写出类似这个伪代码的东西:

route(Route::Current(), [$locale => 'foo'])

问题:

我想使用我当前的 URL 并替换其中的一个参数。我该怎么做?

更新 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 中插入语言。我目前正在考虑仅使用正则表达式替换来执行此操作,因为它是最直接的解决方案。

【问题讨论】:

  • 您想prefix all [my] routes,但您也想将其设为可选?那么你真正想要的是什么?我认为最好在您的路线中添加 ALL 或 NONE 前缀。
  • 我想要一个工作的语言环境系统,其 url 中的语言环境。如果 url/request 中缺少区域设置,则应使用默认区域设置。
  • 我认为这并不容易,因为 Laravel 不知道什么时候应该将第一个参数解释为语言环境,什么时候不应该。
  • 如果第一个参数匹配来自 Config::get('app.available_locales') 的字符串,也许就像我在设置语言环境时所做的那样?
  • 是的,这不可能吗?检查请求的第一段。如果匹配,万岁我们有一个语言环境。如果没有,请将默认语言环境插入请求并重定向。这可能对吧?

标签: php laravel url locale


【解决方案1】:

我没有对此进行测试,但您可以尝试以这种方式进行。 如果没有给出参数,你可以很容易地重定向到默认的语言环境路由。如果给出第一个参数,则需要检查它是否是正确的语言环境。

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

});

【讨论】:

  • 这适用于索引,但不适用于所有网站。如果有人直接访问 mywebsite.com/about,那么它将重定向到 mywebsite.com/en 而不是 mywebsite.com/en/about。很近了!
  • 您应该(在前缀组中)重定向到具有以下组件的 URL:基本 URL / 区域设置 / 当前请求。
  • 如何访问“当前请求”?
  • 我编辑了我的答案。我不知道你是否可以在 routes.php 文件中使用 Request Facade。不过你可以试一试。
  • @Yannici 另外,您应该分别使用function() use ($defaultLocale)function($locale) use ($defaultLocale) 使$defaultLocale 在两个闭包范围内都可用,或者将此默认语言存储在应用程序配置之类的东西中。使用配置文档:laravel.com/docs/5.0/configuration#after-installation
【解决方案2】:

所以我最终没有用 laravel 魔法解决这个问题,我编写了自己的代码。

Route::Group 保持不变,我用来为不同语言创建 URL:s 的代码如下所示:

<a href="{{ change_locale_url('en') }}"</a>

change_locale_url 函数只是一个正则表达式函数,它使用 URL::Current 获取当前 url,然后插入或替换输入字符串作为 url 中的语言参数。

  • 当我在 mywebsite.com/about 上时,函数输出 mywebsite.com/en/about
  • 当我在 www.mywebsite.com/de/about 上时,函数输出 www.mywebsite.com/en/about
  • 当我在http://mywebsite.com 时,函数输出http://mywebsite.com/en

提醒一下,使用此路由组时,您需要使用 action('HomeController@index') 创建链接,以使语言环境跟随您到下一个链接。链接到 /about 将删除当前选择的任何语言。

【讨论】:

    猜你喜欢
    • 2020-04-26
    • 2021-12-10
    • 2017-07-12
    • 1970-01-01
    • 2016-11-29
    • 1970-01-01
    • 2015-02-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多