Çeviri Dizeleri

1.6k görüntülenme Markdown

Çeviri dizelerini arayan, düzenleyen, silen ve taşıyan beş uç.

Genel Bakış

Çeviri dizeleri veritabanında değil dosyalarda yaşar. Her dizenin bir tam anahtarı vardır ve o anahtar hangi dosyada durduğunu da söyler: needs/button-save gibi.

Anahtarın başı dizeyi üç kümeden birine yerleştirir: müşteri yüzü, yönetim paneli ve geri kalan sistem metinleri. Arama sonucu bu üç küme altında gruplanır.

Yazmanın iki yolu vardır ve bilerek farklıdırlar. Toplu düzenleme katıdır: tanımadığı bir anahtar gördüğünde hiçbir şey yazmaz. İçe aktarma hoşgörülüdür: tanımadığını atlar, gerisini yazar.

Referans

get/api/v1/admin/languages/{key}/translations
Languages/GetLanguageTranslations admin en çok 100 eşleşme

Aradığınız metni taşıyan çeviri dizelerini gruplu döndürür.

Sorgu 1
searchstringreqAranacak metin. En az üç karakter olmalıdır ve büyük küçük harf ayrımı vardır.
Dönen alanlar data — 3 + meta — 3
clientobjectMüşteri yüzündeki eşleşmeler.
totalintGruptaki eşleşme sayısı.
dataobjectTam anahtar ile değeri eşleyen harita.
adminobjectYönetim panelindeki eşleşmeler.
systemobjectKalan bütün eşleşmeler. Hata mesajları ve ortak metinler.
totalintToplanan eşleşme sayısı. Yüzde durur, gerçek toplam daha büyük olabilir.
searchstringAradığınız metin.
truncatedboolYüz sınırına ulaşıldı mı.
Hatalar 3
language_not_found404Dil bulunamadı.
search_too_short422Arama metni üç karakterden kısa.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl 'https://panel.ornek.com/api/v1/admin/languages/de/translations?search=Save' \
  -H "Authorization: Bearer $API_KEY"
const url = new URL(`https://panel.ornek.com/api/v1/admin/languages/${key}/translations`);
url.searchParams.set('search', term);

const res  = await fetch(url, { headers: { Authorization: `Bearer ${apiKey}` } });
const { data, meta } = await res.json();
if (meta.truncated) narrowTheSearch();
$qs = http_build_query(['search' => $term]);
$ch = curl_init('https://panel.ornek.com/api/v1/admin/languages/' . $key . '/translations?' . $qs);
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Arama BUYUK-KUCUK harfe duyarlidir: 'save' ile 'Save' ayni sonucu vermez.
$r = Api::Languages()->GetLanguageTranslations(['key' => $key], ['search' => 'Save']);
if ($r['meta']['truncated']) $logger->info('sonuc yuzde kesildi — aramayi daraltin');

Çevirileri Toplu Düzenleme

put/api/v1/admin/languages/{key}/translations
Languages/UpdateLanguageTranslations admin katı

Verdiğiniz anahtarların karşılıklarını yazar, gerisine dokunmaz.

Gövde 1
translationsobjectreqTam anahtar ile yeni değeri eşleyen harita. Bir anahtar bile geçersizse istek tümüyle reddedilir.
Dönen alanlar data — 2
updatedintYazılan anahtar sayısı.
languagestringDilin anahtarı.
Hatalar 4
language_not_found404Dil bulunamadı.
translations_required422Harita boş.
invalid_translation_key422Bir anahtar var olmayan bir dosyaya işaret ediyor.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X PUT 'https://panel.ornek.com/api/v1/admin/languages/de/translations' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"translations":{"needs/button-save":"Speichern"}}'
const res = await fetch(`https://panel.ornek.com/api/v1/admin/languages/${key}/translations`, {
  method: 'PUT',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({
    translations: {
      'needs/button-save': 'Speichern',
      'admin/services/page-list': 'Dienste',
    },
  }),
});

