外部链接和cakephp的路由引擎(多语言)

我最近构建了一个微小的路由“扩展”,它从MySQL表(结构向下)调用路由。我认为值得一提的是,这个页面以多种语言(德语和英语)运行。所以 - 依赖于当前在客户端浏览器中设置的cookie - 相应的路由连接。 问题是,如果用户不能(外部)链接到德语内容页面,如果他的浏览器的语言cookie被设置为英语(因为英语路由已连接)。 有人为此得到了适当的解决方案吗?说实话,我真的不知道,如何以编程方式扩展Router-class的功能。 MySQL表的结构如下所示:
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`)
)
    
已邀请:
使用p28n - http://bakery.cakephp.org/articles/view/p28n-the-top-to-bottom-persistent-internationalization-tutorial 它工作得很好,我经常使用它,它现在是我标准版本的一部分。 我还有一个脚本,它将根据所选语言返回已翻译的URL。我不记得我在哪里找到它所基于的脚本,但是如果它有帮助我可以尝试给你一个干净的版本。 编辑:好的,这是骨头: 此脚本将翻译网址,以便他们在各种语言中保持SEO友好。语言切换和消息转换由p28n(上面)和po处理。 把这一行放在你的
app/config/bootstrap.php
文件中:
include_once("translate.php");
把它作为
app/config/routes.php
中的第一行代码:
$fromUrl = translate($fromUrl,true);
现在您需要创建包含所有路由信息的文件
app/config/translate.php
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]));
     }
 }
这真的很简单 - 诀窍就是让它在适当的地方送入CakePHP。我希望它对你有用。     

要回复问题请先登录注册