使用Symfony3更改区域设置在URL中的显示方式

时间:2017-07-07 12:24:54

标签: symfony routing localization

Symfony3默认以url本地显示在网址中:website.com/en_GB/(或" en_gb")。

如何更改以这种方式显示它:website.com/en-gb/

使用以下控制器并呼叫website.com/en-GB/以法语返回主页(默认语言为法语)。致电website.com/en_GB/会以英文返回页面。

en_GB:英国的英语

控制器:

/**
 * @Route("/{_locale}/", name="homepageLocale")
 * @Template("AppBundle:Default:homepage/homepage.html.twig")
 */
 public function homepageLocaleAction(Request $request) {
    return [];
 }

似乎解码语言环境的代码是:

   Symfony\Component\Intl\Locale.php

   public static function getFallback($locale)
    {
        if (false === $pos = strrpos($locale, '_')) {
            if (self::$defaultFallback === $locale) {
                return 'root';
            }

            // Don't return default fallback for "root", "meta" or others
            // Normal locales have two or three letters
            if (strlen($locale) < 4) {
                return self::$defaultFallback;
            }

            return;
        }

        return substr($locale, 0, $pos);
    }

1 个答案:

答案 0 :(得分:1)

要实现这一点,你可能需要将“完全”the HttpKernel LocaleListener装饰成这样的东西:

// AppBundle\EventListener\LocaleListener

private function setLocale(Request $request)
{
    if ($locale = $request->attributes->get('_locale')) {
        if (false !== strpos($locale, '-')) {
            // translate en-gb to en_GB
            $localeParts = explode('-', $locale);
            $locale = $localeParts[0].'_'.strtoupper($localeParts[1]);
        }

        $request->setLocale($locale);
    }
}

private function setRouterContext(Request $request)
{
    if (null !== $this->router) {
        $locale = $request->getLocale();

        // translate en_GB to en-gb
        $locale = strtolower(strtr($locale, '_', '-'));

        $this->router->getContext()->setParameter('_locale', $locale);
    }
}

注意:这两种方法都是private,这就是为什么我们需要复制+粘贴原始侦听器的完整代码来改变其行为。

有关"How to Decorate Services" here的更多信息,或创建您自己的compiler pass来交换locale_listener定义的服务类。