Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions Resources/config/services.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
<parameter key="jms_i18n_routing.cookie_setting_listener.class">JMS\I18nRoutingBundle\EventListener\CookieSettingListener</parameter>

<parameter key="jms_i18n_routing.route_translation_extractor.class">JMS\I18nRoutingBundle\Translation\RouteTranslationExtractor</parameter>
<parameter key="jms_i18n_routing.twig_extension.class">JMS\I18nRoutingBundle\Twig\I18nRoutingExtension</parameter>
</parameters>

<services>
Expand All @@ -37,6 +38,9 @@
<call method="setRedirectToHost">
<argument>%jms_i18n_routing.redirect_to_host%</argument>
</call>
<call method="setLogger">
<argument type="service" id="logger" on-invalid="null" />
</call>
</service>

<service id="jms_i18n_routing.locale_choosing_listener" class="%jms_i18n_routing.locale_choosing_listener.class%" public="false">
Expand Down Expand Up @@ -69,5 +73,11 @@
<argument type="service" id="jms_i18n_routing.route_exclusion_strategy" />
<tag name="jms_translation.extractor" alias="jms_i18n_routing" />
</service>

<service id="jms_i18n_routing.twig_extension" class="%jms_i18n_routing.twig_extension.class%" public="false">
<argument type="service" id="request_stack" />
<argument>%jms_i18n_routing.locales%</argument>
<tag name="twig.extension" />
</service>
</services>
</container>
5 changes: 5 additions & 0 deletions Resources/views/hreflang.html.twig
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@

{% for locale in locales %}
{% set arr = routeParams|merge({'_locale':locale}) %}
<link rel="alternate" hreflang="{{ locale }}" href="{{ url(route, arr) }}" />
{% endfor %}
2 changes: 2 additions & 0 deletions Router/I18nLoader.php
Original file line number Diff line number Diff line change
Expand Up @@ -63,13 +63,15 @@ public function load(RouteCollection $collection)
$catchMultipleRoute = clone $route;
$catchMultipleRoute->setPath($pattern);
$catchMultipleRoute->setDefault('_locales', $locales);
$catchMultipleRoute->setDefault('localized', true);
$i18nCollection->add(implode('_', $locales).I18nLoader::ROUTING_PREFIX.$name, $catchMultipleRoute);
}

foreach ($locales as $locale) {
$localeRoute = clone $route;
$localeRoute->setPath($pattern);
$localeRoute->setDefault('_locale', $locale);
$localeRoute->setDefault('localized', true);
$i18nCollection->add($locale.I18nLoader::ROUTING_PREFIX.$name, $localeRoute);
}
}
Expand Down
33 changes: 30 additions & 3 deletions Router/I18nRouter.php
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,9 @@

use JMS\I18nRoutingBundle\Exception\NotAcceptableLanguageException;

use Psr\Log\LoggerAwareInterface;
use Psr\Log\LoggerAwareTrait;
use Psr\Log\LoggerInterface;
use Symfony\Component\Routing\Matcher\RequestMatcherInterface;
use Symfony\Component\Routing\RequestContext;
use Symfony\Component\DependencyInjection\ContainerInterface;
Expand All @@ -33,7 +36,7 @@
*
* @author Johannes M. Schmitt <schmittjoh@gmail.com>
*/
class I18nRouter extends Router
class I18nRouter extends Router implements LoggerAwareInterface
{
private $hostMap = array();
private $i18nLoaderId;
Expand Down Expand Up @@ -140,8 +143,21 @@ public function generate($name, $parameters = array(), $referenceType = self::AB
// fallback to default behavior
}

// use the default behavior if no localized route exists
return $generator->generate($name, $parameters, $referenceType);
try {
// use the default behavior if no localized route exists
return $generator->generate($name, $parameters, $referenceType);
} catch (\Exception $e) {
if ($this->logger) {
$this->logger->critical('JMSRouter tried to generate a route', [
'category'=>'routing',
'name'=>$name,
'parameters'=>json_encode($parameters),
'absolute'=>$absolute ? 'true' : 'false',
]);
}

throw $e;
}
}

/**
Expand Down Expand Up @@ -290,4 +306,15 @@ private function getRequest()

return $request;
}


/**
* Sets a logger.
*
* @param LoggerInterface $logger
*/
public function setLogger(LoggerInterface $logger)
{
$this->logger = $logger;
}
}
77 changes: 77 additions & 0 deletions Twig/I18nRoutingExtension.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,77 @@
<?php

namespace JMS\I18nRoutingBundle\Twig;

use Symfony\Component\HttpFoundation\RequestStack;

/**
* @author Tobias Nyholm
*/
class I18nRoutingExtension extends \Twig_Extension
{
/**
* @var RequestStack requestStack
*/
private $requestStack;

/**
* @var array locales
*/
private $locales;

/**
* @param RequestStack $requestStack
* @param array $locales
*/
public function __construct(RequestStack $requestStack, $locales)
{
$this->requestStack = $requestStack;
$this->locales = $locales;
}

public function getFunctions()
{
return array(
new \Twig_SimpleFunction('hreflang', array($this, 'getHreflang'), array(
'needs_environment'=>true,
'is_safe'=>array('html'),
)),
);
}

/**
* Return HTML with hreflang attributes
*
* @param \Twig_Environment $env
*/
public function getHreflang(\Twig_Environment $env)
{
if (null === $request = $this->requestStack->getMasterRequest()) {
return;
}

if (null === $routeParams = $request->attributes->get('_route_params')) {
return;
}

if (!isset($routeParams['localized']) || !$routeParams['localized']) {
return;
}

return $env->render('JMSI18nRoutingBundle::hreflang.html.twig', array(
'locales'=>$this->locales,
'route'=>$request->attributes->get('_route'),
'routeParams'=>$routeParams,
));
}

/**
* {@inheritdoc}
*
* @return string
*/
public function getName()
{
return 'i18n_routing_extension';
}
}
2 changes: 1 addition & 1 deletion composer.json
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@
}
],
"require": {
"php": ">=5.3.9",
"php": ">=5.3.9",
"symfony/framework-bundle": "~2.3|~3.0"
},
"require-dev": {
Expand Down