Symfony 4中如何将月份数字转换为土耳其语月份名称
嘿,看你正在从零开始用Symfony 4做带截止日期的待办事项列表,还在纠结怎么把日期里的月份数字转成土耳其语名称对吧?结合你给出的现有代码,我给你几个实用的解决方案:
方法1:借助PHP strftime函数(利用已设置的locale)
你已经在代码里加了setlocale(LC_TIME, "tr_TR");,这步很关键,它告诉PHP要使用土耳其语的本地化规则。接下来就可以用strftime来格式化日期,它会自动输出土耳其语的月份名称。
在Twig模板中直接渲染
如果是在模板里展示Task的截止日期,可以这么写:
{{ task.deadline|date('d') }} {{ task.deadline|strftime('%B') }} {{ task.deadline|date('Y') }}
%B会根据你设置的locale输出完整的月份名称,比如对应1月就会显示Ocak。
在控制器中预处理后传给模板
要是你想在控制器里先处理好日期再传给模板,可以这样写:
// 假设你已经获取了Task实体的deadline字段 $timestamp = $task->getDeadline()->getTimestamp(); $formattedDate = strftime('%d %B %Y', $timestamp); // 把$formattedDate传给模板
⚠️ 注意:确保你的服务器已经安装了土耳其语本地化包,如果是Linux系统,可以通过sudo locale-gen tr_TR.UTF-8命令来安装,不然strftime可能还是会输出英文月份。
方法2:用Symfony自带的localizeddateTwig过滤器
如果你希望整个应用的日期显示都统一用土耳其语,可以先在配置里设置默认locale:
打开config/packages/translation.yaml,修改成这样:
framework: default_locale: 'tr' translator: default_path: '%kernel.project_dir%/translations' fallbacks: - 'en'
然后在Twig模板里直接使用localizeddate过滤器:
{{ task.deadline|localizeddate('long', 'none', 'tr') }}
这个过滤器的三个参数分别是:日期格式(long会显示完整的月份名称)、时间格式(none表示不显示时间)、语言代码(这里指定土耳其语)。这样就能直接输出类似15 Ocak 2025的日期了。
方法3:自定义Twig过滤器(完全自主控制)
如果上面的方法都不符合你的需求,比如不想依赖服务器locale设置,那可以自己写一个Twig过滤器来手动映射土耳其语月份:
- 先创建过滤器类:
// src/Twig/MonthNameExtension.php namespace App\Twig; use Twig\Extension\AbstractExtension; use Twig\TwigFilter; class MonthNameExtension extends AbstractExtension { public function getFilters() { return [ new TwigFilter('turkish_month', [$this, 'getTurkishMonthName']), ]; } public function getTurkishMonthName(\DateTimeInterface $date) { // 土耳其语月份名称映射 $turkishMonths = [ 1 => 'Ocak', 2 => 'Şubat', 3 => 'Mart', 4 => 'Nisan', 5 => 'Mayıs', 6 => 'Haziran', 7 => 'Temmuz', 8 => 'Ağustos', 9 => 'Eylül', 10 => 'Ekim', 11 => 'Kasım', 12 => 'Aralık', ]; return $turkishMonths[$date->format('n')]; } }
- 然后在Twig模板里使用这个过滤器:
{{ task.deadline|date('d') }} {{ task.deadline|turkish_month }} {{ task.deadline|date('Y') }}
这种方法完全不需要依赖服务器的本地化配置,所有月份名称都是你自己定义的,灵活性拉满。
内容的提问来源于stack exchange,提问作者Alp Sukuf

