14

我在哪里可以全局设置语言(基于用户的 cookie)?如何让它在整个应用程序(控制器、视图等)中工作?

在我发现的文档 \Yii::$app->language = '';中,我可以在哪里编写逻辑以正确的方式更改语言?

4

7 回答 7

21

您可以在配置文件中设置您的基本语言。在基本应用程序中,它的默认位置是:/config/web.php,高级:application-name/config/main.phpapplication-name/config/main-local.php.

$config = [
    'id' => 'basic',
    'language' => 'nl', // Set the language here
    'basePath' => dirname( __DIR__ ),
    'bootstrap' => ['log'],
    ...
];
于 2015-05-13T09:39:54.343 回答
15

你应该使用

\Yii::$app->language = ''; 

在作为所有控制器的父级的控制器内部。父类应该在 components 文件夹中,如果它不可用,则使用类似的东西创建组件

use yii\web\Controller;
class MyController extends Controller
{
    public function init()
    {
        parent::init();
        #add your logic: read the cookie and then set the language
    }
}

之后,您必须确保所有控制器都扩展了新创建的 MyController 而不是原来的控制器。

我希望它有所帮助。

于 2015-01-10T23:09:08.823 回答
4

公认的答案是一个很好的答案,但如果您想要“更全局”的东西,您可以使用引导功能或“on beforeAction”来触发功能(都通过配置):

引导程序:

$config = [
  ...
  'bootstrap' => ['your\own\component'],
  ...
];

例如,您可以使用该init()组件的 -function。

“在行动之前”:

$config = [
   'on beforeAction' => function($event) {
      // set language
   } 
];
于 2015-05-13T19:51:15.183 回答
1

我知道这很旧,但是我在寻找答案时发现了这个问题。我还找到了一个不错的指南,链接如下。

一种创建组件并引导它的方法,如下所示:

在 common/components/LanguageSelector.php 中创建一个文件

<?php

namespace common\components;

use yii\base\BootstrapInterface;

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

    public function bootstrap($app)
    {
        $preferredLanguage = $app->request->getPreferredLanguage($this->supportedLanguages);
        $app->language = $preferredLanguage;
    }
}

我使用的是高级应用模板,您可以根据需要调整文件位置和命名空间。

然后,在您的配置文件中,您需要添加此组件,就像您添加另一个组件(如调试或日志组件)一样,如下所示:

'components' => [
    'languageSelector' => [
        'class' => 'common\components\LanguageSelector',
        'supportedLanguages' => ['en-US', 'tr-TR'],
    ],
],

此外,您需要将此组件添加到配置文件中的引导组件:

'bootstrap' => ['languageSelector', ...]

然而,这种方法不依赖于 cookie,它依赖于客户端浏览器的语言。您还可以在下面的页面上找到一个示例,了解如何实现基于偏好的语言选择。但基本上您需要做的是,在您的语言选择器组件中,从 cookie 中获取值并相应地更改语言。如果用户浏览器中没有 cookie,您可以回退到浏览器语言。

https://github.com/samdark/yii2-cookbook/blob/master/book/i18n-selecting-application-language.md

于 2016-02-02T19:51:53.863 回答
1

您的问题有很多答案,具体取决于您的逻辑。如果您有静态规则:

return [
    ...
    'language' => 'it',
    ...
];

http://www.yiiframework.com/doc-2.0/guide-tutorial-i18n.html#configuration

如果你想实现普通的 HTTP 内容协商,你有一个专门的组件:

return [
    ...
    'components' => [
        ...
        'contentNegotiator' => [
            'class' => 'yii\filters\ContentNegotiator',
            'languages' => ['en', 'it'],
        ],
        ...
    ],
];

http://www.yiiframework.com/doc-2.0/guide-structure-filters.html#content-negotiator

如果你需要更复杂的协商,你可以创建一个引导组件。这是一个示例,其中语言取自登录用户的用户偏好或为来宾协商。请注意,您可以使用复杂的操作使应用程序过载,例如从数据库中获取支持的语言。

/**
 * Select a language from user preferences or content negotiation
 */
class LanguageSelector implements BootstrapInterface
{
    public function bootstrap($app)
    {
        if (\Yii::$app->user->isGuest) {
            $supportedLanguages = (new \yii\db\Query())
                ->select('iso639_1')
                ->from('language')
                ->orderBy(['priority' => SORT_ASC])
                ->column();

            $app->language = $app->request->getPreferredLanguage($supportedLanguages);

        } else {
            $app->language = Language::findOne(\Yii::$app->user->identity->language_id)->iso639_1;
        }
    }
}

关于这个主题有一个很好的阅读:https ://yii2-cookbook.readthedocs.io/i18n-selecting-application-language/

于 2017-11-24T17:49:29.943 回答
0

Roman,您可以使用主配置文件或参数来实现您的目标。只需创建一个变量,$sitelang = 'UK_ua';然后您就可以通过Yii::$app->params['sitelang']

于 2015-01-10T23:21:36.507 回答
0

转到应用程序配置文件 frontend/main/config.php 或 backend/main/config.php

$config = ['语言' => 'ru-RU']

于 2017-11-25T10:03:05.303 回答