laravel的路由功能是不是无法优雅地实现像这样设计的本地化(多语言)
当前使用的 Laravel 版本?
laravel 10
您期望得到的结果?
像这样:
axios-http.com/docs/intro 可以访问英文页面
axios-http.com/zh/docs/intro 其他语言则加上前缀,例如zh
您实际得到的结果?
我用 laravel 的路由前缀功能来实现发现无法达到预期:
Route::prefix('{locale?}')->middleware('web')->group(base_path('routes/web.php'));
以上路由当我访问/zh/docs/intro
时一切正常,但是当我访问/docs/intro
时报404。
即使我定义了参数{locale}
的默认值: 生成 URL《Laravel 10 中文文档》 ,问题依旧。
ps:我在各大搜索引擎和人工智能里都无法找到类似实现过程。
docs/intro
路由怎么定义的,发出来看看?我用 Laravel 10 测试没有问题
我觉得还是通过二级域名设置比较好,然后中间件设置一下,这样路由不受影响
刚刚查了下源码,匹配路由的时候采用的是正则表达式匹配,路由规则为
{locale?}/index
,最终生成的路由规则是^\/(?P<locale>[^\/]++)\/index$
,虽然路由规则定义的是?
,但最终的正则表达式是+
所以
/index
匹配不到这个规则,我尝试使用Route::pattern('locale', '[a-zA-Z]*');
来定义locale
,但是最终的正则表达式还是需要匹配/
,我记得我以前做多语言路由 prefix 的时候是采用循环生成的方式: