Obtenir le nom du pays traduit à partir d'un code de pays à 2 chiffres en Symfony2/brindille?
j'utilise le Symfony2 pays type de champ, il fonctionne bien et les noms de pays sont traduits. Je stocke le code de pays à deux chiffres dans la colonne country
de mon entité.
Comment afficher le nom complet traduit du pays? Voici comment j'ai ajouté le champ au formulaire:
$builder
->add('country', 'country', array(
'label' => 'Paese', 'preferred_choices' => array('IT')
));
puis dans mon controller:
$user = $this->getDoctrine()->getRepository('AcmeHelloBundle:User');
$countryCode = $user->getCountry();
$countryName = null; // Get translated country name from code
Ou dans mon template twig:
{# Output the country code and name #}
{{ user.country }}
{# translated country name from code #}
7 réponses
je ne sais pas si vous avez encore besoin... mais cela pourrait aider quelqu'un d'autre. cela peut être fait facilement par une extension de brindille (ce code est basé sur la réponse de @tomaszsobczak )
<?php
// src/Acme/DemoBundle/Twig/CountryExtension.php
namespace Acme\DemoBundle\Twig;
class CountryExtension extends \Twig_Extension {
public function getFilters()
{
return array(
new \Twig_SimpleFilter('country', array($this, 'countryFilter')),
);
}
public function countryFilter($countryCode,$locale = "en"){
$c = \Symfony\Component\Locale\Locale::getDisplayCountries($locale);
return array_key_exists($countryCode, $c)
? $c[$countryCode]
: $countryCode;
}
public function getName()
{
return 'country_extension';
}
}
Et dans vos services.yml fichiers
# src/Acme/DemoBundle/Resources/config/services.yml
services:
acme.twig.country_extension:
class: Acme\DemoBundle\Twig\CountryExtension
tags:
- { name: twig.extension }
exemple D'utilisation dans un fichier de brindilles:
{{ 'US'|country(app.request.locale) }}
selon le commentaire de @Rvanlaak ci-dessus, \Symfony\Component\Locale\Locale est maintenant deprecated. Je pense que le plus concis façon de le faire est:
use Symfony\Component\Intl\Intl;
...
$country = Intl::getRegionBundle()->getCountryName($countryCode);
inspiré de la réponse de Hannoun Yassir, j'utilise L'Intl comme dans le champ country type. Le code d'extension de brindille est
<?php
namespace Tbl\SagaBundle\Twig;
use Symfony\Component\Intl\Intl;
class CountryExtension extends \Twig_Extension
{
public function getFilters()
{
return array(
new \Twig_SimpleFilter('countryName', array($this, 'countryName')),
);
}
public function countryName($countryCode){
return Intl::getRegionBundle()->getCountryName($countryCode);
}
public function getName()
{
return 'country_extension';
}
}
?>
ajouter une extension de brindille dans les services.yml
# src/Acme/DemoBundle/Resources/config/services.yml
services:
acme.twig.acme_extension:
class: Acme\DemoBundle\Twig\CountryExtension
tags:
- { name: twig.extension }
utilisation dans le template (le nom du pays sera affiché en locale par défaut (voir Symfony/Component/Intl/ResourceBundle/RegionBundleInterface.php)
{{ user.countryCode|countryName }}
Merci beaucoup Yassir, cette version n'utilise pas locale dépréciée depuis la version 2.3 >> http://symfony.com/components/Locale
Vous pouvez utiliser le même composant que Symfony utilise pour le type de champ Pays
public function humanCountry() {
$c = \Symfony\Component\Locale\Locale::getDisplayCountries('en');
return array_key_exists($this->getCountry(), $c)
? $c[$this->getCountry()]
: $this->getCountry();
}
Utilisez SonanaIntlBundle, vous pouvez faire quelque chose comme ceci:
{{ 'FR' | country }} => France (if the current locale in request is 'fr')
{{ 'FR' | country('de') }} => Frankreich (force the locale)
{{ 'fr' | language }} => français (if the current locale in request is 'fr')
{{ 'fr' | language('en') }} => French (force the locale)
{{ 'fr' | locale }} => français (if the current locale in request is 'fr')
{{ 'fr' | locale('en') }} => French (force the locale)
si vous utilisez des entities une option au lieu de faire des filtres de brindilles est de créer une fonction pour obtenir le nom du pays à l'intérieur de l'entity.
use Symfony\Component\Intl\Intl;
public function getCountryName() {
return Intl::getRegionBundle()->getCountryName($this->getCountry());
}
ainsi en brindille plus tard vous pouvez faire
{{ user.countryName }}
new \Twig_SimpleFilter('country_name', function($value) {
return \Symfony\Component\Intl\Intl::getRegionBundle()->getCountryName($value);
}),
utilisation dans un template twig
{{ 'GB' | country_name }} {# displays United Kingdom #}