Где я могу установить язык (на основе cookie пользователя) глобальным? Заставьте его работать в целом приложении (контроллеры, представления и т. Д.)
В документации я нашел \Yii::$app->language = '';
но, где я могу написать свою логику, правильно изменить язык?
Я новичок в yii, я думаю, что я должен переопределить какой-то компонентный класс или что-то вроде класса Request?
Вы должны использовать
\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, а не оригинальный.
Я надеюсь, что это помогает.
Вы можете установить базовый язык в файле конфигурации. В основном приложении это местоположение по умолчанию: /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» для запуска функции (как через конфигурацию):
Bootstrap:
$config = [ ... 'bootstrap' => ['your\own\component'], ... ];
Затем вы можете использовать init()
этого компонента.
«о преданности»:
$config = [ 'on beforeAction' => function($event) { // set language } ];
Роман, вы можете достичь своей цели, используя основной файл конфигурации или параметр. Просто $sitelang = 'UK_ua';
переменную типа $sitelang = 'UK_ua';
то вы можете использовать его через Yii::$app->params['sitelang']
На ваш вопрос много ответов, в зависимости от вашей логики. Если у вас есть статическое правило:
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/
Перейдите в файл конфигурации приложения frontend / main / config.php или backend / main / config.php
$ config = ['language' => 'ru-RU']
Я знаю, что это старо, но я нашел этот вопрос, пока я искал ответ. Я также нашел хороший гид, ссылка ниже.
Один из способов сделать это, чтобы создать компонент и загрузить его, например:
Создайте файл, например, 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