Home » Php » php – Lumen fails to change locale

php – Lumen fails to change locale

Posted by: admin July 12, 2020 Leave a comment

Questions:

I have an almost fresh installation of Lumen.

I have a POST route which leads to one Controller. In the request I send lang parameter with a string value.

public function form(Request $request)
{
    if ($request->has('lang')) {
        app('config')->set('app.locale', $request->input('lang'));
    }
    return view('form');
}

I have one folder more in my /resources/lang/ folder called bg. In this folder I have simple file which has an array just like in resources/lang/en/validation.php – called static.php.

In the view I’m displaying I have few lines that say:

<input type="text" name="email" value="" class="input-default" placeholder="{{trans('static.enter_email')}}"/>

The text I’ve set in those lang files in resources/lang/... are properly displayed, but I cannot change the locale before displaying the form.

For example, if in my dotenv file I set:

APP_LOCALE=en

And load the view the strings in resources/lang/en/static.php are loaded.
If I change the APP_LOCALE to bg and load the view again, I get the strings from resources/lang/bg/static.php.

All I want is to set the locale before rendering the view, which doesn’t seem to work with the code (in my controller) I provided above.

Also I couldn’t find any information about localization in Lumen on the official site, but I suppose it supports such, since trans() is working.

How to&Answers:

You are changing the config after it is loaded, which has no effect. To change the locale at runtime use the setLocale() method on the app instance:

app()->setLocale($request->input('lang'));

Edit

The first answer seem to only work on Laravel. To change the locale at runtime with Lumen use this:

app('translator')->setLocale($request->input('lang'));

Answer:

Changing locale at the runtime varying depends on the framework.
You can use facade or helper function:

For Lumen:

Lang::setLocale('lang');

or

app('translator')->setLocale('lang');

For Laravel:

App::setLocale('lang');

or

app()->setLocale('lang');