Yii2 установить значение глобального языка

Где я могу установить язык (основанный на пользовательском cookie) глобальный? Заставьте его работать в целом приложении (контроллеры, представления и т.д.)

В документации я нашел \Yii::$app->language = '';, но где я могу написать свою логику, правильно изменить язык?

Я новичок в yii, я думаю, что я должен обновить класс компонентов или что-то еще, возможно, класс Request?

Ответ 1

Вы должны использовать

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

внутри контроллера, который является родительским для всех ваших контроллеров. Родительский класс должен находиться внутри папки компонентов, и если он недоступен, создайте компонент с чем-то вроде

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, а не оригинальный.

Надеюсь, это поможет.

Ответ 2

Вы можете установить базовый язык в файле конфигурации. В базовом приложении это местоположение по умолчанию: /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'],
    ...
];

Ответ 3

Принятый ответ очень хороший, но на всякий случай, когда вы хотите что-то "еще более глобальное", вы можете использовать функциональность бутстрапа или "on beforeAction" для запуска функции (как через конфигурацию):

Загрузочный лоток:

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

Затем вы можете использовать init() -функцию этого компонента.

"on beforeaction":

$config = [
   'on beforeAction' => function($event) {
      // set language
   } 
];

Ответ 4

Roman, вы можете достичь своей цели, используя основной файл конфигурации или параметр. Просто введите переменную типа $sitelang = 'UK_ua';, затем вы можете использовать ее через Yii::$app->params['sitelang']

Ответ 5

На ваш вопрос много ответов, в зависимости от вашей логики. Если у вас есть статическое правило:

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/

Ответ 6

Перейдите в файл конфигурации приложения frontend/main/config.php или backend/main/config.php

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

Ответ 7

Я знаю, что это старый, но я нашел этот вопрос, пока я искал ответ. Я также нашел хороший гид, ссылка ниже.

Один из способов сделать это, чтобы создать компонент и загрузить его, например:

Создайте файл, например, 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;
    }
}

Я использую расширенный шаблон приложения, вы можете настроить расположение файла и пространство имен по мере необходимости.

Затем в вашем файле конфигурации вам нужно добавить этот компонент, как если бы вы добавляли другой компонент, такой как debug или log components, например:

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

Кроме того, вам необходимо добавить этот компонент к загруженным компонентам в файл конфигурации:

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

Этот подход не зависит от файлов cookie, однако он зависит от языка браузера клиента. Вы также можете найти пример на странице ниже, чтобы узнать, как выбрать язык, основанный на предпочтениях. Но в основном то, что вам нужно сделать, - в вашем компоненте languageSelector - получить значение из файла cookie и соответствующим образом изменить язык. Если в пользовательском браузере нет файла cookie, вы можете вернуться к языку браузера.

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