PHP ile Ücretsiz ve Sınırsız Çeviri API si Kurma: Google Translate Unofficial Endpoint

PHP ile Ücretsiz ve Sınırsız Çeviri API si Kurma: Google Translate Unofficial Endpoint

Neden Ücretli Çeviri API'si Kullanmak Zorunda Değilsiniz?

Bir web projesinde çok dilli içerik üretme ihtiyacı doğduğunda akla ilk gelen çözümler genellikle Google Translate API veya DeepL gibi ücretli servislerdir. 50.000 ürün başlığını beş dile çevirmek için gereken maliyet ciddi rakamlara ulaşabilir — oysa aynı kalitede çeviriyi ücretsiz elde etmek mümkün.

Google Translate, tarayıcıların kullandığı resmi olmayan bir HTTP endpoint üzerinden doğrudan sorgulanabilir. Bu endpoint herhangi bir API anahtarı gerektirmez, kurulum istemez ve Google'ın kendi çeviri motoru kalitesini sunar. Bu makalede bu endpoint'i PHP ile sarmalayan, API anahtarı doğrulamalı, çoklu dil ve toplu çeviri destekli tam bir wrapper sistemi kuracağız.

⚠️ Önemli Uyarı: Bu endpoint resmi olarak belgelenmemiş ve Google tarafından garantilenmemektedir. Kişisel projeler ve içerik zenginleştirme senaryoları için idealdir; ancak yoğun ticari kullanımda resmi API anahtarı edinmenizi tavsiye ederim.

Endpoint'in Çalışma Mantığı

Google Translate web arayüzü arka planda şu endpoint'i kullanır:

https://translate.googleapis.com/translate_a/single
  ?client=gtx
  &sl=en        # kaynak dil
  &tl=tr        # hedef dil
  &dt=t         # çeviri verisi iste
  &q=Hello      # çevrilecek metin

Yanıt iç içe geçmiş bir JSON dizisidir. İlk eleman çeviri parçalarını içerir:

[[["Merhaba","Hello",null,null,10]],null,"en"]

Birden fazla cümle içeren metinlerde bu dizi çoğalır; parçaları birleştirerek tam çeviriyi elde ederiz.

PHP Wrapper API'si

Aşağıdaki dosyayı sunucunuzda translate/api.php olarak kaydedin. Dört farklı action desteklemektedir: translate, multi, batch ve detect.

<?php
define('API_KEY', 'buraya_guclu_bir_anahtar_yazin');

header('Content-Type: application/json; charset=utf-8');
header('Access-Control-Allow-Origin: *');

// API key doğrulama
$key = $_POST['key'] ?? $_GET['key'] ?? '';
if ($key !== API_KEY) {
    http_response_code(401);
    die(json_encode(['error' => 'Geçersiz API anahtarı']));
}

$action = $_POST['action'] ?? $_GET['action'] ?? 'translate';

switch ($action) {

    case 'translate':
        // Tek metni tek dile çevir
        echo json_encode(translateText(
            $_POST['q'] ?? '',
            $_POST['source'] ?? 'en',
            $_POST['target'] ?? 'tr'
        ));
        break;

    case 'multi':
        // Tek metni birden fazla dile aynı anda çevir
        $text    = $_POST['q'] ?? '';
        $source  = $_POST['source'] ?? 'en';
        $targets = explode(',', $_POST['targets'] ?? 'tr,de,fr,ar,ru');
        $results = [];
        foreach ($targets as $lang) {
            $lang = trim($lang);
            $results[$lang] = translateText($text, $source, $lang)['translatedText'] ?? '';
        }
        echo json_encode(['results' => $results]);
        break;

    case 'batch':
        // Birden fazla metni aynı dile çevir
        $texts  = json_decode($_POST['texts'] ?? '[]', true);
        $source = $_POST['source'] ?? 'en';
        $target = $_POST['target'] ?? 'tr';
        $results = [];
        foreach ($texts as $text) {
            $results[] = translateText($text, $source, $target)['translatedText'] ?? '';
            usleep(150000); // rate limiting için 150ms bekle
        }
        echo json_encode(['results' => $results]);
        break;

    case 'detect':
        // Metnin dilini otomatik tespit et
        $result = translateText($_POST['q'] ?? '', 'auto', 'en');
        echo json_encode(['detected' => $result['source'] ?? 'unknown']);
        break;

    default:
        http_response_code(400);
        echo json_encode(['error' => 'Geçersiz action']);
}

function translateText(string $text, string $source, string $target): array
{
    if (empty(trim($text))) {
        return ['translatedText' => '', 'source' => $source, 'target' => $target];
    }

    $url = 'https://translate.googleapis.com/translate_a/single'
         . '?client=gtx'
         . '&sl=' . urlencode($source)
         . '&tl=' . urlencode($target)
         . '&dt=t'
         . '&q='  . urlencode($text);

    $ch = curl_init($url);
    curl_setopt_array($ch, [
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_TIMEOUT        => 10,
        CURLOPT_USERAGENT      => 'Mozilla/5.0 (compatible; PHPTranslate/1.0)',
        CURLOPT_HTTPHEADER     => ['Accept: application/json'],
    ]);

    $response = curl_exec($ch);
    $error    = curl_error($ch);
    curl_close($ch);

    if ($error || !$response) {
        return ['translatedText' => '', 'error' => $error];
    }

    $data = json_decode($response, true);
    $translated = '';
    if (isset($data[0]) && is_array($data[0])) {
        foreach ($data[0] as $part) {
            if (isset($part[0])) $translated .= $part[0];
        }
    }

    return [
        'translatedText' => $translated,
        'source'         => $source,
        'target'         => $target
    ];
}

Kullanım Örnekleri

Tek Dil Çevirisi

