MikeHaertl / localeurls
localeurls 是一个用于通过 URL 自动进行区域/语言管理的 Yii 扩展。
Requires
- php: >=5.0.0
README
为 URL 自动进行区域/语言管理。
此扩展允许使用包含语言代码的 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, ), // ... ), );
注意:您需要配置所有可用的语言,包括应用程序的默认语言。更具体的语言代码应先列出,例如
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。默认为true
。redirectDefault
: 是否也要重定向应用程序的默认语言,即如果主应用程序语言是en
,则从www.example.com
重定向到www.example.com/en
。默认为 false。
方法
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.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。