我要处理这个新的Laravel项目。我们希望提供多种语言版本。
我从JetStream开始了这个项目。身份验证之类的路由由JetStream / Fortify自动处理。然后,我添加了https://github.com/mcamara/laravel-localization来处理本地化。对于我自己创建的路线来说效果很好:
Route::group(
[
'prefix' => LaravelLocalization::setLocale(),
'middleware' => [ 'localeSessionRedirect', 'localizationRedirect', 'localeViewPath' ]
], function()
{
Route::get('/', function () {
return view('welcome');
});
Route::middleware(['auth:sanctum', 'verified'])->get('/dashboard', function () {
return view('dashboard');
})->name('dashboard');
});
但是如何在Jetstream和Fortify处理的路由上设置组,前缀和中间件?
[编辑]
因此,在@TEFO提出一些建议之后,我试图添加一个中间件来处理区域设置。添加了:
Fortify.php:
'path' => '{lang}',
'middleware' => ['web', 'setLang']
新的中间件setLang:
class SetLang {
/**
* Handle an incoming request.
*
* @param \Illuminate\Http\Request $request
* @param \Closure $next
* @return mixed
*/
public function handle(\Illuminate\Http\Request $request, Closure $next) {
// $lang = 'en';
// $request->attributes->add(['lang' => 'en']);
$request->route()->setParameter('lang', 'en');
// $request->request->set('lang', 'en');
return $next($request);
}
}
将中间件添加到$routeMiddleware
。
尝试到达http://mylaravel/en/login
时收到此错误:
ErrorException
Missing required parameters for [Route: login] [URI: {lang}/login]. (View: /var/www/resources/views/auth/login.blade.php)
答案 0 :(得分:7)
最后成功地做到了这一点。我只是简单地禁用了Fortify和Jetstream的路由,将它们复制并推到了我的分组前缀路由中。仍在使用https://github.com/mcamara/laravel-localization,但无论您希望它如何工作,只要您控制路线,就可以自己制作系统或任何东西。
在 JetstreamServiceProvider 中:
public function register() {
Jetstream::ignoreRoutes();
}
在 FortifyServiceProvider 中:
public function register() {
Fortify::ignoreRoutes();
}
并从Fortify vendor/laravel/fortify/routes/routes.php
和Jetstream vendor/laravel/jetstream/routes/livewire.php
(如果使用此方法,我想适应惯性)的路由复制到web.php
文件中,路由组内您需要的前缀。
答案 1 :(得分:1)
我现在几乎不使用mcamara/laravel-localization,但我面临着几乎相同的问题。
基于上面@JeremyBelolo和@TEFO之间的有益讨论,以下解决方案对我有用:
'path' => '{locale}/my-secret-path'
添加到了config/fortify.php
。正如@JeremyBelolo和@ETO讨论的那样,the support for that was recenlty added。\Laravel\Jetstream\Http\Middleware\AuthenticateSession::class
之前的中间件添加到web
$middlewareGroups
app()->setLocale($locale);
和默认的{locale} url参数URL::defaults(['locale' => $locale]);
。考虑到Jetstream,我必须执行与@JeremyBelolo相同的步骤,例如我没有复制jetsream / livewire路线,但是在路线组中使用了以下内容:
require base_path('vendor/laravel/jetstream/routes/livewire.php');
现在,我可以访问{locale}/my-secret-path/login
,其中{locale}
是我的网站支持的语言环境。
答案 2 :(得分:0)
我使用 Jetstream 创建了一个新的 Laravel 项目。我想在我的项目中使用多语言支持,但是当我根据 en/login
中的语言使用 Prefix (de/login
, url
) 时,我也遇到了 Route 问题。我按照以下步骤解决了我的问题。我希望你也会有用:
1 - 我已经在我的项目中包含了这个 https://github.com/mcamara/laravel-localization 上的包。并按顺序执行。
2 - 我在“rautes\web.php”文件中进行了路由设置,如下所示。
Route::group(['prefix' => LaravelLocalization::setLocale(),'middleware' => [
'localeSessionRedirect', 'localizationRedirect','localeViewPath' ]], function(){
/** ADD ALL LOCALIZED ROUTES INSIDE THIS GROUP **/
Route::get('/', function () {return view('welcome');});
Route::middleware(['auth', 'verified'])->get('/dashboard', function () {
return view('back.dashboard');})->name('dashboard');
});
3 - 我已将 包含在 app\Http\Middleware\Kernel.php
中。在 middlewareGroups
前缀的 web
结尾。
protected $middlewareGroups = [
'web' => [....
\Mcamara\LaravelLocalization\Middleware\LaravelLocalizationRoutes::class,
\Mcamara\LaravelLocalization\Middleware\LaravelLocalizationRedirectFilter::class,
\Mcamara\LaravelLocalization\Middleware\LocaleSessionRedirect::class,
\Mcamara\LaravelLocalization\Middleware\LocaleCookieRedirect::class,
\Mcamara\LaravelLocalization\Middleware\LaravelLocalizationViewPath::class,]
4 - 强化路线,将 prefix
包含在 vendor\laravel\fortify\routes.php
- Route::group
中,如下所示:
Route::group(['prefix' => LaravelLocalization::setLocale(),
'middleware' => config('fortify.middleware', ['web'])], function () {
$enableViews = config('fortify.views', true);
.......
5 - Livewire 路由,将 prefix
包含在 vendor\laravel\jetstream\routes\livewire.php
- Route::group
中,如下所示:
Route::group(['prefix' => LaravelLocalization::setLocale(),
'middleware' =>config('jetstream.middleware', ['web'])], function () {
if (Jetstream::hasTermsAndPrivacyPolicyFeature()) {
Route::get('/terms-of-service', [TermsOfServiceController::class, 'show'])-
>name('terms.show');
Route::get('/privacy-policy', [PrivacyPolicyController::class, 'show'])-
>name('policy.show');}
6 - 如果您想将后端和前端分开,您可以在 app\Http\Middleware\Kernel.php
的 protected $routeMiddleware
end of prefix
中添加 protected $routeMiddleware = [
........
'localize'=> \Mcamara\LaravelLocalization\Middleware\LaravelLocalizationRoutes::class,
'localizationRedirect' => \Mcamara\LaravelLocalization\Middleware\LaravelLocalizationRedirectFilter::class,
'localeSessionRedirect' => \Mcamara\LaravelLocalization\Middleware\LocaleSessionRedirect::class,
'localeCookieRedirect' => \Mcamara\LaravelLocalization\Middleware\LocaleCookieRedirect::class,
'localeViewPath' => \Mcamara\LaravelLocalization\Middleware\LaravelLocalizationViewPath::class,
]
,就像在这个 https://github.com/mcamara/laravel-localization 中一样。
if (Math.Round(self, decimals) - Math.Round(value, decimals) < 0)
return -1;
else if (Math.Round(self, decimals) - Math.Round(value, decimals) == 0)
return 0;
else
return 1;
7 - 幸福的结局...