Symfony 3 Rediriger Toutes Les Voies De Paramètres Régionaux En Cours De Version

Je suis en train de travailler sur une application symfony où mon objectif est de n'importe quelle page l'utilisateur est sur il sera accédez à la version locale de la page.

Par exemple, si l'utilisateur accède à "/" de la page d'accueil, il vous redirigera vers "/fr/"

Si ils sont sur le "/admin" de la page, il va rediriger vers "/fr/admin", de telle manière que la _locale propriété est définie à partir de la route.

Aussi il doit déterminer les paramètres régionaux s'ils visitent /admin à partir du navigateur d'utilisateurs depuis aucune locale a été déterminé de manière à ce qu'il sache page de redirection.

Actuellement mon contrôleur par défaut ressemble à ci-dessous depuis que je suis en essais. Je suis en utilisant le dev mode & profiler pour tester que les traductions sont de travail correcte.

Symfony 3 Rediriger Toutes Les Voies De Paramètres Régionaux En Cours De Version

<?php

namespace AppBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;

class DefaultController extends Controller
{
    /**
     * @Route("/", name="homepage")
     * @Route("/{_locale}/", name="homepage_locale")
     */
    public function indexAction(Request $request)
    {
        $translated = $this->get('translator')->trans('Symfony is great');

        //replace this example code with whatever you need
        return $this->render('default/index.html.twig', [
            'base_dir' => realpath($this->container->getParameter('kernel.root_dir').'/..'),
            'translated' => $translated
        ]);
    }
}

Cette méthode permettra de garder l'utilisateur au "/" si ils passent par là, mais je veux l'avoir rediriger vers "/en/". Cela devrait fonctionner pour d'autres pages, comme /admin, ou /chemin/pathagain/article1 (/fr/admin /fr/chemin/pathagain/article1)

Comment puis-je faire?

Les références que j'ai lu cela n'a pas aidé:

Symfony2 Utiliser les paramètres régionaux par défaut dans le service de routage (une URL pour une seule langue)

Symfony2 paramètres régionaux par défaut dans le service de routage

::Mise jour::

Je n'ai pas résolu mon problème mais j'ai réussi à proximité ainsi que appris quelques astuces pour être plus efficace.

DefaultController.php

<?php

namespace AppBundle\Controller;

use Sensio\Bundle\FrameworkExtraBundle\Configuration\Route;
use Symfony\Bundle\FrameworkBundle\Controller\Controller;
use Symfony\Component\HttpFoundation\Request;

class DefaultController extends Controller
{

    /**
     * @Route("/", name="home", defaults={"_locale"="en"}, requirements={"_locale" = "%app.locales%"})
     * @Route("/{_locale}/", name="home_locale", requirements={"_locale" = "%app.locales%"})
     */
    public function indexAction(Request $request)
    {
        $translated = $this->get('translator')->trans('Symfony is great');

        //replace this example code with whatever you need
        return $this->render('default/index.html.twig', [
            'base_dir' => realpath($this->container->getParameter('kernel.root_dir').'/..'),
            'translated' => $translated
        ]);
    }

    /**
     * @Route("/admin", name="admin", defaults={"_locale"="en"}, requirements={"_locale" = "%app.locales%"})
     * @Route("/{_locale}/admin", name="admin_locale", requirements={"_locale" = "%app.locales%"})
     */
    public function adminAction(Request $request)
    {
        $translated = $this->get('translator')->trans('Symfony is great');

        //replace this example code with whatever you need
        return $this->render('default/index.html.twig', [
            'base_dir' => realpath($this->container->getParameter('kernel.root_dir').'/..'),
            'translated' => $translated
        ]);
    }
}
?>

Config.yml

imports:
- { resource: parameters.yml }
- { resource: security.yml }
- { resource: services.yml }
# Put parameters here that don't need to change on each machine where the app is deployed
# http://symfony.com/doc/current/best_practices/configuration.html#application-related-configuration
parameters:
locale: en
app.locales: en|es|zh
framework:
#esi:             ~
translator:      { fallbacks: ["%locale%"] }
secret:          "%secret%"
router:
resource: "%kernel.root_dir%/config/routing.yml"
strict_requirements: ~
form:            ~
csrf_protection: ~
validation:      { enable_annotations: true }
#serializer:      { enable_annotations: true }
templating:
engines: ['twig']
#assets_version: SomeVersionScheme
default_locale:  "%locale%"
trusted_hosts:   ~
trusted_proxies: ~
session:
# handler_id set to null will use default session handler from php.ini
handler_id:  ~
save_path:   "%kernel.root_dir%/../var/sessions/%kernel.environment%"
fragments:       ~
http_method_override: true
assets: ~
# Twig Configuration
twig:
debug:            "%kernel.debug%"
strict_variables: "%kernel.debug%"
# Doctrine Configuration
doctrine:
dbal:
driver:   pdo_mysql
host:     "%database_host%"
port:     "%database_port%"
dbname:   "%database_name%"
user:     "%database_user%"
password: "%database_password%"
charset:  UTF8
# if using pdo_sqlite as your database driver:
#   1. add the path in parameters.yml
#     e.g. database_path: "%kernel.root_dir%/data/data.db3"
#   2. Uncomment database_path in parameters.yml.dist
#   3. Uncomment next line:
#     path:     "%database_path%"
orm:
auto_generate_proxy_classes: "%kernel.debug%"
naming_strategy: doctrine.orm.naming_strategy.underscore
auto_mapping: true
# Swiftmailer Configuration
swiftmailer:
transport: "%mailer_transport%"
host:      "%mailer_host%"
username:  "%mailer_user%"
password:  "%mailer_password%"
spool:     { type: memory }

Avis en vertu de l'paramètres de la valeur app.locales: en|es|zh. C'est maintenant une valeur que je peut faire référence à chaque fois que je créer mes itinéraires si j'ai l'intention de soutenir plus de jeux dans l'avenir que je fais. Ces itinéraires sont l'anglais, l'espagnol, le chinois, dans l'ordre, pour les curieux. Dans le DefaultController dans les annotations de la "%app.locales%" est la partie qui fait référence à la configuration de paramètre.

Le problème avec ma méthode actuelle est d'aller à /admin par exemple ne pas rediriger l'utilisateur vers /{navigateurs locale}/admin, ce qui serait la solution la plus élégante de garder tout organisé... mais au moins, les itinéraires de travail. Toujours à la recherche de la meilleure solution.

****Mise à jour****

Je crois que j'ai peut-être trouvé la réponse ici comme la bas réponse donnée (Ajouter les paramètres régionaux et les exigences de tous les itinéraires - Symfony2), la réponse par Athlan. Juste ne sais pas comment l'implémenter dans symfony 3 que ses instructions n'ont pas été assez clair pour moi.

Je pense que cet article peut aider aussi (http://symfony.com/doc/current/components/event_dispatcher/introduction.html)

OriginalL'auteur Joseph Astrahan | 2016-01-10