【问题标题】:How to manage routes with Internationalization in CakePHP?如何在 CakePHP 中使用国际化管理路由?
【发布时间】:2021-12-27 10:55:59
【问题描述】:

我的网站将管理两种语言,法语(默认语言)和荷兰语。 在法语中,我认为我不需要在 URL 中显示语言参数,所以我只想为荷兰语显示它(例如 myapp.com/nl/)。目前我的路线无法正常工作,不确定我是否以正确的方式使用 lang 参数。 我是 CakePHP 的菜鸟,所以我按照文档做了以下操作:

Header.php(我觉得这里有问题……

<?php if (!$this->request->getParam('lang')) : ?>
        <?= $this->Html->link('<i class="fas fa-globe"></i> Nederlands', ['lang' => 'nl'], ['class' => 'btn ms-lg-4 btn-primary btn-sm float-end float-lg-start mt-3 mt-lg-0', 'escape' => false]) ?>
<?php else : ?>
        <?= $this->Html->link('<i class="fas fa-globe"></i> Français', ['lang' => ''], ['class' => 'btn ms-lg-4 btn-primary btn-sm float-end float-lg-start mt-3 mt-lg-0', 'escape' => false]) ?>
<?php endif ?>

appController.php

public function beforeFilter(EventInterface $event) {
    # We check if we have a language set
    if ($this->request->getParam('lang')) {
        I18n::setLocale($this->request->getParam('lang'));
    } else {
        # If we don't have one, we will set the default one (in my case it's French)
        I18n::setLocale('fr');
    }
}

routes.php

 $builder
    ->connect(
        '/',
        ['controller' => 'pages', 'action' => 'home']
    );

$builder
    ->connect(
        '{lang}/',
        ['controller' => 'pages', 'action' => 'home']
    )
    ->setPersist(['lang']);

$builder
    ->connect(
        '/{lang}/{controller}/{action}/*', 
        []
    )
    ->setPatterns([
        'lang' => '[a-z]{2}'
    ])
    ->setPersist(['lang']);

$builder
    ->connect(
        '/{lang}/{controller}/{action}/{id}', 
        []
    )
    ->setPatterns([
        'lang' => '[a-z]{2}',
        'id' => '\d+'
    ])
    ->setPersist(['lang'])
    ->setPass(['id']);

$builder
    ->connect(
        '/{lang}/{controller}/{action}/{slug}', 
        []
    )
    ->setPatterns([
        'lang' => '[a-z]{2}',
        'slug' => '[a-z0-9-_]+'
    ])
    ->setPersist(['lang'])
    ->setPass(['slug']);

感谢您的帮助。

【问题讨论】:

    标签: cakephp internationalization cakephp-4.x


    【解决方案1】:

    在你的 Header.php 中试试这个

    <?php
        $langList = ['fr', 'nl'];
        // Remove lang from current URL
        $hereWithoutLang = preg_replace('#^/(' . implode('|', $langList) . ')#', '', $this->request->getRequestTarget());
    ?>
    
    <?= $this->Html->link(
        '<i class="fas fa-globe"></i> Nederlands',
        '/nl' . $hereWithoutLang,
        ['class' => 'btn ms-lg-4 btn-primary btn-sm float-end float-lg-start mt-3 mt-lg-0', 'escape' => false]) ?>
    
    <?= $this->Html->link(
        '<i class="fas fa-globe"></i> Français',
        empty($hereWithoutLang) ? '/' : $hereWithoutLang,
        ['class' => 'btn ms-lg-4 btn-primary btn-sm float-end float-lg-start mt-3 mt-lg-0', 'escape' => false]) ?>
    

    【讨论】:

      猜你喜欢
      • 2015-08-31
      • 1970-01-01
      • 2011-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-19
      • 2014-06-21
      相关资源
      最近更新 更多