Skip to content

A multilingual blog system built with Laravel 12, showcasing localized database design, post translations, and Tailwind UI integration.

Notifications You must be signed in to change notification settings

malisahin89/laravel-multi-language-blog

Repository files navigation

📝 Laravel Multi-Language Blog & Product Platform

Laravel PHP Security License

Readme.md made with (Yapay Zeka - AI)

Enterprise düzeyinde, çok dilli (multi-language) içerik yönetim sistemi. Laravel 12, güvenlik en iyi pratikleri ve modern web teknolojileri kullanılarak geliştirilmiş kapsamlı bir blog ve ürün yönetim platformudur.

🎯 Proje Hakkında

Bu platform, hem blog içerikleri hem de ürün katalogları için tam kapsamlı çok dilli destek sunar. SEO odaklı, güvenlik öncellikli ve ölçeklenebilir mimari ile tasarlanmıştır. Hierarchical (hiyerarşik) kategori yapısı, gelişmiş slug yönetimi, rate limiting ve input sanitization gibi enterprise özelliklere sahiptir.


📑 İçindekiler


🎥 Video Tanıtımı


🧩 Temel Özellikler

📝 İçerik Yönetimi

  • Blog Sistemi: Tam özellikli çok dilli blog yazıları
  • Ürün Katalog Sistemi: E-ticaret için ürün yönetimi
  • Hierarchical Kategori Yapısı: Sınırsız seviye alt kategori desteği
  • Etiket Sistemi: Blog ve ürünler için ortak etiket yönetimi
  • Galeri Yönetimi: Çoklu resim yükleme ve sıralama
  • Öne Çıkan İçerik: Featured flag ile özel içerikler
  • Yayınlama Zamanlaması: Gelecek tarihli yayın desteği

🌍 Multi-Language (Çok Dil) Sistemi

  • Dinamik Dil Yönetimi: Admin panel üzerinden dil ekleme/düzenleme
  • Translation Tabloları: Her içerik türü için ayrı çeviri tabloları
  • SEO Friendly URLs: Dil bazlı slug yapısı (/tr/blog-yazisi, /en/blog-post)
  • Varsayılan Dil: Otomatik fallback desteği
  • Dil Değiştirici: Aynı içeriğin farklı dilleri arasında geçiş

🔐 Güvenlik Özellikleri

  • Input Sanitization: SecurityHelper ile slug ve lang parametreleri temizleme
  • SQL Injection Koruması: Parametrized queries ve input validation
  • Mass Assignment Protection: $guarded kullanımı ile model koruması
  • Rate Limiting: DoS saldırılarına karşı istek limitleri (60-120 req/min)
  • Validation Middleware: Route seviyesinde parametre doğrulama
  • XSS Prevention: HTML temizleme ve output encoding
  • Status Control: Sadece aktif içeriklerin gösterilmesi
  • Published Date Check: Yayın tarihine göre içerik kontrolü

🎨 Teknik Özellikler

  • Slug Generation: Türkçe karakter desteği ile otomatik slug oluşturma
  • Unique Slug Control: Veritabanı bazlı benzersizlik kontrolü
  • WebP Image Conversion: Otomatik resim optimizasyonu
  • Responsive Image Upload: Intervention Image ile resim işleme
  • JSON Data Storage: Specifications, features, documents için JSON
  • Cache Integration: Kategori ağacı ve sayaçlar için cache desteği
  • Sitemap Generation: Otomatik XML sitemap oluşturma
  • 404 Rate Limiting: 404 isteklerine özel rate limit

📊 SEO Optimizasyonları

  • Meta Tags: Her içerik için özel SEO title, description, keywords
  • Clean URLs: SEO dostu URL yapısı
  • Canonical URLs: Dil bazlı canonical tag desteği
  • Sitemap.xml: Arama motorları için dinamik sitemap
  • Alt Tags: Resimler için otomatik alt text
  • Schema Markup: Yapılandırılmış veri desteği (hazır)

👤 Kullanıcı Yönetimi

  • Laravel Breeze: Kimlik doğrulama sistemi
  • Admin Panel: Yönetici kontrolü
  • User Roles: Yetki yönetimi alt yapısı
  • Profile Management: Kullanıcı profil yönetimi

🛠️ Teknolojiler

Backend

  • Laravel 12: Modern PHP framework
  • PHP 8.2+: Son PHP sürümü
  • MySQL/MariaDB: İlişkisel veritabanı

Frontend

  • Blade Templates: Laravel template engine
  • Tailwind CSS: Utility-first CSS framework
  • Alpine.js: Minimal JavaScript framework
  • Vite: Modern build tool

