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 #}
22
demandé sur Pratik Gadoya 2012-03-24 02:08:39

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) }}
20
répondu Hannoun Yassir 2013-09-01 15:04:52

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);
17
répondu NoelLH 2014-03-22 12:31:08

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

14
répondu Fabrice G 2014-10-12 21:00:02

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();
}
11
répondu sbczk 2012-06-07 16:54:32

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)

en savoir plus sur ce

10
répondu smoreno 2012-03-23 22:44:26

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 }}
7
répondu Dainius 2015-11-26 13:30:15
http://symfony.com/doc/current/cookbook/templating/twig_extension.html):

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 #} 
4
répondu Elvis Ciotti 2015-03-10 11:43:42