如何在 lumen 中使用 preferredLocale?

How to use preferredLocale in lumen?

随着 Laravel 5.7 的发布,Illuminate\Notifications\Notification class 开始提供区域设置方法来设置所需的语言。格式化通知时,应用程序将更改为该语言环境,然后在格式化完成后恢复为之前的语言环境。这是此功能的示例:

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

我只需要在 lumen(最新版本)中使用这个功能,但是当我实现它时 documentation 说我遇到了一个错误

Call to undefined method Laravel\Lumen\Application::getLocale() 这是因为在 lumen 应用程序中没有 getLocalesetLocale 方法..所以任何解决这个问题的想法。

Lumen 和 Laravel 的区别在于在 Laravel 中调用 Application->setLocale()

如上所述,这会做三件事:

  1. 设置配置app.locale
  2. 在翻译器上设置语言环境
  3. 触发 locale.changed 事件

虽然在 Lumen 中,您可以直接使用 app('translator')->setLocale()App::make('translator')->setLocale()

调用翻译器

所以这里的区别是不会自动设置配置变量并且不会触发 locale.changed 事件。

Laravel 的应用程序 class 也更新配置并触发事件:

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');
}

对于翻译思想来说,译者才是最重要的。 Laravel 的反式助手看起来像这样:

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 种方法让您的应用程序扩展另一个 class

您可以在新 class 中扩展 Laravel\Lumen\Application 并使 $app 变量从 bootstrap\app.php 文件中的新 class 获取实例

1- 像这样创建新的 class:

<?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- 从你的新 class ex:

创建一个实例

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