unique/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-09 16:12:07 UTC


README

Latest Stable Version Total Downloads License

Yii2 TranslatableUrlRule

为 Yii 2 定制的 URL 规则类,允许使用可翻译的 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 时,您需要指定 两个 语言参数。

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

创建一个如下所示的 widget

<?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 的示例。