看来我真的很喜欢这个兔子洞。我的任务是使用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,因此会丢失多个网段。也不建议使用可选前缀。
有人能推荐我一个可靠的解决方案吗我对此感到非常沮丧。
这应该有所帮助。当我使用gettext时,这是我的方式。这是routes.php
$locale = Request::segment(1);
if(in_array($locale, config('app.locales'))){
Config::set('app.locale', $locale);
if($locale=='bg') $gettext_locale = 'bg_BG';
if($locale=='en') $gettext_locale = 'en_US';
if($locale=='ru') $gettext_locale = 'ru_RU';
if($locale=='ro') $gettext_locale = 'ro_RO';
if($locale=='sk') $gettext_locale = 'sr_RS';
if($locale=='mk') $gettext_locale = 'mk_MK';
LaravelGettext::setLocale($gettext_locale);
}else{ // default locale
Config::set('app.locale', 'bg');
LaravelGettext::setLocale('bg_BG');
$locale = '';
}
Route::group([
'prefix' => $locale
], function(){...}
现在我使用这样的数据库:https://gist.github.com/escapeboy/b50f252f095916963e8130bc9dc69f56