Получите переведенное название страны из двухзначного кода страны в Symfony2/Twig?
Я использую Sympony2 тип поля страны, он хорошо работает, и названия стран переводятся. Я сохраняю двузначный код страны в столбце 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 #}
Ответы
Ответ 1
Я не уверен, что вам все еще нужно... но это может помочь кому-то другому. это можно сделать с помощью расширения веточки (этот код основан на ответе @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 }
Пример использования внутри файла twig:
{{ 'US'|country(app.request.locale) }}
Ответ 2
Как и в предыдущем комментарии @Rvanlaak,\Symfony\Component\Locale\Locale теперь устарел. Я думаю, что самый сжатый способ сделать это сейчас:
use Symfony\Component\Intl\Intl;
...
$country = Intl::getRegionBundle()->getCountryName($countryCode);
Ответ 3
Вдохновленный Ханнуном Ясиром, я использую 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';
}
}
?>
Добавить расширение twig в 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, эта версия не использует locale, устаревшую с версии 2.3 → http://symfony.com/components/Locale
Ответ 4
Вы можете использовать тот же компонент, который использует Symfony для типа поля страны
public function humanCountry() {
$c = \Symfony\Component\Locale\Locale::getDisplayCountries('en');
return array_key_exists($this->getCountry(), $c)
? $c[$this->getCountry()]
: $this->getCountry();
}
Ответ 5
Используйте 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)
Подробнее об этом
Ответ 6
Хорошо, если вы используете сущности, один вариант вместо создания фильтров ветки - это создание функции для получения имени страны внутри объекта.
use Symfony\Component\Intl\Intl;
public function getCountryName() {
return Intl::getRegionBundle()->getCountryName($this->getCountry());
}
Итак, в ветке позже вы можете сделать
{{ user.countryName }}
Ответ 7
С фильтром завихрения (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