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,181 @@
---
title: Faz 0 I18n Fixture Plani
description: Cok dillilik migration, katalog ve portal testleri icin seed senaryolari.
phase: 0
status: completed
last_updated: 2026-07-19
---
# Faz 0 I18n Fixture Plani
Bu plan Faz-1 sonrasinda script veya test fixture'ina donusturulecek veri setini
tanımlar. Hedef, locale resolver, fallback, domain icerik cevirileri ve portal
dili davranisini ayni senaryoda dogrulamaktir.
## Locale fixture'lari
| Locale | Durum | Built-in | Fallback | Amac |
| --- | --- | --- | --- | --- |
| `tr` | `active` | Evet | Yok | Instance default ve mevcut verinin ana dili. |
| `en` | `active` | Evet | `tr` | Built-in ikinci dil ve portal client testi. |
| `fr` | `draft` | Hayir | `en` | Eksik katalog/fallback testi. |
| `ar-XB` | `test` | Hayir | `en` | RTL smoke ve layout kontrolu. |
`tr` ve `en` silinemez. `fr` portal dili olarak ancak kritik portal namespace'leri
tamamlaninca secilebilir. `ar-XB` urun ayarlarinda normal kullaniciya
gosterilmez.
## Katalog fixture'lari
### Turkce built-in katalog
Tum namespace'lerde eksiksiz olmalidir:
- `common`
- `auth`
- `navigation`
- `dashboard`
- `clients`
- `projects`
- `tasks`
- `calendar`
- `finance`
- `journal`
- `chat`
- `settings`
- `portal`
- `status`
- `validation`
- `api`
### Ingilizce built-in katalog
Turkce ile ayni anahtar setine sahip olmalidir. Faz-2 testinde anahtar farki
release engeli kabul edilir.
### Eksik Fransizca katalog
Fallback test etmek icin bilincli olarak kismi tutulur.
Ornek:
```json
{
"navigation.dashboard": "Tableau de bord",
"navigation.projects": "Projets",
"portal.dashboard.title": "Apercu",
"common.save": "Enregistrer"
}
```
Beklenen davranis: Eksik `portal.tasks.title` gibi anahtarlarda once `en`, sonra
`tr` fallback metni gosterilir; kullaniciya ham anahtar basılmaz.
## Auth fixture'lari
| Kullanici | Rol | Email | Dil | Baglam |
| --- | --- | --- | --- | --- |
| Freelancer | `admin` | `owner@neta.local` | `tr` | Dashboard, ayarlar ve ceviri yonetimi. |
| Turkce musteri | `client` | `client-tr@neta.local` | `tr` | Portal default dil testi. |
| Ingilizce musteri | `client` | `client-en@neta.local` | `en` | Portal client locale testi. |
Freelancer hesabi instance default dilini `tr` olarak korur. Ingilizce musteri
icin davet kaydinda ve `clients.portal_locale` alaninda `en` beklenir.
## Domain veri fixture'i
### Musteriler
| ID | Ad | Portal dili | Not |
| --- | --- | --- | --- |
| `client-tr` | Ada Yilmaz | `tr` | Turkce portal goruntusu. |
| `client-en` | Nova Studio | `en` | Ingilizce portal goruntusu. |
### Projeler
| ID | Musteri | Default baslik | EN baslik | FR baslik | Not |
| --- | --- | --- | --- | --- |
| `project-website` | `client-tr` | Web sitesi yenileme | Website refresh | Bos | Fallback testi. |
| `project-brand` | `client-en` | Marka kiti | Brand kit | Kit de marque | Portal EN ve FR content testi. |
Beklenen davranis:
- `tr` isteyen kullanici default kolon veya `content_translations(tr)` degerini
gorur.
- `en` isteyen kullanici EN content translation'i gorur.
- `fr` isteyen kullanici FR alan bos ise fallback zinciriyle EN veya TR gorur.
### Gorevler
| ID | Proje | Public | TR baslik | EN baslik |
| --- | --- | --- | --- | --- |
| `task-wireframe` | `project-website` | Evet | Ana sayfa wireframe | Homepage wireframe |
| `task-internal` | `project-website` | Hayir | Ic notlari toparla | Gather internal notes |
Portal yalnizca `is_public_to_client = true` gorevleri gosterir.
### Planlama bolumleri
| ID | Proje | Kategori | TR baslik | EN baslik |
| --- | --- | --- | --- | --- |
| `plan-scope` | `project-website` | `scope` | Kapsam | Scope |
| `plan-delivery` | `project-website` | `delivery` | Teslimat | Delivery |
Kategori teknik degeri cevrilmez; label `status` veya `projects` namespace'inden
gelir.
## Portal davet fixture'lari
| Davet | Email | Locale | Beklenen ekran dili |
| --- | --- | --- | --- |
| `invite-tr` | `client-tr@neta.local` | `tr` | Turkce |
| `invite-en` | `client-en@neta.local` | `en` | Ingilizce |
| `invite-fr-draft` | `client-en@neta.local` | `fr` | Portal publish kurali nedeniyle reddedilir veya fallback EN kullanir. |
Davet ekranlari auth oncesi oldugu icin locale'i session'dan degil davet
kaydindan alir.
## API contract fixture'lari
`/api/v1/meta` Faz-8 sonunda en az su localization bilgisini dondurmelidir:
```json
{
"localization": {
"defaultLocale": "tr",
"supportedLocales": [
{ "code": "tr", "name": "Turkce", "status": "active", "builtIn": true },
{ "code": "en", "name": "English", "status": "active", "builtIn": true },
{ "code": "fr", "name": "Francais", "status": "draft", "builtIn": false }
],
"fallbacks": {
"en": "tr",
"fr": "en"
}
}
}
```
Mobil istemci aktif olmayan dilleri kullanici seciminde gostermemeli, ancak
ceviri yonetimi ekranlari icin admin API'de draft dilleri gorebilmelidir.
## Smoke beklentileri
Faz-2 sonrasinda:
- `t("common.save")` `tr` icin `Kaydet`, `en` icin `Save` dondurur.
- `fr` locale'inde eksik anahtar ham key olarak gosterilmez.
- `formatMoney(10000, "TRY", "tr")` Turkce bicim verir.
- `formatDate(..., "en")` Ingilizce ay adi verir.
Faz-6 sonrasinda:
- `client-en` portali EN navigasyon ve EN proje basliklariyla acilir.
- `client-tr` portali TR kalir.
- Davet kabul edildikten sonra secilen locale client kaydina yansir.
Faz-8 sonrasinda:
- `/api/v1/meta` supported locale listesini dondurur.
- `/api/v1/me` kullanicinin etkin locale'ini ve fallback chain'ini dondurur.
- API hata response'lari stabil kod + locale'e uygun insan okunur mesaj tasir.