【问题标题】:Laravel localization in routes without prefix没有前缀的路由中的 Laravel 本地化
【发布时间】: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

标签: php laravel routes


【解决方案1】:

我想我为你找到了一个完美的解决方案。

通过谷歌快速搜索后,我发现了以下内容:

看看吧!

https://github.com/codezero-be/laravel-localized-routes

【讨论】:

  • 这仍然使用 URL 中的前缀来确定本地化。
【解决方案2】:

我处理这个问题的方法是使用两条路由,一条用于主页(通常包含更复杂的逻辑,如新闻、文章、横幅等),另一条用于任何其他页面。

路线

// 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\-\/]+)');

上面要注意的重要部分是链接在路由末尾的-&gt;where() 方法。这允许您为路由参数声明正则表达式模式匹配。在这种情况下,我允许 {slug} 参数使用字母数字字符、连字符和正斜杠。

这将匹配像这样的蛞蝓

test-page
test-page/sub-page
another-page/sub-page

您可以设置自己的模式。

【讨论】:

  • 将尝试对此进行调查。
【解决方案3】:

好的,所以我稍作休息,想出了一个似乎运行良好的可能解决方案。

$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');

  }

让我知道这是否有任何潜在的中断,但对我来说它正在工作。

【讨论】:

  • 你也可以从像config/locales.php这样的配置文件中获取你的语言数组,它会更具可读性和动态性。
  • 完美。是否更新以包含来自配置的数组 - 但是对于答案,我会保留它。谢谢
  • 假设用户输入siteurl.com/kontakt。 'kontakt' 来自德语。但是您的应用程序默认语言环境是“en”。所以用户会看到英文翻译。我在路线上使用你的方法,但这个问题太令人不安了。
猜你喜欢
  • 2016-03-31
  • 2018-11-30
  • 1970-01-01
  • 2019-07-23
  • 1970-01-01
  • 2016-12-10
  • 2013-01-05
  • 1970-01-01
  • 2019-09-07
相关资源
最近更新 更多