Paketler

  • Intervention Image 3.11: Resim işleme ve optimizasyon
  • Laravel Breeze 2.3: Authentication scaffolding
  • Laravel Debugbar 3.15: Development debugging
  • Laravel Pint 1.13: Code style fixer

Güvenlik

  • SecurityHelper: Custom input sanitization
  • Rate Limiting: İstek limitleme middleware
  • CSRF Protection: Laravel built-in koruma
  • Mass Assignment Protection: Model güvenliği

🚀 Kurulum

Gereksinimler

  • PHP >= 8.2
  • Composer
  • Node.js & NPM
  • MySQL/MariaDB
  • GD Library veya Imagick (resim işleme için)

Adım Adım Kurulum

1. Projeyi Klonla

git clone https://github.com/malisahin89/laravel-multi-language-blog.git
cd laravel-multi-language-blog

2. Bağımlılıkları Kur

composer install
npm install
npm run build

3. Ortam Dosyasını Ayarla

cp .env.example .env
php artisan key:generate

.env dosyasında aşağıdaki alanları kendi veritabanı bilgilerine göre doldur:

DB_DATABASE=veritabani_adi
DB_USERNAME=kullanici_adi
DB_PASSWORD=sifre

4. Veritabanını Hazırla

php artisan migrate:fresh --seed

Bu komut:

  • Tüm tabloları oluşturur
  • Örnek dilleri ekler (TR, EN)
  • Admin kullanıcı oluşturur
  • Örnek kategoriler ve etiketler ekler

5. Storage Link Oluştur

php artisan storage:link

6. Cache ve Optimize

composer dump-autoload
php artisan optimize:clear

7. Geliştirme Sunucusunu Başlat

Terminal'de iki ayrı pencere açın:

# Terminal 1 - Laravel Server
php artisan serve

# Terminal 2 - Vite Dev Server
npm run dev

8. Admin Girişi

Admin Panel: http://localhost:8000/admin

Email: test@example.com
Password: 11223344

Frontend: http://localhost:8000


📁 Proje Yapısı

laravel-multi-language-blog/
├── app/
│   ├── Helpers/
│   │   ├── SecurityHelper.php      # Input sanitization ve validation
│   │   ├── SlugHelper.php          # Slug generation ve uniqueness
│   │   ├── ImageHelper.php         # Resim işleme ve WebP dönüşümü
│   │   └── FileHelper.php          # Dosya yükleme yardımcıları
│   ├── Http/
│   │   ├── Controllers/
│   │   │   ├── Contents/           # Admin CRUD controllers
│   │   │   │   ├── PostController.php
│   │   │   │   ├── ProductController.php
│   │   │   │   ├── CategoryController.php
│   │   │   │   └── TagController.php
│   │   │   └── Frontend/           # Public controllers
│   │   │       ├── HomeController.php
│   │   │       ├── PostController.php
│   │   │       ├── ProductController.php
│   │   │       ├── CategoryController.php
│   │   │       └── TagController.php
│   │   └── Middleware/
│   │       └── ValidateRouteParameters.php  # Route validation
│   ├── Models/
│   │   ├── Post.php
│   │   ├── PostTranslation.php
│   │   ├── Product.php
│   │   ├── ProductTranslation.php
│   │   ├── Category.php
│   │   ├── CategoryTranslation.php
│   │   ├── Tag.php
│   │   ├── TagTranslation.php
│   │   ├── Language.php
│   │   └── User.php
│   └── Traits/
│       └── LanguageValidator.php   # Dil doğrulama trait
├── database/
│   ├── migrations/                 # Tüm veritabanı migration'ları
│   └── seeders/
│       └── DatabaseSeeder.php      # Seed data
├── resources/
│   └── views/
│       ├── admin/                  # Admin panel views
│       │   ├── posts/
│       │   ├── products/
│       │   ├── categories/
│       │   └── tags/
│       └── frontend/               # Public views
│           ├── home.blade.php
│           ├── post.blade.php
│           ├── products.blade.php
│           ├── product.blade.php
│           ├── category.blade.php
│           └── tag.blade.php
└── routes/
    └── web.php                     # Tüm route tanımlamaları

📂 Veritabanı Şeması

🗄️ Ana Tablolar

1. languages - Dil Yönetimi

Alan Tip Açıklama
id int (PK)
name varchar Dil adı (Türkçe, English)
slug varchar(2-5) Dil kodu (tr, en, en-us)
flag varchar Bayrak emoji veya icon
status tinyint(1) Aktif/Pasif
is_default boolean Varsayılan dil
created_at, updated_at datetime

