Laravel ile Çok Dilli Uygulamaların Geliştirilmesi: Kapsamlı Rehber
Laravel, modern web uygulamaları için güçlü bir framework olup, çok dilli uygulama geliştirmek de bu gücün bir parçasıdır. Bu rehber, Laravel uygulamalarında çok dilli desteği sağlamak için kullanılabilecek temel mimari, kod yapıları ve en iyi uygulamaları detaylandıracaktır.
Problem
Geliştiricilerin sıkça karşılaştığı bir sorun, çok dilli destek sağlayan bir uygulamanın nasıl olması gerektiğidir. Genellikle, Laravel uygulamaları bu durumu yalnızca __() yardımcı fonksiyonu ile çözme eğilimindedir. Ancak, gerçek bir SaaS uygulaması için ihtiyaçlar daha karmaşıktır:
- Kullanıcının tercih ettiği dil, kullanıcı kaydolmadan önce nasıl tespit edilir?
- Bu dil tercihi, oturumlar, cihazlar ve kimlik durumu boyunca nasıl saklanır?
- JavaScript ön yüzüne çevirileri verimli bir şekilde nasıl iletebiliriz?
- Sadece arayüz etiketleri değil, kullanıcı tarafından üretilen içerikler nasıl çevrilir?
Mimari Genel Bakış
Çok dilli uygulamanın mimarisi, SetLocale middleware’ı etrafında şekillenir.
plaintext
Request
|
v
SetLocale Middleware
|– Check user.locale (DB)
|– Check session
|– Check browser Accept-Language
|– Check IP geolocation (ip-api.com)
|– Fall back to default ‘en’
|
v
app()->setLocale($locale)
|
v
HandleInertiaRequests
|– Load lang/{locale}.json
|– Load lang/{locale}/*.php
|– Pass as Inertia shared props
|
v
Vue + vue-i18n
|– Global t() function
|– Language switcher component
Backend: Yerelleştirme Tespit Zinciri
Ana sistem, SetLocale middleware’ıdır. Bu, her istekte çalışır ve 5 aşamalı bir yedekleme zincirini kullanır.
Kimliği Tamamlanmış Kullanıcılar için
php
// app/Http/Middleware/SetLocale.php
public function handle(Request $request, Closure $next)
{
$locale = null;
if (auth()->check()) {
// Step 1: User's saved preference
$locale = auth()->user()->locale;
// Step 2: Session
if (!$locale) {
$locale = session('locale');
}
// Step 3: Browser Accept-Language
if (!$locale) {
$locale = $this->detectFromBrowser($request);
}
// Step 4: IP Geolocation
if (!$locale) {
$locale = $this->detectFromIp($request->ip());
}
// Step 5: Default
$locale = $locale ?: config('app.locale');
// Persist
auth()->user()->update(['locale' => $locale]);
session(['locale' => $locale]);
}
app()->setLocale($locale);
return $next($request);}
Ziyaretçiler için
Ziyaretçilerin tercihleri, çerezlerde saklanarak tespit edilir. Süreç:
localeçerezi kontrol edilir (ilk tespitten sonra 10 yıl boyunca ayarlanır).- Oturum
- Tarayıcı dil bilgisi
- IP coğrafyası
- Varsayılan
Diller Arası Geçiş
Dil değiştirme işlemi, basit bir kontrolör ile sağlanır:
php
// app/Http/Controllers/LanguageController.php
public function languageSwitch($locale = ‘en’)
{
if (array_key_exists($locale, config(‘app.available_languages’))) {
app()->setLocale($locale);
Session::put(‘locale’, $locale);
if (auth()->check()) {
auth()->user()->update(['locale' => $locale]);
}
Cookie::queue('locale', $locale, 525600); // 1 yıl
}
return redirect()->back();}
Çeviri Dosyaları Yapısı
LaraFoundry, iki format kullanır:
JSON dosyaları arayüz dizeleri için:
plaintext
lang/
en.json -> {} (boş – İngilizce anahtarlar dizeleridir)
uk.json -> 1700+ anahtar-değer çifti
pl.json -> Lehce çeviriler
de.json -> Almanca çeviriler
PHP array dosyaları framework’e özgü dizeler için:
plaintext
lang/
en/
auth.php
validation.php
pagination.php
passwords.php
uk/
auth.php
validation.php
Frontend: Laravel’den Vue’ye Inertia ile
Inertia, her yanıtla birlikte çevirileri taşır. Ek API çağrısı veya lazy loading gerektirmez.
Inertia Props ile Çeviri Paylaşımı
php
// app/Http/Middleware/HandleInertiaRequests.php
public function share(Request $request): array
{
return [
‘locale’ => fn() => App::getLocale(),
‘translations’ => function() {
$locale = App::getLocale();
$data = [];
// JSON çevirileri yükle
$jsonPath = base_path("lang/{$locale}.json");
if (File::exists($jsonPath)) {
$data = array_merge($data, json_decode(File::get($jsonPath), true) ?? []);
}
// PHP array çevirilerini yükle
$dir = base_path("lang/{$locale}/");
if (File::exists($dir)) {
foreach (File::files($dir) as $file) {
$name = pathinfo($file, PATHINFO_FILENAME);
$data[$name] = Lang::get($name);
}
}
return $data;
},
];}
Vue i18n Ayarı
Inertia props’dan çeviriler alınarak vue-i18n başlatılır:
javascript
import { createI18n } from ‘vue-i18n’;
const locale = pageProps.locale || ‘en’;
const translations = pageProps.translations || {};
const i18n = createI18n({
legacy: false,
locale,
fallbackLocale: ‘en’,
messages: {
},});
// Global t() – hiçbir yerde import gerekmez
app.config.globalProperties.t = (…args) => i18n.global.t(…args);
globalThis.t = (…args) => i18n.global.t(…args);
Bileşenlerde Çevirilerin Kullanımı
Bileşenlerde çeviriler şu şekilde kullanılabilir:
vue
{{ t(‘Welcome back’) }}
Test
Çok dilli modül, kapsamlı test kapsama sahip olup Pest ile test edilir:
php
it(‘detects locale from user profile’, function () {
$user = User::factory()->create([‘locale’ => ‘uk’]);
actingAs($user)->get(‘/dashboard’)->assertOk();
expect(app()->getLocale())->toBe(‘uk’);
});
Sonuç
LaraFoundry’nin çok dilli desteği, SaaS uygulamaları için yeterince kapsamlıdır. Uygulama geliştirenlerin bu modülü kullanarak hem hızlı bir şekilde çok dillilik oluşturabilir hem de zaman kazanabilirler. Eğer Laravel, Inertia ve Vue ile bir SaaS uygulaması inşa ediyorsanız, bu modül ihtiyacınız olan her şeyi sunar.
Kaynak: Orijinal Makale


