geertw / yii2-translatable-url-rule
一个为 Yii 2 定制的 URL 规则类,允许创建可翻译的 URL 规则
Requires
- yiisoft/yii2: ^2.0.13
Suggests
- codemix/yii2-localeurls: Redirects users based on the request's language parameter.
README
Yii2 TranslatableUrlRule
一个为 URL 规则类 定制的 Yii 2,允许创建可翻译的 URL 规则。
此扩展允许您按语言编写 URL 规则。例如,您可以有 signup
用于 en
,aanmelden
用于 nl
和 registrieren
用于 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 的示例。