首页 > 解决方案 > yii2 i18n not working with buttons

问题描述

I am trying to set i18n into my website. I did all configurations like following: 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',
                ],
            ],
        ],
    ],
//...

Directories:

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

ru-RU/app.php file:

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

And when I put \Yii::$app->language = 'ru-RU' into layouts/main.php file, it's working. But when I am using buttons to change language, i18n is not working. code for buttons in 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>

site/lang:

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

Please, help!

标签: yii2internationalization

解决方案


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

我建议您阅读有关语言检测的文档: Yii2 Cookbook - 选择应用程序语言

简而言之:在支持手动选择语言部分,您会看到可以将语言设置存储在用户 cookie 或数据库中。在应用程序引导程序中,您获取语言首选项,并将其设置到应用程序中。

打开应用程序配置并将以下代码添加到您的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']) ?>

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


推荐阅读