# Dil Paketleri

https://dev.wisecp.com/tr/dil-paketleri

Kurulu dilleri gören, ayarlayan ve kaldıran yedi uç.

## Genel Bakış

Bir dil WISECP'de üç yerde birden yaşar: **paket dosyası** (ad, ülke, sıra, durum), **çeviri dosyaları** ve **dil tabloları** (ürün adları, kategori başlıkları, bildirim şablonları). Bu makale ilkini ve bütününü yönetir.

Diller **WISECP ile birlikte gelir**; ne panelden ne API'den yeni dil oluşturulur. Kapalı duran bir dil açıldığında dil tabloları varsayılandan doldurulur, yani boş başlamaz.

Bir dil **varsayılandır** ve o dil ayrıcalıklıdır: kapatılamaz, silinemez ve adreslerinde dil ön eki taşımaz. Varsayılanı taşımak bu üç davranışı iki dil arasında yer değiştirir.

## Referans

### Kurulu Dilleri Listeleme

get/api/v1/admin/languages

`Languages/GetLanguages` admin

Kurulumdaki bütün dilleri, kapalı olanlar dahil döndürür.

Dönen alanlar data[] — 15 + meta — 2

keystringDilin anahtarı. Adres yollarında bu değer geçer.

namestringDilin İngilizce adı.

show_namestringMüşteriye gösterilen ad.

codestringDil kodu.

code_hyphenstringDil ve ülke kodu birlikte.

country_idintÜlkenin numarası. Adı için başvuru uçlarına bakın.

country_codestringÜlke kodu.

statusboolDil açık mı.

localboolVarsayılan dil mi. Kurulumda tek bir dil bunu taşır.

rtlboolSağdan sola yazılan bir dil mi.

rankintListedeki sırası.

permalinkboolKalıcı bağlantı desteği.

prefixstringAdres ön eki durumu. Varsayılan dilde kapalı, diğerlerinde açıktır.

copiedstringKopyalandığı kaynak dilin adı.

created_atstringOluşturulduğu an.

countintDil sayısı. Meta altında döner.

defaultstringVarsayılan dilin anahtarı.

Hatalar 1

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl 'https://panel.ornek.com/api/v1/admin/languages' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/languages', {
  headers: { Authorization: `Bearer ${apiKey}` },
});

const { data, meta } = await res.json();
const live = data.filter((l) => l.status);
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/languages');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Kapalilar da gelir; musteriye acik dilleri status ile suzun.
$r    = Api::Languages()->GetLanguages();
$live = array_values(array_filter($r['data'], fn ($l) => $l['status']));
$def  = $r['meta']['default'];
```

### İndirilebilir Dilleri Listeleme

get/api/v1/admin/languages/available

`Languages/GetAvailableLanguages` admin uzak servis

WISECP çeviri servisinden kurulabilecek dilleri döndürür.

Dönen alanlar data[] + meta — 1

dataobject[]Uzak servisin döndürdüğü dil tanımları. Servise ulaşılamazsa boş liste gelir.

countintDönen dil sayısı. Meta altında döner.

Hatalar 1

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl 'https://panel.ornek.com/api/v1/admin/languages/available' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res = await fetch('https://panel.ornek.com/api/v1/admin/languages/available', {
  headers: { Authorization: `Bearer ${apiKey}` },
});

const { data, meta } = await res.json();
if (meta.count === 0) showRetry();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/languages/available');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// BOS LISTE iki anlama gelir: hicbiri yok ya da uzak servise ulasilamadi. Ayirt edilemez.
$out = Api::Languages()->GetAvailableLanguages();
if (! $out['data']) $logger->warning('dil listesi bos — servis erisimini dogrulayin');
```

### Tek Dili Okuma

get/api/v1/admin/languages/{key}

`Languages/GetLanguage` admin

Tek bir dil paketini döndürür.

Dönen alanlar data — 15

dataobjectDil paketi. Listeleme ucundaki öğeyle aynı şekildedir.

Hatalar 2