$ch = curl_init('https://siteniz.com/translate/api.php');
curl_setopt_array($ch, [
    CURLOPT_POST          => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POSTFIELDS    => http_build_query([
        'key'    => 'api_anahtariniz',
        'action' => 'translate',
        'q'      => 'Laser Cut Decorative Panel 3mm',
        'source' => 'en',
        'target' => 'tr'
    ])
]);
$result = json_decode(curl_exec($ch), true);
echo $result['translatedText'];
// Çıktı: "Lazer Kesim Dekoratif Panel 3mm"

Tek Seferde 5 Dile Çevirme

Ürün başlığı veya açıklamasını aynı anda birden fazla dile çevirmek için multi action'ını kullanın:

$ch = curl_init('https://siteniz.com/translate/api.php');
curl_setopt_array($ch, [
    CURLOPT_POST          => true,
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POSTFIELDS    => http_build_query([
        'key'     => 'api_anahtariniz',
        'action'  => 'multi',
        'q'       => 'Wood Wall Clock SVG File',
        'source'  => 'en',
        'targets' => 'tr,de,fr,ar,ru'
    ])
]);
$data = json_decode(curl_exec($ch), true);
print_r($data['results']);
/*
Array (
    [tr] => Ahşap Duvar Saati SVG Dosyası
    [de] => Holz-Wanduhr SVG-Datei
    [fr] => Fichier SVG Horloge Murale en Bois
    [ar] => ملف SVG ساعة حائط خشبية
    [ru] => SVG-файл деревянных настенных часов
)
*/

Toplu Çeviri ve SQLite'a Kaydetme

Veritabanındaki binlerce ürünü toplu olarak çevirmek için aşağıdaki pattern'i kullanabilirsiniz. Sistem kaldığı yerden devam edebilmesi için translated sütununu bayrak olarak kullanır:

$db = new SQLite3('urunler.db');

// Henüz çevrilmemiş 50 ürünü al
$sorgu = $db->query("SELECT id, title, description FROM products WHERE translated = 0 LIMIT 50");

while ($urun = $sorgu->fetchArray(SQLITE3_ASSOC)) {

    // Başlık çevirisi
    $baslik = cevir($urun['title']);

    // Açıklama çevirisi
    $aciklama = cevir($urun['description']);

    // Veritabanına kaydet
    $stmt = $db->prepare("
        UPDATE products SET
            title_tr = :btr, title_de = :bde, title_fr = :bfr,
            title_ar = :bar, title_ru = :bru,
            desc_tr  = :dtr, desc_de  = :dde, desc_fr  = :dfr,
            desc_ar  = :dar, desc_ru  = :dru,
            translated = 1
        WHERE id = :id
    ");
    foreach (['tr','de','fr','ar','ru'] as $lang) {
        $stmt->bindValue(":b$lang", $baslik[$lang] ?? '');
        $stmt->bindValue(":d$lang", $aciklama[$lang] ?? '');
    }
    $stmt->bindValue(':id', $urun['id']);
    $stmt->execute();

    usleep(200000); // her ürün arasında 200ms bekle
    echo "ID {$urun['id']} tamamlandı.\n";
}

function cevir(string $metin): array {
    $ch = curl_init('https://siteniz.com/translate/api.php');
    curl_setopt_array($ch, [
        CURLOPT_POST          => true,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_POSTFIELDS    => http_build_query([
            'key'     => 'api_anahtariniz',
            'action'  => 'multi',
            'q'       => $metin,
            'source'  => 'en',
            'targets' => 'tr,de,fr,ar,ru'
        ])
    ]);
    $data = json_decode(curl_exec($ch), true);
    return $data['results'] ?? [];
}

cURL Testi

API'nin çalıştığını komut satırından hızlıca test edebilirsiniz:

curl -X POST https://siteniz.com/translate/api.php \
  -d "key=api_anahtariniz" \
  -d "action=multi" \
  -d "q=Hello World" \
  -d "source=en" \
  -d "targets=tr,de,fr"

İpuçları ve Dikkat Edilmesi Gerekenler

İstekler arasına gecikme ekleyin. Kısa sürede çok fazla istek atmak geçici engellenmeye yol açabilir. Batch işlemlerinde istekler arasına 150-200ms bekleyiş eklemek yeterlidir.

Büyük işlemleri gece yapın. 10.000 ve üzeri çeviriyi cron job ile gece saatlerine planlayın. Hem sunucu yükünü dağıtır hem de olası rate limit sorunlarının önüne geçersiniz.

Sonuçları önbelleğe alın. Aynı metni tekrar çevirmek yerine veritabanında saklayın. translated = 1 bayrağı sayesinde toplu işlem kesintisiz devam eder.

API anahtarınızı güçlü tutun. Wrapper'ınızı açık internete koyuyorsanız rastgele erişimi önlemek için en az 32 karakterlik bir anahtar kullanın.

Uzun metinleri parçalara bölün. 5.000 karakterin üzerindeki metinlerde Google yanıt kesebilir. Paragraf veya cümle bazında bölerek çevirin, sonuçları birleştirin.

Sonuç

Google Translate'in gayri resmi endpoint'ini PHP ile sarmalaması birkaç satır kod meselesi. Ortaya çıkan sistem; tek dil, çok dil ve toplu çeviri modlarını, otomatik dil tespitini ve API key doğrulamasını destekleyen tam işlevli bir çeviri servisi sunuyor. Kişisel projelerinizde, e-ticaret sitelerinde ürün çevirisi için veya blog içeriklerini çok dilli hale getirmek için rahatlıkla kullanabilirsiniz.

T

Site Yöneticisi

Merhaba! Ben Ramazan, Bir yazılım geliştiricisiyim.

💬 Yorumlar (0)

İlk yorumu siz yapın!

💬 Yorum Yap