const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/languages/' . $key . '/translations');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'PUT',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode([
        'translations' => ['needs/button-save' => 'Speichern'],
    ]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// TEK gecersiz anahtar tum yigini reddeder; toplu yukleme icin ice aktarma ucunu secin.
Api::Languages()->UpdateLanguageTranslations([
    'key' => $key, 'translations' => ['needs/button-save' => 'Speichern'],
]);

Tek Çeviriyi Silme

delete/api/v1/admin/languages/{key}/translations
Languages/DeleteLanguageTranslation admin

Tek bir çeviri dizesini dosyasından kaldırır.

Gövde 1
keystringreqSilinecek tam çeviri anahtarı. Adresteki dil anahtarıyla karıştırmayın.
Dönen alanlar data — 3
deletedboolSilme çalıştı mı.
keystringSilinen çeviri anahtarı.
languagestringDilin anahtarı.
Hatalar 5
language_not_found404Dil bulunamadı.
key_required422Çeviri anahtarı verilmedi.
invalid_translation_key422Çeviri anahtarı geçersiz.
translation_file_not_found404Anahtarın işaret ettiği dosya yok.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X DELETE 'https://panel.ornek.com/api/v1/admin/languages/de/translations' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"key":"needs/button-save"}'
const res = await fetch(`https://panel.ornek.com/api/v1/admin/languages/${lang}/translations`, {
  method: 'DELETE',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ key: 'needs/button-save' }),
});

const body = await res.json();
$ch = curl_init('https://panel.ornek.com/api/v1/admin/languages/' . $lang . '/translations');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_CUSTOMREQUEST  => 'DELETE',
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['key' => 'needs/button-save']),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Silinen anahtari arayan ekran BOS metin basar; ceviriyi bosaltmak yerine duzeltmeyi dusunun.
Api::Languages()->UpdateLanguageTranslations([
    'key' => $lang, 'translations' => ['needs/button-save' => 'Speichern'],
]);

Çevirileri Dışa Aktarma

get/api/v1/admin/languages/{key}/translations/export
Languages/ExportLanguageTranslations admin

Dilin bütün çeviri dizelerini düz bir harita olarak döndürür.

Dönen alanlar data + meta — 2
dataobjectTam anahtar ile değeri eşleyen düz harita. İçe aktarma ucuna doğrudan verilebilir.
countintDize sayısı. Meta altında döner.
languagestringDilin anahtarı.
Hatalar 2
language_not_found404Dil bulunamadı.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl 'https://panel.ornek.com/api/v1/admin/languages/de/translations/export' \
  -H "Authorization: Bearer $API_KEY" > de.json
const res = await fetch(`https://panel.ornek.com/api/v1/admin/languages/${key}/translations/export`, {
  headers: { Authorization: `Bearer ${apiKey}` },
});

const { data, meta } = await res.json();
console.log(`${meta.count} dize`);
$ch = curl_init('https://panel.ornek.com/api/v1/admin/languages/' . $key . '/translations/export');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_HTTPHEADER     => ['Authorization: Bearer ' . $apiKey],
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Cikti JSON'dur, tablo dosyasi DEGIL; panelin sundugu tablo bicimi bu ucta yoktur.
$dump = Api::Languages()->ExportLanguageTranslations(['key' => $key])['data'];
file_put_contents("$key.json", json_encode($dump, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE));

Çevirileri İçe Aktarma

post/api/v1/admin/languages/{key}/translations/import
Languages/ImportLanguageTranslations admin hoşgörülü

Bir çeviri haritasını toplu yazar ve tanımadığı anahtarları atlar.

