2013-06-30 39 views
0

我正在开发一个多国家多语言应用程序,我遇到的其中一个问题是小数点分隔符和日期格式。我知道setLocale方法,但我看到的唯一更改是翻译。我是否必须使用PHP内置的setlocale方法来正确格式化数字和日期,还是有其他方法?symfony 2号码和日期格式

此外,数字(金钱)存储在数据库MySQL中,我应该使用数据转换器在表单字段使用语言环境还是会由symfony自动处理?

+0

使用symfony的2.3 – mentalic

回答

0

数字与金钱的形式

对于数字和金钱表单域symfony已经有一个number和一个money表单类型,它根据语言环境处理小数点和分组。输出

数字和日期的格式通常你格式化日期(树枝)与像mydate|date("m/d/Y")日期过滤器,但你可以将其设置为完整的树枝环境,所以你只需要调用mydate|date。但是,如果区域设置要求对于整个应用程序是静态的而不是基于用户区域设置的,则只建议这样做。为此,您应该考虑@jkucharovic和@Kris发布的树枝延伸。

+0

这是不好解决。对于每个请求来说,通过做不必要的工作会浪费系统资源 - 新的监听器注入Twig并覆盖默认的Formates - 即使它不会被使用。 更好的解决方案(也是要求不高)创建自定义的Twig扩展,并只在需要时调用它。 – jkucharovic

+1

是的,删除了侦听器,并添加了提示给你发布。 –

2

我建议用PHP intl创建自定义的枝条延伸。你可以看看my answer to similar question

namespace Acme\Bundle\DemoBundle\Twig; 

class IntlExtension extends \Twig_Extension 
{ 

    public function getFilters() 
    { 
     return array(
      new \Twig_SimpleFilter('intl_day', array($this, 'intlDay')), 
      new \Twig_SimpleFilter('intl_number', array($this, 'intlNumber')), 
     ); 
    } 

    // Other methods… 

    /** 
    * NULL locale cause load locale from php.ini 
    */ 
    public function intlNumber($number, $locale = NULL) 
    { 
     $fmt = new \NumberFormatter($locale, \NumberFormatter::DECIMAL); 
     return $fmt->format($number); 
    } 

    public function getName() 
    { 
     return 'intl_extension'; 
    } 
} 

然后在你的枝杈模板,你可以使用:

{{ entity.number_value|intl_number(app.request.locale) }} 

,或者如果您使用的Symfony < 2.1 app.session.locale