Php İle Çoklu Dil Desteğine Sahip Web Sitesi Nasıl Yapılır?

Php İle Çoklu Dil Desteğine Sahip Web Sitesi Nasıl Yapılır?
Php İle Çoklu Dil Desteğine Sahip Web Sitesi Nasıl Yapılır?

Gereksinimler ve Ön Hazırlık

Projeye başlamadan önce bilgisayarınızda bir yerel geliştirme ortamının (WAMP, XAMPP veya Docker tabanlı bir yapı) hazır olması gerekir. PHP 8.2 veya 8.3 gibi güncel bir sürüm kullanmanız, performans ve güvenlik açısından kritik öneme sahiptir.

  • PHP Sürümü: 8.0 ve üzeri (8.2+ önerilir).
  • Sunucu: Apache veya Nginx.
  • Metin Editörü: VS Code veya PHPStorm.
  • Temel Bilgi: PHP oturum (session) yönetimi ve dosya okuma/yazma işlemleri hakkında temel bilgi.

Adım 1: Dil Dosyalarının Yapılandırılması

Çoklu dil desteğinin temeli, metinlerin bir merkezden yönetilmesidir. Bunun için her dil için ayrı bir PHP dosyası oluşturacağız. Bu dosyalar, anahtarlar (keys) ve bunlara karşılık gelen değerleri (values) içeren basit diziler (arrays) barındıracaktır.

// lang/tr.php
return [
    'welcome' => 'Sitemize Hoş Geldiniz',
    'home' => 'Anasayfa',
    'contact' => 'İletişim'
];

// lang/en.php
return [
    'welcome' => 'Welcome to our website',
    'home' => 'Home',
    'contact' => 'Contact'
];

Bu yapıda, her dil dosyası bir dizi döndürür. Bu sayede include komutu ile bu dosyaları istediğimiz zaman değişkenlere atayabiliriz. Anahtarların her iki dosyada da aynı olması, kodun geri kalanında dil bağımsız bir yapı kurmamızı sağlar.

Adım 2: Oturum Yönetimi ile Dil Seçimini Kaydetme

Kullanıcının seçtiği dili hatırlamak için PHP oturumlarını (session) kullanacağız. Kullanıcı siteye ilk girdiğinde varsayılan bir dil atamalı, ardından kullanıcı seçim yaptıkça bu değeri güncellemeliyiz.

session_start();

// Varsayılan dil Türkçe olsun
$default_lang = 'tr';
$allowed_langs = ['tr', 'en'];

// Kullanıcı dil değiştirirse oturumu güncelle
if (isset($_GET['lang']) && in_array($_GET['lang'], $allowed_langs)) {
    $_SESSION['lang'] = $_GET['lang'];
}

// Oturumda dil yoksa varsayılanı ata
if (!isset($_SESSION['lang'])) {
    $_SESSION['lang'] = $default_lang;
}

$lang = $_SESSION['lang'];
$translations = include "lang/{$lang}.php";

Burada in_array fonksiyonu ile kullanıcıdan gelen dil parametresinin izin verilenler arasında olup olmadığını kontrol ediyoruz. Bu, güvenlik açısından kritiktir; çünkü kullanıcı dışarıdan rastgele bir dosya yolu girmeye çalışabilir (Local File Inclusion - LFI saldırısı).

Adım 3: Çoklu Dil Desteği İçin Yardımcı Fonksiyon Yazma

Her seferinde $translations['anahtar'] yazmak yerine, daha temiz bir kullanım için küçük bir yardımcı fonksiyon tanımlayalım. Bu, kodun okunabilirliğini artıracaktır.

function __($key) {
    global $translations;
    return $translations[$key] ?? $key; // Anahtar yoksa anahtarın kendisini döndür
}

// Kullanımı:
echo __('welcome');