Gövde 1
translationsobjectreqTam anahtar ile değeri eşleyen harita. Dışa aktarma çıktısıyla aynı biçimdedir.
Dönen alanlar data — 4
languagestringDilin anahtarı.
translationsintGönderdiğiniz anahtar sayısı.
applied_filesintYazılan dosya sayısı.
skipped_filesarrayHedef dosyası bulunmadığı için atlanan anahtarlar. Sessiz kaybın tek işaretidir.
Hatalar 3
language_not_found404Dil bulunamadı.
translations_required422Harita boş.
insufficient_scope403Anahtar gerekli kapsamı taşımıyor.
İstek
curl -X POST 'https://panel.ornek.com/api/v1/admin/languages/de/translations/import' \
  -H "Authorization: Bearer $API_KEY" \
  -H 'Content-Type: application/json' \
  -d '{"translations":{"needs/button-save":"Speichern"}}'
const res = await fetch(`https://panel.ornek.com/api/v1/admin/languages/${key}/translations/import`, {
  method: 'POST',
  headers: {
    Authorization: `Bearer ${apiKey}`,
    'Content-Type': 'application/json',
  },
  body: JSON.stringify({ translations: map }),
});

const { data } = await res.json();
if (data.skipped_files.length) reportSkipped(data.skipped_files);
$ch = curl_init('https://panel.ornek.com/api/v1/admin/languages/' . $key . '/translations/import');
curl_setopt_array($ch, [
    CURLOPT_RETURNTRANSFER => true,
    CURLOPT_POST           => true,
    CURLOPT_HTTPHEADER     => [
        'Authorization: Bearer ' . $apiKey,
        'Content-Type: application/json',
    ],
    CURLOPT_POSTFIELDS => json_encode(['translations' => $map]),
]);

$body = json_decode(curl_exec($ch), true);
curl_close($ch);
// Tanimadigi anahtari SESSIZCE atlar; atlananlari saymazsaniz eksik ceviri fark edilmez.
$out = Api::Languages()->ImportLanguageTranslations(['key' => $key, 'translations' => $map])['data'];
if ($out['skipped_files']) $logger->warning('atlanan anahtar', $out['skipped_files']);

Tuzaklar

Toplu düzenleme ile içe aktarma aynı hatayı farklı karşılar

Toplu düzenleme tek bir geçersiz anahtar yüzünden tüm yığını reddeder ve hiçbir şey yazmaz. İçe aktarma aynı anahtarı sessizce atlar, gerisini yazar. Elle düzeltmede birincisini, dış bir dosyayı yüklerken ikincisini seçin.

Atlanan anahtarlar yalnız yanıtta görünür

İçe aktarma atladığı anahtarları skipped_files altında sayar ve başka hiçbir yerde bildirmez. Yanıtı okumayan bir betik, çevirilerin bir bölümünü yazmadığını hiç öğrenemez. Bu alanı her koşuda denetleyin.

Arama sayısı bir toplam değildir

Arama yüzüncü eşleşmede durur ve total alanı toplanan sayıyı verir, var olan toplamı değil. truncated doğruysa daha fazlası vardır ve kaç tane olduğu bilinmez. Bu sayıyı bir ilerleme göstergesine bağlamayın.

Arama büyük küçük harfe duyarlıdır

Arama metni birebir karşılaştırılır: save aramak Save dizesini bulmaz. Bir metni tüm kurulumda değiştirmeye çalışıyorsanız aynı kelimeyi her yazımıyla ayrı ayrı arayın.

İki farklı anahtar, tek istek

Silme ucunda adres dil anahtarını, gövde ise çeviri anahtarını taşır. İkisi de key adını kullanır. Gövdeye dil anahtarını yazmak geçersiz çeviri anahtarı hatası verir; bunu dilin bulunamaması sanmayın.

Dışa aktarma bir tablo dosyası vermez

Panelin sunduğu tablo çıktısı ile uzaktan çekme bu uçlarda yoktur; dışa aktarma düz bir harita döndürür ve içe aktarma aynı haritayı bekler. İkisi birbirinin simetriğidir, yani bir dili dışa aktarıp başka bir kuruluma olduğu gibi yükleyebilirsiniz.

Faydalı oldu mu?

Geri bildiriminiz için teşekkürler!

Hâlâ Yardıma mı İhtiyacınız Var?

Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.