yii2 i18n不使用按钮

时间:2018-06-18 07:03:19

标签: yii2 internationalization

我正在尝试将i18n设置到我的网站中。我做了以下所有配置: 公共/配置/ main.php

'language' => 'uz-UZ',
    'sourceLanguage' => 'en-US',
// ...
'components' => [
//...
'i18n' => [
        'translations' => [
            'app*' => [
                'class' => 'yii\i18n\PhpMessageSource',
                //'basePath' => '@app/messages',
                //'sourceLanguage' => 'en-US',
                'fileMap' => [
                    'app' => 'app.php',
                    'app/error' => 'error.php',
                ],
            ],
        ],
    ],
//...

目录:

- common
   -messages
      -en-EN
         app.php
      -ru-RU
         app.php

ru-RU / app.php文件:

return [
    'Bosh sahifa' => 'Домашная страница'
];

当我将\Yii::$app->language = 'ru-RU'放入layouts / main.php文件时,它正在运行。但是,当我使用按钮来改变语言时,i18n无效。 layouts / main.php中按钮的代码:

<div>
   <a href="<?= Url::to(['site/lang', 'lang' => 'uz']) ?>">uz</a>
   <a href="<?= Url::to(['site/lang', 'lang' => 'ru']) ?>">ru</a>
   <a href="<?= Url::to(['site/lang', 'lang' => 'en']) ?>">en</a>
</div>

站点/郎:

public function actionLang($lang)
{
    switch ($lang) {
        case "en":
            \Yii::$app->language = "en-EN";
            break;
        case "ru":
            \Yii::$app->language = "ru-RU";
            break;
        case "uz":
            \Yii::$app->language = "uz-UZ";
            break;
        default:
            \Yii::$app->language = "uz-UZ";
    }
    $this->goBack();
}

请帮忙!

1 个答案:

答案 0 :(得分:2)

您没有在任何地方存储语言设置(对于给定的客户端)。事实上,只有在actionLang()打开时才会更改语言,但它不会起作用,因为您使用$this->goBack()(没有传递$ lang参数)立即重定向到上一页。

我建议您阅读有关语言检测的文档: Yii2 Cookbook - Selecting application language

简要说明:在Support selecting language manually部分,您会发现可以在用户Cookie或数据库中存储语言设置。在app bootstrap上,您可以获取语言首选项,并将其设置为应用程序。

打开应用程序配置并将以下代码添加到boostrap部分:

return [
    'bootstrap' => [
        [
            'class' => 'app\components\LanguageSelector',
            'supportedLanguages' => ['en_US', 'ru_RU'],
        ],
    ],
    // ...
];

然后创建LanguageSelector类并编写如下内容: namespace app \ components;

use yii\base\BootstrapInterface;

class LanguageSelector implements BootstrapInterface
{
    public $supportedLanguages = [];

    public function bootstrap($app)
    {
        $preferredLanguage = isset($app->request->cookies['language']) ? (string)$app->request->cookies['language'] : null;

        if (empty($preferredLanguage)) {
            $preferredLanguage = $app->request->getPreferredLanguage($this->supportedLanguages);
        }

        $app->language = $preferredLanguage;
    }
}

<强>更新

此外,您还可以查看yii2-localeurls扩展程序,这样可以更轻松地管理您应用程序中的语言 您所要做的就是将扩展组件添加到配置文件中,您可以使用这种链接轻松更改应用程序语言:

<?= $url = Url::to(['demo/action', 'language' => 'fr']) ?>
<?= Html::a('Click', ['demo/action', 'language' => 'fr']) ?>

请注意,它会在/fr/demo/action这样的网址中显示语言,这对SEO非常有用