---
title: 'Yerelleştirme Gereksinimleri'
source: 'https://academia.sh/tr/kurslar/erisilebilir-kaliplar/yerellestirme-gereksinimleri'
course: 'Erişilebilir Bileşen Kalıpları'
language: tr
updated: '2026-08-17T18:09:34+00:00'
license: 'CC BY-SA 4.0'
---

# Yerelleştirme Gereksinimleri

Biçimlemenin yerel ayardan türetilmesi, çoğul biçimi sayısının dile göre değişmesi, kısa dizgilerin orantılı olarak daha çok uzaması, dizgi birleştirmenin sözcük sırasını gömmesi ve çeviri kapsamının ölçülmesi.

Önceki iki ders arayüz metnini tek bir dilde ele aldı: rehber kuralları ve hata iletisinin
yapısı. Katalog başka bir dile açıldığında metnin kendisi kadar çevresi de değişir. Aynı
düğme yazısı bazı dillerde iki katına çıkar ve kutusuna sığmaz; tarih, sayı ve yüzde
biçimleri değişir; "kayıt bulundu" gibi bir cümlenin sözcük sırası dilden dile aynı kalmaz.

Bu ders yerelleştirmeyi çeviri işi olarak değil, **arayüzün taşıması gereken bir esneklik**
olarak ele alır. Esnekliğin ölçüleri vardır ve hepsi hesaplanabilir.

## Biçimleme Metnin Parçası Değildir

Tarih, sayı, yüzde ve para birimi arayüz metnine yazılmaz; yerel ayardan türetilir. Aşağıdaki
hesap aynı değerin altı yerel ayardaki karşılığını üretir ve çoğul kurallarını sayar.

