dlls/yii2-localeurls

为URL自动管理区域/语言。

安装次数: 3,340

依赖关系: 0

建议者: 0

安全: 0

星级: 0

关注者: 3

分支: 111

类型:yii2-extension

1.1.1 2016-06-21 12:19 UTC

This package is not auto-updated.

Last update: 2024-09-25 15:29:53 UTC


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;
    }
}