已弃用:Laravel视图中使用Carbon本地化日期失败的求助
嘿,我来帮你搞定这个Carbon日期本地化的问题!之前我也踩过类似的坑,其实不是你调用Carbon::setLocale('it')没用,而是得和Laravel的应用配置配合起来,还有几个关键细节要注意:
先把Laravel应用的Locale切换成意大利语
Carbon在Laravel里默认会继承应用的语言设置,单独调用Carbon的setLocale经常不生效。- 要是想全局生效,打开
config/app.php,把locale项改成'locale' => 'it'就行。 - 要是只想在这个路由里临时生效,就在路由闭包里加上
app()->setLocale('it');,修改后的路由代码如下:Route::get('/tables/setup', function(){ app()->setLocale('it'); // 临时切换应用语言为意大利语 $now= Date::now('Europe/Paris'); $active_tasks = GanttTask::whereDate('start_date', '<', $now) ->whereDate('end_date', '>', $now) ->get(); return view('my_view', compact('active_tasks')); });
- 要是想全局生效,打开
用
translatedFormat替代format方法
这是很多人容易忽略的点!普通的format方法只会输出英文格式的日期,必须用translatedFormat才能渲染出本地化后的内容。结合你修正后的Blade调用,正确的写法应该是:@foreach($active_tasks as $active_task) {{$active_task->start_date->translatedFormat('l j F Y H:i:s')}} @endforeach另外要确认你的
GanttTask模型里,start_date已经被Eloquent转换成Carbon实例了——可以在模型里添加protected $casts = ['start_date' => 'datetime', 'end_date' => 'datetime'];,确保字段被正确解析。确认Carbon的意大利语语言包存在
Carbon 2.x及以上版本自带了多语言包,但如果你的版本比较旧,可能缺少意大利语的文件。可以去vendor/nesbot/carbon/src/Carbon/Lang目录下看看有没有it.php,如果没有,执行composer update nesbot/carbon更新Carbon到最新版本就行。测试验证
如果还是有问题,可以加个测试路由快速排查:Route::get('/test-carbon', function(){ app()->setLocale('it'); $date = \Carbon\Carbon::now(); dd($date->translatedFormat('l j F Y H:i:s')); });访问这个路由,如果输出的是意大利语日期(比如
venerdì 26 gennaio 2018 09:19:54),说明Carbon本地化是正常的,那问题大概率出在模型字段转换或者视图调用的细节上。
内容的提问来源于stack exchange,提问作者Sebastien D

