0

I'm trying to make my test app in multilanguage way.

This question has two correlated questions:

First question:

I followed the second answer in How to create multilingual translated routes in Laravel and this help me having a multilanguage site and the route cached, but I've a question and some misunderstanding.

It's a good practice overwrite an app config as they do int the AppServiceProver.php, making:

Config::set('app.locale_prefix', Request::segment(1));

Isn't better to work with the Session::locale in any case?

Second question:

In my case I've two languages, and in the navbar I want to print just ENG when locale is original language, and ITA when session locale is English.

If I'm in the Italian page, the ENG link in the navbar should point to the same English translated page.

Working with the method used in the other question, I hade many problems caused by the:

Config::set('app.locale_prefix', Request::segment(1));

We overwrite the variable in the config file local_prefix, and every time I switch to English language the locale_prefix will change to 'eng' and this sounds me strange, another thing I did is this:

   if ( $lang && in_array($lang, config('app.alt_langs')) ){
       return app('url')->route($lang . '_' . $name, $parameters, $absolute);
   }

We use the alt_langs where are defined only the alternative languages, and this is a problem cause if I pass the local lang, in my case 'it', like lang parameter, this will not be found cause, from the description, the alt_lang should not contain the locale language and you will be able to get only the translated string.

If I change the:

   if ( $lang && in_array($lang, config('app.alt_langs')) ){
       return app('url')->route($lang . '_' . $name, $parameters, $absolute);
   }

in:

   if ( $lang && in_array($lang, config('app.all_langs')) ){
       return app('url')->route($lang . '_' . $name, $parameters, $absolute);
   }

Now using app.all_langs I'm able to choose which URL you want and in which language I want.

How do I get the translated URL?

In the blade file I need to get the translated URL of the page, and if read the other question, we used the $prefix for caching the routes and giving to the route a new name ->name($prefix.'_home'); in this way I can cache all the route and I can call the routes using blade without prefix {{ route('name') }} but, needing the translated url of the actual page a made this on the top of the view:

@php
     $ThisRoute = Route::currentRouteName();
    
     $result = substr($ThisRoute, 0, 2);
     if ($result =='it' ){
        $routeName = str_replace('it_', '', $ThisRoute);
        $url = route($routeName,[],true,'en');
     } else {
        $routeName = str_replace('en_', '', $ThisRoute);
        $url = route($routeName,[],true,'it');
    }
@endphp

Doing this I get the actual route name that should be it_home I check if start with it_ or en_, I remove the it_ or en_ prefix and I get the translated URL, now you can use the $url as <a href="{{ $url" }}>text</a> cause if I call the {{ route('page') }} I get the link, with the locale language.

This code is not very good, I know, but I written in 5 minutes, need more implementation, and check, but for the moment is just to play with Laravel.

It's a good way?? How can I do it better (except the blade link retrieving)?? Many solution I found used middleware, but I would like to avoid a link in the navbar like mysite.com/changelang?lang=en

Is a good approach overriding the app.locale_prefix?

Jason Aller
  • 3,541
  • 28
  • 38
  • 38
Stefano Martini
  • 408
  • 2
  • 17

1 Answers1

0

First

according to your question, it's a bad practice to save the preferences into .env or session because as soon as the session is finished the saved language will be removed also it's common when you need to store any preferences related to your website such as (Color, Font, Language, ...etc) you must store any of them into the cache.

Second

honestly, your code is a very strange and NOT common way and there are two ways to handle what do you need

First

There is a very helpful and awesome package called mcamara it'll help you too much (I recommend this solution).

Second

you can do it from scratch using the lang folder located in the resource folder and you must create files with the same count of the needed languages then use the keys that you'll define into these files into views and you can prefix your routes with the selected language you can use group method like so

Route::group(['prefix' => 'selected_lang'], function() {
    Route::get('first_route', [Controller::class, 'your_method']);
});

or you can add the selected language as a query string like so localhost:8000/your_route?lang=en you can follow this tutorial for more info.