geertw / yii2-translatable-url-rule

一个为 Yii 2 定制的 URL 规则类,允许创建可翻译的 URL 规则

v1.2.1 2018-09-26 22:16 UTC

This package is auto-updated.

Last update: 2024-09-12 05:41:43 UTC


README

Latest Stable Version Total Downloads License

Yii2 TranslatableUrlRule

一个为 URL 规则类 定制的 Yii 2,允许创建可翻译的 URL 规则。

此扩展允许您按语言编写 URL 规则。例如,您可以有 signup 用于 enaanmelden 用于 nlregistrieren 用于 de。因为此扩展使用 常规 Yii2 UrlRule 对象来构建特定于语言的 URL 规则,所以您仍然拥有常规 Yii URL 规则的所有功能,包括 URL 参数和正则表达式。

当前语言由 Yii::$app->language 参数确定。此参数的值用于创建和解析 URL。

此扩展不会设置当前语言参数。请使用 codemix/yii2-localeurls 来实现。

安装

安装此扩展的首选方式是通过 composer

运行以下命令:

composer require geertw/yii2-translatable-url-rule

或者

"geertw/yii2-translatable-url-rule": "*"

将以下内容添加到您的 composer.json 文件的 require 部分:

用法

更新您的 URL 规则以使用此类并按语言设置模式。

<?
$rules = [
    [
        'class' => 'geertw\Yii2\TranslatableUrlRule\TranslatableUrlRule',
        'patterns' => [
            'en' => '/signup',
            'nl' => '/aanmelden',
            'de' => '/registrieren',
        ],
        'route' => 'user/signup',
    ],
    [
        'class' => 'geertw\Yii2\TranslatableUrlRule\TranslatableUrlRule',
        'patterns' => [
            'en' => '/user/<username>',
            'nl' => '/gebruiker/<username>',
            'de' => '/benutzer/<username>',
        ],
        'route' => 'user/view',
    ],
];
?>

route 参数对所有规则都保持不变。patterns 是所有模式的数组,键必须等于 Yii 语言标识符。如果没有为语言设置模式,则将使用配置的第一个模式。

forceRuleSearch 设置为 true 以强制在所有规则模式中进行搜索。

当在 UrlManager 中配置 ruleConfig 时,您可以在 URL 规则中省略 class 配置。

<?
return [
    'components' => [
        'urlManager'   => [
            'ruleConfig' => [
                'class' => 'geertw\Yii2\TranslatableUrlRule\TranslatableUrlRule'
            ],
            'rules' => $rules,
            // Additional UrlManager configuration
        ],
    ];
?>

语言切换器示例

由于此库的工作方式,当为其他语言的路由创建 URL 时,您需要指定两个语言参数。

以下两个代码片段允许您创建一个简单的下拉菜单,用户可以选择当前路由的替代语言

创建一个类似这样的小部件

<?php

namespace frontend\components;

use Yii;
use yii\bootstrap\Dropdown;

class LanguageSwitcher extends Dropdown {
    public $langLabels;

    private $isError;

    public function init() {
        $route = Yii::$app->controller->route;
        $params = $_GET;
        $this->isError = $route === Yii::$app->errorHandler->errorAction;

        array_unshift($params, '/' . $route);

        foreach (Yii::$app->urlManager->languages as $language) {
            $isWildcard = substr($language, -2) === '-*';
            if ($isWildcard) {
                $language = substr($language, 0, 2);
            }
            $params['language'] = $language;
            $params['url-language'] = $language;
            $this->items[] = [
                'label' => $this->label($language),
                'url'   => $params,
            ];
        }
        parent::init();
    }

    public function run() {
        // Only show this widget if we're not on the error page
        if ($this->isError) {
            return '';
        } else {
            return parent::run();
        }
    }

    public function label($code) {
        return isset($this->langLabels[$code]) ? $this->langLabels[$code] : null;
    }
}

在您的视图代码中插入以下代码

    <?= LanguageSwitcher::widget([
        'options'    => ['class' => 'pull-right'],
        'langLabels' => [
            'de' => 'German',
            'en' => 'English',
            'nl' => 'Nederlands',
        ],
    ]) ?>

您可能已经认识这个例子,因为它在很大程度上是基于 yii2-localeurls 的示例。