2012-03-23 24 views
21

Estoy usando Symfony2 country Field Type, funciona bien y los nombres de los países están traducidos. Estoy almacenando el código de país de dos dígitos en la columna country de mi entidad.¿Obtener el nombre del país traducido de un código de país de 2 dígitos en Symfony2/Twig?

¿Cómo puedo ver el nombre del país completo y traducido? Así es como he añadido el campo de la forma:

$builder 
    ->add('country', 'country', array(
     'label' => 'Paese', 'preferred_choices' => array('IT') 
    )); 

Y luego en mi controlador:

$user = $this->getDoctrine()->getRepository('AcmeHelloBundle:User'); 
$countryCode = $user->getCountry(); 
$countryName = null; // Get translated country name from code 

O en mi plantilla ramita:

{# Output the country code and name #} 
{{ user.country }} 

{# translated country name from code #} 

Respuesta

10

Uso SonanaIntlBundle, usted podría haga algo como esto:

{{ '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) 

Read more about this

+0

No voy a instalar un paquete sólo para esto, pero gracias. Creo que el nombre de la cadena ya debería estar en Symfony2. – gremo

11

Usted puede utilizar el mismo componente que Symfony está utilizando para el país Tipo de campo

public function humanCountry() { 
    $c = \Symfony\Component\Locale\Locale::getDisplayCountries('en'); 

    return array_key_exists($this->getCountry(), $c) 
      ? $c[$this->getCountry()] 
      : $this->getCountry(); 
} 
20

No estoy seguro de si todavía necesita ... pero podría ayudar a alguien más. esto se puede hacer a través de una extensión de la ramita con facilidad (este código se basa en la respuesta 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'; 
     } 
    } 

Y en sus archivos services.yml

# src/Acme/DemoBundle/Resources/config/services.yml 
services: 
    acme.twig.country_extension: 
     class: Acme\DemoBundle\Twig\CountryExtension 
     tags: 
      - { name: twig.extension } 

Ejemplo de uso dentro de un archivo ramita:

{{ 'US'|country(app.request.locale) }} 
+3

'\ Symfony \ Component \ Locale \ Locale' será privado en Symfony 3.0 – Rvanlaak

+0

Me gusta esta solución lo mejor, solo ten cuidado en público Función getFilter: Comprueba tu propia versión de la documentación de symfony2 para obtener el valor de retorno adecuado (google for twig custom filtro lo encontrará rápido) – Cesc

+2

Gran solución simple. Para adaptarse a Sf 3.0, simplemente cambie el método 'countryFilter' de esta manera: ' return Symfony \ Component \ Intl \ Intl :: getRegionBundle() -> getCountryName ($ countryCode, $ locale); ' – Ronan

17

Según el comentario anterior de @Rvanlaak, \ Symfony \ Component \ Locale \ Locale ahora es deprecated. Creo que la forma más concisa que hacer esto ahora es:

use Symfony\Component\Intl\Intl; 

... 

$country = Intl::getRegionBundle()->getCountryName($countryCode); 
12

Inspirado en respuesta Hannoun Yassir, yo uso el Intl como en el campo de tipo de país. El código de extensión es la extensión ramita ramita

<?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'; 
    } 
} 
?> 

Agregar en services.yml

# src/Acme/DemoBundle/Resources/config/services.yml 
services: 
    acme.twig.acme_extension: 
     class: Acme\DemoBundle\Twig\CountryExtension 
     tags: 
      - { name: twig.extension } 

uso en la plantilla (el nombre del país será de visualización en el entorno local por defecto (ver Symfony/Componente/Intl /ResourceBundle/RegionBundleInterface.php)

{{ user.countryCode|countryName }} 

Muchas gracias Yassir, esta versión no utiliza la configuración regional en desuso desde la versión 2.3 >>http://symfony.com/components/Locale

4

Con un filtro de rama (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); 
}), 

el uso de una plantilla ramita

{{ 'GB' | country_name }} {# displays United Kingdom #} 

trabajó para mí en Symfony 2.3

+1

¡Gran solución, gracias! –

5

Bueno, si usted está usando entidades una opción en lugar de hacer filtros twig es crear una función para obtener el nombre del país dentro de la entidad.

use Symfony\Component\Intl\Intl; 

public function getCountryName() { 
    return Intl::getRegionBundle()->getCountryName($this->getCountry()); 
} 

Así que en la ramita Más tarde se puede hacer

{{ user.countryName }} 
Cuestiones relacionadas