language_not_found404Dil bulunamadı.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl 'https://panel.ornek.com/api/v1/admin/languages/de' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res  = await fetch(`https://panel.ornek.com/api/v1/admin/languages/${key}`, {
  headers: { Authorization: `Bearer ${apiKey}` },
});
const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/languages/' . $key);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Anahtar dil KODU degildir: ikinci bir ulke icin ayni kod 'en-gb' bicimini alir.
$pkg = Api::Languages()->GetLanguage(['key' => $key])['data'];
```

### Dil Oluşturma (Kapalı)

post/api/v1/admin/languages

`Languages/CreateLanguage` admin her zaman reddedilir

Diller WISECP ile birlikte gelir; ne panelden ne buradan yeni dil oluşturulur.

Adres, mevcut entegrasyonlar 404 yerine açık bir yanıt alsın diye yerinde durur. Her çağrı, gövdesi ne olursa olsun `422` ile reddedilir ve hiçbir şey yazılmaz. Bir dil üzerinde çalışmak için kurulu bir dili [Dil Ayarlarını Değiştirme](#update) ve çeviri uçlarıyla düzenleyin.

Hatalar 2

language_create_disabled422Dil oluşturma kapalı; bunun yerine kurulu bir dili düzenleyin.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

### Dil Ayarlarını Değiştirme

patch/api/v1/admin/languages/{key}

`Languages/UpdateLanguage` admin varsayılan yapmak ağırdır

Gönderdiğiniz alanları değiştirir ve dili varsayılan yapabilir.

Gövde 5

show_namestringMüşteriye gösterilen ad. Gönderirseniz boş olamaz.

rankintListedeki sırası.

rtlintSağdan sola yazılıyorsa 1.

statusintDil açık mı. Varsayılan dilde yok sayılır.

localintBu dili varsayılan yapmak için 1. İki dilin adres ön ekini birden değiştirir.

Dönen alanlar data — 15

dataobjectGüncel dil paketi.

Hatalar 3

language_not_found404Dil bulunamadı.

show_name_required422Gönderilen ad boş.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X PATCH 'https://panel.ornek.com/api/v1/admin/languages/de' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"show_name":"Deutsch","rank":2}'
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/admin/languages/${key}`, {
  method: 'PATCH',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ show_name: 'Deutsch', rank: 2 }),
});

const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/languages/' . $key);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'PATCH',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['show_name' => 'Deutsch', 'rank' => 2]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// VARSAYILAN dilde status GORMEZDEN GELINIR: yanit 200 doner ama dil acik kalir.
$pkg = Api::Languages()->UpdateLanguage(['key' => $key, 'status' => 0])['data'];
if ($pkg['status']) $logger->info('varsayilan dil kapatilamaz — degisiklik uygulanmadi');
```

### Dili Açma ve Kapatma

put/api/v1/admin/languages/{key}/status

`Languages/SetLanguageStatus` admin

Dili müşteriye açar ya da kapatır.

Gövde 1

statusintreqYeni durum: 0 kapalı, 1 açık.

Dönen alanlar data — 2

keystringDilin anahtarı.

statusboolGüncel durum.

Hatalar 5

language_not_found404Dil bulunamadı.

invalid_status422Durum 0 ya da 1 değil.

language_is_default422Varsayılan dil kapatılamaz.

no_change422Dil zaten istediğiniz durumda.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X PUT 'https://panel.ornek.com/api/v1/admin/languages/de/status' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"status":1}'
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/admin/languages/${key}/status`, {
  method: 'PUT',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ status: 1 }),
});

