“ App :: getLocale()”返回默认语言,而不是自定义服务提供商中的当前语言

时间:2019-05-17 08:11:36

标签: php laravel

我正在使用服务提供者进行js本地化,并且需要获取当前语言环境以获取当前lang翻译并传递给js。一切正常,但是App :: getLocale()始终返回默认的应用语言。

我试图同时使用ladlcast和stackoverflow中的其他发布线程来使用middlware和view composer来执行此操作,但是没有任何帮助。 这是链接

https://laracasts.com/discuss/channels/laravel/get-current-locale-in-app-service-provider

Getting locale language at provider class in Laravel

Laravel get getCurrentLocale() in AppServiceProvider

class JstranslateServiceProvider extends ServiceProvider 
{ 
    protected $langPath; 

    public function __construct() 
    {   
        $locale = App::getLocale();
        $this->langPath = resource_path('lang/'.$locale);
        dd($locale);
    }
}
尽管当前语言是

dd($locale);,但输出始终是'en'

我使用此指南Link对js进行了本地化,看来对他们来说是有效的

2 个答案:

答案 0 :(得分:0)

在服务提供者的构造函数外部执行此操作。

这些类在Laravel做任何事情之前被实例化,因此您在中间件/视图编辑器中编写的任何内容都可能没有受到影响。

相反,您应该使用bootregister方法执行此操作。

答案 1 :(得分:0)

在启动时获取语言环境并将所有内容放入composer解决了我的问题。

public function boot()
{   
    Cache::forget('translations');
    view()->composer("layouts.app", function () {
        $locale = App::getLocale();
        if($locale == 'us')
            $locale = 'en';
        $this->langPath = resource_path('lang/'.$locale);
        Cache::rememberForever('translations', function () {
            return collect(File::allFiles($this->langPath))->flatMap( function ($file) {
                return [
                    ($translation = $file->getBasename('.php')) => trans($translation),
                ];
            })->toJson(JSON_UNESCAPED_UNICODE);
        });
    });
}