Ders 21 / 25
Arayüz Metni Rehberi
Arayüz metni rehberinin denetlenebilir kurallara çevrilmesi; terim defteri, ton kuralları, sınıf başına uzunluk sınırı ve görünen metnin erişilebilir adın içinde bulunması ölçütü.
İçindekiler
Önceki konudaki yedi kalıbın hepsinde son karar metne düştü. Bildirimin süresi metnin kelime sayısından hesaplandı, hata iletisinin yeterliliği kurtarma yolunu yazıp yazmamasına bağlandı, rozetin ikinci kanalı çoğu zaman tek bir sözcük oldu.
Mikro Metin dersi arayüz metnini bir düzen kısıtı olarak ölçmüştü: etiketin genişliği, kırpmanın ürettiği çakışma, hata iletisinin satır sayısı. Bu ders aynı metni bir sistem olarak ele alır. Sorusu şudur: bir arayüz metni rehberi, kişisel üslup tercihlerinin listesi olmaktan çıkıp denetlenebilir kurallara nasıl çevrilir?
Rehber Neyi Çözer, Ne Zaman İşe Yaramaz
Arayüz metni rehberi, aynı arayüzde çalışan farklı kişilerin aynı sözcükleri seçmesini sağlar. Çözdüğü sorun tutarsızlıktır: bir ekranda “ödünç alma”, ötekinde “emanet”, üçüncüsünde “çıkış” yazıldığında kullanıcı üç ayrı işlem olduğunu sanır.
Rehber üç durumda işe yaramaz:
- Örnek yoksa. “Kısa ve net yaz” bir kural değildir; sınanamaz.
- Karşı örnek yoksa. Neyin yanlış olduğu yazılmadığında kural yorum bırakır.
- Denetlenmiyorsa. Elle okunan bir rehber, kataloğun büyümesiyle uygulanmaz olur.
Bu üç eksik aynı çözüme işaret eder: kurallar makine tarafından sınanabilir biçimde yazılmalıdır. Rehberin gövdesi düzyazı olabilir, ama her kuralın bir denetim karşılığı bulunmalıdır.
Dört Kural Ailesi
Terim defteri. Her kavram için bir sözcük seçilir, eşanlamlıları yasaklanır. Defter bir sözlük değildir; bir karar kaydıdır ve nedeni de yazılır. “Kayıt” seçildiyse, “materyal” ve “eser” yasaktır.
Ton. Üç kural yeter: eylem etiketleri kısa emir kipinde yazılır, sistem iletileri kullanıcıyı suçlamaz, vurgu için büyük harf ve ünlem kullanılmaz. Suçlamama kuralının gerekçesi nezaket değil doğruluktur — “yanlış girdiniz” ifadesi, alanın beklediği biçimi söylemediği için kullanıcıya hiçbir bilgi vermez.
Uzunluk. Sınır metin sınıfına göre değişir: eylem etiketi en çok üç kelime, boş durum başlığı altı, yardım metni on dört, ileti yirmi. Sayılar keyfîdir ve o arayüz için seçilir; işlevleri denetlenebilir olmalarıdır.
Görünen metin ile ad. 2.5.3 Etikette Ad ölçütü, görünen etiketin erişilebilir adın içinde bulunmasını ister. Bu, bir yazım kuralı gibi görünmez ama doğrudan metin kararıdır: ekranda “Filtreyi uygula” yazıp adı “Uygula” bırakmak ölçütü kaldırır.
Rehberin Denetimi
Aşağıdaki betik on dört girdilik bir arayüz metni kataloğunu dört kural ailesiyle denetliyor ve son bölümde her kavramın kaç ayrı sözcükle anıldığını sayıyor.
// metin-denetimi.mjs — arayuz metni rehberinin dort kuralinin catalog uzerinde denetimi // Arayuz metni katalogu: her girdinin sinifi, gorunen metni ve (denetimlerde) erisilebilir adi. const KATALOG = [ { anahtar: "dugme.odunc", sinif: "eylem", metin: "Ödünç al", ad: "Ödünç al" }, { anahtar: "dugme.rezerve", sinif: "eylem", metin: "Rezerve et", ad: "Rezerve et" }, { anahtar: "dugme.emanet", sinif: "eylem", metin: "Emanete çıkar", ad: "Emanete çıkar" }, { anahtar: "dugme.suzgec", sinif: "eylem", metin: "Filtreyi uygula", ad: "Uygula" }, { anahtar: "dugme.temizle", sinif: "eylem", metin: "Süzgeçleri temizle", ad: "Süzgeçleri temizle" }, { anahtar: "dugme.disa", sinif: "eylem", metin: "Seçili kayıtları dışa aktar", ad: "Seçili kayıtları dışa aktar" }, { anahtar: "baslik.bos", sinif: "baslik", metin: "Süzgeçlere uyan kayıt yok", ad: null }, { anahtar: "baslik.ilk", sinif: "baslik", metin: "KATALOGDA ARAMA YAPIN", ad: null }, { anahtar: "hata.isbn", sinif: "ileti", metin: "ISBN yanlış girdiniz!", ad: null }, { anahtar: "hata.tarih", sinif: "ileti", metin: "İade tarihi bugünden sonra olmalı. Takvimden bir gün seçin.", ad: null }, { anahtar: "yardim.uye", sinif: "yardim", metin: "Üye numaranız kartınızın arkasında, barkodun altında yazar; boşluksuz yazın.", ad: null }, { anahtar: "yardim.materyal", sinif: "yardim", metin: "Materyal türünü seçerek sonuçları daraltabilirsiniz.", ad: null }, { anahtar: "durum.sonuc", sinif: "ileti", metin: "128 kayıt listeleniyor", ad: null }, { anahtar: "dugme.kaldir", sinif: "eylem", metin: "Kaldır", ad: "Tür etiketini kaldır" }, ]; // --- Kural 1: terim defteri -------------------------------------------------- // Her kavram icin tek bir sozcuk; otekiler kurs boyunca kullanilmaz. const TERIM = { "ödünç alma": ["emanet", "kiralama", "çıkış yapma"], "kayıt": ["materyal", "eser", "ürün"], "süzgeç": ["filtre"], "üye": ["müşteri", "abone"], }; // --- Kural 2: ton ------------------------------------------------------------ const SUCLAYAN = ["yanlış girdiniz", "hatalı girdiniz", "unuttunuz", "yapmalısınız", "girmediniz"]; const KISALTMA = new Set(["ISBN", "QR"]); // --- Kural 3: uzunluk -------------------------------------------------------- const SINIR = { eylem: 3, baslik: 6, ileti: 20, yardim: 14 }; const kelimeler = (m) => m.trim().split(/\s+/); const kucuk = (m) => m.toLocaleLowerCase("tr"); // Turkce ekli dillerde alt dizgi aramasi yanlis eslesir ("turunu" icinde "urun" gecer): // eslesme sozcuk basindan baslamali, sonu serbest kalmali. const gecer = (metin, sozcuk) => new RegExp(`(^|[^\\p{L}])${kucuk(sozcuk)}`, "u").test(kucuk(metin)); const bulgular = []; for (const g of KATALOG) { // 1. terim for (const [dogru, yasak] of Object.entries(TERIM)) for (const y of yasak) if (gecer(g.metin, y)) bulgular.push({ anahtar: g.anahtar, kural: "terim", ayrinti: `"${y}" yerine "${dogru}"` }); // 2. ton if (g.metin.includes("!")) bulgular.push({ anahtar: g.anahtar, kural: "ton", ayrinti: "ünlem" }); for (const s of SUCLAYAN) if (gecer(g.metin, s)) bulgular.push({ anahtar: g.anahtar, kural: "ton", ayrinti: `suçlayan kalıp: "${s}"` }); for (const k of kelimeler(g.metin)) { const sade = k.replace(/[^\p{L}]/gu, ""); if (sade.length >= 4 && sade === sade.toLocaleUpperCase("tr") && !KISALTMA.has(sade)) bulgular.push({ anahtar: g.anahtar, kural: "ton", ayrinti: `büyük harfle yazım: "${sade}"` }); } // 3. uzunluk const n = kelimeler(g.metin).length; if (n > SINIR[g.sinif]) bulgular.push({ anahtar: g.anahtar, kural: "uzunluk", ayrinti: `${n} kelime, sınır ${SINIR[g.sinif]}` }); // 4. 2.5.3 — gorunen metin adin icinde olmali if (g.ad !== null && !kucuk(g.ad).includes(kucuk(g.metin))) bulgular.push({ anahtar: g.anahtar, kural: "2.5.3", ayrinti: `görünen "${g.metin}", ad "${g.ad}"` }); } console.log(`katalog: ${KATALOG.length} girdi, bulgu: ${bulgular.length}\n`); console.log("anahtar kural ayrinti"); for (const b of bulgular) console.log(`${b.anahtar.padEnd(20)}${b.kural.padEnd(10)}${b.ayrinti}`); const sayim = {}; for (const b of bulgular) sayim[b.kural] = (sayim[b.kural] ?? 0) + 1; console.log("\nkural bazinda: " + Object.entries(sayim).map(([k, v]) => `${k}=${v}`).join(", ")); // --- Ayni kavramin kac ayri sozcukle anildigi ------------------------------- console.log("\nkavram kullanilan sozcukler"); for (const [dogru, yasak] of Object.entries(TERIM)) { const gorulen = new Set(); for (const g of KATALOG) { if (gecer(g.metin, dogru.split(" ")[0])) gorulen.add(dogru); for (const y of yasak) if (gecer(g.metin, y)) gorulen.add(y); } console.log(`${dogru.padEnd(14)}${gorulen.size ? [...gorulen].join(", ") : "—"} (${gorulen.size} biçim)`); }
katalog: 14 girdi, bulgu: 10 anahtar kural ayrinti dugme.emanet terim "emanet" yerine "ödünç alma" dugme.suzgec terim "filtre" yerine "süzgeç" dugme.suzgec 2.5.3 görünen "Filtreyi uygula", ad "Uygula" dugme.disa uzunluk 4 kelime, sınır 3 baslik.ilk ton büyük harfle yazım: "KATALOGDA" baslik.ilk ton büyük harfle yazım: "ARAMA" baslik.ilk ton büyük harfle yazım: "YAPIN" hata.isbn ton ünlem hata.isbn ton suçlayan kalıp: "yanlış girdiniz" yardim.materyal terim "materyal" yerine "kayıt" kural bazinda: terim=3, 2.5.3=1, uzunluk=1, ton=5 kavram kullanilan sozcukler ödünç alma ödünç alma, emanet (2 biçim) kayıt kayıt, materyal (2 biçim) süzgeç filtre, süzgeç (2 biçim) üye üye (1 biçim)
On dört girdilik küçük bir katalogda on bulgu çıkıyor. Bulgular dört ayrı türden ve her biri farklı bir maliyet üretir.
Terim kayması üç girdide görünüyor. Son tablo bunun toplam etkisini veriyor: dört kavramın üçü arayüzde iki ayrı sözcükle anılıyor. Kullanıcı için bu, üç kavramın altı kavram gibi görünmesi demektir. Terim kayması aynı zamanda bir çeviri maliyetidir; her eşanlamlı, çeviri kataloğunda ayrı bir anahtar ve ayrı bir karar üretir.
Büyük harfle yazım üç bulgu üretiyor ve tek bir başlıktan geliyor. Büyük harf yalnız bir üslup kararı değildir: harflerin dış hatları benzeştiği için okuma yavaşlar, ve bazı okuma araçları büyük harfli sözcükleri kısaltma sanıp harf harf okuyabilir. Vurgu, biçim kararlarıyla verilir — ağırlık, boyut, konum.
Suçlayan kalıp ve ünlem aynı girdide. “ISBN yanlış girdiniz!” iletisi kullanıcıya neyin
yanlış olduğunu söylemez, ne yapacağını söylemez ve suçu ona yükler. Aynı kataloğun
hata.tarih girdisi karşı örnektir: “İade tarihi bugünden sonra olmalı. Takvimden bir gün
seçin.” Kuralı ve çözümü birlikte verir, hiçbir denetime takılmaz.
Uzunluk sınırı tek girdide aşılıyor. “Seçili kayıtları dışa aktar” dört kelimedir ve eylem sınırını aşar; Mikro Metin dersindeki genişlik hesabı bu sınırın nereden geldiğini gösterir.
2.5.3 bulgusu en sessiz kusurdur. Ekranda “Filtreyi uygula” yazan düğmenin adı “Uygula”; görsel olarak hiçbir sorun görünmez. Sesle denetim kullanan biri ekrandaki sözcüğü söylediğinde düğme çağrılmaz. Denetimin bunu yakalaması, kuralın makine tarafından sınanabilir yazılmasının doğrudan kazancıdır.
Betikteki gecer işlevi ayrıca Türkçeye özgü bir tuzağı çözüyor. Alt dizgi araması
“türünü” sözcüğü içinde “ürün” bulur ve yanlış bir bulgu üretir. Eklerin sona geldiği bir
dilde eşleşme sözcük başından aranır, sonu serbest bırakılır; böylece “materyal” ile
“materyalin” birlikte yakalanır, “türünü” yakalanmaz.
Rehbere Girmesi Gereken Kararlar
Denetim, kuralı uygular ama kuralı seçmez. Rehberin düzyazı bölümünde şu kararlar gerekçeleriyle yazılır.
Kime seslenilir. Arayüz metni kullanıcının diliyle yazılır, sistemin diliyle değil. “Kayıt oluştur” veri tabanının işidir; “Kitap ekle” kullanıcının işidir.
Kim özne olur. Sistem iletilerinde özne sistemdir: “İstek gönderilemedi”. Kullanıcının eylemini anlatan yerlerde özne kullanıcıdır: “Ödünç aldığınız kayıtlar”. Karışması, sorumluluğun yanlış yere düşmesine yol açar.
Sayı ve tarih nasıl yazılır. Bu karar bir sonraki derslerin konusudur ve rehberde tek bir satırla belirtilir: sayı ve tarih elle biçimlenmez.
Kısaltma ne zaman kullanılır. Kısaltma yalnız kullanıcı sözlüğünde bulunanlar için serbesttir; arayüz içi kısaltmalar yasaktır.
Sık Yapılan Hata ve Nasıl Anlaşılır
Rehber var, denetim yok. Anlaşılması: kataloğu yasaklı sözcük listesiyle taramak; bulgu çıkıyorsa rehber uygulanmıyordur.
Aynı anahtarın iki yerde farklı metni. Anlaşılması: kavram başına kullanılan sözcük sayısını çıkarmak; birden büyük her sayı bir karardır.
Görünen metin adın içinde değil. Anlaşılması: denetimin dördüncü kuralını çalıştırmak; görsel incelemeyle yakalanamaz.
Metin koda gömülü. Denetlenecek bir katalog yoksa hiçbir kural uygulanamaz. Anlaşılması: metnin koddan ayrılıp ayrılmadığına bakmak; Uygulama Mimarisi kursundaki çeviri kataloğu kurulumu bu denetimin önkoşuludur.
Özet
- Arayüz metni rehberi, ancak her kuralın makine tarafından sınanabilir bir karşılığı varsa uygulanır; örneksiz ve karşı örneksiz kurallar yorum bırakır.
- Dört kural ailesi yeterlidir: terim defteri, ton, sınıf başına uzunluk sınırı ve görünen metnin erişilebilir adın içinde bulunması.
- Terim kayması yalnız tutarsızlık değil, çeviri kataloğunda çoğalan anahtar demektir; on dört girdilik katalogda dört kavramın üçü iki ayrı sözcükle anılıyordu.
- Büyük harfle yazım ve ünlem vurgu aracı değildir; vurgu ağırlık, boyut ve konumla verilir.
- 2.5.3 ölçütü görsel incelemeyle yakalanamaz: ekranda görünen etiket erişilebilir adın içinde bulunmalıdır.
- Türkçe gibi ekli dillerde sözcük denetimi alt dizgi aramasıyla yapılmaz; eşleşme sözcük başından aranır, sonu serbest bırakılır.
Sonraki Adım
Denetimin yakaladığı en ağır bulgu bir hata iletisiydi ve karşı örneği aynı katalogda duruyordu. İki iletinin farkı üslup değil yapıdır: biri neyin yanlış olduğunu söyler, öteki neyin doğru olduğunu ve nasıl yapılacağını. Sonraki ders hata iletisini kaynağına göre sınıflandırır, her sınıf için hangi parçaların zorunlu olduğunu belirler ve iletileri bu parçalara göre denetleyen bir kural kümesi kurar.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.