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:我在各大搜索引擎和人工智能里都无法找到类似实现过程。

《L05 电商实战》
从零开发一个电商项目,功能包括电商后台、商品 & SKU 管理、购物车、订单管理、支付宝支付、微信支付、订单退款流程、优惠券等
《G01 Go 实战入门》
从零开始带你一步步开发一个 Go 博客项目,让你在最短的时间内学会使用 Go 进行编码。项目结构很大程度上参考了 Laravel。
讨论数量: 3
翟宇鑫

docs/intro 路由怎么定义的,发出来看看?
我用 Laravel 10 测试没有问题

file

file

file

file

file

1年前 评论

我觉得还是通过二级域名设置比较好,然后中间件设置一下,这样路由不受影响

1年前 评论

刚刚查了下源码,匹配路由的时候采用的是正则表达式匹配,路由规则为 {locale?}/index,最终生成的路由规则是 ^\/(?P<locale>[^\/]++)\/index$,虽然路由规则定义的是 ? ,但最终的正则表达式是 +

file

所以 /index 匹配不到这个规则,我尝试使用 Route::pattern('locale', '[a-zA-Z]*'); 来定义 locale,但是最终的正则表达式还是需要匹配 /

file

我记得我以前做多语言路由 prefix 的时候是采用循环生成的方式:

$locales = [
'','en','zh-cn','jp'
];

foreach($locales as $locale){
        Route::prefix($locale)->group(function(){
                 Route::get('/index','IndexController@index');
        })
}
1年前 评论