2017-07-07 11 views
2

symfony3はデフォルトでURLにローカルで表示されるようにwebsite.com/en_GB/(または "en_gb")と表示します。symfony3でURLにロケールを表示する方法を変更します

このように表示する方法を変更するには:website.com/en-gb/

以下のコントローラでwebsite.com/en-GB/を呼び出すと、ホームページがフランス語(デフォルト言語はフランス語)で返されます。 website.com/en_GB/に電話すると、ページが英語で返されます。

表すen_GB:英国の英語

コントローラー:

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); 
    } 

答えて

2

は、あなたが完全に「飾る必要がある場合がありますことを達成するために:

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

それはだが、ロケールをデコードするコードは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); 
    } 
} 

注:これら2つの方法はprivateです。そのため、元のリスナーの完全なコードをコピー&ペーストして動作を変更する必要があります。

詳細"How to Decorate Services" here、またはcompiler passを所有しており、locale_listener定義のサービスクラスを交換します。

+0

ありがとうございます。 –

関連する問題