Merhabalar efendim, projemde setLocal() değiştirmek için bir dropmenu ekledim. setLocal işlemi tek seferde çalışıyor bununla ilgili araştırma yaptığımda; hep router üzerinden, /lang/{local} şeklinde seçim yapan bir arakatman oluşturuluyor. Benim yapmak istediğim şudur: URL'de yani rotasyonda bir parametre belirtmeden dili kullanıcıya göre değiştirmek istiyorum. Giriş yapmamış, misafir kullanıcı dil seçimi yapmadığında session'da bu local verisini tutsun eğer giriş yapmış bir kullanıcı ise UserDB de oluşturacağım sütunda bu local verisini tutsun.
/lang/{local} şeklinde olmasını istememe sebebim de hem url uzamasın hemde daha önceden hazırladığım rotasyon kalabalık olduğu için hepsinde bir değişiklik yapmak istemiyorum. Bu konu hakkında yardım edebilecek, yol gösterebilecek biri olursa çok mutlu olurum. Şimdiden teşekkürler
setLocal Hakkında - Rotasız local Seçmek
- En İyi YanıtFahriMeral tarafından
FahriMeral Dili değiştirip oturuma kaydeden bir tane controller yazın. Daha sonra middleware ile oturumu kontrol ederek App::setLocale() ile oturumdan gelen değer ile dili değiştirin.
Middleware
https://laravel.com/docs/7.x/middleware
mgsmus
Dediğiniz gibi yaptım Session'da gayet güzel çalışıyor:
web.php
Route::get('/dil/{lang}','LocalSwitchController@index')->name('localChange');
Controller
public function index($lang) //rotadan gelen lang degerini aldik { if ($lang == 'en' or $lang=='tr' or $lang=='nl') { Session::put('lang', $lang); return redirect()->back(); }else { return redirect()->back(); } }
View
<a class="dropdown-item" href="{{ route('localChange',['lang'=>'tr'] )}}">
Ve son olarak oluşturduğum: (Karnel içinde web middlewareGroups içine ekledim.)
middleware
public function handle($request, Closure $next)
{
if(Session::has('lang'))
{
app()->setLocale(Session::get('lang'));
}
return $next($request);
}
mgsmus
Aklımda User tablosuna lang sütunu ekleyip session değerini oraya yazdırmak vardı fakat araştırma yaparken şöyle birşeye rastladım:
php artisan session:table
Session veri tabanı oluşturuyormuş, sizce hangi yöntemi kullanmalıyım? Dediğim gibi bir sütun ekleyip işi bitireyim mi yoksa bu yapıyla mı çalışmalıyım? Bilemedim.
php artisan session:table
Bu ayrı bir şey. Oturumun Redis, dosya ya da veritabanında tutulmasını seçerken veritabanında tutulması seçerseniz bunu yaparak oturumun tutulacağı tabloyu oluşturmanız için gerekli komut bu.
User tablosuna kullanıcının dilini tutmak mantıklı. Genellikle de oturum dilinden üstün olur, o varsa oturum dilini ezer. Middleware içerisinde $request->user() şeklinde aktif kullanıcıya ulaşabilirsiniz ve şöyle bir şey yapabilirsiniz:
public function handle($request, Closure $next)
{
$locale = app()->getLocale();
if($request->session()->has('locale')) {
$locale = $request->session()->get('locale');
}
// Burada giriş yapılmış ve giriş yapan kullanıcı kendisine dil tanımlamış ise onu seçtiği
// dil öncelikli olduğundan oturumdan geleni eziyoruz.
if(auth()->check() && $request->user()->locale) {
$locale = $request->user()->locale;
}
app()->setLocale($locale);
return $next($request);
}
- Düzenlendi
mgsmus dil öncelikli olduğundan oturumdan geleni eziyoruz.
Bu kısım çok mantıklı olmuş, if ile var mı yok mu? eğer varsa gitsin yoksa sessiona baksın falan yapmayı düşünüyordum. Ezme; işlemi çok pratikleştirmiş, bence güzel bi trick
FahriMeral config/app.php içerisinde, locale anahtarının altına locales şeklinde bir anahtar daha ekleyin:
'locales' => ['tr', 'en', 'nl'],
if ($lang == 'en' or $lang=='tr' or $lang=='nl')
yapmak yerine if(in_array($locale, config('app.locales')))
yapın.
Hatta app/Services/LocaleManager.php dosyası oluşturun:
<?php
namespace App\Services;
class LocaleManager
{
public function resolve($locale): string
{
if(in_array($locale, config('app.locales'))) {
return $locale;
}
return app()->getLocale();
}
public function set($locale): void
{
$locale = $this->resolve($locale);
app()->setLocale($locale);
}
public function keep($locale): void
{
session([
'locale' => $this->resolve($locale)
]);
}
}
Şöyle kullanın:
public $localeManager;
public function __construct(LocaleManager $localeManager)
{
$this->localeManager = $localeManager;
}
public function index($locale)
{
$this->localeManager->keep($locale);
return redirect()->back();
}
Artık yavaş yavaş vanilla PHP yazmayı bırakmanız lazım.
- Düzenlendi
mgsmus app/Services/LocaleManager.php
Bunun amacını anlayamadım çok çalışmam lazım daha
Spatie paketiyle kullandığım için text içindeki lang baslıklarını dizi olarak döndürüp yazdırmayı da düşünüyorum, onun için bir tane id=1 olan veriyi referans verisi yapıp onun text içindeki lang ları döndürüp if() içine almayı düşünüyorum aynı şekilde view'de de menüyü ona entegre edersek, referansa yeni bir dil eklediğimizde sistem otomatikleşecek diye düşünüyorum
mgsmus Kodu inceledim controller'da yaptıgımız işi aslında bu LocalManager kodları ile yapıyoruz. Peki bunu controllardan hariç burda yapmamızın artısı nedir daha derli olduğu için mi böyle düşündünüz acaba?
FahriMeral Benzer işlemleri yapmanız gerekirse if...else... yazmadan direkt LocaleManager ile halledersiniz. Şimdilik böyle düşünün.