Ders 24 / 25
Sağdan Sola Diller
Yön değişiminin biçem katmanındaki karşılığı, mantıksal özelliklerin fiziksel özelliklere üstünlüğü, simge aynalamasının ölçüte bağlanması, iki yönlü metinde yalıtım ve klavye sözleşmelerinin akış yönüyle yazılması.
İçindekiler
Önceki dersin bütün örnekleri soldan sağa yazılan dillerdeydi. Katalog sağdan sola yazılan bir dile açıldığında değişen şey metnin yönünden ibaret değildir: kayıt kartının kenarlığı karşı tarafa geçer, süzgeç paneli ekranın öbür yanına taşınır, ileri oku ters çevrilir ama saat simgesi olduğu gibi kalır.
Bu ders yön değişimini bir çeviri sorunu olarak değil, bir mimari karar olarak ele alır. Kararın alındığı yer biçem katmanıdır ve kararın ölçüsü, kaç bildirimin yön değişiminden etkilendiğidir.
Fiziksel Değil Mantıksal Eksen
Sol ve sağ, ekranın sabit yönleridir. Başlangıç ve bitiş ise akışa bağlıdır: soldan sağa yazılan bir düzende başlangıç soldadır, sağdan sola yazılanda sağdadır. Bir bileşenin kenarlığı “solda” diye yazıldığında yön değiştiğinde de solda kalır ve düzen bozulur; aynı kenarlık “satır içi başlangıçta” diye yazıldığında akışı izler.
Aşağıdaki hesap katalog bileşenlerinden toplanan bildirimleri fiziksel ve mantıksal karşılıklarıyla listeler ve kaçının yön duyarlı olduğunu sayar.
// yon.mjs — yon duyarli duzen: mantiksal ozellikler, aynalanan ve aynalanmayan ogeler // 1. Fiziksel ozelliklerin mantiksal karsiliklari. const ESLEME = { "margin-left": "margin-inline-start", "margin-right": "margin-inline-end", "padding-left": "padding-inline-start", "padding-right": "padding-inline-end", "border-left": "border-inline-start", "text-align: left": "text-align: start", "left": "inset-inline-start", "width": "inline-size", "margin-top": "margin-block-start", "border-bottom": "border-block-end", }; // Katalog bilesenlerinden toplanmis bildirimler. const BILDIRIMLER = [ { bilesen: "kayit-karti", bildirim: "padding-left" }, { bilesen: "kayit-karti", bildirim: "border-left" }, { bilesen: "kayit-karti", bildirim: "margin-top" }, { bilesen: "suzgec-paneli", bildirim: "width" }, { bilesen: "suzgec-paneli", bildirim: "text-align: left" }, { bilesen: "odunc-dugmesi", bildirim: "margin-right" }, { bilesen: "bildirim-seridi", bildirim: "left" }, { bilesen: "bildirim-seridi", bildirim: "border-bottom" }, ]; const yatay = (b) => /left|right|width|inline/.test(b); console.log("bilesen fiziksel bildirim mantiksal karsilik yon duyarli"); let duyarli = 0; for (const b of BILDIRIMLER) { if (yatay(b.bildirim)) duyarli++; console.log( `${b.bilesen.padEnd(17)} ${b.bildirim.padEnd(21)} ${ESLEME[b.bildirim].padEnd(25)} ${yatay(b.bildirim) ? "evet" : "hayir"}` ); } console.log(`yon duyarli bildirim: ${duyarli} / ${BILDIRIMLER.length}`); console.log("dikey eksendeki bildirimler yon degisiminden etkilenmez; yine de mantiksal"); console.log("yazilmalari dikey yazim kiplerinde ayni kazanci verir."); // 2. Aynalanan ve aynalanmayan ogeler. const OGELER = [ { ad: "geri oku", aynalanir: true, gerekce: "yonu akisa bagli" }, { ad: "ileri oku", aynalanir: true, gerekce: "yonu akisa bagli" }, { ad: "kirinti ayiraci", aynalanir: true, gerekce: "hiyerarsi yonunu gosterir" }, { ad: "ilerleme cubugu", aynalanir: true, gerekce: "artis yonu akisi izler" }, { ad: "saat simgesi", aynalanir: false, gerekce: "gercek dunyada yonu sabit" }, { ad: "onay isareti", aynalanir: false, gerekce: "yon anlam tasimaz" }, { ad: "arama buyuteci", aynalanir: false, gerekce: "nesnenin kendi bicimi" }, { ad: "ses seviyesi simgesi", aynalanir: true, gerekce: "artis yonu akisi izler" }, { ad: "kalem/duzenle", aynalanir: false, gerekce: "nesnenin kendi bicimi" }, ]; console.log("\noge aynalanir gerekce"); for (const o of OGELER) console.log(` ${o.ad.padEnd(20)} ${(o.aynalanir ? "evet" : "hayir").padEnd(10)} ${o.gerekce}`); console.log(`aynalanan: ${OGELER.filter((o) => o.aynalanir).length} / ${OGELER.length}`); // 3. Sayilar ve gomulu Latin terimler kendi yonunu korur. // Iki yonlu metin: paragrafin temel yonu sagdan sola, icindeki sayi soldan saga yazilir. const SEGMENTLER = [ { metin: "raf kodu", yon: "rtl" }, { metin: "QB-141", yon: "ltr" }, { metin: "yil", yon: "rtl" }, { metin: "1998", yon: "ltr" }, ]; console.log("\nparagraf temel yonu: rtl"); console.log("segment yon yalitim gerekir mi"); for (const s of SEGMENTLER) { console.log(` ${s.metin.padEnd(11)} ${s.yon.padEnd(5)} ${s.yon === "ltr" ? "evet" : "hayir"}`); } console.log("yalitimsiz birlestirmede soldan saga segmentlerin komsu noktalama isaretleri"); console.log("yanlis tarafa kayar; bu yuzden gomulu segment yalitilir."); // 4. Bir dizginin gorunen sirasi: yalitimli ve yalitimsiz. // Basit model: rtl paragrafta segmentler ters sirada dizilir, ltr segment kendi icinde duz kalir. function gorunenSira(segmentler, temel) { const dizi = temel === "rtl" ? [...segmentler].reverse() : segmentler; return dizi.map((s) => s.metin).join(" "); } console.log("\nmantiksal sira : " + SEGMENTLER.map((s) => s.metin).join(" ")); console.log("gorunen sira : " + gorunenSira(SEGMENTLER, "rtl")); // 5. Kaydirma ve klavye: ok tuslarinin anlami degismez. const TUSLAR = [ { tus: "Sag ok", ltr: "sonraki oge", rtl: "onceki oge" }, { tus: "Sol ok", ltr: "onceki oge", rtl: "sonraki oge" }, { tus: "Home", ltr: "ilk oge", rtl: "ilk oge" }, { tus: "End", ltr: "son oge", rtl: "son oge" }, ]; console.log("\ntus soldan saga sagdan sola"); for (const t of TUSLAR) console.log(` ${t.tus.padEnd(9)} ${t.ltr.padEnd(18)} ${t.rtl}`); console.log("ok tuslari fiziksel yonu izler: sag ok her zaman ekranda saga gider,"); console.log("dolayisiyla sagdan sola duzende bir onceki ogeye ulasir."); // 6. Denetim: fiziksel bildirim kalan bilesenler yayina cikamaz. const kalan = BILDIRIMLER.filter((b) => yatay(b.bildirim)); const bilesenler = [...new Set(kalan.map((b) => b.bilesen))]; console.log(`\nyon duyarli fiziksel bildirim tasiyan bilesen: ${bilesenler.length}`); for (const b of bilesenler) { const sayi = kalan.filter((x) => x.bilesen === b).length; console.log(` ${b.padEnd(17)} ${sayi} bildirim`); }
bilesen fiziksel bildirim mantiksal karsilik yon duyarli kayit-karti padding-left padding-inline-start evet kayit-karti border-left border-inline-start evet kayit-karti margin-top margin-block-start hayir suzgec-paneli width inline-size evet suzgec-paneli text-align: left text-align: start evet odunc-dugmesi margin-right margin-inline-end evet bildirim-seridi left inset-inline-start evet bildirim-seridi border-bottom border-block-end hayir yon duyarli bildirim: 6 / 8 dikey eksendeki bildirimler yon degisiminden etkilenmez; yine de mantiksal yazilmalari dikey yazim kiplerinde ayni kazanci verir. oge aynalanir gerekce geri oku evet yonu akisa bagli ileri oku evet yonu akisa bagli kirinti ayiraci evet hiyerarsi yonunu gosterir ilerleme cubugu evet artis yonu akisi izler saat simgesi hayir gercek dunyada yonu sabit onay isareti hayir yon anlam tasimaz arama buyuteci hayir nesnenin kendi bicimi ses seviyesi simgesi evet artis yonu akisi izler kalem/duzenle hayir nesnenin kendi bicimi aynalanan: 5 / 9 paragraf temel yonu: rtl segment yon yalitim gerekir mi raf kodu rtl hayir QB-141 ltr evet yil rtl hayir 1998 ltr evet yalitimsiz birlestirmede soldan saga segmentlerin komsu noktalama isaretleri yanlis tarafa kayar; bu yuzden gomulu segment yalitilir. mantiksal sira : raf kodu QB-141 yil 1998 gorunen sira : 1998 yil QB-141 raf kodu tus soldan saga sagdan sola Sag ok sonraki oge onceki oge Sol ok onceki oge sonraki oge Home ilk oge ilk oge End son oge son oge ok tuslari fiziksel yonu izler: sag ok her zaman ekranda saga gider, dolayisiyla sagdan sola duzende bir onceki ogeye ulasir. yon duyarli fiziksel bildirim tasiyan bilesen: 4 kayit-karti 2 bildirim suzgec-paneli 2 bildirim odunc-dugmesi 1 bildirim bildirim-seridi 1 bildirim
Çıktının ilk bölümü sekiz bildirimin altısının yön duyarlı olduğunu gösteriyor. Dikey eksendeki iki bildirim yön değişiminden etkilenmez; yine de mantıksal yazılmaları, dikey yazım kiplerinde aynı kazancı verir. Kural basittir: yatay eksene dokunan her bildirim mantıksal yazılır ve bu, çeviri başlamadan önce alınması gereken bir karardır.
Son bölüm aynı veriyi bir denetim çıktısına çeviriyor: dört bileşen hâlâ fiziksel bildirim taşıyor. Bu liste, bir dilin yayına alınmasından önce kapatılması gereken iş kalemidir ve Belirteçler konusundaki denetimlerle aynı biçimde otomatikleştirilir.
Her Simge Aynalanmaz
İkinci bölüm simgeleri ayırıyor. Aynalanma ölçütü tek bir sorudur: simgenin yönü akışa mı bağlı, yoksa nesnenin kendi biçimi mi? İleri oku akışa bağlıdır ve aynalanır; kırıntı ayıracı hiyerarşinin yönünü gösterir ve aynalanır; ilerleme çubuğu artış yönünü akıştan alır ve aynalanır.
Saat simgesi aynalanmaz, çünkü saatin yönü gerçek dünyada sabittir. Onay işareti aynalanmaz, çünkü yönü anlam taşımaz. Büyüteç ve kalem aynalanmaz, çünkü bunlar nesnenin kendi biçimidir. Dokuz simgenin beşi aynalanıyor; ayrım simgenin ne gösterdiğine bakılarak yapılır, toplu bir dönüşümle değil. Bütün simgeleri aynalayan bir kural, saati ters çevirir.
Sayılar ve Gömülü Terimler Kendi Yönünü Korur
Üçüncü ve dördüncü bölüm iki yönlü metni ele alıyor. Sağdan sola bir paragrafın içindeki sayılar ve Latin harfli terimler — raf kodu, ISBN, ölçüm birimi — kendi yönlerinde yazılır. Paragrafın temel yönü ile segmentin yönü farklı olduğunda, aradaki noktalama işaretlerinin hangi tarafa düşeceği belirsizleşir.
Çözüm gömülü segmenti yalıtmaktır: segment kendi yönünü bildirir ve komşularının yönünü etkilemez. Dördüncü bölümdeki karşılaştırma mantıksal sıra ile görünen sıranın aynı olmadığını gösteriyor — metnin bellekteki sırası ile ekrandaki sırası farklıdır ve bu fark kopyalama, arama ve sıralama işlemlerinde de kendini gösterir.
Klavye Fiziksel Yönü İzler
Beşinci bölüm sık atlanan bir ayrımı yazıyor. Ok tuşları fiziksel yönü izler: sağ ok her zaman ekranda sağa gider. Sağdan sola bir listede ekranda sağa gitmek, listenin bir önceki ögesine gitmek demektir.
Bu, Sekmeler ve Menüler derslerindeki klavye sözleşmelerinin sağdan sola düzende yeniden yazılması gerektiği anlamına gelir: “sağ ok bir sonrakine geçer” cümlesi yön bağımlıdır. Doğru yazım akışa göredir — “akış yönünde bir sonrakine geçer”. Başlangıç ve bitiş tuşları ise yön değişiminden etkilenmez, çünkü ilk ve son öge akışta tanımlıdır.
Ölçülebilir Kısıtlar
- Yatay eksene dokunan her bildirim mantıksal özelliklerle yazılır; denetim fiziksel bildirim kalan bileşenleri raporlar.
- Simge aynalaması tek tek karara bağlanır; toplu aynalama saat, onay ve nesne biçimli simgeleri bozar.
- Gömülü ters yönlü segmentler yalıtılır; yalıtımsız birleştirme noktalama konumunu belirsiz bırakır.
- Ok tuşu sözleşmeleri fiziksel yön yerine akış yönüyle yazılır.
- Metin uzaması kuralı sağdan sola dillerde de geçerlidir; iki kısıt birlikte denetlenir.
Sık Yapılan Hata
En sık hata, yön desteğini bir çeviri işi sanıp biçem katmanına hiç dokunmamaktır; bu durumda metin çevrilir ama düzen soldan sağa kalır ve arayüz okunamaz hâle gelir. İkincisi, bütün simgeleri toplu aynalamaktır. Üçüncüsü, yön değişimini yalnız bir kök özniteliğiyle bildirip bileşenlerdeki fiziksel bildirimleri bırakmaktır: bildirim düzeyinde düzeltme yapılmadan kök bildirimi tek başına yeterli değildir.
Özet
- Sol ve sağ ekranın sabit yönleridir; başlangıç ve bitiş akışa bağlıdır. Yatay eksendeki her bildirim mantıksal yazılır — modeldeki sekiz bildirimin altısı yön duyarlı.
- Simge aynalaması ölçüte bağlanır: yönü akışa bağlı olan aynalanır, nesnenin kendi biçimi olan aynalanmaz; dokuz simgenin beşi aynalanıyor.
- Sağdan sola paragrafta sayılar ve Latin harfli terimler kendi yönünü korur ve yalıtılır; metnin mantıksal sırası ile görünen sırası aynı değildir.
- Ok tuşları fiziksel yönü izler; klavye sözleşmeleri bu yüzden akış yönüyle yazılır.
- Denetim, fiziksel bildirim taşıyan bileşenleri listeler; bu liste bir dilin yayına alınmasından önce kapatılır.
Sonraki Adım
Yön ve biçim kararları arayüzün kabını dile uyarladı. Geriye kabın içine giren veri kalıyor. Kullanıcıdan ad, adres ve kimlik bilgisi isteyen her form bir varsayım taşır: adın iki parçadan oluştuğu, adresin bir posta koduyla tamamlandığı, kimliğin belli bir uzunlukta olduğu. Bu varsayımların hepsi bir yerde kırılır. Kursun son dersi bu alanları ele alır ve varsayımları kurala çevirir.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.