使用JMSI18nRoutingBundle进行Symfony2本地化

时间:2016-01-02 16:01:19

标签: php symfony localization

我安装了作曲家:

"jms/i18n-routing-bundle": "dev-master""jms/translation-bundle": "1.1.*"

然后我将它们添加到AppKernel文件

new JMS\I18nRoutingBundle\JMSI18nRoutingBundle(), 
new JMS\TranslationBundle\JMSTranslationBundle(),

之后我在config.yml

的末尾添加了这个
jms_i18n_routing:
    default_locale: en
    locales: [de, en]
    strategy: prefix

最后,我只使用简单的控制器。

namespace Comflex\W2Bundle\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;
use Comflex\W2Bundle\Models;

class HomeController extends Controller
{
    public function indexAction(Request $request)
    {
        $session = $request->getSession();

        $user = NULL;
        if($session->get('user')!== NULL){
            $user = $session->get('user');
        }
        $request->getSession()->set('_locale', 'en');
        $locale = $request->getLocale();

        return $this->render(
             'ComflexW2Bundle:Home:index.html.twig',
             array(
                'user' => $user,
                'locale' => $locale,
                'authFormPlaceholder' => array(
                    'login' => $this->get('translator')->trans('LOGIN'),
                    'password' => $this->get('translator')->trans('PASSWORD'),
                )
            )
            );
    }
}
内包

routing.yml

comflex_w2_home:
    path: /
    defaults: { _controller: ComflexW2Bundle:Home:index}

和两个包含翻译数据的文件(message.de.ymlmessage.en.yml

当我转到http://localhost/symfony/web/app_dev.php/de/http://localhost/symfony/web/app_dev.php时,两种翻译都是正确的,但当我将/en添加到网址时,我会得到No route found for "GET /en"。怎么解决?如何在每次丢失时添加/en/de(取决于用户语言值)?

示例:http://localhost/symfony/web/app_dev.php - >用户语言为英语时的http://localhost/symfony/web/app_dev.php/en或当语言为德语时为http://localhost/symfony/web/app_dev.php/de

1 个答案:

答案 0 :(得分:1)

  1. 如果更改jms_i18n设置的策略,则需要手动清除缓存。所以我认为它仍在使用 prefix_except_default 而不仅仅是前缀

  2. 您的routing.yml

    中的
  3.   

    front.nolang:
        pattern:   /
        defaults:  { _controller: AppBundle:Default:nolang }
        options: { i18n: false }
    
    front.index:
        pattern:   /
        defaults:  { _controller: AppBundle:Default:index }
        options: { i18n: true }
    

    这有两条不同的路线,第一条(只是/)会用这样的东西重定向到正确的路线

    public function nolangAction(Request $request){
        $locale = $request->getLocale();
        //...add your checks here
        return $this->redirectToRoute('front.index',['_locale' => $locale]);
    }
    

    PS。我很久以前就这么做了所以我不确定现在一切正常,请确认