如何在 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 应用程序中没有 getLocale
或 setLocale
方法..所以任何解决这个问题的想法。
Lumen 和 Laravel 的区别在于在 Laravel 中调用 Application->setLocale()
。
如上所述,这会做三件事:
- 设置配置
app.locale
- 在翻译器上设置语言环境
- 触发 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__) . '/')
);
随着 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 应用程序中没有 getLocale
或 setLocale
方法..所以任何解决这个问题的想法。
Lumen 和 Laravel 的区别在于在 Laravel 中调用 Application->setLocale()
。
如上所述,这会做三件事:
- 设置配置
app.locale
- 在翻译器上设置语言环境
- 触发 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__) . '/')
);