CakePHP - 如何在更改语言和重新加载路由表后翻译当前 URL

Posted

技术标签:

【中文标题】CakePHP - 如何在更改语言和重新加载路由表后翻译当前 URL【英文标题】:CakePHP - how to translate current URL after changing language and reloading Routing table 【发布时间】:2011-10-17 11:15:29 【问题描述】:

我为每种语言使用不同的路由表,并且我编写了更改语言并重定向到同一页面但使用目标语言(和目标 URL)的操作。

主要问题是我的操作太复杂了——我怎样才能让它变得简单? 它应该更改语言并重定向到新的 url(目标语言)。

简而言之:我们有一种语言的随机有效蛋糕网址,我们必须将其翻译成另一种语言的适当网址。

我的路由表:

if( 'en' == Configure::read('Config.language') ) 
    Router::connect('/help',   array('controller' => 'pages', 'action' => 'display', 'help') );
 else 
    Router::connect('/pomoc',   array('controller' => 'pages', 'action' => 'display', 'help') );

动作改变语言:

function lang($lang) 

    // getting previous url table
    $url = $this->referer();
    $url = Router::parse($url);

    // changing language
    if( in_array($lang, Configure::read('Languages.valid') ) ) 
        $this->Session->write('Language', $lang);
        Configure::write('Config.language', $lang);
    

    // saving base params
    $requestInfo = array(Router::getParams(), Router::getPaths());
    // reload routing table
    Router::reload();
    include(CONFIGS.'routes.php');
    // restore base params
    Router::setRequestInfo($requestInfo);

    // fix for 'pass' params
    if(!empty($url['pass']) && is_array($url['pass'])) 
        $url = array_merge($url, $url['pass']);
        unset($url['pass']);
    
    $this->redirect($url);

关于 url 表中的 'pass' 键:

/pages/display/help

在Router::parse()之后,提取参数:

pass => array(
    0 => 'help'
)

后来从 Router::url() 返回的值看起来像这样:

/pages/display/pass:Array

所以我必须通过将 'pass' 值与整个数组合并并删除键来修复它

【问题讨论】:

您能否提供更多关于您想要的确切“流程”的信息?据我了解,您希望能够在页面(例如您的帮助页面)上有一个链接,上面写着“在 $language 中查看此页面”,对吗?那么您实际上将您提到的 lang() 操作称为哪里? 它在每个页面的“选择语言”框中 【参考方案1】:

我知道现在回答这个问题为时已晚,但对于那些有类似需求的人来说:

在 routes.php 中p1 标识静态页面(所有语言都相同),可以是唯一标识页面的任何字符串。

Router::connect('/:language/p1/:translation',   array(
    'controller' => 'pages',
    'action' => 'display',
    'help',
    'options' => array('language' => '[a-zA-Z]2')
) );

在你看来

$this->html->link('Click me', array(
    'language'    => Configure::read('Config.language'),
    'controller'  => 'pages',
    'action'      => 'display',
    'help',
    'translation' => __('help') // could be any string in fact
));

将生成指向英文版/en/p1/help 的链接,否则生成指向/xx/p1/pomoc 的链接。

language 参数注入每个链接可以在AppHelper::url() 中完成,而不是在每个链接出现时都提供它。

如果你想在控制器中重定向:

$this->redirect(array(
    'language'    => Configure::read('Config.language'),
    'controller'  => 'pages',
    'action'      => 'display',
    'help',
    'translation' => __('help')
));

【讨论】:

【参考方案2】:

我有这样的 routes.php

Configure::write('Config.language', $_SESSION['lang']);
Router::connect(__('/help',true),   array('controller' => 'pages', 'action' => 'display', 'help') );

所以我使用__() 来翻译网址。它在 po 文件中搜索翻译。而在您的lang() 函数中,将 Session 更改为当前语言后,您需要做的就是:

$this->redirect(__('/help'));

希望对你有帮助

【讨论】:

这不是解决方案。我将不得不存储 /help /pomoc 等之间的所有翻译。我的操作情况是这样的:我们有一种语言的随机有效网址,我们必须将其翻译成另一种语言的适当网址。

以上是关于CakePHP - 如何在更改语言和重新加载路由表后翻译当前 URL的主要内容,如果未能解决你的问题,请参考以下文章

如何在不重新加载页面的情况下从 FF Web 扩展内容脚本更改 3rd 方网站上的 Angular 应用程序路由/URL

CakePHP - 从插件加载路由文件

AngularJS:在不完全重新加载控制器的情况下更改哈希和路由

React 不会在路由参数更改或查询更改时重新加载组件数据

当我在android中更改应用程序中的语言环境时如何重新加载当前视图

Cakephp 3 带有语言参数的路由