Arrache de chevelure sur l'internationalisation d'un site.

je souhaite faire une redirection sur la page courante de l'utilisateur s'il change la langue du site, pour pouvoir changer le slug de l'url.

Router::addUrlFilter(function ($params, $request) {
    if (isset($request->params['i18n']) && !isset($params['i18n'])) {
        $params['i18n'] = $request->params['i18n'];
    }
    return $params;
});

ce bout de code ci-dessus est censé persister le parametre de la langue dans l'url. ça fonctionne bien lors de la génération des liens sur le site, mais lorsque je fais cette redirection :

        $stpage = $this->Stpages->find()->where(['Stpages.id'=>$id,'Stpages.published'=>1])->first();
        if($slug!=$stpage->slug) {
            return $this->redirect(['action'=>'view',$id,$stpage->slug]);
        }

le params semble passer aux oubliettes, et la redirection se fait, mais le params de langue dans l'url disparait. Ce qui fausse tout le processus.

Tout fonctionne sauf ce petit détails... Je n'arrive pas à persister le params['i18n'] dans mon url si je fais cette redirection manuelle... une idée de comment le récupérer et le réinjecter dans ma redirection ?

3 réponses


Bonsoir.
Pourquoi tu ne l'ajoutes tout simplement pas dans les paramètres de ta redirection ?
Exemple :

return $this->redirect(['action'=>'view', $id, $stpage->slug, 'i18n' => $this->request->params['i18n']]);

as tu vérifié si
if (isset($request->params['i18n']) && !isset($params['i18n'])) around
existant au momant ou tu fait ton redirect

Flitflit
Auteur

Lartak si je fais ça, ça rajoute i18n en queryString et non pas en params. (genre site.com/coucou.html?i18n=en au lieu de site.com/en/coucou.html)