Bonjour,
je développe un petit projet avec Silex et j'y ai ajouté des traductions. La langue était détectée grâce à la requête HTTP. Mais je me suis rendu compte que cela n'était pas pratique et n'était pas non plus bon pour le référencement.
Je voulais donc qu'on puise accéder aux pages grâce à une Url du style http://mondomaine.com/fr/page. Le problème c'est que dans Silex le service de traduction démarre avant que l'association des urls se fassent. J'aimerais donc savoir comment faire pour que je puisse récupérer la langue à partir de l'url avec le TranslationServiceProvider.

Voici mon web/index.php :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
 
<?php
 
require_once __DIR__.'/../vendor/autoload.php';
 
$app = new Silex\Application();
 
require __DIR__.'/../app/config/dev.php';
require __DIR__.'/../app/app.php';
require __DIR__.'/../app/routes.php';
 
$app->run();
Mon fichier app/app.php :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
<?php
 
use Symfony\Component\Debug\ErrorHandler;
use Symfony\Component\Debug\ExceptionHandler;
use Symfony\Component\Translation\Loader\YamlFileLoader;
use Bloome\Controller\HomeController;
 
 
// Register global error and exception handlers
ErrorHandler::register();
ExceptionHandler::register();
 
// Register service providers.
$app->register(new Silex\Provider\DoctrineServiceProvider());
$app->register(new Silex\Provider\TwigServiceProvider(), array(
    'twig.path' => __DIR__.'/../views',
));
$app->register(new Silex\Provider\UrlGeneratorServiceProvider());
$app->register(new Silex\Provider\SessionServiceProvider());
$app->register(new Silex\Provider\SecurityServiceProvider(), array(
    'security.firewalls' => array(
        'secured' => array(
            'pattern' => '^/',
            'anonymous' => true,
            'logout' => true,
            'form' => array('login_path' => '/login', 'check_path' => '/login_check'),
            'users' => $app->share(function () use ($app) {
                return new Bloome\DAO\UserDAO($app['db']);
            }),
        ),
    ),
));
$app->register(new Silex\Provider\TranslationServiceProvider(), array(
    'locale'                    => HomeController::getClientLanguage(),
    'locale_fallback'           => 'fr',
    'translation.class_path'    => __DIR__.'/vendor/Symfony/Component',
));
// Register services. *****************************************************************************************
$app['dao.article'] = $app->share(function ($app) {
    return new Bloome\DAO\ArticleDAO($app['db']);
});
$app['translator.messages'] = array(
    'fr' => __DIR__.'/../src/locales/fr.yml',
    'en' => __DIR__.'/../src/locales/en.yml'
);
$app['translator'] = $app->share($app->extend('translator', function($translator, $app) {
    $translator->addLoader('yaml', new YamlFileLoader());
 
    $translator->addResource('yaml', __DIR__.'/../src/Locales/en.yml', 'en');
    $translator->addResource('yaml', __DIR__.'/../src/Locales/fr.yml', 'fr');
 
    return $translator;
}));
/*$app->error(function (\Exception $e, $code) use ($app) {
    switch ($code) {
        case 403:
            $message = 'Accès refusé. Erreur 403';
            break;
        case 404:
            $message = 'La ressource demandée n\' pas pu être trouvée. Erreur 404';
            break;
        default:
            $message = "Quelque chose a mal tourné.";
    }
    return $app['twig']->render('error.html.twig', array('message' => $message));
});*/
Mon fichier app/routes.php :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
<?php
 
// Home page
$app->get('/{_locale}', "Bloome\Controller\HomeController::indexAction")->bind('home');
$app->get('/{_locale}/login', "Bloome\Controller\ConnectionController::loginAction")->bind('login');
Mon fichier src/Controller/HomeController.php :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
 
namespace Bloome\Controller;
 
use Silex\Application;
use Symfony\Component\HttpFoundation\Request;
 
class HomeController {
	/**
	 *
	 * Controlleur de la page d'accueil
	 * @param Application $app Silex application
	 */
	public function indexAction(Application $app) {
		$articles = $app['dao.article']->findAll();
		return $app['twig']->render('index.html.twig', array('articles' => $articles));
	}
	public static function getClientLanguage() {
	    $langs = explode(',', $_SERVER['HTTP_ACCEPT_LANGUAGE']);
	    return substr($langs[0], 0, 2);
	}
}
En espérant que vous pourrez éclairer ma lanterne,
Merci par avance,
Louisld.