Bu fonksiyon, eğer belirtilen anahtar dil dosyasında bulunamazsa, hata vermek yerine anahtarın kendisini ekrana basar. Bu, geliştirme aşamasında eksik çevirileri hızlıca fark etmenizi sağlar.

Adım 4: Kullanıcı Arayüzünde Dil Değiştirici Oluşturma

Kullanıcıların diller arasında geçiş yapabilmesi için basit bir link yapısı kurmamız gerekir. Bu linkler, mevcut sayfanın URL'sini bozmadan sadece lang parametresini değiştirmelidir.


    Türkçe
    English


Bu basit HTML yapısı, kullanıcının tıklamasıyla $_GET['lang'] değerini günceller ve PHP kodumuz bu değeri yakalayarak ilgili dil dosyasını yeniden yükler.

Karşılaştırma: Dil Yönetim Yöntemleri

Yöntem Avantajı Dezavantajı
PHP Dizileri Hızlı, basit, ek kütüphane gerektirmez. Çok büyük projelerde yönetimi zorlaşabilir.
JSON Dosyaları Diğer dillerle (JS) kolay paylaşılır. PHP dizileri kadar hızlı işlenmez.
Veritabanı Dinamik içerik yönetimi için idealdir. Her sayfa yüklemesinde ek sorgu gerektirir.

Adım 5: Güvenlik Uyarıları ve En İyi Pratikler

Kritik Güvenlik Uyarısı: Dil dosyalarını yüklerken asla doğrudan kullanıcıdan gelen veriyi include fonksiyonuna vermeyin. Yukarıdaki örnekte olduğu gibi, mutlaka bir "beyaz liste" (allowed_langs) kontrolü yaparak sadece izin verdiğiniz dosyaların yüklenmesini sağlayın. Aksi takdirde sunucunuzdaki hassas dosyalar okunabilir.

Ayrıca, XSS (Cross-Site Scripting) saldırılarına karşı, dil dosyasından gelen verileri ekrana basarken htmlspecialchars() fonksiyonunu kullanmayı ihmal etmeyin.

// Güvenli çıktı
echo htmlspecialchars(__('welcome'), ENT_QUOTES, 'UTF-8');

Sıkça Sorulan Sorular

URL yapısını "site.com/tr/hakkimizda" şeklinde nasıl yapabilirim?

Bunun için .htaccess dosyanızda mod_rewrite kuralları kullanarak URL'deki dil parametresini yakalayıp PHP'ye yönlendirmeniz gerekir. Bu, SEO açısından en çok tavsiye edilen yöntemdir.

Veritabanı içeriğini nasıl çoklu dilli yapabilirim?

Veritabanı tablolarınıza lang sütunu ekleyerek veya her dil için ayrı birer tablo oluşturarak verileri filtreleyebilirsiniz. Sorgularınızda WHERE lang = 'tr' şartını unutmamalısınız.

Kullanıcının tarayıcı dilini otomatik nasıl algılarım?

PHP'de $_SERVER['HTTP_ACCEPT_LANGUAGE'] değişkenini kullanarak kullanıcının tarayıcı tercihini okuyabilir ve ilk girişte onu uygun dile yönlendirebilirsiniz.

Çok fazla metin olduğunda performans düşer mi?

PHP dizileri bellekte tutulur ve oldukça hızlıdır. Ancak binlerce satırlık bir çeviri dosyanız varsa, bunları parçalara ayırarak sadece ilgili sayfanın ihtiyaç duyduğu metinleri yüklemek daha verimlidir.

SEO için nelere dikkat etmeliyim?

Her sayfanın etiketini, seçilen dile göre dinamik olarak güncellemelisiniz. Ayrıca Google'ın dil sürümlerini anlaması için hreflang etiketlerini kullanmanız şarttır.

Sorumluluk Reddi: Bu makalede paylaşılan kodlar eğitim amaçlıdır. Ticari projelerinizde güvenlik katmanlarını (WAF, girdi filtreleme, yetkilendirme) mutlaka profesyonel standartlarda uygulayın. Yazılım güvenliği sürekli güncellenen bir süreçtir.

