Yerelleştirme (i18n)
API her istek için bir dil (locale) müzakere eder ve insanlara görünen tüm
metinleri (hata/başarı mesajları, doğrulama mesajları, e-posta içeriği) o dilde
döndürür. Çeviri, makine tarafından okunan alanları asla etkilemez — yalnızca
message, doğrulama errors ve bildirim metinleri yerelleştirilir.
Desteklenen diller
Desteklenen dil izin listesi tek doğruluk kaynağı olarak
config/locales.php içindedir. Bu taslak itibarıyla:
| Kod | Ad | Yerel ad | Yön |
|---|---|---|---|
en | English | English | ltr |
tr | Turkish | Türkçe | ltr |
Varsayılan (ve geri-dönüş) dil en'dir. İzin listesi dışındaki herhangi bir dil
yok sayılır ve istek varsayılana düşer — bilinmeyen veya enjekte edilmiş dil
dizeleri asla kabul edilmez.
Dillerin keşfi (istemciler için)
İstemciler (yönetim SPA'sı, doküman sitesi) listeyi çalışma zamanında okur; böylece dil değiştiriciler sunucuyla senkron kalır. Bu uç herkese açık, kimlik doğrulaması gerektirmeyen ve kiracıdan bağımsızdır:
GET /api/locales
{
"default": "en",
"active": "en",
"dir": "ltr",
"locales": [
{ "code": "en", "name": "English", "native_name": "English", "dir": "ltr" },
{ "code": "tr", "name": "Turkish", "native_name": "Türkçe", "dir": "ltr" }
]
}
default— geri-dönüş dili.active— bu isteğin müzakere ettiği dil (istemci, Accept-Language müzakeresinin sonucunu doğrulayabilir).dir— aktif dilin metin yönü (ltr/rtl).locales[].dir— dil başına yön; ön yüzdocument.dir/dirHTML niteliğini ayarlayabilir. Yön bilgisi her dil için baştan sağlanır; böylece yerleşim, herhangi bir RTL dili gelmeden önce RTL'ye hazırdır.
Dil nasıl seçilir
Sunucu her istekte dili şu önceliğe göre, her adımda izin listesiyle sınırlı olarak çözer:
- Kimliği doğrulanmış kullanıcı tercihi —
users.settings.locale. - Kiracı varsayılanı — kiracı bağlıyken
tenant_settingsiçindekilocaleanahtarı. Accept-Languagemüzakeresi — başlıkta izin listesinde bulunan, en yüksek sıralı dil etiketi. Kalite değerleri (q=) ve bölge alt etiketleri (tr-TR→tr) dikkate alınır.- Geri-dönüş — varsayılan dil (
en).
Örnekler
GET /api/locales
Accept-Language: tr,en;q=0.8
→ active değeri tr.
GET /api/locales
Accept-Language: de-DE,fr;q=0.9
→ ne de ne fr desteklenir → active en'e düşer.
Başarısız bir giriş, yerelleştirilmiş gövdeyi gösterir:
POST /api/login
Accept-Language: tr
{ "email": "[email protected]", "password": "wrong" }
{
"message": "...",
"errors": { "email": ["Bu kimlik bilgileri kayıtlarımızla eşleşmiyor."] }
}
Kalıcı tercih ayarlama
Accept-Language istek başına bir ipucudur. Bir seçimi kalıcı kılmak için onu
kullanıcıda (settings.locale) veya kiracı varsayılanında
(tenant_settings.locale) sakla; saklanan tercih her istekte Accept-Language
üzerinde önceliğe sahip olur.
E-postalar ve kuyruğa alınan bildirimler
Bildirim e-postaları (doğrulama, magic-link, parola sıfırlama) alıcının tercih ettiği dile, gönderim anında çözülerek yerelleştirilir — gönderimi tetikleyenin diline göre değil. Bu, istek dışında çalışan ve dili hedef kullanıcı/kiracıdan yeniden çözen kuyruk işleri için önemlidir.