从 Symfony2/Twig 中的 2 位国家代码获取翻译的国家名称?

Posted

技术标签:

【中文标题】从 Symfony2/Twig 中的 2 位国家代码获取翻译的国家名称?【英文标题】:Get translated country name from a 2 digit country code in Symfony2/Twig? 【发布时间】:2012-04-08 11:29:37 【问题描述】:

我正在使用 Symfony2 country Field Type,它运行良好,并且可以翻译国家名称。我将两位国家/地区代码存储在我的实体的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】:

使用 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)

Read more about this

【讨论】:

我不会为此安装捆绑软件,但谢谢。我认为字符串名称应该已经在 Symfony2 中了。【参考方案2】:

您可以使用 Symfony 用于国家/地区字段类型的相同组件

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

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

【讨论】:

【参考方案3】:

我不确定您是否仍然需要...但它可能对其他人有所帮助。这可以通过树枝扩展轻松完成(此代码基于@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) 

【讨论】:

\Symfony\Component\Locale\Locale 将在 Symfony 3.0 中被弃用 我最喜欢这个解决方案,只是在公共函数 getFilter 上要小心:检查你自己版本的 symfony2 文档以获得正确的返回值(google for twig custom filter 你会很快找到它)跨度> 非常简单的解决方案。要适应 Sf 3.0,只需以这种方式更改 countryFilter 方法:return Symfony\Component\Intl\Intl::getRegionBundle()-&gt;getCountryName($countryCode, $locale); 【参考方案4】:

根据上面@Rvanlaak 的评论,\Symfony\Component\Locale\Locale 现在是deprecated。我认为现在最简洁的方法是:

use Symfony\Component\Intl\Intl;

...

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

【讨论】:

【参考方案5】:

受 Hannoun Yassir 回答的启发,我在国家类型字段中使用 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

【讨论】:

未知的“countryName”【参考方案6】:

好吧,如果您使用实体,而不是使用树枝过滤器,一种选择是创建用于在实体中获取国家/地区名称的函数。

use Symfony\Component\Intl\Intl;

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

所以在twig之后你可以这样做

 user.countryName 

【讨论】:

非常好!谢谢。 未知的“countryName”【参考方案7】:

为方便起见,如果有人在几年后阅读此内容:

对于 twig 2 或更高版本,您可以使用

composer require twig/intl-extra

使过滤器语言名称可用。它还提供了一些配置选项。

See the doc.

【讨论】:

以上是关于从 Symfony2/Twig 中的 2 位国家代码获取翻译的国家名称?的主要内容,如果未能解决你的问题,请参考以下文章

Symfony2 Assetic + Twig 模板 JavaScript 继承

Symfony2 twig 移动模板后备

Symfony 2.8 Twig_Error_Runtime Sonata 管理包

如何从android中的纬度和经度获取3位国家代码[重复]

如何根据不同的条件从数字键中隔离选择的数字?

为何自动驾驶遇瓶颈,自动代客泊车却很热?| 创变观察