Php 在Yii2应用程序中设置全局语言值

Php 在Yii2应用程序中设置全局语言值,php,yii2,yii2-advanced-app,Php,Yii2,Yii2 Advanced App,在哪里可以全局设置语言(基于用户的cookie)?如何使其在整个应用程序(控制器、视图等)中工作 在文档中,我找到了\Yii::$app->language=''但是,我可以在哪里编写逻辑以正确的方式更改语言?您应该使用 \Yii::$app->language = ''; 在所有控制器的父控制器内。 父类应该在components文件夹中,如果它不可用,请使用以下内容创建组件 use yii\web\Controller; class MyController extends Con

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

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

您应该使用

\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,而不是原来的MyController


我希望它能有所帮助。

罗曼,您可以使用主配置文件或参数来实现您的目标。只需创建一个变量,如
$sitelang='UK_ua'
然后您可以通过
Yii::$app->params['sitelang']
使用它,您可以在配置文件中设置基本语言。在基本应用程序中,它的默认位置是:
/config/web.php
,在高级应用程序中是:
application name/config/main.php
application name/config/main local.php

$config = [
    'id' => 'basic',
    'language' => 'nl', // Set the language here
    'basePath' => dirname( __DIR__ ),
    'bootstrap' => ['log'],
    ...
];

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

引导:

$config = [
  ...
  'bootstrap' => ['your\own\component'],
  ...
];
例如,您可以使用该组件的
init()
-函数

“在采取行动之前”:


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

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

'components' => [
    'languageSelector' => [
        'class' => 'common\components\LanguageSelector',
        'supportedLanguages' => ['en-US', 'tr-TR'],
    ],
],
例如,在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;
    }
}
此外,您需要将此组件添加到配置文件中的引导组件:

'bootstrap' => ['languageSelector', ...]
这种方法不依赖于cookie,但它依赖于客户端浏览器的语言。您还可以在下面的页面上找到如何实现基于偏好的语言选择的示例。但基本上,您需要做的是,在languageSelector组件中,从cookie中获取值并相应地更改语言。如果用户浏览器中不存在cookie,则可以回退到浏览器语言


根据您的逻辑,您的问题有很多答案。 如果您有静态规则:

如果要实现普通HTTP内容协商,您有一个专用组件:

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


关于这个主题,这里有一本很好的读物:

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


$config=['language'=>'ru-ru']

这不适用于YII2基本模板-站点可见语言仍然是'en'仍然是'en-US',对于meCan,请提供将语言设置为全局的完整代码示例。这对所有会员都有帮助。这里有一个很好的关于如何处理语言的介绍:
'bootstrap' => ['languageSelector', ...]
return [
    ...
    'language' => 'it',
    ...
];
return [
    ...
    'components' => [
        ...
        'contentNegotiator' => [
            'class' => 'yii\filters\ContentNegotiator',
            'languages' => ['en', 'it'],
        ],
        ...
    ],
];
/**
 * 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;
        }
    }
}