```js
// yerel.mjs — metin uzamasi, bicimleme ve cogul kurallarinin yerel ayardan turetilmesi

const DILLER = ["tr", "en", "de", "fr", "ru", "ja"];

// 1. Bicimleme: ayni deger, alti yerel ayar.
const TARIH = new Date(Date.UTC(2026, 7, 12, 9, 30));
const SAYI = 1234567.89;
console.log("yerel  tarih (uzun)            sayi              yuzde");
for (const d of DILLER) {
  const tarih = new Intl.DateTimeFormat(d, { dateStyle: "long", timeZone: "UTC" }).format(TARIH);
  const sayi = new Intl.NumberFormat(d).format(SAYI);
  const yuzde = new Intl.NumberFormat(d, { style: "percent", maximumFractionDigits: 1 }).format(0.427);
  console.log(`${d.padEnd(6)} ${tarih.padEnd(24)} ${sayi.padEnd(17)} ${yuzde}`);
}

// 2. Cogul kurallari: kac ayri bicim gerekiyor?
console.log("\nyerel  gereken cogul bicimi  1        2        5        11       0.5");
for (const d of DILLER) {
  const kural = new Intl.PluralRules(d);
  const bicimler = new Set([0, 1, 2, 3, 5, 11, 21, 100].map((n) => kural.select(n)));
  const ornek = [1, 2, 5, 11, 0.5].map((n) => kural.select(n).padEnd(8)).join(" ");
  console.log(`${d.padEnd(6)} ${String(bicimler.size).padStart(18)}  ${ornek}`);
}

// 3. Liste birlestirme: dizgi toplama neden kirilir?
console.log("\nyerel  liste birlestirme (uc oge)");
for (const d of DILLER) {
  const liste = new Intl.ListFormat(d, { style: "long", type: "conjunction" })
    .format(["gökbilim", "meteoroloji", "arşivcilik"]);
  console.log(`${d.padEnd(6)} ${liste}`);
}

// 4. Metin uzamasi: kisa dizgiler orantili olarak daha cok uzar.
// Olcum yerine kural: uzunluga gore beklenen uzama pay araligi.
const UZAMA = [
  { altSinir: 1,  ustSinir: 10,  pay: 2.0 },
  { altSinir: 11, ustSinir: 20,  pay: 1.8 },
  { altSinir: 21, ustSinir: 30,  pay: 1.6 },
  { altSinir: 31, ustSinir: 50,  pay: 1.4 },
  { altSinir: 51, ustSinir: 70,  pay: 1.3 },
  { altSinir: 71, ustSinir: 999, pay: 1.15 },
];
const payBul = (n) => UZAMA.find((u) => n >= u.altSinir && n <= u.ustSinir).pay;

const ARAYUZ = [
  { anahtar: "dugme.odunc", metin: "Ödünç al", kutu: 120 },
  { anahtar: "dugme.iptal", metin: "İptal", kutu: 90 },
  { anahtar: "etiket.raf", metin: "Raf kodu", kutu: 110 },
  { anahtar: "baslik.sonuc", metin: "Arama sonuçları", kutu: 220 },
  { anahtar: "yardim.isbn", metin: "ISBN 13 hane olmalı; çizgi kodun altında yazar.", kutu: 420 },
];
const KARAKTER_GENISLIGI = 8; // px, gövde metni için ortalama
console.log("\nanahtar         karakter  pay   en genis hal (px)  kutu  sigar mi");
for (const a of ARAYUZ) {
  const pay = payBul(a.metin.length);
  const genislik = Math.ceil(a.metin.length * pay * KARAKTER_GENISLIGI);
  console.log(
    `${a.anahtar.padEnd(15)} ${String(a.metin.length).padStart(8)} ${pay.toFixed(2).padStart(5)} ` +
      `${String(genislik).padStart(17)} ${String(a.kutu).padStart(5)}  ${genislik <= a.kutu ? "evet" : "HAYIR"}`
  );
}

// 5. Dizgi birlestirme tuzagi: parcali cumle ile tam cumle.
const parcali = (n) => "Toplam " + n + " kayıt bulundu";       // parcalar ayri cevrilir
const tam = (n, dil) =>
  new Intl.NumberFormat(dil).format(n) +
  ({ tr: " kayıt bulundu", en: " records found" }[dil] ?? " kayıt bulundu");
console.log("\nparcali kurulum : " + parcali(1234567));
console.log("tam kurulum (tr): " + tam(1234567, "tr"));
console.log("tam kurulum (en): " + tam(1234567, "en"));
console.log("  -> parcali kurulumda sayi bicimlenmez ve sozcuk sirasi sabitlenir.");

// 6. Ceviri kapsami: eksik anahtar denetimi.
const KATALOG = {
  tr: { "dugme.odunc": "Ödünç al", "dugme.iptal": "İptal", "etiket.raf": "Raf kodu", "baslik.sonuc": "Arama sonuçları", "yardim.isbn": "ISBN 13 hane olmalı." },
  en: { "dugme.odunc": "Borrow", "dugme.iptal": "Cancel", "etiket.raf": "Shelf mark", "baslik.sonuc": "Search results" },
  de: { "dugme.odunc": "Ausleihen", "dugme.iptal": "Abbrechen" },
};
const anahtarlar = Object.keys(KATALOG.tr);
console.log("\ndil  ceviri  kapsam  eksik anahtarlar");
for (const [dil, tablo] of Object.entries(KATALOG)) {
  const eksik = anahtarlar.filter((a) => !(a in tablo));
  console.log(
    `${dil.padEnd(4)} ${String(Object.keys(tablo).length).padStart(6)}  ` +
      `%${String(Math.round((100 * (anahtarlar.length - eksik.length)) / anahtarlar.length)).padStart(4)}  ${eksik.join(", ") || "-"}`
  );
}
```