2. categories - Hierarchical Kategori Sistemi

Alan Tip Açıklama
id int (PK)
parent_id int (FK → categories.id) Üst kategori
level int Hiyerarşi seviyesi (0-N)
path varchar Kategori yolu (/1/3/7)
color varchar Kategori rengi
icon varchar Icon class/emoji
status tinyint(1) Aktif/Pasif
sort_order int Sıralama
created_at, updated_at datetime

Özellikler:

  • Sınırsız seviye alt kategori
  • Otomatik level ve path hesaplama
  • Cache desteği
  • Ancestor/Descendant metodları

3. category_translations

Alan Tip Açıklama
id int (PK)
category_id int (FK → categories.id)
language_slug varchar Dil kodu
name varchar Kategori adı
slug varchar URL slug
seo_title varchar SEO başlık
seo_description text SEO açıklama
seo_keywords text SEO anahtar kelimeler
created_at, updated_at datetime

4. tags

Alan Tip Açıklama
id int (PK)
color varchar Etiket rengi
status tinyint(1) Aktif/Pasif
usage_count int Kullanım sayısı
created_at, updated_at datetime

5. tag_translations

Alan Tip Açıklama
id int (PK)
tag_id int (FK → tags.id)
language_slug varchar Dil kodu
name varchar Etiket adı
slug varchar URL slug
description text Açıklama
seo_title varchar SEO başlık
seo_description text SEO açıklama
seo_keywords text SEO anahtar kelimeler
created_at, updated_at datetime

6. posts - Blog Yazıları

Alan Tip Açıklama
id int (PK)
user_id int (FK → users.id) Yazar
category_id int (FK → categories.id) Ana kategori
cover_image varchar Kapak resmi
gallery_images json Galeri resimleri
status tinyint(1) 0:draft, 1:published
is_featured boolean Öne çıkan
comment_enabled boolean Yorum açık/kapalı
view_count int Görüntülenme sayısı
order int Sıralama
published_at datetime Yayın tarihi
created_at, updated_at datetime

7. post_translations

Alan Tip Açıklama
id int (PK)
post_id int (FK → posts.id)
language_slug varchar Dil kodu
title varchar Başlık
slug varchar URL slug
short_description text Kısa açıklama
content longtext İçerik (HTML)
seo_title varchar SEO başlık
seo_description text SEO açıklama
seo_keywords text SEO anahtar kelimeler
created_at, updated_at datetime

8. products - Ürün Kataloğu

Alan Tip Açıklama
id int (PK)
order int Sıralama
cover_image varchar Kapak resmi
gallery_images json Galeri resimleri
is_featured boolean Öne çıkan ürün
status tinyint(1) Aktif/Pasif
brand varchar Marka
price decimal(10,2) Fiyat
model varchar Model kodu
specifications json Teknik özellikler
product_url varchar Dış link
published_at datetime Yayın tarihi
created_at, updated_at datetime

9. product_translations

Alan Tip Açıklama
id int (PK)
product_id int (FK → products.id)
language_slug varchar Dil kodu
title varchar Ürün adı
slug varchar URL slug
short_description text Kısa açıklama
content longtext Detaylı açıklama
features json Özellikler listesi
attributes json Nitelikler
documents json Dökümanlar/Kataloglar
seo_title varchar SEO başlık
seo_description text SEO açıklama
seo_keywords text SEO anahtar kelimeler
created_at, updated_at datetime

🔗 Pivot (İlişki) Tabloları

10. post_category - Post ↔ Category (Many-to-Many)

Alan Tip
post_id int (FK → posts.id)
category_id int (FK → categories.id)

11. post_tag - Post ↔ Tag (Many-to-Many)

Alan Tip
post_id int (FK → posts.id)
tag_id int (FK → tags.id)

12. product_category - Product ↔ Category (Many-to-Many)

Alan Tip
product_id int (FK → products.id)
category_id int (FK → categories.id)

13. product_tag - Product ↔ Tag (Many-to-Many)

Alan Tip
product_id int (FK → products.id)
tag_id int (FK → tags.id)

🔗 İlişki Diyagramı

Users
  └── Posts (1:N)
       ├── PostTranslations (1:N)
       ├── Categories (N:M via post_category)
       └── Tags (N:M via post_tag)

Products
  ├── ProductTranslations (1:N)
  ├── Categories (N:M via product_category)
  └── Tags (N:M via product_tag)

Categories (Hierarchical)
  ├── CategoryTranslations (1:N)
  ├── Parent (Self Reference)
  └── Children (Self Reference)

Tags
  └── TagTranslations (1:N)

