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

《L03 构架 API 服务器》
你将学到如 RESTFul 设计风格、PostMan 的使用、OAuth 流程,JWT 概念及使用 和 API 开发相关的进阶知识。
《L02 从零构建论坛系统》
以构建论坛项目 LaraBBS 为线索,展开对 Laravel 框架的全面学习。应用程序架构思路贴近 Laravel 框架的设计哲学。
讨论数量: 3
翟宇鑫

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

file

file

file

file

file

8个月前 评论

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

8个月前 评论

刚刚查了下源码,匹配路由的时候采用的是正则表达式匹配,路由规则为 {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');
        })
}
8个月前 评论

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!