2012-03-23 23 views
21

Sto utilizzando Symfony2 country Field Type, funziona bene e i nomi dei paesi sono tradotti. Sto memorizzando il codice paese a due cifre nella colonna country della mia entità.Ottieni il nome del paese tradotto da un codice paese di 2 cifre in Symfony2/Twig?

Come visualizzare il nome completo del paese tradotto? Questo è come ho aggiunto il campo al form:

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

E poi nel mio controller:

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

O nel mio modello ramoscello:

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

{# translated country name from code #} 

risposta

10

Usa SonanaIntlBundle, si potrebbe fare qualcosa del genere:

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

Non ho intenzione di installare un pacchetto solo per questo, ma grazie. Penso che il nome della stringa dovrebbe già essere in Symfony2. – gremo

11

È possibile utilizzare lo stesso componente che Symfony utilizza per il campo Paese Tipo

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

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

Non sono sicuro se hai ancora bisogno ... ma potrebbe aiutare qualcun altro. questo può essere fatto attraverso un prolungamento ramoscello facilmente (questo codice si basa sulla risposta di @ 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'; 
     } 
    } 

E nei file services.yml

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

esempio di utilizzo all'interno di un file ramoscello:

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

'\ Symfony \ Component \ Locale \ Locale' verrà sottratto in Symfony 3.0 – Rvanlaak

+0

Mi piace questa soluzione, meglio fare attenzione a public Funzione getFilter: Controlla la tua versione della documentazione di symfony2 per il valore di ritorno corretto (google per twig personalizzato filtro lo troverai veloce) – Cesc

+2

Ottima soluzione semplice. Per adattarsi a Sf 3.0, basta cambiare il metodo 'countryFilter' in questo modo: ' return Symfony \ Component \ Intl \ Intl :: getRegionBundle() -> getCountryName ($ countryCode, $ locale); ' – Ronan

17

Come da commento di @Rvanlaak sopra, \ Symfony \ Component \ Locale \ Locale è ora deprecated. Penso che il modo più conciso per fare questo ora è:

use Symfony\Component\Intl\Intl; 

... 

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

Ispirato Hannoun Yassir risposta, io uso l'Intl come nel campo Tipo paese. Il codice di estensione ramoscello è

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

aggiungere l'estensione ramoscello services.yml

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

utilizzo nel modello (il nome del paese sarà in esposizione locale di default (vedi Symfony/Component/Intl /ResourceBundle/RegionBundleInterface.php)

{{ user.countryCode|countryName }} 

Molte grazie Yassir, questa versione non utilizzare locale deprecato dalla versione 2.3 >>http://symfony.com/components/Locale

4

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

utilizzo in un modello ramoscello

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

ha lavorato per me in Symfony 2.3

+1

Ottima soluzione, grazie! –

5

Beh, se si utilizza le entità una opzione invece di fare filtri ramoscello è creare una funzione per ottenere il nome del paese all'interno dell'entità.

use Symfony\Component\Intl\Intl; 

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

Quindi, in ramoscello poi si può fare

{{ user.countryName }} 
Problemi correlati