有可能是一个更好的办法来获取所有使用这种语言的国家,但你可以为每种语言创建的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';
}
}
是THX是有道理的,但我一直在寻找一种方式来获得从内置的国际化系统,阵列,而不必把它写自己...一个选项也许是以[az] _ [AZ]格式获取所有完整语言环境的列表,然后提取所有以我的短语言环境开始的所有内容...但我想知道是否有更好的方法... – smarques 2014-10-18 16:14:25
一种选择是使用 $ variants = \ Symfony \ Component \ Intl \ Intl :: getLocaleBundle() - > getLocaleNames(); ,然后通过仅选择以语言代码开头的元素进行过滤。 仍然是一个大阵列,所以这可能是低效的,最好是创建每个子阵列的缓存。 – smarques 2014-10-19 16:54:01