```
yerel  tarih (uzun)            sayi              yuzde
tr     12 Ağustos 2026          1.234.567,89      %42,7
en     August 12, 2026          1,234,567.89      42.7%
de     12. August 2026          1.234.567,89      42,7 %
fr     12 août 2026             1 234 567,89      42,7 %
ru     12 августа 2026 г.       1 234 567,89      42,7 %
ja     2026年8月12日               1,234,567.89      42.7%

yerel  gereken cogul bicimi  1        2        5        11       0.5
tr                      2  one      other    other    other    other   
en                      2  one      other    other    other    other   
de                      2  one      other    other    other    other   
fr                      2  one      other    other    other    one     
ru                      3  one      few      many     many     other   
ja                      1  other    other    other    other    other   

yerel  liste birlestirme (uc oge)
tr     gökbilim, meteoroloji ve arşivcilik
en     gökbilim, meteoroloji, and arşivcilik
de     gökbilim, meteoroloji und arşivcilik
fr     gökbilim, meteoroloji et arşivcilik
ru     gökbilim, meteoroloji и arşivcilik
ja     gökbilim、meteoroloji、arşivcilik

anahtar         karakter  pay   en genis hal (px)  kutu  sigar mi
dugme.odunc            8  2.00               128   120  HAYIR
dugme.iptal            5  2.00                80    90  evet
etiket.raf             8  2.00               128   110  HAYIR
baslik.sonuc          15  1.80               216   220  evet
yardim.isbn           47  1.40               527   420  HAYIR

parcali kurulum : Toplam 1234567 kayıt bulundu
tam kurulum (tr): 1.234.567 kayıt bulundu
tam kurulum (en): 1,234,567 records found
  -> parcali kurulumda sayi bicimlenmez ve sozcuk sirasi sabitlenir.

dil  ceviri  kapsam  eksik anahtarlar
tr        5  % 100  -
en        4  %  80  yardim.isbn
de        2  %  40  etiket.raf, baslik.sonuc, yardim.isbn
```

Çıktının ilk bölümü tek bir tarihin ve tek bir sayının altı ayrı görünümünü veriyor:
ayıraçlar değişiyor, ay adının yeri değişiyor, yüzde işareti kimi dilde önde kimi dilde
arkada duruyor ve arada boşluk olup olmadığı bile dile bağlı. Bu farkların hiçbiri
tasarımcının kararı değildir; kararın tamamı yerel ayara aittir.

Kural şudur: biçimleme çalışma zamanında yapılır. Metin kataloğuna "12 Ağustos 2026" yazmak,
o dizgiyi bir dilde dondurmaktır; katalog yalnız **kalıbı** taşır, değeri biçimleyici üretir.

## Çoğul İki Biçimden İbaret Değildir

İkinci bölüm sık yapılan bir varsayımı yıkıyor. Türkçe, İngilizce, Almanca ve Fransızca iki
çoğul biçimiyle yetinirken Rusça üç ayrı biçim gerektiriyor; Japoncada ise sayıya göre biçim
değişmiyor. Ondalık sayılar da ayrı davranıyor: Fransızcada 0.5 tekil biçimi alıyor,
Türkçede almıyor.

Bunun sonucu doğrudandır: "1 kayıt" ve "N kayıt" biçiminde iki dallı bir kurulum, üç biçim
gerektiren dilde yanlış metin üretir. Doğru kurulum çoğul biçimini yerel ayardan sorar ve
her biçim için ayrı bir metin tutar. Aynı şey liste birleştirmede de geçerlidir: üçüncü
bölümdeki çıktı, virgül ve bağlacın dilden dile değiştiğini — Japoncada bağlacın hiç
kullanılmadığını — gösteriyor.

## Metin Uzaması Bir Düzen Kısıtıdır

Dördüncü bölüm uzamayı ölçüyor. Kural şudur: kısa dizgiler orantılı olarak daha çok uzar.
Sekiz karakterlik bir düğme yazısı iki katına çıkabilirken elli karakterlik bir yardım metni
yaklaşık yüzde kırk uzar. Nedeni, kısa metinlerin çoğu dilde tek bir sözcükle
karşılanamamasıdır.

