yii2 i18n不使用按钮

yii2 i18n不使用按钮,yii2,internationalization,Yii2,Internationalization,我正在尝试将i18n设置到我的网站中。我做了如下所有配置: common/config/main.php 'language' => 'uz-UZ', 'sourceLanguage' => 'en-US', // ... 'components' => [ //... 'i18n' => [ 'translations' => [ 'app*' => [ 'class' =>

我正在尝试将i18n设置到我的网站中。我做了如下所有配置: common/config/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/app.php文件:

return [
    'Bosh sahifa' => 'Домашная страница'
];
当我把
\Yii::$app->language='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>

求求你,救命

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

我建议您阅读以下有关语言检测的文档:

简单地说:在第节中,您可以将语言设置存储在用户cookie或数据库中。在应用程序引导中,您获取语言首选项,并将其设置到应用程序中

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

return [
    'bootstrap' => [
        [
            'class' => 'app\components\LanguageSelector',
            'supportedLanguages' => ['en_US', 'ru_RU'],
        ],
    ],
    // ...
];
然后创建
LanguageSelector
类并编写如下内容: 名称空间应用程序\组件

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

更新

您还可以查看扩展,它可以使您的应用程序更易于管理语言。
您只需将扩展组件添加到配置文件中,就可以使用以下链接轻松更改应用程序语言:

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


请注意,它将在URL中显示语言,如
/fr/demo/action
,这对于SEO非常有用

可能重复您链接的页面中给出的我已更改的语言。现在它只适用于layout/main.php,而不适用于其他页面,如index.php或view.phpThank!它真的帮助了我
<?= $url = Url::to(['demo/action', 'language' => 'fr']) ?>
<?= Html::a('Click', ['demo/action', 'language' => 'fr']) ?>