Получить переведенное название страны из двузначного кода страны в Symfony2 / Twig? - PullRequest
23 голосов
/ 24 марта 2012

Я использую Symfony2 Тип поля страны , он работает хорошо и названия стран переведены.Я храню двузначный код страны в столбце country моей организации.

Как отобразить полное переведенное название страны? Таким образом, я добавил поле вформа:

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

А потом в моем контроллере:

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

Или в моем шаблоне веточки:

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

{# translated country name from code #}

Ответы [ 7 ]

21 голосов
/ 01 сентября 2013

Я не уверен, что вам все еще нужно ... но это может помочь кому-то еще. это можно легко сделать с помощью расширения ветки (этот код основан на ответе @ 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';
        }
    }

А в ваших файлах services.yml

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

Пример использования внутри файла ветки:

{{ 'US'|country(app.request.locale) }}
18 голосов
/ 22 марта 2014

В соответствии с комментарием @ Rvanlaak выше, \ Symfony \ Component \ Locale \ Locale теперь устарел . Я думаю, что самый краткий способ сделать это сейчас:

use Symfony\Component\Intl\Intl;

...

$country = Intl::getRegionBundle()->getCountryName($countryCode);
15 голосов
/ 13 октября 2014

Вдохновленный ответом Ханнуна Яссира, я использую Intl как в поле типа страны.Код расширения ветки:

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

Добавление расширения ветки в использование services.yml

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

в шаблоне (по умолчанию название страны будет отображаться в локали (см. Symfony /Component / Intl / ResourceBundle / RegionBundleInterface.php)

{{ user.countryCode|countryName }}

Большое спасибо Yassir, эта версия не использует локаль, которая устарела с версии 2.3 >> http://symfony.com/components/Locale

11 голосов
/ 07 июня 2012

Вы можете использовать тот же компонент, который Symfony использует для типа поля страны

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

    return array_key_exists($this->getCountry(), $c)
           ? $c[$this->getCountry()]
           : $this->getCountry();
}
11 голосов
/ 24 марта 2012

Используйте SonanaIntlBundle, вы можете сделать что-то вроде этого:

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

Подробнее об этом

9 голосов
/ 26 ноября 2015

Хорошо, если вы используете сущности, один из вариантов вместо использования фильтров веток - это создать функцию для получения названия страны внутри сущности.

use Symfony\Component\Intl\Intl;

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

Так что в веточку позже можно сделать

{{ user.countryName }}
6 голосов
/ 10 марта 2015

С фильтром веточки (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);
}),

использование в шаблоне веточки

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

работал у меня в Symfony 2.3

...