如何在CakePHP中使用国际化管理路由?

pxiryf3j  于 2022-11-11  发布在  PHP
关注(0)|答案(1)|浏览(110)

我的网站将管理两种语言,法语(默认语言)和荷兰语。在法语中,我认为我不需要在URL中显示语言参数,所以我想只显示荷兰语(例如myapp.com/nl/)。目前我的路由不能正常工作,不确定我是否正确使用lang参数。我是一个新手与CakePHP,所以我做了以下根据文档:
我觉得这里面有一个问题。

<?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']);

谢谢你的帮助。

bjg7j2ky

bjg7j2ky1#

在您的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]) ?>

相关问题