2011-03-17 82 views
1

我想做一个链接将在布局中改变语言。所以它应该适用于很多路线。symfony链接改变语言,并留在页面上

例如 我是页/ EN/Mymodule中

上的链接应该指向 /德/ Mymodule中 /FR/Mymodule中

我发现这里的解决方案是:http:/ /oldforum.symfony-project.org/index.php/m/70452/

<?php echo link_to(
    'Germany', 
    '@default?' . http_build_query(array(
    'sf_culture' => 'de', 
    'module' => $sf_request->getParameter('module'), 
    'action' => $sf_request->getParameter('action')) 
), null, '&')) ?> 

问题是,我需要一个默认路由,而我不希望拥有它。

有什么解决方案,我需要什么?

+0

为什么不会要使用默认路由? – Pabloks 2011-03-17 18:13:42

回答

3
routing: 
    user_switch_culture: 
    url: /culture-change/:language 
    param: { module: user, changeCulture } 

在您的布局模板:

<?php echo link_to(image_tag("flags/gb.gif"), "user_switch_culture", array("language"=>"en", "redirect"=>$sf_request->getUri())) ?> 

链接将产生:

http://example.com/culture-change/fr?redirect=http//example.com/fr/control-panel

在你的行动:

public function executeChangeCulture(sfWebRequest $request) 
{ 
    $oldCulture = $this->getUser()->getCulture(); 
    $newCulture = $request->getParameter("language"); 
    $this->getUser()->setCulture($newCulture); 
    return $this->redirect(str_replace('/'.$oldCulture.'/', '/'.$newCulture.'/', $request->getParameter("redirect"))); 
} 

就在我头顶。应该工作...

不是很大:应该做重定向一些过滤器,确保它是正确的域名等

1

我认为我有一个解决办法:

$uri = sfContext::getInstance()->getRouting()->getCurrentRouteName(); 
    echo link_to('French', $uri, array('sf_culture'=>'fr')) . ' | '; 
    echo link_to('English', $uri, array('sf_culture'=>'en')) . ' | '; 
    echo link_to('German', $uri, array('sf_culture'=>'de')); 

它是一个很好的一个,或是否有更好的解决办法?

+0

我编辑更好的解决方案 – Charles 2011-03-17 18:17:20

+0

这可能会导致问题,如果显示在404页面上。 – Maerlyn 2011-03-17 23:01:56

+0

请勿使用sfContext :: getInstance()(请参阅:http://webmozarts.com/2009/07/01/why-sfcontextgetinstance-is-bad/) – Flukey 2011-03-29 15:48:32

2

为什么不为此做一个特定的操作?

public function executeChangeLanguage(sfWebRequest $request) 
{ 
    if (in_array($request->getParameter('lang'), sfConfig::get('app_site_languages')) 
    { 
    $this->getUser()->setCulture($request->getParameter('lang')); 
    } 

    // you can ask the browser for referrer or send a parameter to the change language action 
    // something like '/change-language?lang=ro&redirect=your page'. 
    // if you are sending a redirect parameter you must make sure that it's actually a page within your site 
    $referrer = $request->getReferer(); 
    // or $referrer = $request->getParameter('redirect'); 

    // you can further check the referrer here 
    return $this->redirect($referrer); 
} 
+0

以及例如,如果引用链接是谷歌? – Flukey 2011-03-29 15:46:58

+0

就像在最后的评论中说的那样,你必须检查引荐者 (参见评论'//你可以在这里进一步检查引用者的位置)。否则,有些人可能会将您的重定向用于他们自己的目的 – 2011-03-30 12:39:39