我想在我的网站上添加多语言支持,但我不知道如何最好地实现它。 Laravel文档(https://laravel.com/docs/5.3/localization)非常罕见,所以我做了一些研究,但是每个人似乎都使用不同的解决方案并使用其中包含语言的URL - 例如{{1} }。
我想要一个没有语言标记的URL架构。这样的事情:example.com/en/pagename
现在,根据用户语言,应该翻译URL:
example.com/pagename
example.com/pagename (english)
应使用浏览器设置/语言检测初始语言。用户还应该可以选择在提供的语言之间切换。
在我的网站上,用户可以注册一个帐户。他将能够将他的首选语言保存在数据库中 - 让我们在字段example.com/seitenname (german)
中的表users
中说出来。为了在这种情况下保持简单,它只是一个像" en" (英语)或" de" (德国)。
通过创建如下语言文件来轻松翻译路线:
pref_lang
......和EN的一个:
// resources/lang/de/routes.php
return array(
'contact' => 'kontakt',
'pagename' => 'seitenname'
);
...与这些路线结合,例如:
// resources/lang/en/routes.php
return array(
'contact' => 'contact',
'pagename' => 'pagename'
);
现在只有一个问题,我如何创建这样一个语言切换"按钮,存储浏览器设置/切换操作中的语言或来自SESSION中的数据库以及如何将其重新用于HTML // routes/web.php
Route::get('/', function () {
return view('pages.dashboard');
});
Route::get('/{contact}', function () {
return view('pages.contact');
});
Route::get('/{pay2gether-system}', function () {
return view('pages.pagename');
});
标记中的路由和URL?
答案 0 :(得分:3)
我已经完成了几次,这很容易实现。请按照以下步骤操作,如果您有任何其他问题,请随时提出。
language
表格中创建users
列。这就是我过去设置它的方式$table->string('language')->default('en');
SetLanguage
。web
中app\Http\Kernel.php
中间件组的底部。将以下内容粘贴到handle
方法中。
if ($request->has('language')) {
if (auth()->user()) {
auth()->user()->language = $request->language;
auth()->user()->save();
}
App::setLocale($request->language);
} elseif (auth()->user()) {
App::setLocale(auth()->user()->language);
}
return $next($request);
创建服务提供商并在config/app.php
中注册,并在引导方法中粘贴以下代码。
view()->composer('template.name', function($view) {
$languages = [];
$folders = File::directories(base_path('resources/lang/'));
foreach ($folders as $folder) {
$languages[] = str_replace('\\', '', last(explode('/',$folder)));
}
$view->with('languages', $languages);
});
现在,在您的template.name.blade.php
中,您可以浏览应用程序中可用的语言。
在您的下拉列表中,您应该在循环播放时使用{{ url('/') . '?language=' . $language }}
作为链接。您可以将language
密钥更改为其他密钥,但如果这样做,您还必须在中间件中进行更改。
答案 1 :(得分:0)
我会在中间件中做点什么:
public function handle($request, Closure $next)
{
if ($request->has('language')) {
$path = $request->path();
$locale = $request->get('language');
# save locale
Cookie::queue(Cookie::make(
'language', $locale, 1440 // 24h
));
# set locale
\App::setLocale($locale);
return redirect($path)->withCookie(cookie('language'));
}
if ($locale = $request->cookie('language')) {
\App::setLocale($locale);
}
return $next($request);
}
现在在提供商中:
public function boot()
{
View::composer('template.name', function($view) {
$directory = base_path('resources/lang/');
$languages = \File::directories($directory);
$view->with('languages', array_map('basename', $languages));
});
}
在视图中:
<ul class="dropdown-menu" role="menu">
@foreach ($languages as $lang)
<li>
<a href="{{ url()->current() . '/?language=' . $lang }}" title="">{{ $lang }}</a>
</li>
@endforeach
</ul>
我不太确定这是否是最佳解决方案......也许在Laravel有更多经验的人可以向我们展示另一种解决方案