dlls / yii2-localeurls
为URL自动管理区域/语言。
README
为Yii 2通过URL实现自动的区域/语言管理。
特性
使用此扩展,您可以使用包含语言代码的URL,例如
/en/some/page
/de/some/page
http://www.example.com/en/some/page
http://www.example.com/de/some/page
如果您想,也可以配置友好的名称
http://www.example.com/english/some/page
http://www.example.com/deutsch/some/page
语言代码将在创建URL时自动添加,并在解析URL时读取。为了最佳的用户体验,语言将自动从浏览器设置中检测 - 但用户仍然可以通过调用另一个语言代码的URL来访问其他语言。
最后请求的语言也将持久化在用户会话和cookie中。因此,如果用户尝试访问您的网站而没有URL中的语言代码,他将被重定向到他在上次访问中使用的语言。
当然,所有上述内容(以及更多)都是可配置的。
安装
通过composer安装包
composer require dlds/yii2-localeurls
然后将以下内容添加到您的应用程序配置中
<?php return [ // ... 'bootstrap' => ['localeUrls'], // ... 'components' => [ // ... 'localeUrls' => [ 'class' => 'dlds\localeurls\LocaleUrls', // List all supported languages here 'languages' => ['en_us', 'en', 'fr', 'de'] ] // Override the urlManager component 'urlManager' => [ 'class' => 'dlds\localeurls\UrlManager', ] // ... ] ];
现在您已准备好使用此扩展了。
注意:您仍然可以像往常一样配置自定义URL规则。只需忽略任何
language
参数即可,因为它将在解析之前被删除,并在创建URL后添加。
注意2:语言代码将从pathInfo中删除。
操作模式和配置
创建URL
所有创建的URL都将包含当前应用程序语言的代码。因此,如果检测到的语言是de
,您使用
<?php $url = Url:to(['demo/action']) ?> <?= Html::a('Click', ['demo/action']) ?>
您将得到如下URL
/de/demo/action
要创建一个切换到不同语言的链接,您可以显式添加language
URL参数
<?= $url = Url:to(['demo/action', 'language'=>'fr']) ?> <?= Html::a('Click', ['demo/action', 'language'=>'fr']) ?>
这将给出如下URL
/fr/demo/action
注意:如果使用自定义URL规则,URL可能看起来不同。在这种情况下,语言参数始终被附加到最终的相对/绝对URL之前/之后。
如果您想为该URL参数使用不同于language
的名称,可以通过urlManager
组件的languageParam
选项进行配置。
默认语言
默认语言通过应用程序配置中的language参数进行配置。
默认情况下,默认语言的URL不会包含任何语言代码。例如
/
/some/page
如果网站通过包含默认语言代码的URL访问,访问者将被重定向到没有语言代码的URL。例如,如果默认语言是fr
/fr/ -> Redirect to /
/fr/some/page -> Redirect to /some/page
如果将enableDefaultSuffix
更改为true
,则相反。现在包括默认语言在内的每种语言都将在URL中使用显式的语言代码。没有语言代码的URL不再可访问
/fr
/fr/some/page
/ -> Redirect to /fr
/some/page -> Redirect to /fr/some/page
语言配置
包括默认语言在内的所有语言都必须配置在localeUrls
组件的languages
参数中。您应该在类似外观的通用代码之前列出更具体的语言代码(即,'en_us'之前'en')
'languages' => ['en_us','en_uk','en','fr','de_at','de'],
您还可以在URL中使用更友好的名称,配置如下
'languages' => ['en','german'=>'de'],
<?= Url:to(['demo/action', 'language'=>'de']) ?>
这将给出如下URL
/german/demo/action
持久化
访问者最后使用的语言将被存储在用户会话和cookie中。如果用户再次访问您的网站而没有语言代码,他将被重定向到存储的语言。
例如,如果用户首先访问
/de/some/page
然后经过一段时间后回到以下URL之一
/some/page -> Redirect to /de/some/page
/ -> Redirect to /de/
/dk/some/page
在上一个情况下,dk
将被存储为最后使用的语言。
持久性默认启用,可以通过在 localeUrls
组件中将 enablePersistence
设置为 false
来禁用它。
您可以使用以下方法修改其他持久性设置:
languageCookieDuration
:将语言信息存储在 cookie 中的秒数。设置为false
以禁用 cookie。languageCookieName
:语言 cookie 的名称。默认为_language
。languageSessionKey
:语言会话键的名称。默认为_language
。
重置为默认语言
您会注意到,如果 enableDefaultSuffix
设置为 false
(这是默认值)并且用户已经将 de
存储为最后使用的语言,那么会出现一个问题。我们如何现在以默认语言访问网站呢?因为我们尝试访问 /
时,会被重定向到 /de/
。
答案很简单:为了创建一个重置 URL,您需要在 URL 中显式包含默认语言的代码。例如,如果默认语言是 fr
<?= Url:to(['demo/action', 'language'=>'fr']) ?>
/fr/demo/action -> Redirect to /demo/action
在这种情况下,fr
将首先被存储为最后使用的语言,然后再将用户重定向。
语言检测
如果用户第一次访问您的网站,并且会话或 cookie 中没有存储语言(或者持久性已关闭),那么将从访客的浏览器设置中检测语言。如果首选语言之一与您的语言匹配,它将被用作应用程序语言(如果启用持久性,也会被持久化)。
要禁用此功能,您可以将 enableLanguageDetection
设置为 false
。默认情况下它是启用的。
示例语言选择小部件
没有包含语言选择小部件,因为这样的小部件在标记和行为方面有太多的选项。但是,构建它非常简单。以下是基本思路
<?php use Yii; use yii\bootstrap\Dropdown; class LanguageDropdown extends Dropdown { private static $_labels; public function init() { $route = '/'.Yii::$app->controller->route; $appLanguage = Yii::$app->language; $params = $_GET; array_unshift($params, $route); foreach (Yii::$app->localeUrls->languages as $language) { if ($language===$appLanguage) { continue; // Exclude the current language } $params['language'] = $language; $this->items[] = [ 'label' => self::label($language), 'url' => $params, ]; } parent::init(); } public static function label($code) { if (self::$_labels===null) { self::$_labels = [ 'de' => Yii::t('language', 'German'), 'fr' => Yii::t('language', 'French'), 'en' => Yii::t('language', 'English'), ]; } return isset(self::$_labels[$code]) ? self::$_labels[$code] : null; } }