Где я могу установить язык (на основе файлов cookie пользователя) в глобальном масштабе? Как заставить его работать во всем приложении (контроллеры, представления и т. Д.)?
В документации я нашел \Yii::$app->language = '';
но где я могу написать свою логику, чтобы правильно изменить язык?
Вы должны использовать
\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
}
];
Есть много ответов на ваш вопрос, в зависимости от вашей логики.
Если у вас есть статическое правило:
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/
Роман, ты можешь достичь своей цели, используя основной файл конфигурации или параметр. Просто сделайте переменную как $sitelang = 'UK_ua';
тогда вы можете использовать его через Yii::$app->params['sitelang']
Перейдите в файл конфигурации приложения frontend / main / config.php или backend / main / config.php
$ config = [‘language’ => ‘ru-RU’]
Я знаю, что это старый, но я нашел этот вопрос, когда я искал ответ. Я также нахожу хорошее руководство, ссылка ниже.
Один из способов сделать это для создания компонента и его начальной загрузки, вот так:
Создайте файл, скажем, в общем / компоненты / 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