2012-03-23 4 views
21

Ich benutze die Symfony2 country Field Type, es funktioniert gut und Ländernamen werden übersetzt. Ich speichere den zweistelligen Ländercode in der Spalte country meines Unternehmens.Übersetzt den Namen eines Landes aus einem 2-stelligen Ländercode in Symfony2/Twig?

Wie kann ich den vollständigen Namen des übersetzten Landes anzeigen? Dies ist, wie ich das Feld auf das Formular hinzugefügt:

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

Und dann in meinem Controller:

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

Oder in meinem Zweig Vorlage:

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

{# translated country name from code #} 

Antwort

10

Verwenden SonanaIntlBundle, könnten Sie tun Sie etwas wie das:

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

Ich werde nicht ein Bündel nur für diese installieren, aber dank. Ich denke, dass der String-Name bereits in Symfony2 sein sollte. – gremo

11

können Sie die gleiche Komponente verwenden, die Symfony für Land Feldtyp wird mit

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

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

Ich bin mir nicht sicher, ob Sie noch brauchen ... aber es könnte jemand anderes helfen. dies kann leicht durch einen Zweig Erweiterung durchgeführt werden (dieser Code basiert auf @ tomaszsobczak Antwort)

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

Und in Ihrer services.yml Datei

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

Beispiel zur Verwendung in einer Zweig-Datei:

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

'\ Symfony \ Component \ Locale \ Locale' wird in Symfony 3.0 entzogen. – Rvanlaak

+0

Ich mag diese Lösung am besten, seien Sie vorsichtig bei der öffentlichen Funktion getFilter: Überprüfen Sie Ihre eigene Version von symfony2 Dokumentation für den richtigen Rückgabewert (google for twig custom filtern Sie finden es schnell) – Cesc

+2

Große einfache Lösung. Um mit Sf 3.0 zu passen, ändern Sie einfach die Methode 'countryFilter': 'return Symfony \ Komponente \ Intl \ Intl :: getRegionBundle() -> getCountryName ($ countryCode, $ locale); ' – Ronan

17

Gemäß dem obigen Kommentar von @ Rvanlaak lautet \ Symfony \ Component \ Locale \ Locale jetzt deprecated. Ich denke, der prägnanteste Weg, dies jetzt zu tun ist:

use Symfony\Component\Intl\Intl; 

... 

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

Inspiriert von Hannoun Yassir Antwort, ich Intl als auf dem Land Art Feld. Der Code der Zweig Erweiterung ist

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

Add Zweig Erweiterung in services.yml

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

Verwendung in der Vorlage (der Ländernamen Anzeige in locale standardmäßig (siehe Symfony/Component/Intl wird /ResourceBundle/RegionBundleInterface.php)

{{ user.countryCode|countryName }} 

Vielen dank Yassir, diese Version locale nicht seit Version 2 veraltet verwenden.3 >>http://symfony.com/components/Locale

4

Mit einem Zweig Filter (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); 
}), 

Verwendung in einem Zweig Vorlage

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

für mich in Symfony 2.3

+1

Große Lösung, danke! –

5

gut funktioniert, wenn Sie mit Entities Eine Option anstelle von Zweigfiltern besteht darin, eine Funktion zum Abrufen des Ländernamens in Entität zu erstellen.

use Symfony\Component\Intl\Intl; 

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

in Zweig So können Sie später

tun
{{ user.countryName }}