【问题标题】:Cakephp 3.x translating the routesCakephp 3.x 翻译路线
【发布时间】:2016-05-10 17:37:27
【问题描述】:

有没有办法转换路线? 例如:

domain.com/catalog/products     // english
domain.com/catalogo/productos   // portuguese

两个不同的路由,但是调用同一个 Plugin/Controller/Action/

我尝试这样创建:

    Router::plugin('Catalog', ['path' => __d('catalog', /catalog']), function ($routes ){
        $routes->connect(__d('catalog','/inventory'),
            ['controller' => 'inventory', 'action' => 'index']
        );
    }

但是,I18n::locale() 每次都返回默认的“en_US”,即使登录我网站的用户是“pt_BR”。 在我的控制器上,同样的功能:I18n::locale() 返回正确。

好的,现在让我们想象一下,使用__d()“自动”执行此操作是不可能的,我必须用每种语言编写每条路线(至少目前只有 2 条)。

那么,如何根据用户的语言创建链接? 例如:

echo $this->Html->link(
        __d('catalog','inventory'),
        ['plugin'=>'catalog', 'controller' => 'inventory', 'action' => 'index']
    );

【问题讨论】:

    标签: cakephp routing internationalization cakephp-3.0


    【解决方案1】:

    但是,即使登录我网站的用户是“pt_BR”,I18n::locale() 每次都会返回默认的“en_US”。在我的控制器上,同样的函数:I18n::locale() 返回正确。

    听起来像是执行顺序的问题。找出实际设置语言的时间。我不确定我现在也没有心情和时间为您查找它,但我认为甚至在应用程序 bootstrap.php 之前就已经加载了路线。

    根据您实施语言检测的方式,我猜它是在您的路线之后设置的,这就是您最终使用 en_US 的原因。如果您使用的是语言调度程序过滤器,我猜它是在路由之后设置的,但逻辑上是在控制器加载之前设置的。

    【讨论】:

    • 我尝试将 I18n::locale("pt_BR") 放在 bootstrap.php 上,即使在我的路线上返回 en_US,默认值。 bootstrap.php 比 routes.php 先加载。但是这个问题我可以创建硬代码,用每种语言设置每条路线。但主要问题是如何根据语言创建一个 url。
    • 您找到解决方案了吗?似乎路由是在引导之前加载的。
    猜你喜欢
    • 2020-07-09
    • 2016-11-05
    • 2016-03-09
    • 2015-10-27
    • 2018-08-22
    • 1970-01-01
    • 2015-09-14
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多