Hesap üç bileşenin en geniş hâlinin kutusuna sığmadığını gösteriyor. Bu bulgu tasarım
aşamasına aittir: kutuların sabit genişlikte verilmesi, arayüzü tek dile bağlar. Çözüm iç
boşluğa göre büyüyen kutular, satır kaymasına izin veren düzen ve — Düzen ve Aralık
konusundaki kuralla — genişliğin içerikten türetilmesidir.

Ölçünün kendisi bir tahmindir ve tahmin olduğu söylenmelidir; gerçek uzama çeviri
yapıldıktan sonra ölçülür. Tahminin işlevi, çeviri gelmeden önce **hangi bileşenlerin
riskli** olduğunu göstermektir.

## Dizgi Birleştirme Çeviriyi Bozar

Beşinci bölüm parçalı kurulumla tam kurulumu karşılaştırıyor. Parçalı kurulumda sayı ham
hâliyle yapıştırılır ve sözcük sırası koda gömülür: "Toplam " + n + " kayıt bulundu".
Bu yapı iki şeyi birden kaybeder — sayı biçimlenmez ve çevirmen sözcük sırasını
değiştiremez.

Doğru kurulum tek bir kalıp tutar ve değerleri adlandırılmış yuvalarla yerleştirir. Böylece
çevirmen yuvaları kendi dilinin sırasına göre taşıyabilir, sayı da yerel ayara göre
biçimlenir. Bu, Uluslararasılaştırma dersinde kurulan kuralın arayüz metni tarafındaki
karşılığıdır.

## Kapsam Ölçülür

Son bölüm çeviri kapsamını sayıyor. Eksik anahtar bir kusur değil, bir **durum**dur: çeviri
her zaman koddan geride gelir. Önemli olan eksikliğin görünür olması ve bir yedek davranışın
tanımlanmasıdır — eksik anahtar için hangi dilin metni gösterilecek ve arayüzde bu durum
nasıl işaretlenecek.

Kapsam ölçümü aynı zamanda bir yayın ölçütüdür: bir dil, kapsamı belli bir eşiğin altındayken
kullanıcıya sunulmaz. Eşiğin sayısı ürüne göre değişir; ölçümün varlığı değişmez.

## Özet

- Tarih, sayı ve yüzde biçimleri metnin parçası değildir; çalışma zamanında yerel ayardan
  türetilir — aynı değer altı yerel ayarda altı ayrı görünüm alır.
- Çoğul biçimi sayısı dile bağlıdır: modelde bir dil üç biçim gerektiriyor, bir dil hiç
  ayırt etmiyor; iki dallı kurulum bu dillerde yanlış metin üretir.
- Kısa dizgiler orantılı olarak daha çok uzar; sabit genişlikli kutular arayüzü tek dile
  bağlar ve modelde üç bileşen en geniş hâlinde kutusuna sığmıyor.
- Dizgi birleştirme sözcük sırasını koda gömer ve sayıyı biçimlenmemiş bırakır; kalıp ve
  adlandırılmış yuva bu iki sorunu birden çözer.
- Çeviri kapsamı ölçülür ve eksik anahtar için yedek davranış tanımlanır; kapsam bir yayın
  ölçütüdür.

## Sonraki Adım

Bu dersin bütün örnekleri soldan sağa yazılan dillerdeydi. Arayüz sağdan sola yazılan bir
dile açıldığında değişen şey yalnız metnin yönü değildir: düzenin kendisi aynalanır, simge
yönleri anlam değiştirir, sayılar ve gömülü Latin harfli terimler kendi yönlerini korur.
Sonraki ders yön duyarlı düzen kararlarını ele alır ve fiziksel özelliklerle mantıksal
özellikler arasındaki farkın neden bir çeviri sorunu değil bir mimari karar olduğunu
hesapla gösterir.
