Ç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 hreflang etiketleri 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 ı/I dönüşümü; PostgreSQL'de doğru collation, JS'te toLocaleUpperCase("tr") ve Intl.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.

  1. SSR, SSG ve CSR arasındaki farklar nelerdir?OrtaWeb MimarisiFull Stack
  2. Monorepo nedir? Avantajları, dezavantajları ve araçları nelerdir?ZorWeb MimarisiFull Stack
  3. MVC mimarisi nedir? Modern web uygulamalarında nasıl karşılık bulur?KolayWeb MimarisiFull Stack
  4. Bir kullanıcı girişinin uçtan uca akışını (frontend'den veritabanına) anlatın.OrtaWeb MimarisiFull Stack
  5. Büyük dosya yükleme akışını nasıl tasarlarsınız? Presigned URL nedir?ZorWeb MimarisiFull Stack
  6. Backend for Frontend (BFF) deseni nedir, ne zaman kullanılır?OrtaWeb MimarisiFull Stack

Bu konuda başka bir soru biliyor musun?

Mülakatta karşılaştığın soruları ekle, onaylandıktan sonra yayına alınsın.

Soru ekle