fedemotta / localeurls
localeurls 是一个用于通过 URL 自动进行地域/语言管理的 Yii 扩展。
Requires
- php: >=5.0.0
README
URL 的自动地域/语言管理。
这是对 mikehaertl/localeurls 存储库的真正长期分支,目前处于维护模式。从版本 1.2 开始,有一个 redirectDefaultTo 参数来鼓励用户在选择之前选择一个有效的语言。您可以在 https://www.weegoo.com/ 上看到此功能。
此扩展允许使用包含语言代码的 URL,例如
/en/some/page
/de/some/page
http://www.example.com/en/some/page
http://www.example.com/de/some/page
从 1.1.3 版本开始,如果您想的话,也可以配置更友好的语言名称
http://www.example.com/english/some/page
http://www.example.com/deutsch/some/page
语言代码会自动插入到创建的每个 URL 中,并在每个请求中读取。不需要额外的 URL 规则。为了获得最佳用户体验,如果用户返回到没有语言代码的 URL,语言也会从会话/cookie 中恢复。
安装
将包解压到您的 protected/extensions
目录,并将其重命名为 localeurls
。然后配置您的 protected/config/main.php
中的组件
<?php return array( // ... 'components' => array( // ... 'urlManager' => array( 'class' => 'ext.localeurls.LocaleUrlManager', // Advanced configuration with defaults (see below) //'languageParam' => 'language', ), 'request' => array( 'class' => 'ext.localeurls.LocaleHttpRequest', 'languages' => array('en_us','en','de','fr'), // Since version 1.1.3 you can also map url => language // 'languages' => array( // 'english' => 'en', // 'deutsch' => 'de', // 'fr', // ) // Advanced configuration with defaults (see below) //'detecLanguage' => true, //'languageCookieLifetime' => 31536000, //'persistLanguage' => true, //'redirectDefault' => false, //'redirectDefaultTo' => '/site/selector', ), // ... ), );
注意:您需要配置所有可用的语言,包括您应用程序的默认语言。更具体的语言代码应先列出,例如
en_us
应在en
之前。
操作模式
配置上述设置后,您就可以开始使用了。如果收到一个未设置语言的请求,组件将尝试从 HTTP 标头自动检测语言,并将其重定向到该 URL,例如 www.example.com/fr
。如果 fr
是您应用程序的默认语言(即您在 main.php
中配置的),则不会进行重定向 - 除非您将 redirectDefault
设置为 true
。
注意:如果启用了
redirectDefault
,则无法再访问www.example.com
,因为您总是会重定向到特定的语言 URL,即使对于默认应用程序语言也是如此。
您使用任何 createUrl()
和 createAbsoluteUrl()
方法创建的所有 URL 都将包含当前访问者的语言。对于默认语言也适用相同的规则:除非您将 redirectDefault
设置为 true
,否则如果您使用的是默认语言,则您创建的 URL 不会包含语言代码。
要让您用户切换到另一种语言,您可以通过通常的方法创建 URL,并在其中添加一个 language
参数
<?php $germanUrl = $this->createUrl('site/contact', array('language' => 'de'));
一旦用户访问了一个包含语言代码的 URL,该语言就会被存储在他的会话中。如果用户在没有语言代码的 URL(或任何其他页面)上返回到起始页面,他将被自动重定向到他的最后选择的语言。下面是一个有用的小部件,它可以创建一个简单的语言选择器。
API
LocaleHttpRequest
属性
detectLanguage
:是否从 HTTP 标头自动检测用户首选语言。默认值为true
。languageCookieLifeTime
:在 cookie 中存储用户语言的时长。默认值为 1 年。设置为false
以禁用 cookie 存储。languages
:可用语言代码数组。更具体的模式必须先列出,即en_us
必须在en
之前列出。应用程序配置中的默认语言也必须在此列出。从 1.1.3 版本开始,您还可以将 URL 值映射到语言:array('de','fr','english'=>'en')
。persistLanguage
:是否将用户语言选择存储在会话和Cookie中。如果用户返回任何不带语言URL的页面,则会被重定向到存储的语言URL。默认值为true
。redirectDefault
:是否也将应用程序的默认语言重定向,例如,如果主应用程序语言是en
,则从www.example.com
重定向到www.example.com/en
。默认值为false。redirectDefaultTo
:如果redirectDefault
为true,您可以提供一个始终将用户重定向到的URL(并且您可以鼓励用户选择有效语言),例如/site/selector
。默认值为null。
方法
getDefaultLanguage()
:返回默认语言,这是在语言检测过程中覆盖之前在主应用程序配置中设置的。
LocaleUrlManager
属性
languageParam
:构建URL时包含所需语言的参数名称。默认值为language
。
如何切换语言
以下是一个简单的示例,说明如何创建一个语言选择小部件。它创建了一个针对流行的Bootstrap框架定制的下拉菜单。
<?php class LanguageSelector extends CWidget { public function run() { $app = Yii::app(); $route = $app->controller->route; $languages = $app->request->languages; $language = $app->language; $params = $_GET; echo CHtml::link($language. ' <b class="caret"></b>', '#', array( 'class' => 'dropdown-toggle', 'data-toggle' => 'dropdown' )); array_unshift($params, $route); echo '<ul class="dropdown-menu" role="menu" aria-labelledby="dropdownMenu">'; foreach($languages as $lang) { if($lang===$language) continue; $params['language'] = $lang; echo '<li>'.CHtml::link($lang,$params ).'</li>'; } echo '</ul>'; } }
变更日志
1.2.1
- 301重定向
1.2
- 将此分支作为一个真正的长期分支更新,以上传到packagist
redirectDefaultTo
功能
1.1.6
- 修复#8:包含语言代码的URL再次出错
1.1.5
- 修复#4:切换到默认语言时丢失查询参数
1.1.4
- 修复#3:无法创建切换到默认语言的URL
1.1.3
- 添加映射功能。
- 在
ext.localeurls
类别下添加调试输出(仅当YII_DEBUG
被设置时)
升级
从1.0.0
defaultLanguage
参数已被删除。您应在主应用程序配置中配置默认语言。如果您想重定向到默认语言,可以将redirectDefault
设置为true。