İleri Seviye İpucu: Dil Dosyalarında İç İçe Yapılandırma ve Değişken Kullanımı

Projeleriniz büyüdükçe, dil dosyalarınızdaki anahtar-değer çiftleri yönetilemez hale gelebilir. Basit bir dizi yapısı yerine, çok boyutlu diziler kullanarak metinlerinizi kategorize etmek, kodun okunabilirliğini ve bakımını ciddi oranda artırır. Ayrıca, dinamik verileri (örneğin: "Hoş geldin, {isim}") dil dosyalarına dahil etmek için sprintf fonksiyonundan yararlanmak en profesyonel yaklaşımdır.

Örnek bir tr.php dosyası yapısı:


return [
    'nav' => [
        'home' => 'Anasayfa',
        'contact' => 'İletişim'
    ],
    'messages' => [
        'welcome' => 'Hoş geldin, %s!',
        'error' => 'Bir hata oluştu, lütfen tekrar deneyin.'
    ]
];

Bu yapıyı çağırmak için yardımcı fonksiyonunuzu şu şekilde güncelleyebilirsiniz:


function __($key, $params = []) {
    global $lang_data; // Dil dosyasından dönen dizi
    $keys = explode('.', $key);
    $output = $lang_data;

    foreach ($keys as $k) {
        $output = $output[$k] ?? $key;
    }

    return empty($params) ? $output : vsprintf($output, $params);
}

// Kullanımı:
echo __('messages.welcome', ['Ahmet']);

Performans Optimizasyonu: Dil Dosyalarını Önbelleğe Alma

Her sayfa yüklenişinde dil dosyalarını diskten okumak ve diziye dönüştürmek, özellikle büyük projelerde küçük de olsa bir gecikmeye neden olur. Bu süreci hızlandırmak için PHP'nin OPcache özelliğinden faydalanmalı ve dil dosyalarını birer PHP dizisi olarak döndürmelisiniz. Ayrıca, üretim (production) ortamında dil dosyalarını bir kez yükleyip bellekte tutmak için basit bir statik sınıf kullanabilirsiniz.

Basit bir önbellek sınıfı örneği:


class Translator {
    private static $cache = [];

    public static function load($lang) {
        if (!isset(self::$cache[$lang])) {
            $file = "languages/{$lang}.php";
            self::$cache[$lang] = file_exists($file) ? include $file : [];
        }
        return self::$cache[$lang];
    }
}

// Kullanım:
$lang_data = Translator::load($_SESSION['lang']);

Bu yöntemle, aynı istek içerisinde birden fazla kez dil dosyasına ihtiyaç duyduğunuzda, dosya sistemi yerine RAM üzerinde tutulan diziye erişerek I/O (Girdi/Çıktı) yükünü minimize etmiş olursunuz.

Sonuç

PHP ile çoklu dil desteği kurmak, başlangıçta karmaşık görünse de yukarıdaki modüler yapı ile oldukça yönetilebilir bir süreçtir. Dil dosyalarını ayırmak, oturum yönetimi ile dili hafızada tutmak ve güvenlik önlemlerini (beyaz liste kontrolü, çıktı temizleme) elden bırakmamak, projenizin başarısı için anahtardır.

Bir sonraki adım olarak, çoklu dil yapınızı veritabanı ile entegre etmeyi deneyebilir veya URL yapılandırması için .htaccess yönlendirmelerini inceleyerek SEO uyumlu "pretty URLs" yapısına geçiş yapabilirsiniz.

Bu yazıya tepkinizi paylaşın:
Mert Demir

Teknik beceriler ve bakım onarım rehberleri konusunda deneyimli bir editörüm. Okuyucularıma günlük hayatta tasarruf sağlayacak ipuçları sunuyorum.

Yorumlar (0)

Yorum Yaz