docs: add multilingual i18n rollout plan

This commit is contained in:
poyrazavsever
2026-07-19 03:06:30 +03:00
parent bace8c86cf
commit 0548820584
11 changed files with 2498 additions and 0 deletions
@@ -0,0 +1,171 @@
---
title: Faz 0 ADR Seti
description: Neta cok dilli sisteminin baslangic karar kayitlari.
phase: 0
status: accepted
last_updated: 2026-07-19
---
# Faz 0 ADR Seti
Bu dosya cok dillilik calismasinin ilk uygulama kararlarini kilitler. Amac,
sonraki fazlarda ayni problemi tekrar tekrar tartismadan ilerleyebilmek ve
SQLite tabanli self-host hedefini korumaktir.
## ADR-I18N-0001 — UI cevirisi ve domain icerik cevirisi ayrilacak
### Durum
Kabul edildi.
### Baglam
Neta'da iki farkli metin tipi var:
- Uygulamanin kendisine ait sabit arayuz metinleri.
- Freelancer veya musteri tarafindan uretilen is icerikleri.
Bu iki veri tipini ayni tabloda veya ayni anahtar modeliyle tutmak, hem fallback
hem de izin modeli tarafinda karmasa yaratir.
### Karar
Arayuz cevirileri stabil katalog anahtarlariyla yonetilecek. Built-in `tr` ve
`en` kataloglari kod icinde surumlenecek; instance sahibi tarafindan eklenen
override'lar SQLite icindeki `instance_ui_translations` modelinde tutulacak.
Domain icerik cevirileri entity ve field bazli tutulacak. Bunun icin Faz-1'de
`content_translations` modeli eklenecek.
### Sonuc
- Arayuz metinleri release sureciyle denetlenebilir kalir.
- Sonradan eklenen diller deployment gerektirmeden doldurulabilir.
- Is icerikleri icin form tab'lari net bicimde modellenir.
- Chat, gunluk notu ve musteri mesajlari gibi iletisim icerikleri otomatik
cevrilmez; yazildigi dilde kalir.
## ADR-I18N-0002 — Locale cozumleme onceligi
### Durum
Kabul edildi.
### Baglam
Ayni instance icinde freelancer, musteri portali, davet ekranlari ve public API
farkli baglamlarda calisir. Locale cozumleme her yerde ayni kaynaga bakarsa
portal daveti gibi auth oncesi akislarda yanlis dil gorunebilir.
### Karar
Locale asagidaki sirayla cozumlenecek.
Auth oncesi davet ekranlari:
1. Davet kaydindaki locale.
2. Guvenli locale cookie'si.
3. Instance varsayilan dili.
4. Built-in fallback `tr`.
Freelancer uygulamasi:
1. Oturum acmis kullanicinin `user_preferences.language` degeri.
2. Guvenli locale cookie'si.
3. Instance varsayilan dili.
4. Built-in fallback `tr`.
Musteri portali:
1. Musteri profilinin veya `clients.portal_locale` alaninin locale degeri.
2. Portal davetinden gelen locale.
3. Guvenli locale cookie'si.
4. Instance varsayilan dili.
5. Built-in fallback `tr`.
Mobil ve API istekleri:
1. Auth kullanicisinin kayitli tercihi.
2. Guvenilir endpoint parametresi veya `Accept-Language` sinyali.
3. Instance varsayilan dili.
4. Built-in fallback `tr`.
### Sonuc
- Musteri davet ekrani login olmadan dogru dilde acilir.
- Freelancer tercihi musteri portalini yanlislikla etkilemez.
- Mobil istemci ayni kurallari API kontratindan okuyabilir.
## ADR-I18N-0003 — Dashboard ve portal route'larina locale prefix eklenmeyecek
### Durum
Kabul edildi.
### Baglam
`/tr/dashboard`, `/en/dashboard` gibi route prefix'leri public marketing
sitelerinde gucludur, ancak Neta'nin dashboard ve portal yapisi oturum, davet,
yetki ve self-host basitligi uzerine kurulu. Prefix eklemek route sayisini,
redirect davranislarini ve mobil endpoint eslemesini gereksiz buyutur.
### Karar
Dashboard, portal ve davet route'lari mevcut URL yapisini koruyacak. Dil, locale
resolver ve cookie/user/client kayitlariyla belirlenecek.
### Sonuc
- Var olan internal linkler ve mobil baglanti modeli korunur.
- Self-host deploy ve reverse proxy ayarlari sade kalir.
- Public landing/docs tarafi isterse ileride ayri route prefix stratejisi
kullanabilir; bu karar sadece uygulama kabugu icindir.
## ADR-I18N-0004 — Hafif custom runtime i18n katmani yazilacak
### Durum
Kabul edildi.
### Baglam
Projenin ana hedeflerinden biri dependency sayisini azaltmak ve self-host'u
kolaylastirmak. Mevcut ihtiyaclar temel katalog cozumleme, fallback, namespace
yukleme, `Intl` bicimlendirme ve SQLite override okuma uzerinden karsilanabilir.
### Karar
Ilk cok dillilik surumunde agir bir i18n runtime dependency'si eklenmeyecek.
Neta icinde kucuk bir i18n katmani yazilacak:
- `lib/i18n/*` ortak tip ve format yardimcilari.
- `server/i18n/*` locale resolver, katalog merge ve translator servisleri.
- Client component'ler icin sinirli scope'ta provider.
- Tarih, sayi ve para bicimlendirme icin native `Intl`.
### Sonuc
- Yeni dependency eklenmeden Faz-2 runtime kurulabilir.
- Katalog sozlesmesi Neta'nin domain ihtiyaclarina gore sekillenir.
- Ileride ihtiyac buyurse baska kutuphaneye gecis icin katalog anahtarlari
korunabilir.
## ADR-I18N-0005 — Built-in diller ve yayin kurali
### Durum
Kabul edildi.
### Karar
Turkce (`tr`) ve Ingilizce (`en`) built-in, aktif ve silinemez diller olacak.
Instance varsayilan dili ilk migration sonrasinda `tr` olacak.
Yeni eklenen diller once `draft` durumunda olusturulacak. Portal icin kritik
namespace'leri tamamlanmayan bir dil musteri dili olarak secilemeyecek.
### Sonuc
- Eksik ceviri musteriye yarim bir portal deneyimi olarak yansimaz.
- Instance sahibi yeni dili hazirlayip test ettikten sonra aktif edebilir.
- Fallback davranisi her zaman tahmin edilebilir kalir.