好的,我设法为我的testpage添加代码,将这些语言与JMSTranslationBundle结合使用,就像这样在树枝上
<li>
<a href="{{ path("main", {"_locale": "en","name": name}) }}">
<img src="{{ asset('img/flags/gb.png') }}"></a></li>
<li>
<a href="{{ path("main", {"_locale": "de","name": name}) }}">
<img src="{{ asset('img/flags/de.png') }}"></a></li>
但这将适用于path ("main")
如何让它动态地为我目前正在处理的页面/路由工作,包括所需的参数(在这种情况下为"name": name
?所以如果我目前在“关于我们”的英文页面上,我可以自动切换到关于我们的德语页面,包括它的参数?是可能的吗?还是我必须用路径对每个树枝页面/模板进行硬编码?
答案 0 :(得分:3)
硬编码是一个坏主意,这是可以实现的,但据我所知,并非开箱即用。我所做的是提供一个具有相同路径和参数的URL但是对于不同的区域设置是创建一个自定义的枝条扩展来完成它。
此扩展提供了一个新的twig函数,它将读取当前路由,当前参数,消除私有参数并生成相同的路由,但用于另一个区域设置。这里有问题的树枝延伸:
<?php
namespace Acme\WebsiteBundle\Twig\Extension;
use Symfony\Component\DependencyInjection\ContainerInterface;
class LocalizeRouteExtension extends \Twig_Extension
{
protected $request;
protected $router;
public function __construct(ContainerInterface $container)
{
$this->request = $container->get('request');
$this->router = $container->get('router');
}
public function getFunctions()
{
return array(
'localize_route' => new \Twig_Function_Method($this, 'executeLocalizeRoute', array()),
);
}
public function getName()
{
return 'localize_route_extension';
}
/**
* Execute the localize_route twig function. The function will return
* a localized route of the current uri retrieved from the request object.
*
* The function will replace the current locale in the route with the
* locale provided by the user via the twig function.
*
* Current uri: http://www.example.com/ru/current/path?with=query
*
* In Twig: {{ localize_route('en') }} => http://www.example.com/en/current/path?with=query
* {{ localize_route('fr') }} => http://www.example.com/fr/current/path?with=query
*
* @param mixed $parameters The parameters of the function
* @param string $name The name of the templating to render if needed
*
* @return Output a string representation of the current localized route
*/
public function executeLocalizeRoute($parameters = array(), $name = null)
{
$attributes = $this->request->attributes->all();
$query = $this->request->query->all();
$route = $attributes['_route'];
# This will add query parameters to attributes and filter out attributes starting with _
$attributes = array_merge($query, $this->filterPrivateKeys($attributes));
$attributes['_locale'] = $parameters !== null ? $parameters : \Locale::getDefault();
return $this->router->generate($route, $attributes);
}
/**
* This function will filter private keys from the attributes array. A
* private key is a key starting with an underscore (_). The filtered array is
* then returned.
*
* @param array $attributes The original attributes to filter out
* @return array The filtered array, the array withtout private keys
*/
private function filterPrivateKeys($attributes)
{
$filteredAttributes = array();
foreach ($attributes as $key => $value) {
if (!empty($key) && $key[0] != '_') {
$filteredAttributes[$key] = $value;
}
}
return $filteredAttributes;
}
}
现在,您可以通过捆绑包加载此服务定义或直接加载到位于config.yml
下的app/config
文件中来启用此枝条扩展程序。
services:
acme.twig.extension:
class: Acme\WebsiteBundle\Twig\Extension\LocalizeRouteExtension
scope: request
arguments:
request: "@request"
router: "@router"
tags:
- { name: twig.extension }
现在你可以用树枝来提出当前加载页面的不同版本:
<a id='englishLinkId' href="{{ localize_route('en') }}">
English
</a>
<a id='frenchLinkId' href="{{ localize_route('fr') }}">
Français
</a>
希望这会有所帮助,而这正是您所寻找的。 p>
编辑:
似乎无法直接缩小树枝延伸范围。为避免这种情况,请始终注入依赖项容器,然后检索所需的服务。这应该通过更改twig扩展的构造函数定义和扩展的服务定义来体现。我编辑了我之前的答案,检查了新的更新构造函数定义和新服务定义。
另一种可能的解决方案是注入一个负责本地化路由的帮助服务。此帮助程序服务应位于请求范围内。实际上,这就是我的代码中的内容。我有一个RoutingHelper
服务,在我的枝条扩展中注入。然后,在方法executeLocalizeRoute
中,我使用我的助手来完成艰苦的工作。
告诉我现在一切正常。
的问候,
马特
答案 1 :(得分:3)
这描述的扩展程序与您正在寻找的完全相同:http://blog.viison.com/post/15619033835/symfony2-twig-extension-switch-locale-current-route
可以通过注入ScopeWideningInjectionException
来检索路由器和请求而不是直接注入它们来修复@service_container
。