Çok dilli (i18n) bir uygulamayı uçtan uca nasıl tasarlarsınız? Tarih, saat dilimi ve para birimi nasıl ele alınır?
Cevap
i18n tasarımı üç katmanda düşünülür: arayüz metinleri, veri (çevrilebilir içerik) ve biçimlendirme (tarih, sayı, para, saat dilimi). Temel kural: veriyi tarafsız formatta sakla (UTC, ISO kodları, kuruş cinsinden tamsayı), kullanıcıya gösterirken yerelleştir.
Arayüz metinleri
- Metinler koddan ayrı mesaj dosyalarında durur (
tr.json,en.json); i18next, react-intl, next-intl gibi kütüphaneler kullanılır. - Metin birleştirme yerine parametreli mesaj ve ICU plural kuralları kullanılır (dillerin çoğul kuralları farklıdır).
{ "cart.items": "{count, plural, =0 {Sepetiniz boş} other {Sepette # ürün var}}" }Locale belirleme ve routing
- Öncelik sırası: URL (
/en/urunler) > kullanıcı tercihi (DB) > cookie >Accept-Language. - SEO için dil URL'de olmalı ve
hreflangetiketleri eklenmeli.
Veri
- Çevrilebilir içerik (ürün adı) için ayrı çeviri tablosu:
product_translations(product_id, locale, name, description). Az dil varsa JSONB kolon da kullanılabilir. - Arama ve sıralama dile duyarlıdır: Türkçede
i/İveı/Idönüşümü; PostgreSQL'de doğru collation, JS'tetoLocaleUpperCase("tr")veIntl.Collator.
Tarih ve saat dilimi
- Veritabanında her zaman UTC (
timestamptz) saklanır; API ISO 8601 döner:2026-03-01T09:00:00Z. - Kullanıcının saat dilimi (
Europe/Istanbul) profilde saklanır; gösterim client'ta yapılır. - "Her gün 09:00'da hatırlat" gibi kurallar UTC ofset olarak değil saat dilimi adıyla saklanmalıdır; yaz saati değişimlerinde kayma olur.
new Intl.DateTimeFormat("tr-TR", { dateStyle: "long", timeStyle: "short", timeZone: "Europe/Istanbul" })
.format(new Date("2026-03-01T09:00:00Z")); // "1 Mart 2026 12:00"
new Intl.NumberFormat("tr-TR", { style: "currency", currency: "TRY" }).format(1234.5); // "₺1.234,50"Para
Tutarlar float değil en küçük birim cinsinden tamsayı (kuruş) veya NUMERIC olarak, para birimi koduyla (TRY, EUR) birlikte saklanır.
Ayrıca RTL dilleri (Arapça) için CSS logical property'ler (margin-inline-start) kullanmak ileride büyük refactor'lerin önüne geçer.
İlgili Web Mimarisi soruları
- SSR, SSG ve CSR arasındaki farklar nelerdir?
- Monorepo nedir? Avantajları, dezavantajları ve araçları nelerdir?
- MVC mimarisi nedir? Modern web uygulamalarında nasıl karşılık bulur?
- Bir kullanıcı girişinin uçtan uca akışını (frontend'den veritabanına) anlatın.
- Büyük dosya yükleme akışını nasıl tasarlarsınız? Presigned URL nedir?
- Backend for Frontend (BFF) deseni nedir, ne zaman kullanılır?
Bu konuda başka bir soru biliyor musun?
Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.