2010-09-14 4 views
0

J'ai récemment construit une petite extension de routage, qui appelle les routes d'une table MySQL (structure vers le bas). Je pense qu'il vaut la peine d'être mentionné, que cette page fonctionne en plusieurs langues (allemand et anglais). Donc - en s'appuyant sur le cookie, qui est actuellement défini dans le navigateur du client - les routages correspondants obtiennent connecté. Le problème est que si l'utilisateur ne peut pas (extérieurement) être lié à une page de contenu allemand, si le cookie de son navigateur était réglé sur la langue anglaise (parce que les routes en anglais se sont connectées).Liaison externe et engin de routage de cakephp (multilangue)

Est-ce que quelqu'un a une bonne solution pour cela? Pour être honnête, je ne sais pas vraiment, comment étendre par programme la fonctionnalité de classe de routeur.

Meilleures salutations, Benedikt


La structure de la table MySQL ressemble à ceci:

CREATE TABLE `routes` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `language` varchar(5) COLLATE latin1_general_ci NOT NULL DEFAULT 'de', 
    `route` varchar(64) COLLATE latin1_general_ci NOT NULL, 
    `controller` varchar(64) COLLATE latin1_general_ci NOT NULL, 
    `action` varchar(64) COLLATE latin1_general_ci NOT NULL, 
    PRIMARY KEY (`id`) 
) 
+0

1) Cela semble être une mauvaise idée, vous mettez trop de logique dans le routeur et rend le reste de votre application inflexible (apparemment). 2) Il est difficile de déterminer, à partir de votre explication, ce que vous avez exactement fait au routeur, comment cela affecte le reste de votre application et pourquoi vous rencontrez le problème que vous rencontrez. 3) Vous l'avez écrit, probablement seulement vous savez comment y faire face. :) – deceze

+0

En fait, je suis juste à la recherche d'une bonne solution pour les routages multilangues dans cakephp. – Benedikt

+1

Alors peut-être cela vous donnera de l'inspiration: http://stackoverflow.com/questions/1794412/adding-a-prefix-to-every-url-in-cakephp – deceze

Répondre

1

utilisation p28n - http://bakery.cakephp.org/articles/view/p28n-the-top-to-bottom-persistent-internationalization-tutorial

Il fonctionne bien, je l'utilise beaucoup et il est une partie de ma construction standard maintenant.

J'ai aussi un script qui retournera les URL traduites en fonction de la langue choisie. Je ne me souviens pas où j'ai trouvé le script sur lequel elle est basée, mais si ça peut aider, je peux essayer de vous envoyer une version propre.

EDIT: D'accord, voici les os:

Ce script se traduira urls afin qu'ils restent SEO friendly à travers les langues. Le changement de langue et la traduction des messages sont gérés par p28n (ci-dessus) et par po.

Mettez cette ligne dans votre fichier app/config/bootstrap.php:

include_once("translate.php"); 

Mettre cela comme la première ligne de code dans app/config/routes.php:

$fromUrl = translate($fromUrl,true); 

Maintenant, vous devez créer le fichier app/config/translate.php qui contient toutes les informations de routage:

function translate($str = null,$total = false) 
{ 
    // If this is an RSS route, ignore it and bounce straight out 
    if (strpos($str,".rss")!==false) 
      return $str; 
    $translatetable = array( 
         'some-url-in-german' => array('/articles/msome-url-in-german',1), 
         'some-url-in-english' => array('/articles/some-url-in-german',2), 

         'a-german-article' => array('/posts/a-german-article',1), 
         'an-english-article' => array('/posts/a-german-article',2) 
          ); 
    if($str) 
    { 
     if($total) 
     { 
      $old = explode('/',$str); 
      $lastone = end($old); 
      if(empty($lastone)) array_pop($old); 
      $new = array(); 
      /* translate each part or leave untranslated part */ 
      for($i = 0 ; $i <sizeof($old) ; $i++) 
      { 
       $new[$i] = translate($old[$i]); 
      } 
      /* construct the translated url. This also adds 
       a trailing "/" even if it wasn't in the original */ 
      $new_url=""; 
      foreach($new as $n) 
      { 
       $new_url .= $n."/"; 
      } 
      return $new_url; 
     } 
     else 
     { 
      foreach ($translatetable as $orig => $new) 
      { 
       if($str == $orig) 
       { 
        $str = $new[0]; 
        switchLanguage($new[1]); 
       } 
      } 
       return $str; 
     } 
    } 
} 

function switchLanguage($lang) 
{ 
    if($lang>0) 
    { 
     $translatetable = array(
           '1' => 'de',             
           '2'=> 'eng' 
           ); 
     Configure::write(array('Config.language'=>$translatetable[$lang])); 
    } 
} 

C'est vraiment simple - l'astuce consiste à l'envoyer dans CakePHP aux bons endroits. J'espère que cela vous sert à quelque chose.

+0

Je n'ai pas utilisé ce script depuis un moment et maintenant je me souviens qu'il y avait un problème avec $ fromUrl. Je suis sûr que vous serez capable de contourner cela. – Leo

+0

Merci beaucoup. Je viens de mettre en place le composant p28n. Je vais aussi jeter un coup d'œil à l'extension 'translate'. – Benedikt