转换日期语言环境

7
有人能告诉我如何在Symfony2中切换本地日期格式吗?
无论我在配置中设置什么(framework.session.default_locale),这总是返回英语的星期几(我需要德语的星期几):
$start->format("D d.m.Y");

当我输出默认区域设置时,无论我在config.yml文件中进行了什么设置,它总是返回“de”。顺便说一下,保留所有HTML标签。
echo  \Locale::getDefault()

额外信息:

我希望能够以正确的方式格式化日期(即包含正确的德国星期几),并在本地系统和服务器上正确输出。尝试使用 strftime 进行格式化,但由于实际开发和生产环境的区别导致其使用了不同命名方案的区域设置包出现了问题。 这里有另一个相关的 SO 问题: PHP:为什么我的日期在服务器上格式不同?


请查看 https://dev59.com/vGsy5IYBdhLWcg3wyw-i#23424315。 - Nic Wortel
5个回答

8
Symfony2核心没有提供任何日期格式化程序。它只是通过嗅探会话和请求来配置\Locale::getDefault()值。您需要提供一些额外的服务来处理每个区域设置的格式,例如SonataIntlBundle。该捆绑包在扩展中添加了一些Twig过滤器,并提供一些可在任何地方使用的帮助器。一旦激活,您可以在模板中使用它们,例如:
{{ my_date|format_datetime }}

这里有更多信息:https://github.com/sonata-project/SonataIntlBundle/blob/master/Resources/doc/reference/datetime.rst

2
感谢指出Symfony没有这个功能。但是一定有办法使用Intl来实现这个功能。我看了SonataIntlBundle的代码,但是还是不理解。 我感觉自己像在火星上-难道真的只有我一个人遇到这个问题吗? - stoefln
很多Sonata的东西会让你觉得自己在火星上 :) 但Symfony相关代码的许多部分也是这样的 :) 当然,你可以直接使用Intl*类,并使用$session->getLocale()或其他方式进行配置。 - Florian Klein
现在我明白了,有一些有价值的信息对我来说是缺失的:用户的语言环境在登录时设置,因此更改配置在用户注销并重新登录之前不会产生任何效果。谢谢! - stoefln

4
我在我的项目中使用了以下代码来格式化日期(您需要为php打开intl扩展):
<?php
    class DefaultController extends Controller {
        public function indexAction() {
            $date = new \DateTime("now");
            $formatter = new \IntlDateFormatter(\Locale::getDefault(), \IntlDateFormatter::NONE, \IntlDateFormatter::NONE);
            $formatter->setPattern("EEEE Y-M-d");
            return array('locale' => \Locale::getDefault(), "intl" => $formatter->format($date));
    }

这对我来说很有效。要创建格式化模式,您可以在http://userguide.icu-project.org/formatparse/datetime中找到相关内容。

但是我没有找到Twig的帮助程序,所以您可以自己创建。


我在这里以一行代码的方式发布了相同的方法:https://stackoverflow.com/a/53053409/1668200 - Thomas Landauer

2
只需在config.yml文件中添加twig扩展即可。
services:
    twig.extension.intl:
        class: Twig_Extensions_Extension_Intl
        tags:
            - { name: twig.extension }

在你的Twig模板中 语法: {{ myDate | localizeddate('sizeDate', 'sizeHour', 'locale') }} myDate: 必须是一个DateTime对象 sizeDate: 可选参数none/short/medium/long/full sizeHour: 可选参数none/short/medium/long/full locale: 可选参数,默认使用会话语言,但你可以强制指定不同的区域设置值
{{ myDate | localizeddate('full', 'none') }} ({{ myDate | localizeddate('none', 'short') }})
<!--
locale "fr" : vendredi 21 décembre 2012 (13:37)
locale "en : Friday, December 21, 2012 (13:37 PM)
-->

如果你收到错误信息"Please install the ‘intl’ extension for full localization capabilities",请安装php5-intl软件包。例如,在Debian服务器上,命令为:apt-get install php5-intl。别忘了清除缓存 ;)

2
一种更简单的方式是将格式存储在翻译文件中,像这样:
在“messages.en.yml”文件中:
date.format: m/d/Y
time.format: g:i A

在“messages.fr.yml”文件中:
date.format: d/m/Y
time.format: H:i

然后,在twig文件中,你可以这样做:
{{ my_date|date('date.format'|trans) }}

所以日期将自动以正确的格式显示,使用当前的语言环境。


这是我认为最简单的方法。它让你有可能定义像长、短等格式,并且可以直接使用,无需任何额外的包。 - Stefan Staub
1
这里唯一的问题是星期和月份的名称没有被翻译。 - Stefan Staub

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接