if (res.status === 422) { /* zaten aciksa buraya duser */ }
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/languages/' . $key . '/status');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'PUT',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['status' => 1]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Ayni durumu tekrar yazmak HATA verir; toplu esitlemede once mevcut durumu okuyun.
$pkg = Api::Languages()->GetLanguage(['key' => $key])['data'];
if ($pkg['status'] !== $wanted) Api::Languages()->SetLanguageStatus(['key' => $key, 'status' => (int) $wanted]);
```

### Dili Kaldırma

delete/api/v1/admin/languages/{key}

`Languages/DeleteLanguage` admin geri alınamaz

Dili, çevirilerini ve dile ait bütün satırları kaldırır.

Dönen alanlar data — 2

deletedboolSilme çalıştı mı.

keystringSilinen dilin anahtarı.

Hatalar 4

language_not_found404Dil bulunamadı.

language_is_default422Varsayılan dil silinemez.

remove_tables_failed500Dil tablosu satırları silinemedi.

insufficient_scope403Anahtar gerekli kapsamı taşımıyor.

İstek cURL JavaScript PHP (HTTP) PHP (Dahili)

```bash
curl -X DELETE 'https://panel.ornek.com/api/v1/admin/languages/de' \
  -H "Authorization: Bearer $API_KEY"
```

```javascript
const res = await fetch(`https://panel.ornek.com/api/v1/admin/languages/${key}`, {
  method: 'DELETE',
  headers: { Authorization: `Bearer ${apiKey}` },
});

const body = await res.json();
```

```php
$ch = curl_init('https://panel.ornek.com/api/v1/admin/languages/' . $key);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'DELETE',
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
```

```php
// Urun/kategori adlarinin O DILDEKI satirlari da gider; once disa aktarip saklayin.
$dump = Api::Languages()->ExportLanguageTranslations(['key' => $key])['data'];
file_put_contents("backup-$key.json", json_encode($dump));

Api::Languages()->DeleteLanguage(['key' => $key]);
```

## Tuzaklar

> **Oluşturulan anahtar gönderdiğiniz kod olmayabilir**
> 
> Gönderdiğiniz dil kodu kurulumda **zaten varsa** yeni dilin anahtarı `kod-ülke` biçimini alır. İkinci bir İngilizce kurmak `en` değil `en-gb` üretir. Anahtarı yanıttan okuyun; sonraki her çağrı onu ister.

> **Varsayılanı taşımak iki dilin adreslerini değiştirir**
> 
> Bir dili varsayılan yapmak eski varsayılanın ön ekini **açar** ve yenisininkini **kapatır**. Yani iki dilin de genel adresleri değişir ve eski bağlantılar kayar. Bu iş ayrıca ayar dosyasını yeniden yazar, yeni dili zorla açar. Yayında olan bir kurulumda bunu plansız yapmayın.

> **İki yol aynı durumu farklı işler**
> 
> Durum ucu varsayılan dili kapatmayı `422` ile reddeder. Ayar ucu ise aynı isteği **sessizce yok sayar** ve `200` döndürür; dil açık kalır. İkisini karıştıran bir betik kapattığını sanır. Yanıttaki duruma bakın.

> **Aynı durumu yazmak hata döner**
> 
> Durum ucu istenen durum mevcut durumla aynıysa `no_change` ile `422` döner. Yani bu uç tekrar edilebilir değildir: bütün dilleri "açık" hâle getiren bir eşitleme döngüsü zaten açık olanlarda hata alır. Yazmadan önce mevcut durumu okuyun.

> **Silme çeviriden fazlasını götürür**
> 
> Dili silmek çeviri dosyalarını, bildirim şablonlarını ve **dil tablosu satırlarını** kaldırır: o dildeki ürün adları, kategori başlıkları ve sayfa içerikleri de gider. Geri dönüş yolu yalnız yedektir. Silmeden önce çevirileri dışa aktarın.

> **Boş indirilebilir listesi hata anlamına gelebilir**
> 
> İndirilebilir diller uzak bir servisten gelir. Servise ulaşılamazsa uç hata döndürmez, **boş liste** döner. Bu yüzden "hiç dil yok" ile "servise ulaşılamadı" aynı görünür. Boş sonucu bir arayüzde "seçenek yok" diye göstermeden önce yeniden deneme yolu bırakın.

## İlgili Makaleler

- [Çeviri Dizeleri](https://dev.wisecp.com/tr/ceviri-dizeleri)
- [Başvuru Listeleri](https://dev.wisecp.com/tr/basvuru-listeleri)
