【问题标题】:Symfony countries by localeSymfony 国家/地区(按地区)
【发布时间】:2014-10-18 09:46:31
【问题描述】:

我想扩展 Symfony 的 Country Form Type,以便它自动将所有与当前语言环境对应的国家设置为首选。例如,如果语言环境设置为“en”,我希望首选选项包括所有讲英语的国家(美国、JM..),而如果语言环境设置为“en_JM”,我只想将 JM 添加到首选选项中。

我知道如何在表单中获取语言环境,但我想知道,有没有一种首选方法可以使用 Symfony i18n 组件按短语言环境(即: en 或 de )提取此国家代码列表?

【问题讨论】:

    标签: php symfony internationalization


    【解决方案1】:

    可能有更好的方法来获取使用该语言的所有国家/地区,但您可以为每种语言创建一组 ISO alpha-2 国家/地区代码,然后将区域设置传递给自定义表单类型作为必需的选项。

    public function registerAction(Request $request)
    {
        $builder->add('location', new LocationType(), array(
            'locale' => $request->getLocale(),
        ));
    }
    

    自定义表单类型

    <?php
    
    namespace Your\Bundle\WebsiteBundle\Form\Type;
    
    use Symfony\Component\Form\AbstractType;
    use Symfony\Component\Form\FormBuilderInterface;
    use Symfony\Component\OptionsResolver\OptionsResolverInterface;
    
    class LocationType extends AbstractType
    {
        /**
         * {@inheritdoc}
         */
        public function buildForm(FormBuilderInterface $builder, array $options)
        {
            $preferredChoices = array(
                'en' => array(
                    'US', // United States
                    'CA', // Canada
                    'GB', // United Kingdom
                    'IE', // Ireland
                    'AU', // Australia
                    'ZA', // South Africa
                    // etc
                ),
                'it' => array(
                    'IT', // Italy
                    'CH', // Switzerland
                ),
                'nl' => array(
                    'NL', // Netherlands
                    'BE', // Belgium
                    'SR', // Suriname
                    'ZA', // South Africa
                ),
            );
    
            $builder
                ->add('country', 'country', array(
                    'preferred_choices' => $preferredChoices[$options['locale']],
                ))
                // ->add( more )
            ;
        }
    
        /**
         * {@inheritdoc}
         */
        public function setDefaultOptions(OptionsResolverInterface $resolver)
        {
            $resolver->setRequired(array(
                'locale',
            ));
            $resolver->setAllowedTypes(array(
                'locale' => 'string',
            ));
        }
    
        /**
         * {@inheritdoc}
         */
        public function getName()
        {
            return 'location';
        }
    }
    

    【讨论】:

    • 是的,这是有道理的,但我正在寻找一种方法来从内置的 i18n 系统中获取该数组,而无需自己编写它......一个选择可能是获取所有列表格式为 [a-z]_[AZ] 的完整语言环境,然后提取所有以我的简短语言环境开头的内容...但我想知道是否有更好的方法...
    • 一种选择是使用 $variants = \Symfony\Component\Intl\Intl::getLocaleBundle()->getLocaleNames();然后通过仅选择以语言代码开头的元素来过滤它。它仍然是一个大数组,所以这可能效率低下,最好为每个子数组创建一个缓存。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-20
    • 1970-01-01
    • 2015-11-27
    • 2012-12-17
    • 1970-01-01
    相关资源
    最近更新 更多