Languages
  ├── PostTranslations (1:N)
  ├── ProductTranslations (1:N)
  ├── CategoryTranslations (1:N)
  └── TagTranslations (1:N)

🌍 Multi-Language Yapısı

Çalışma Prensibi

Platform, Translation Pattern kullanarak çok dilli içerik yönetimi sağlar:

  1. Ana Tablolar: Dil-bağımsız veriler (ID, status, timestamps, resimler)
  2. Translation Tabloları: Dil-bağımlı veriler (title, content, slug, SEO)

URL Yapısı

# Varsayılan dil (TR)
https://example.com/              → Ana sayfa
https://example.com/blog-yazisi   → Blog yazısı

# Diğer diller
https://example.com/en/           → Ana sayfa (İngilizce)
https://example.com/en/blog-post  → Blog yazısı (İngilizce)
https://example.com/de/blog-post  → Blog yazısı (Almanca)

Yeni İçerik Ekleme

  1. Varsayılan Dilde Oluşturma: Her içerik önce varsayılan dilde oluşturulur
  2. Diğer Dillere Çeviri: Edit sayfasındaki dil butonları ile çeviri eklenir
  3. Slug Yönetimi: Her dil için otomatik benzersiz slug oluşturulur

Kod Örneği

// Post çekirisini alma
$post = Post::with(['translations' => function($q) use ($lang) {
    $q->where('language_slug', $lang);
}])->find($id);

// Kategori hiyerarşisi
$category->getAncestors();  // Üst kategoriler
$category->getDescendants(); // Alt kategoriler

🔒 Güvenlik Mimarisi

1. Input Sanitization (SecurityHelper)

Konum: app/Helpers/SecurityHelper.php

// Slug temizleme - sadece a-z, 0-9, hyphen
SecurityHelper::sanitizeSlug($slug);
// Örnek: "../../etc/passwd" → "etcpasswd"

// Language code temizleme
SecurityHelper::sanitizeLang($lang);
// Örnek: "tr'; DROP TABLE--" → "tr"

// Format validation
SecurityHelper::isValidSlug($slug);    // ^[a-z0-9-]{1,255}$
SecurityHelper::isValidLang($lang);    // ^[a-z]{2}(-[a-z]{2})?$

Kullanım: Tüm frontend controller'larda otomatik

2. Validation Middleware

Konum: app/Http/Middleware/ValidateRouteParameters.php

// Route seviyesinde validation
'middleware' => ['validate.route']

// Kontroller:
- String type check
- Length validation (1-255 karakter)
- Format validation (regex)
- Sanitization check

Route Uygulaması:

Route::group([
    'middleware' => ['validate.route', 'throttle:60,1']
], function () {
    // Tüm slug içeren route'lar korunuyor
});

3. Rate Limiting

Route Grubu Limit Açıklama
Frontend 60 req/min Blog, ürün, kategori sayfaları
Admin Panel 120 req/min Admin işlemleri
Sitemap 30 req/min XML sitemap
404 Fallback 10 req/min Brute force koruması

Aşım Durumunda: HTTP 429 Too Many Requests

4. Mass Assignment Protection

Tüm modellerde $guarded kullanımı:

protected $guarded = [
    'id',
    'created_at',
    'updated_at',
];

Avantajları:

  • Whitelist yerine blacklist (daha güvenli)
  • Yeni alan eklemede otomatik koruma
  • ID ve timestamp manipülasyonu engellendi

5. Database Security

  • Prepared Statements: Laravel Eloquent ORM otomatik kullanır
  • SQL Injection: Parametrized queries ile korunuyor
  • XSS Protection: Blade {{ }} otomatik escape eder
  • CSRF Protection: Form'larda @csrf token zorunlu

6. Status & Permission Checks

// Frontend - sadece aktif içerikler
->where('status', 1)

// Yayın tarihi kontrolü
->where('published_at', '<=', now())

// Sadece owner düzenleyebilir (hazır alt yapı)
Gate::allows('update', $post);

🚀 Kullanım Kılavuzu

Admin Panel İşlemleri

1. Dil Ekleme

Admin → Languages → Create
- Name: Türkçe
- Slug: tr
- Flag: 🇹🇷
- Is Default: ✓

2. Kategori Oluşturma

Admin → Categories → Create
- Parent Category: (üst kategori seçilebilir)
- Status: Active
- Her dil için çeviri eklenir

3. Blog Yazısı Ekleme

Admin → Posts → Create
1. Varsayılan dilde oluştur (TR)
2. Save
3. Edit → Dil butonlarıyla çeviri ekle
4. Her dil için:
   - Title (otomatik slug)
   - Content
   - SEO fields

