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);
}
答案 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
定义的服务类。