Laravel İle Statik Veriler İçin Çoklu Dil Desteği
Merhaba, başlığı bilerek böyle yazdım. Sayfadaki sabit terimler için bir başlangıç yapmak istedim.
Neyse efenim, biz başlayalım.
İlk yapacağımız şey views klasörü altında bir tane layouts alt klasörü oluşturalım.
İçine şu başlıktaki dosyaları atalım.
- footer.blade.php
- header.blade.php
- main.blade.php
- menu.blade.php
footer.blade.php dosyası şu şekilde:
</div> <script src="https://code.jquery.com/jquery-3.2.1.slim.min.js" integrity="sha384-KJ3o2DKtIkvYIK3UENzmM7KCkRr/rE9/Qpg6aAZGJwFDMVNA/GpGFF93hXpG5KkN" crossorigin="anonymous"></script> <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.12.9/umd/popper.min.js" integrity="sha384-ApNbgh9B+Y1QKtv3Rn7W3mgPxhU9K/ScQsAP7hUibX39j7fakFPskvXusvfa0b4Q" crossorigin="anonymous"></script> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script> </body> </html>
header.blade.php dosyası şu şekilde:
<!DOCTYPE html> <html lang="{{ str_replace('_', '-', app()->getLocale()) }}"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <title>Laravel</title> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous"> </head> <body> <div class="container">
menu.blade.php dosyası şu şekilde:
<nav class="navbar navbar-expand-lg navbar-light bg-light"> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarSupportedContent"> <ul class="navbar-nav mr-auto"> <li class="nav-item active"> <a class="nav-link" href="#">Anasayfa</a> </li> <li class="nav-item"> <a class="nav-link" href="#">Hakkımızda</a> </li> <li class="nav-item"> <a class="nav-link" href="#>Portfolyo</a> </li> <li class="nav-item"> <a class="nav-link" href="#">İletişim</a> </li> <li class="nav-item dropdown"> <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> Dil </a> <div class="dropdown-menu" aria-labelledby="navbarDropdown"> <a class="dropdown-item" href="#">Türkçe</a> <a class="dropdown-item" href="#"İngilizce</a> <a class="dropdown-item" href="#">Almanca</a> </div> </li> </ul> <form class="form-inline my-2 my-lg-0"> <input class="form-control mr-sm-2" type="search" placeholder="ara" aria-label="Search"> <button class="btn btn-outline-success my-2 my-sm-0" type="submit">Ara</button> </form> </div> </nav>
main.blade.php dosyası şu şekilde olacak:
@include('layouts.header') @include('layouts.menu') @yield('content') @include('layouts.footer')
Şimdilik anlamadığınız kodları es geçin. Tahmin ettiğiniz üzere bootstrap kullandım. Hazır kodları zaten.
Basit bir menü oluşturulmuş oldu.
Artık başlıyoruz.
Ana dizin altında bulunan resources klasörü altındaki lang klasörü bizim sistemimizin dili ile ilgili bilgilerin tutulacağı yerdir.
Bakarsanız orada hazır bir tane en klasörü görürsünüz.
Biz de yanına şu isimlerde klasörler açalım.
- de
- tr
Tahmin edeceğiniz üzere Almanca ve Türkçe dilleri için oluşturduk.
Bizim örneğimiz basit bir örnek olacağı için hemen bu 3 klasörün de içine şu dosyayı oluşturalım.
- main.php
Bu dosyalar bizim her bir sayfamız için ayrı bir dil bilgilerini tutacak. Siz isterseniz hepsini tek bir dosyada birleştirebilirsiniz. Çağırırken de o dosya adı ile çağıracaksınız.
Ben anlaşılır olsun diye böyle yaptım.
"tr" klasörü altındaki main.php dosyasının içine şunları yazalım.
<?php /*** tr altındaki main */ $main = [ 'home' => 'Anasayfa', 'about' => 'Hakkımızda', 'portfolyo' => 'Portfolyo', 'contact' => 'İletisim', 'search' => 'Ara', 'lang' => 'Dil', 'fr' => 'Fransızca', 'eng' => 'İngilizce', 'de' => 'Almanca', 'tr' => 'Türkçe', 'body' => [ 'neresi_home' => 'Burası Anasayfa', 'neresi_hakkimizda' => 'Burası Hakkımızda Sayfası', 'neresi_iletisim' => 'Burası İletişim Sayfası', 'neresi_portfolyo' => 'Burası Portfolyo Sayfası', ], ]; return $main; ?>
"en" klasörü altındaki main.php dosyasının içine şunları yazalım.
<?php /** en altındaki main*/ $main = [ 'home' => 'Home', 'about' => 'About', 'portfolyo' => 'Portfolio', 'contact' => 'Contact', 'search' => 'Search', 'lang' => 'Lang', 'fr' => 'French', 'eng' => 'English', 'de' => 'German', 'tr' => 'Turkish', 'body' => [ 'neresi_home' => 'This is Home', 'neresi_hakkimizda' => 'This is About Page', 'neresi_iletisim' => 'This is Contact Page', 'neresi_portfolyo' => 'This is Portfolyo Page', ], ]; return $main; ?>
"de" klasörü altındaki main.php dosyasının içine şunları yazalım.
<?php /** de altındaki main*/ $main = [ 'home' => 'Heim', 'about' => 'Über Uns', 'portfolyo' => 'Portefeuille', 'contact' => 'Kontakt', 'search' => 'Suche', 'lang' => 'Sprache', 'fr' => 'Französisch', 'eng' => 'Englisch', 'de' => 'Deutsch', 'tr' => 'Türkisch', 'body' => [ 'neresi_home' => 'Das ist Zuhause', 'neresi_hakkimizda' => 'Das ist Über uns Seite', 'neresi_iletisim' => 'Dies ist die Kontaktseite', 'neresi_portfolyo' => 'Dies ist die Portfolio-Seite', ], ]; return $main; ?>
web.php dosyamızı açalım ve "routing" işlemlerine başlayalım.
Öncelikle bir middleware yazalım. Bizim bir adet {lang} parametremiz olacağı için bu değeri almamız ve projeye atamamız gerekiyor.
Terminali açalım ve aşağıdaki kodu girelim.
php artisan make:middleware SetLangMiddleware
İçerisine tek bir satır eklememiz yeterli olacaktır.
public function handle(Request $request, Closure $next)
{
/** Gelen request deki lang parametresini alıp proje diline atıyoruz */
App::setLocale($request->lang);
return $next($request);
}
Ardından bu middleware i App\Http altındaki Kernel.php dosyasındaki "$routeMiddleware" dizisine ekleyelim.
En sonuna ben şu şekilde ekledim.
protected $routeMiddleware = [ 'auth' => \App\Http\Middleware\Authenticate::class, 'auth.basic' => \Illuminate\Auth\Middleware\AuthenticateWithBasicAuth::class, 'cache.headers' => \Illuminate\Http\Middleware\SetCacheHeaders::class, 'can' => \Illuminate\Auth\Middleware\Authorize::class, 'guest' => \App\Http\Middleware\RedirectIfAuthenticated::class, 'password.confirm' => \Illuminate\Auth\Middleware\RequirePassword::class, 'signed' => \Illuminate\Routing\Middleware\ValidateSignature::class, 'throttle' => \Illuminate\Routing\Middleware\ThrottleRequests::class, 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, 'langMiddleware' => \App\Http\Middleware\SetLangMiddleware::class, ];
Route yapımız aşağıdaki şekilde olacak.
http://abcdefg.com/tr/contact
http://abcdefg.com/en/contact
http://abcdefg.com/de/contact
Haliyle her route öncesi bir prefix imiz var.
Hemen yazalım.
// Direkt anasayfa yüklendiğinde Türkçeye redirect ettirelim Route::redirect('/', '/tr')->name('basedir'); Route::group(['prefix' => '{lang}', 'middleware' => ['langMiddleware']], function() { Route::get('/', function () { /** Views klasörü altındaki welcome.blade.php */ return view('welcome'); }); Route::get('/about', function () { /** Views klasörü altındaki hakkimizda.blade.php */ return view('hakkimizda'); })->name('about'); Route::get('/portfolio', function () { /** Views klasörü altındaki portfolyo.blade.php */ return view('portfolyo'); })->name('portfolyo'); Route::get('/contact', function () { /** Views klasörü altındaki iletisim.blade.php */ return view('iletisim'); })->name('contact'); /** Hiçbir route ile eşleşmiyorsa 404 bastıralım */ Route::fallback(function() { abort(404); }); });
Hemen, views altında "welcome.blade.php, hakkimizda.blade.php, portfolyo.blade.php, iletisim.blade.php" dosyalarını oluşturalım.
welcome.blade.php dosyası aşağıdaki gibidir.
@extends('layouts.main')
@section('content')
<div class="row">
<div class="col-md-12 mt-5">
<!-- Burada aslında isimiz basliyor. -->
<!-- Dil klasörleri altında main.php dosyamız vardı -->
<!-- main.php icinde de $main adında bir dizi döndürüyorduk -->
<!-- $main dizisi icinde de body alt dizisi bulunuyordu -->
<!-- body alt dizisinin neresi_home key ine ait değeri ekrana yazdırıyoruz -->
<h1> {{ __('main.body.neresi_home') }}</h1>
</div>
</div>
@endsection
iletisim.blade.php dosyası aşağıdaki gibidir.
@extends('layouts.main') @section('content') <div class="row"> <div class="col-md-12 mt-5"> <h1> {{ __('main.body.neresi_iletisim') }}</h1> </div> </div> @endsection
portfolyo.blade.php dosyası aşağıdaki gibidir.
@extends('layouts.main') @section('content') <div class="row"> <div class="col-md-12 mt-5"> <h1> {{ __('main.body.neresi_portfolyo') }}</h1> </div> </div> @endsection
hakkimizda.blade.php sayfası aşağıdaki gibidir.
@extends('layouts.main') @section('content') <div class="row"> <div class="col-md-12 mt-5"> <h1> {{ __('main.body.neresi_hakkimizda') }}</h1> </div> </div> @endsection
Evet....
Gelelim son olarak yapılacak işe.
layouts dizini altındaki menu.blade.php dosyasını açalım ve içeriğini şununla değiştirelim.
<nav class="navbar navbar-expand-lg navbar-light bg-light"> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarSupportedContent" aria-controls="navbarSupportedContent" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarSupportedContent"> <ul class="navbar-nav mr-auto"> <li class="nav-item active"> <a class="nav-link" href="{{ URL('/', app()->getLocale()) }}">{{ __('main.home') }}</a> </li> <li class="nav-item"> <a class="nav-link" href="{{ route('about', app()->getLocale()) }}">{{ __('main.about') }}</a> </li> <li class="nav-item"> <a class="nav-link" href="{{ route('portfolyo', app()->getLocale()) }}">{{ __('main.portfolyo') }}</a> </li> <li class="nav-item"> <a class="nav-link" href="{{ route('contact', app()->getLocale()) }}">{{ __('main.contact') }}</a> </li> <li class="nav-item dropdown"> <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> {{ __('main.lang') }} </a> <div class="dropdown-menu" aria-labelledby="navbarDropdown"> <a class="dropdown-item" href="{{ URL('/tr') }}">{{ __('main.tr') }}</a> <a class="dropdown-item" href="{{ URL('/en') }}">{{ __('main.eng') }}</a> <a class="dropdown-item" href="{{ URL('/de') }}">{{ __('main.de') }}</a> </div> </li> </ul> <form class="form-inline my-2 my-lg-0"> <input class="form-control mr-sm-2" type="search" placeholder="{{ __('main.search') }}" aria-label="Search"> <button class="btn btn-outline-success my-2 my-sm-0" type="submit">{{ __('main.search') }}</button> </form> </div> </nav>
Buradaki bilinmeyenlerle başlayalım.
- route('about', app()->getLocale() ) -----> Burada about route una gidiyoruz. hatırlarsanız prefix olarak lang parametresini gönderiyorduk. Burada da sistemde kullanılan dili alıyoruz.
- {{ __('main.tr') }}, {{ __('main.contact') }} -----> Hatırlarsanız dil dosyarı altında main.php oluşturmuştuk. Burada da çeşitli key value değerleri içeren bir dizi döndürüyorduk. İşte dönen $main dizisinin key değerini yazıyoruz.
Evet, aslında hepsi bu kadar.
Yorum Yap