4. Ürün Ekleme

Admin → Products → Create
- Cover Image & Gallery
- Specifications (JSON): Teknik özellikler
- Features (JSON): Özellikler listesi
- Documents (JSON): PDF, katalog linkleri
- Categories & Tags (çoklu seçim)

Frontend Kullanımı

Route Yapısı

/ veya /{lang}                  → Ana sayfa
/{lang}/blog/{slug}             → Blog detay
/{lang}/products                → Ürün listesi
/{lang}/product/{slug}          → Ürün detay
/{lang}/category/{slug}         → Kategori sayfası
/{lang}/tag/{slug}              → Etiket sayfası
/sitemap.xml                    → Sitemap

Dil Değiştirme

@foreach($languages as $language)
    <a href="/translator/{{ $language->slug }}/{{ base64_encode(request()->path()) }}">
        {{ $language->flag }} {{ $language->name }}
    </a>
@endforeach

📸 Proje Görselleri

Veritabanı

Veritabanı

Ana Sayfa

Ana Sayfa

Ana Sayfa En

Ana Sayfa En

Makale Sayfası

Üyelik Sayfası

Kategoriler Sayfası

Kategoriler Sayfası

Etiket Sayfası

Etiket Sayfası

Admin Paneli

Admin Paneli

Dil Sayfası

Dil Sayfası

Kategori Sayfası

Kategori Sayfası

Etiket Sayfası

Etiket Sayfası

Makale Sayfası

Makale Sayfası

Makale Edit Sayfası

Makale Edit Sayfası


🎯 Gelecek Özellikler (Roadmap)

  • Comment System: Blog yazıları için yorum sistemi
  • Advanced Caching: Redis/Memcached entegrasyonu
  • Search Functionality: ElasticSearch veya Meilisearch
  • Media Manager: Gelişmiş medya yönetim sistemi
  • User Roles & Permissions: Spatie Permission entegrasyonu
  • API Support: RESTful API endpoints
  • Analytics Dashboard: İstatistik ve raporlama
  • Newsletter System: E-posta bülteni yönetimi
  • Social Media Integration: Sosyal medya paylaşımı
  • Content Versioning: İçerik versiyon kontrolü

🐛 Bilinen Sorunlar & Çözümler

Cache Problemi

# Tüm cache'leri temizle
php artisan optimize:clear

404 Hatası (Route bulunamıyor)

# Route cache'i temizle
php artisan route:clear
php artisan config:clear

Resim Yükleme Hatası

# Storage link kontrol
php artisan storage:link

# Klasör izinleri (Linux/Mac)
chmod -R 775 storage
chmod -R 775 bootstrap/cache

Rate Limit Aşımı

  • Geliştirme sırasında routes/web.php içindeki throttle değerlerini artırabilirsiniz
  • Örnek: throttle:60,1throttle:1000,1

🤝 Katkıda Bulunma

Projeye katkıda bulunmak isterseniz:

  1. Fork yapın
  2. Feature branch oluşturun (git checkout -b feature/YeniOzellik)
  3. Değişikliklerinizi commit edin (git commit -m 'Yeni özellik: ...')
  4. Branch'inizi push edin (git push origin feature/YeniOzellik)
  5. Pull Request oluşturun

Kod Standartları

# Laravel Pint ile kod formatı
./vendor/bin/pint

# PHPStan ile statik analiz (opsiyonel)
./vendor/bin/phpstan analyse

📄 Lisans

Bu proje MIT Lisansı altında açık kaynaklıdır. Dilediğiniz gibi kullanabilir, değiştirebilir ve dağıtabilirsiniz.


💻 Geliştirici

Muhammet Ali ŞAHİN

LinkedIn GitHub


🙏 Teşekkürler

Bu projeyi kullandığınız veya katkıda bulunduğunuz için teşekkür ederiz!

  • Star ⭐ vermeyi unutmayın
  • Sorun bildirmek için Issue açabilirsiniz
  • Sorularınız için Discussions kullanabilirsiniz

📊 Proje İstatistikleri

PHP Laravel License

Özellikler: Multi-Language, Blog, E-commerce, Security, SEO

Veritabanı: 13 Tablo | Hierarchical Categories | Translation Pattern

Güvenlik: Input Sanitization | Rate Limiting | Mass Assignment Protection | XSS & CSRF Protection


Made with ❤️ by Muhammet Ali ŞAHİN

About

A multilingual blog system built with Laravel 12, showcasing localized database design, post translations, and Tailwind UI integration.

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages