gugglegum/yii2-cookie-language-selector

基于cookie的Yii2语言选择器组件

1.0.0 2015-07-03 20:29 UTC

This package is auto-updated.

Last update: 2024-09-13 13:22:24 UTC


README

这是一个非常简单的组件,它通过cookie机制为您的网站添加语言切换功能。它不是一个小部件,也不提供像lajax/yii2-language-picker这样的GUI。这可能很有用,因为每个真正的网站都有自己的设计和HTML标记。一些网站使用<select>,一些使用带有onclick事件处理器的<ul>下拉列表提交隐藏的POST表单。使用此组件,您可以自由地使用任何语言选择方法。您只需要在需要切换语言时能够发送POST请求的某个东西,并为这个POST请求添加一个非常简单的处理器。

安装

安装非常简单,包括以下5个步骤。

1. 安装组件本身

在您的Yii2应用程序目录中执行以下命令

composer require gugglegum/yii2-cookie-language-selector

(您可能需要使用composer.phar而不是composer)。这将安装gugglegum/yii2-cookie-language-selector组件到您的应用程序中。

2. 将组件添加到您的配置

前往您的前端配置,并将组件配置添加到components部分

        'cookieLanguageSelector' => [
            'class' => 'gugglegum\Yii2\Extension\CookieLanguageSelector\Component',
            'defaultLanguage' => 'en-US',
            'validLanguages' => ['en-US', 'ru-RU', 'de-DE'],
        ],

defaultLanguage是语言选择之前使用的默认语言。validLanguages是可以选择的语言列表。另外,您还可以定义存储语言的cookie名称(cookieName)及其过期期限(cookieExpire)。默认cookie名称为"lang",它会在7776000秒(90天)后过期。

3. 在引导中添加组件

您的应用程序将当前语言存储在Yii::$app->language中。因此,您需要将此组件添加到前端配置的bootstrap部分,以便在每次应用程序启动时初始化此组件。您应该得到类似以下内容

    'bootstrap' => ['log', 'cookieLanguageSelector'],

cookieLanguageSelector的初始化将只设置Yii::$app->language为从组件检索到的语言。请使用长语言格式,如"en-US",而不是"en"。

4. 在您的网站上创建POST表单

您应该在网站上创建一个使用POST方法的HTML表单或ajax POST,以将新语言发送到服务器。您的表单可能只包含language参数。另外,您还可以添加redirectTo参数,其中包含用户切换语言后应重定向到的URL(通常是用户之前所在的同URL)。这些参数的名称(languageredirectTo)不是预定义的,完全由您决定,并且它们仅在步骤5中描述的处理程序动作中使用。

请避免使用HTTP的GET方法切换语言。根据RFC-2616的描述,GET方法不应用于除检索信息之外的情况。您的浏览器可能会预取页面上的链接并随机切换语言。另一方面,GET方法请求可能会在代理服务器上缓存,因此切换可能不会起作用。请始终为执行操作的动作使用POST方法。

以下是一个简单的语言切换表单示例。将其添加到某个视图或布局中

        <?= Html::beginForm(['site/switch-language'], 'post') ?>
        <?= Html::hiddenInput('redirectTo', \yii\helpers\Url::to(Yii::$app->request->url)) ?>
        <?= Html::beginTag('select', ['name' => 'language', 'onchange' => 'this.form.submit();']) ?>
        <?= Html::renderSelectOptions(\Yii::$app->language, [
            'en-US' => 'English',
            'de-DE' => 'Deutsch',
            'ru-RU' => 'Russian',
        ]) ?>
        <?= Html::endTag('select') ?>
        <?= Html::endForm() ?>
        <p>Current language is <?= Html::encode(\Yii::$app->language) ?> </p>

当然,您可以使用更定制化的版本。例如,您可以使用CSS样式的下拉列表提交隐藏的POST表单。

5. 创建处理程序动作

将以下动作方法添加到您的SiteController.php

    /**
     * Switches the language and redirects back
     */
    public function actionSwitchLanguage()
    {
        Yii::$app->cookieLanguageSelector->setLanguage(Yii::$app->request->post('language'));
        $this->redirect(Yii::$app->request->post('redirectTo', ['site/index']));
    }

就是这样!欢迎您的评论和建议。