Как использовать предпочитаемую локаль в просвете? - PullRequest
0 голосов
/ 16 января 2019

С выпуском Laravel 5.7 класс Illuminate \ Notifications \ Notification начал предлагать метод языкового стандарта для установки желаемого языка. Приложение изменится на эту локаль при форматировании уведомления, а затем вернется к предыдущей локали, когда форматирование будет завершено. Вот пример этой функции:

$user->notify((new InvoicePaid($invoice))->locale('ar'));

Мне просто нужно использовать эту функцию в люменах (последняя версия), но когда я реализую это, как документация говорит, что я получил ошибку

Call to undefined method Laravel\Lumen\Application::getLocale() и это потому, что в приложении lumen нет методов getLocale или setLocale, поэтому есть идеи для решения этой проблемы.

Ответы [ 2 ]

0 голосов
/ 16 января 2019

Вы можете расширить ваш Laravel\Lumen\Application в новом классе и заставить переменную $app взять экземпляр из вашего нового класса в вашем bootstrap\app.php файле

1 - создайте новый класс следующим образом:

<?php namespace App\Core;

use Laravel\Lumen\Application as Core;

class Application extends Core
{
    /**
     * @param $locale
     */
    public function setLocale($locale): void
    {
        $this['config']->set('app.locale', $locale);
        $this['translator']->setLocale($locale);
        $this['events']->fire('locale.changed', [ $locale ]);
    }

    public function getLocale()
    {
        return $this['config']->get('app.locale');
    }
}

2 - создайте экземпляр из вашего нового класса, например:

$app = new App\Core\Application( realpath(dirname(__DIR__) . '/') );

0 голосов
/ 16 января 2019

Разница между Люменом и Ларавелом в том, что в Ларавеле вы называете Application->setLocale().

Это делает три вещи, как указано выше:

  1. Установить конфигурацию app.locale
  2. Установить локаль на переводчике
  3. Запустить событие locale.changed

В Lumen вы могли бы позвонить переводчику напрямую с помощью app('translator')->setLocale() или App::make('translator')->setLocale(),

, поэтому разница здесь в том, что переменная config не будет установлена ​​автоматически и событие locale.changed не будет запущено.

Класс приложения Laravel также обновляет конфигурацию и запускает событие:

public function setLocale($locale)
{
    $this['config']->set('app.locale', $locale);
    $this['translator']->setLocale($locale);
    $this['events']->fire('locale.changed', [$locale]);
}

и в Laravel getLocale просто читает переменную конфигурации:

public function getLocale()
{
    return $this['config']->get('app.locale');
}

Для мысли о переводе важен именно переводчик. Транс помощник Ларавеля выглядит так:

function trans($id = null, $parameters = [], $domain = 'messages', $locale = null)
{
    if (is_null($id)) {
        return app('translator');
    }
    return app('translator')->trans($id, $parameters, $domain, $locale);
}

Вам нужно сделать так, чтобы ваше приложение расширяло другой класс с помощью 3 вышеуказанных методов

...