私はSymfony2 country Field Type を使用しています。これはうまく機能し、国名が翻訳されています。エンティティのcountry
列に2桁の国コードを保存しています。
完全な翻訳された国名を表示するにはどうすればよいですか?これは私がフォームにフィールドを追加した方法です:
$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
または私のtwigテンプレート:
{# Output the country code and name #}
{{ user.country }}
{# translated country name from code #}
あなたがまだ必要かどうかはわかりません...しかし、それは他の誰かを助けるかもしれません。これは、twig拡張機能を介して簡単に実行できます(このコードは@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) }}
上記の@Rvanlaakのコメントによると、\ Symfony\Component\Locale\Localeは 非推奨 になりました。今これを行う最も簡潔な方法は次のとおりだと思います。
use Symfony\Component\Intl\Intl;
...
$country = Intl::getRegionBundle()->getCountryName($countryCode);
Hannoun Yassirの回答に触発されて、国タイプフィールドのようにIntlを使用します。 twig拡張子のコードは
<?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にtwig拡張子を追加します
# 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
Symfonyが国のフィールドタイプに使用しているのと同じコンポーネントを使用できます
public function humanCountry() {
$c = \Symfony\Component\Locale\Locale::getDisplayCountries('en');
return array_key_exists($this->getCountry(), $c)
? $c[$this->getCountry()]
: $this->getCountry();
}
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)
エンティティを使用している場合、twigフィルタを実行する代わりに、1つのオプションは、エンティティ内で国名を取得するための関数を作成することです。
use Symfony\Component\Intl\Intl;
public function getCountryName() {
return Intl::getRegionBundle()->getCountryName($this->getCountry());
}
したがって、twig後で行うことができます
{{ user.countryName }}
twigフィルター( 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);
}),
twigテンプレートでの使用法
{{ 'GB' | country_name }} {# displays United Kingdom #}
symfony2.3で私のために働いた