【发布时间】:2018-09-06 05:36:31
【问题描述】:
看来我真的把自己弄进了这个兔子洞。我的任务是使用 LaravelGettext 将本地化实现到 Laravel 项目中(因为这似乎只是一个支持 PO 文件的项目)。路由要求似乎很简单,每次调用页面 URL 时,例如像这样:
https://page.com/user
例如de 作为备用/缓存会话语言环境,它应该重定向到:
https://page.com/de/user
除非已经在 URL 中手动定义了有效的语言环境前缀。从那里开始的每个后续 URL 都应该具有相同的语言环境前缀,除非更改。
这个概念看起来很简单,但根据需要实施已经变成了我在谷歌上搜索如何正确设置路线的几个小时。类似的方法
routes\web.php
Route::prefix('{locale?}')->middleware('locale')->group(function() {
//all routes go here
});
App\Middleware\Locale
...
public function handle($request, Closure $next) {
$locale = $request->segment(1);
if (!in_array($locale, config('laravel-gettext.supported-locales'))) {
$segments = $request->segments();
$fallback = session('locale') ?: config('laravel-gettext.fallback-locale');
$segments = array_prepend($segments, $fallback);
return redirect()->to(implode('/', $segments));
}
session(['locale' => $locale]);
app()->setLocale($locale);
LaravelGettext::setLocale($locale);
return $next($request);
}
不幸的是,由于前缀错误地解释了具有多个段的 URL,因此失败了。也不推荐使用可选前缀。
有人可以向我推荐一个可靠的解决方案吗?我对此感到非常沮丧。
【问题讨论】:
-
我怀疑将语言环境作为 uri 段会导致很多麻烦,因此假设这是您的任务的硬性要求(而不是将其放在子域中),您是否尝试过添加全局约束到您的语言环境 uri 段,以便它只响应您期望的语言环境?据推测,这将有助于前缀误解具有多个段的 URL。
-
我曾经有一个类似的解决方案,将语言环境检查完全外包给 RouteServiceProvider。至于解析没有语言环境前缀的链接,建议我在 Exceptions\Handler 类中捕获一个 HttpNotFoundException 并将(301)重定向到具有后备语言环境前缀的同一链接。这有一个奇怪的问题,尽管默认语言环境以某种方式被缓存并覆盖了会话中的语言环境,并且对于 LaravelGettext 以某种方式......无法弄清楚该怎么做。
标签: php laravel localization