8000 [Form] Allow to translate each language into its language in Language… · symfony/symfony@25bc300 · GitHub
[go: up one dir, main page]

Skip to content

Commit 25bc300

Browse files
committed
[Form] Allow to translate each language into its language in LanguageType
1 parent a731c3b commit 25bc300

File tree

2 files changed

+59
-3
lines changed

2 files changed

+59
-3
lines changed

src/Symfony/Component/Form/Extension/Core/Type/LanguageType.php

Lines changed: 26 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
use Symfony\Component\Form\ChoiceList\ArrayChoiceList;
1616
use Symfony\Component\Form\ChoiceList\Loader\ChoiceLoaderInterface;
1717
use Symfony\Component\Form\ChoiceList\Loader\IntlCallbackChoiceLoader;
18+
use Symfony\Component\Form\Exception\LogicException;
1819
use Symfony\Component\Intl\Languages;
1920
use Symfony\Component\OptionsResolver\Options;
2021
use Symfony\Component\OptionsResolver\OptionsResolver;
@@ -42,16 +43,38 @@ public function configureOptions(OptionsResolver $resolver)
4243
$resolver->setDefaults([
4344
'choice_loader' => function (Options $options) {
4445
$choiceTranslationLocale = $options['choice_translation_locale'];
45-
46-
return new IntlCallbackChoiceLoader(function () use ($choiceTranslationLocale) {
47-
return array_flip(Languages::getNames($choiceTranslationLocale));
46+
$choiceSelfTranslation = $options['choice_self_translation'];
47+
48+
return new IntlCallbackChoiceLoader(function () use ($choiceTranslationLocale, $choiceSelfTranslation) {
49+
if (true === $choiceSelfTranslation) {
50+
foreach (Languages::getLanguageCodes() as $languageCode) {
51+
try {
52+
$languagesList[$languageCode] = Languages::getName($languageCode, $languageCode);
53+
} catch (\Exception $e) {
54+
}
55+
}
56+
} else {
57+
$languagesList = Languages::getNames($choiceTranslationLocale);
58+
}
59+
60+
return array_flip($languagesList);
4861
});
4962
},
63+
'choice_self_translation' => false,
5064
'choice_translation_domain' => false,
5165
'choice_translation_locale' => null,
5266
]);
5367

68+
$resolver->setAllowedTypes('choice_self_translation', ['boolean']);
5469
$resolver->setAllowedTypes('choice_translation_locale', ['null', 'string']);
70+
71+
$resolver->setNormalizer('choice_self_translation', function (Options $options, $value) {
72+
if (true === $value && $options['choice_translation_locale']) {
73+
throw new LogicException('Cannot use the "choice_self_translation" and "choice_translation_locale" options at the same time. Remove one of them.');
74+
}
75+
76+
return $value;
77+
});
5578
}
5679

5780
/**

src/Symfony/Component/Form/Tests/Extension/Core/Type/LanguageTypeTest.php

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,39 @@ public function testChoiceTranslationLocaleOption()
5656
$this->assertContains(new ChoiceView('my', 'my', 'бірманська'), $choices, '', false, false);
5757
}
5858

59+
/**
60+
* @requires extension intl
61+
*/
62+
public function testChoiceSelfTranslationOption()
63+
{
64+
$choices = $this->factory
65+
->create(static::TESTED_TYPE, null, [
66+
'choice_self_translation' => true,
67+
])
68+
->createView()->vars['choices'];
69+
70+
// Don't check objects for identity
71+
$this->assertContains(new ChoiceView('cs', 'cs', 'čeština'), $choices, '', false, false);
72+
$this->assertContains(new ChoiceView('es', 'es', 'español'), $choices, '', false, false);
73+
$this->assertContains(new ChoiceView('fr', 'fr', 'français'), $choices, '', false, false);
74+
$this->assertContains(new ChoiceView('ta', 'ta', 'தமிழ்'), $choices, '', false, false);
75+
$this->assertContains(new ChoiceView('uk', 'uk', 'українська'), $choices, '', false, false);
76+
$this->assertContains(new ChoiceView('yi', 'yi', 'ייִדיש'), $choices, '', false, false);
77+
$this->assertContains(new ChoiceView('zh', 'zh', '中文'), $choices, '', false, false);
78+
$this->assertContains(new ChoiceView('zh_Hant', 'zh_Hant', '繁體中文'), $choices, '', false, false);
79+
}
80+
81+
/**
82+
* @expectedException \Symfony\Component\Form\Exception\LogicException
83+
*/
84+
public function testSelfTranslationNotAllowedWithChoiceTranslation()
85+
{
86+
$this->factory->create(static::TESTED_TYPE, null, [
87+
'choice_translation_locale' => 'es',
88+
'choice_self_translation' => true,
89+
]);
90+
}
91+
5992
public function testMultipleLanguagesIsNotIncluded()
6093
{
6194
$choices = $this->factory->create(static::TESTED_TYPE, 'language')

0 commit comments

Comments
 (0)
0