Yii2 интернационализация

Общие вопросы по использованию второй версии фреймворка. Если не знаете как что-то сделать и это про Yii 2, вам сюда.
Ответить
wwwadminwww
Сообщения: 6
Зарегистрирован: 2017.09.26, 14:03
Контактная информация:

Yii2 интернационализация

Сообщение wwwadminwww »

Добрый день! Подскажите пожалуйста как правильно переключать язык всего приложения на Yii2. Я подключил i18n, добавил несколько переводов все работает если я хардкорно например вот так:

Код: Выделить всё

Yii::$app->language = "ua";
echo Yii::t('app', 'О нас')."<br />";
Я создал такой action в Frontend части приложения, но язык все равно постоянно остается русским.

Код: Выделить всё

public function actionLanguage()
    {
        $get = Yii::$app->request->get();
        print_r($get);
        if (!empty($get) || !empty($get['language'])){
            Yii::$app->language = $get['language'];
            $languageCookie = new Cookie([
                'name' => 'language',
                'value' => $get['language'],
                'expire' => time() + 60 * 60 * 24 * 30, // 30 days
            ]);
            Yii::$app->response->cookies->add($languageCookie);
            echo $get['language'];
            return $this->redirect(['site/index']);
        }
    }
А как теперь сделать чтобы при нажатии на одну кнопку языка например UA, язык поменялся по всему сайту и сохранялся еще как-то?
Аватара пользователя
Faenir
Сообщения: 292
Зарегистрирован: 2010.01.06, 01:46
Откуда: Симферополь

Re: Yii2 интернационализация

Сообщение Faenir »

Можете готовое взять, либо в исходниках посмотрите: https://github.com/search?utf8=✓&q=yii2+lang+switch
wwwadminwww
Сообщения: 6
Зарегистрирован: 2017.09.26, 14:03
Контактная информация:

Re: Yii2 интернационализация

Сообщение wwwadminwww »

Спасибо за примеры. А может кто-то объяснить как примерно работают схема переключения, если не тяжело?
Аватара пользователя
futbolim
Сообщения: 2051
Зарегистрирован: 2012.07.08, 19:28

Re: Yii2 интернационализация

Сообщение futbolim »

Код: Выделить всё

/**
 * @return \yii\web\Response
 * @throws NotFoundHttpException
 */
public function actionChangeLanguage()
{
    $language = Yii::$app->request->post('language');
    $supportedLanguages = Yii::$app->params['supportedLanguages'];

    if (!in_array($language, $supportedLanguages)) {
        throw new NotFoundHttpException;
    }

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

    $languageCookie = new Cookie([
        'name' => 'language',
        'value' => $language,
        'expire' => time() + 60 * 60 * 24 * 30,
    ]);

    Yii::$app->response->cookies->add($languageCookie);

    return $this->redirect(Yii::$app->request->referrer);
}

// params
return [
    // Сюда добавлять/убирать языки. Вся система будет работать.
    // Формат для установки языка/локали: ll-CC, где ll - это двух или трёхбуквенный код языка в нижнем регистре
    // в соответствии со стандартом ISO-639 (http://www.loc.gov/standards/iso639-2/),
    // а CC - это код страны в соответствии со стандартом ISO-3166 (https://www.iso.org/obp/ui/#search/code/).
    'supportedLanguages' => [
        'ru-RU' => 'ru-RU',
        'en-US' => 'en-US',
    ],
];

// bootstrapper
namespace frontend\bootstrappers;

use yii\base\BootstrapInterface;
use yii\base\Object;

class LanguageSetter extends Object implements BootstrapInterface
{
    public function bootstrap($app)
    {
        $preferredLanguage = isset($app->request->cookies['language'])
            ? (string)$app->request->cookies['language']
            : null;

        if (empty($preferredLanguage)) {
            $preferredLanguage = $app->request->getPreferredLanguage(\Yii::$app->params['supportedLanguages']);
        }

        $app->language = $preferredLanguage;
    }
}

// config
return [
    'id' => 'app-frontend',
    'basePath' => dirname(__DIR__),
    'bootstrap' => [
        'log',
        frontend\bootstrappers\LanguageSetter::className(),
    ]
];
wwwadminwww
Сообщения: 6
Зарегистрирован: 2017.09.26, 14:03
Контактная информация:

Re: Yii2 интернационализация

Сообщение wwwadminwww »

Спасибо большое!
Ответить