Türkçe projelerde locale tuzakları
Türkçe karakterler yüzünden sessizce bozulan kod parçaları: i/I dönüşümü, sıralama, arama, slug üretimi. CLAUDE.md'ye konunca Claude bu hataları baştan yapmaz.
Kaynak: MDN
Türkçe karakterler yüzünden sessizce bozulan kod parçaları: i/I dönüşümü, sıralama, arama, slug üretimi. CLAUDE.md'ye konunca Claude bu hataları baştan yapmaz.
Kaynak: MDN
curl -sL https://www.antrophiclove.com/api/kaynak/turkce-projelerde-locale-tuzaklari/rawBu içerik mevcut dosyaya elle harmanlanmalı: CLAUDE.md
JavaScript'te toLowerCase() Türkçe'de yanlış çalışır:
"IST".toLowerCase() -> "ist" (beklenen "ıst")
"İSTANBUL".toLowerCase() -> "i̇stanbul" (birleşik nokta!)
Kullanıcı metnini karşılaştırırken: a.toLocaleLowerCase("tr") === b.toLocaleLowerCase("tr")
Ama teknik değerlerde (e-posta, slug, HTTP başlığı, dosya uzantısı)
ASLA "tr" locale kullanma — orada toLowerCase() doğrudur:
email.toLowerCase() ✓
email.toLocaleLowerCase("tr") ✗ ("I" -> "ı" olur, eşleşme kırılır)
liste.sort() ✗ Ç, Ğ, İ, Ö, Ş, Ü sona atılır liste.sort((a, b) => a.localeCompare(b, "tr")) ✓
Kullanıcı "sarı" yazıp "SARI" bulmalı: const norm = (s) => s.toLocaleLowerCase("tr").normalize("NFC");
Türkçe harfler NFD ile ayrışmaz, elle eşle: const MAP = { ç:"c", ğ:"g", ı:"i", ö:"o", ş:"s", ü:"u", Ç:"c", Ğ:"g", İ:"i", I:"i", Ö:"o", Ş:"s", Ü:"u" };
Dikkat: "I" -> "i" ve "İ" -> "i" ikisi de i'ye gider, çakışma olabilir.
Tam metin arama için 'turkish' sözlüğü mevcut: to_tsvector('turkish', metin) Sıralamada: ORDER BY ad COLLATE "tr-TR"
new Intl.NumberFormat("tr-TR").format(2410) -> "2.410" new Intl.DateTimeFormat("tr-TR").format(d) Binlik ayırıcı nokta, ondalık virgüldür; CSV üretirken ayırıcıyı noktalı virgül yap yoksa Excel sütunları bozar.