Установить глобальное значение языка в приложении Yii2

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

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


person bxN5    schedule 10.01.2015    source источник
comment
Хорошее введение в работу с языками можно найти здесь: I18n выбор языка приложения   -  person robsch    schedule 19.03.2018


Ответы (7)


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

\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 вместо исходного.

Я надеюсь, что это помогает.

person Masiorama    schedule 10.01.2015

Вы можете установить базовый язык в файле конфигурации. В базовом приложении его местоположение по умолчанию: /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'],
    ...
];
person Jelmer Keij    schedule 13.05.2015
comment
Это не работает для базового шаблона YII2 - видимый язык сайта остается "en" - person Valery Bulash; 13.09.2016
comment
Остается en-US для меня - person NaturalBornCamper; 25.04.2018

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

Начальная загрузка:

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

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

"о предварительном действии":

$config = [
   'on beforeAction' => function($event) {
      // set language
   } 
];
person Blizz    schedule 13.05.2015
comment
Не могли бы вы предоставить полный пример кода для установки языка в качестве глобального. Это будет полезно для всех участников. - person sankar muniyappa; 04.10.2016

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

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

Создайте файл, скажем, в 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, он зависит от языка браузера клиента. На странице ниже вы также можете найти пример того, как добиться выбора языка на основе предпочтений. Но в основном вам нужно в вашем компоненте languageSelector получить значение из файла cookie и соответствующим образом изменить язык. Если в браузере пользователя нет файла cookie, вы можете вернуться к языку браузера.

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

person SercioSoydanov    schedule 02.02.2016

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

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/

person Sergio    schedule 24.11.2017

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

person Riko    schedule 10.01.2015

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

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

person brahmeswara rao Kamineni    schedule 25.11.2017