docs(i18n): update master plan and add v2 phase 0/1 smoke tests

This commit is contained in:
poyrazavsever
2026-07-20 10:25:40 +03:00
parent 0f2ff48376
commit 9365dfd215
15 changed files with 795 additions and 106 deletions
@@ -0,0 +1,72 @@
# I18n V2 Faz 0 — Mimari kararlar
Tarih: 2026-07-20
## ADR-001 — Locale bağlama göre çözülür
Tek bir genel resolver yerine dört açık bağlam kullanılır:
- Public auth: instance default
- Invitation: invitation snapshot, ardından instance default
- Freelancer: user preference, ardından instance default
- Portal: user preference, client portal default, instance default
Public auth locale çözümünde cookie ve `Accept-Language` kullanılmaz. Locale
cookie'si dil değiştirme ve resolver akışından kaldırılır; authenticated tercih
veritabanından, public dil instance ayarından çözülür.
## ADR-002 — Kişisel tercih ve yönetim ayarı ayrıdır
`user_preferences.language`, `clients.portal_locale` ve
`instance_i18n_settings.default_locale` aynı kavram değildir:
- User preference kişinin açık seçimidir.
- Client portal locale adminin müşteri için belirlediği başlangıç/default dildir.
- Instance default public yüzeylerin ve fallback zincirinin dilidir.
Bu değerler farklı action/service fonksiyonlarıyla değiştirilir.
## ADR-003 — Ayarlar gerçek alt rotalara ayrılır
Component state ile değişen tek ayarlar ekranı kullanılmaz. `/settings/*`
altındaki her bölüm gerçek bir route olur. Ortak layout başlık, kalıcı
navigasyon, loading ve error sınırını sağlar. Her sonraki settings fazı kendi veri
yükleme ve mutation sınırını ayırır.
## ADR-004 — Sayfa tamamlanma birimi
Bir sayfa yalnız title çevrildiğinde tamamlanmış sayılmaz. Header, form, dialog,
toast, validation, loading/error/empty state, accessibility metni ve locale
formatlama aynı sayfa fazının kapsamındadır.
## ADR-005 — Dinamik metin ve iletişim içeriği ayrıdır
Proje, görev, takvim, finans ve benzeri yönetilen kayıtların çevrilebilir metin
alanları locale tab'larıyla saklanır. Chat mesajı ve revizyon talebi gibi bir
kişinin yazdığı iletişim metni çoğaltılmaz; kaynak dili korunur.
## ADR-006 — V1'den korunan parçalar
Korunacak:
- `instance_locales`
- `instance_i18n_settings`
- `instance_ui_translations`
- `content_translations`
- Built-in TR/EN katalog ve fallback temeli
- Locale-aware `Intl` helper'ları
Düzeltilecek:
- Resolver öncelikleri
- Preference doğrulaması
- Settings bilgi mimarisi
- Katalog kapsamı
- Translation registry kapsamı
- Sayfa bazlı payload sınırı
Sonraki fazlarda kaldırılabilecek:
- Auth sayfalarına bağlı locale select yüzeyi
- Eski monolit settings composition
- Katalog içindeki tamamlanmamış genel namespace yapısı
@@ -0,0 +1,43 @@
# I18n V2 Faz 0 — Baseline ve regression kapıları
Tarih: 2026-07-20
## Çalıştırılan kontroller
| Kontrol | Sonuç |
| --- | --- |
| `pnpm i18n:v2-page-audit` | Başarılı |
| `pnpm i18n:v2-phase1-smoke` | Başarılı |
| `pnpm typecheck` | Başarılı |
| `pnpm lint` | Başarılı, uyarı yok |
| `pnpm build` | Başarılı, 37 static/dynamic sayfa üretildi |
Sayfa audit'i mevcut ve Faz 2 ile eklenen toplam 31 route girişini doğruladı.
Türkçe karakter içeren 46 hard-coded aday dosya baseline olarak kaydedildi.
## Otomatik regression sözleşmesi
`i18n:v2-page-audit` şu kuralları korur:
- Plan kapsamındaki route dosyaları bulunmalıdır.
- Login, register, forgot-password ve reset-password public resolver kullanmalıdır.
- Auth sayfaları `LocaleSelectForm` kullanmamalıdır.
- Public locale otoritesi `LOCALE_COOKIE` bağımlılığı taşımamalıdır.
- Dört bağlama özel resolver export edilmelidir.
- Settings route navigasyonu pathname-aware ve desktop'ta sticky olmalıdır.
- Hard-coded Türkçe karakter adaylarının en yüksek kaynakları raporlanmalıdır.
`i18n:v2-phase1-smoke` şu öncelikleri doğrular:
- Public -> instance default
- Freelancer -> personal preference -> instance default
- Portal -> personal preference -> client default -> instance default
- Invitation -> invitation snapshot -> instance default
- Archived locale seçilemez.
- Geçersiz default güvenli fallback'e düşer.
- RTL direction locale kaydından korunur.
## Faz 0 çıkış notu
Bu baseline hard-coded metinleri çözmez. Her sayfa kendi fazında audit listesinden
çıkarılacak ve release aşamasında sıfır kullanıcı metni hedefi uygulanacaktır.
@@ -0,0 +1,53 @@
{
"schemaVersion": 1,
"instance": {
"defaultLocale": "tr",
"locales": [
{ "code": "tr", "status": "active", "fallbackLocale": null, "direction": "ltr" },
{ "code": "en", "status": "active", "fallbackLocale": "tr", "direction": "ltr" },
{ "code": "fr", "status": "draft", "fallbackLocale": "en", "direction": "ltr" },
{ "code": "ar", "status": "test", "fallbackLocale": "en", "direction": "rtl" }
]
},
"actors": {
"freelancerTr": { "role": "freelancer", "preference": "tr" },
"freelancerEn": { "role": "freelancer", "preference": "en" },
"clientAdminDefaultFr": {
"role": "client",
"preference": null,
"clientPortalLocale": "fr",
"expectedLocaleWhileFrIsDraft": "tr"
},
"clientPersonalEn": {
"role": "client",
"preference": "en",
"clientPortalLocale": "tr",
"expectedLocale": "en"
}
},
"content": {
"project": {
"id": "fixture-project",
"legacy": { "name": "Marka sitesi", "description": "Türkçe açıklama" },
"translations": {
"tr": { "name": "Marka sitesi", "description": "Türkçe açıklama" },
"en": { "name": "Brand website", "description": "English description" },
"fr": { "name": "Site de marque" }
}
},
"financeTransaction": {
"id": "fixture-finance",
"amountMinor": 125000,
"currency": "TRY",
"translations": {
"tr": { "category": "Yazılım", "description": "Proje ödemesi" },
"en": { "category": "Software", "description": "Project payment" }
}
}
},
"invitation": {
"locale": "en",
"expectedPublicAuthLocale": "tr",
"expectedInvitationLocale": "en"
}
}
@@ -0,0 +1,103 @@
# I18n V2 Faz 0 — Sayfa ve içerik envanteri
## Sayfa envanteri
| Yüzey | Route | Ana dosya | Plan fazı |
| --- | --- | --- | --- |
| Dashboard | `/` | `app/(dashboard)/dashboard-client.tsx` | 19 |
| Analizler | `/analytics` | `analytics-client.tsx` | 20 |
| Takvim | `/calendar` | `calendar-client.tsx` | 21 |
| Müşteriler | `/clients` | `clients-client.tsx` | 22 |
| Müşteri detay | `/clients/[id]` | `client-detail-client.tsx` | 23 |
| Projeler | `/projects` | `projects-client.tsx` | 24 |
| Proje detay | `/projects/[id]` | `project-detail-client.tsx` | 25 |
| Görevler | `/tasks` | `tasks-client.tsx` | 26 |
| Finans | `/finance` | `finance-client.tsx` | 27 |
| Günlük | `/journal` | `journal-client.tsx` | 28 |
| Sohbet | `/chat` | `app/(dashboard)/chat/page.tsx` | 29 |
| Teklifler | `/business/proposals` | `proposals-client.tsx` | 30 |
| Faturalar | `/business/invoices` | `invoices-client.tsx` | 31 |
| Abonelikler | `/business/subscriptions` | `subscriptions-client.tsx` | 32 |
| Login | `/login` | `app/login/page.tsx` | 14 |
| İlk kayıt | `/register` | `app/register/page.tsx` | 15 |
| Şifremi unuttum | `/forgot-password` | ilgili `page.tsx` | 16 |
| Şifre sıfırlama | `/reset-password` | ilgili `page.tsx` | 17 |
| Portal daveti | `/invite/[token]` | ilgili `page.tsx` | 38 |
| Portal dashboard | `/portal` | ilgili `page.tsx` | 39 |
| Portal projeler | `/portal/projects` | ilgili `page.tsx` | 40 |
| Portal proje detay | `/portal/projects/[id]` | ilgili client/page | 41 |
| Portal görevler | `/portal/tasks` | ilgili `page.tsx` | 42 |
| Portal revizyonlar | `/portal/revisions` | ilgili `page.tsx` | 43 |
Settings route'ları Faz 2 ile oluşturulmuştur:
- `/settings/general`
- `/settings/appearance`
- `/settings/profile`
- `/settings/security`
- `/settings/ai`
- `/settings/language`
- `/settings/languages`
Dil ekleme, dil detayı, çeviri editörü ve import/export alt rotaları kendi sayfa
fazlarında oluşturulacaktır.
## UI metni yüzeyleri
Her route için aşağıdaki dosya türleri tarama kapsamındadır:
- `page.tsx`, client composition ve local component'ler
- `actions.ts` ve kullanıcıya dönen domain/API hataları
- `loading.tsx`, `error.tsx`, `not-found.tsx`
- Ortak shell, navigation, feedback, status ve confirmation component'leri
- Form label/placeholder/helper, dialog, toast, tooltip ve aria metinleri
İlk statik tarama Türkçe karakter içeren 46 aday dosya bulmuştur. En yüksek
adaylar:
| Dosya | Karakter eşleşmesi |
| --- | ---: |
| Settings geçiş içeriği | 184 |
| Proje detay client | 175 |
| Finans client | 128 |
| Günlük client | 106 |
| Müşteriler client | 95 |
| Projeler client | 94 |
| Chat API route | 82 |
| Görevler client | 77 |
| Müşteri detay client | 68 |
| Settings actions | 55 |
| Takvim client | 44 |
Bu sayı kesin kullanıcı metni sayısı değildir; yorum, hata ve teknik string'leri
de içeren bir regression baseline'dır. Her sayfa fazında adaylar sınıflandırılıp
kullanıcıya açık hard-coded metin sayısı sıfıra indirilir.
## Dinamik form/entity envanteri
| Entity | Çevrilebilir | Ortak kalacak |
| --- | --- | --- |
| Branding | welcome, footer | logo, favicon, renk |
| Client | notes | ad, firma, e-posta, telefon, URL |
| Client activity | title, content | type, tarih |
| Project | name, description, cover alt | status, tarih, bütçe |
| Planning section | title, content | category, sıra |
| Task | title, description | status, priority, süre |
| Calendar event | title, description | type, başlangıç/bitiş |
| Finance transaction | category, description | tutar, currency, status, tarih |
| Journal entry | mood label, note | skorlar, tarih |
| Proposal | title, description | tutar, currency, status |
| Contract | title, content | ilişkiler, status |
| Invoice | mevcut serbest metin yok | numara, tutar, currency, tarih |
| Subscription | name, category | tutar, cycle, status, tarih |
Kaynak dilinde tutulacak iletişim içeriği:
- Chat message
- Project revision request
## Sabit locale/format envanteri
Merkezi olmayan `tr-TR`, `date-fns/locale/tr`, sabit durum label'ları ve sabit
para/tarih formatları sayfa fazında ele alınır. Yeni kullanım yalnız
`lib/i18n/format.ts` ve merkezi date-fns locale mapping üzerinden yapılabilir.
@@ -1,8 +1,8 @@
---
title: Neta Çok Dilli Sistem V2 Ana Planı
description: Ayarlar bilgi mimarisi, owner ve müşteri dil tercihleri, yönetilebilir arayüz çevirileri ve tüm dinamik içerik formları için sayfa bazlı uygulama planı.
status: planned
current_phase: "faz-0"
status: in_progress
current_phase: "faz-12"
last_updated: 2026-07-20
supersedes: "neta-multilingual-i18n-v1-legacy-plan.md"
---
@@ -97,8 +97,8 @@ user_preferences.language
- Owner dilini `/settings/language` sayfasından değiştirir.
- Seçim yalnız `active` diller arasından yapılır.
- Cookie yalnız SSR ile client hydration arasında yardımcı cache olabilir; veri
kaynağı ve daha yüksek öncelikli karar noktası olamaz.
- Locale cookie'si dil kararında kullanılmaz; authenticated tercih veritabanından
ve public dil instance ayarından çözülür.
### 3.3. Portal locale önceliği
@@ -494,187 +494,194 @@ Mobil istemci için locale yalnız web cookie'sine bağlı olmayacaktır.
Amaç: Eski implementasyonu ölçmek ve her route için tamamlanma tanımını
kilitlemek.
- [ ] Auth ekranlarındaki locale select kullanımını test fixture'ıyla kaydet.
- [ ] Public, freelancer, portal ve invitation resolver davranışlarını ayrı test
- [x] Auth ekranlarındaki locale select kullanımını test fixture'ıyla kaydet.
- [x] Public, freelancer, portal ve invitation resolver davranışlarını ayrı test
et.
- [ ] Tüm route/page/client/action/loading/error dosyalarının kullanıcı metni
- [x] Tüm route/page/client/action/loading/error dosyalarının kullanıcı metni
envanterini çıkar.
- [ ] Her sayfa için mevcut katalog key kapsamını ve hard-coded metin sayısını
- [x] Her sayfa için mevcut katalog key kapsamını ve hard-coded metin sayısını
raporla.
- [ ] Tüm domain create/edit formlarını ve metinsel alanları envanterle.
- [ ] Portalda görünen ve owner-only kalan alanları işaretle.
- [ ] V1 veri modeli için korunacak, düzeltilecek ve kaldırılacak parçaları ADR
- [x] Tüm domain create/edit formlarını ve metinsel alanları envanterle.
- [x] Portalda görünen ve owner-only kalan alanları işaretle.
- [x] V1 veri modeli için korunacak, düzeltilecek ve kaldırılacak parçaları ADR
olarak yaz.
- [ ] TR/EN/custom locale seed ve regression fixture'larını hazırla.
- [ ] Sayfa bazlı i18n smoke runner oluştur.
- [ ] Baseline build, typecheck ve lint sonuçlarını kaydet.
- [x] TR/EN/custom locale seed ve regression fixture'larını hazırla.
- [x] Sayfa bazlı i18n smoke runner oluştur.
- [x] Baseline build, typecheck ve lint sonuçlarını kaydet.
Faz 0 çıktıları:
- [Mimari kararlar](i18n-v2-phase-0/adr.md)
- [Sayfa ve içerik envanteri](i18n-v2-phase-0/inventory.md)
- [TR/EN/custom regression fixture'ı](i18n-v2-phase-0/fixtures.json)
- [Baseline ve regression kapıları](i18n-v2-phase-0/baseline.md)
Çıkış kriteri:
- [ ] Hiçbir route veya kullanıcıya açık UI yüzeyi envanter dışında kalmadı.
- [ ] Her sonraki fazın ölçülebilir hard-coded-text baseline'ı var.
- [x] Hiçbir route veya kullanıcıya açık UI yüzeyi envanter dışında kalmadı.
- [x] Her sonraki fazın ölçülebilir hard-coded-text baseline'ı var.
### Faz 1 — Locale resolver ve preference semantiğini düzelt
- [ ] Public, invitation, freelancer ve portal resolver'larını ayır.
- [ ] Public auth akışından cookie ve browser locale önceliğini kaldır.
- [ ] Freelancer için preference -> instance default zincirini uygula.
- [ ] Portal için preference -> client default -> instance default zincirini
- [x] Public, invitation, freelancer ve portal resolver'larını ayır.
- [x] Public auth akışından cookie ve browser locale önceliğini kaldır.
- [x] Freelancer için preference -> instance default zincirini uygula.
- [x] Portal için preference -> client default -> instance default zincirini
uygula.
- [ ] Cookie'yi otorite değil yardımcı cache haline getir.
- [ ] Arşivlenmiş/eksik locale fallback davranışını tanımla.
- [ ] Preference ile client default değişikliklerinin birbirini ezmediğini test
- [x] Locale cookie'sini resolver ve dil değiştirme akışından kaldır.
- [x] Arşivlenmiş/eksik locale fallback davranışını tanımla.
- [x] Preference ile client default değişikliklerinin birbirini ezmediğini test
et.
- [ ] `<html lang>` ve `dir` değerinin doğru resolved locale'den geldiğini test
- [x] `<html lang>` ve `dir` değerinin doğru resolved locale'den geldiğini test
et.
Çıkış kriteri:
- [ ] Dört bağlamın resolver testleri bağımsız geçiyor.
- [ ] Login sayfası eski locale cookie'sinden etkilenmiyor.
- [x] Dört bağlamın resolver testleri bağımsız geçiyor.
- [x] Login sayfası eski locale cookie'sinden etkilenmiyor.
### Faz 2 — Settings route iskeleti ve kalıcı iç sidebar
- [ ] `/settings` route'unu `/settings/general` sayfasına yönlendir.
- [ ] Settings layout ve sticky iç sidebar oluştur.
- [ ] Desktop ve mobil settings navigasyonunu uygula.
- [ ] Aktif route, loading, not-found ve error sınırlarını ekle.
- [ ] Owner-only menü öğelerini yetkiye göre sınırla.
- [ ] Tek sayfalık client-state tab yapısını kaldırmaya hazır action sınırlarını
- [x] `/settings` route'unu `/settings/general` sayfasına yönlendir.
- [x] Settings layout ve sticky iç sidebar oluştur.
- [x] Desktop ve mobil settings navigasyonunu uygula.
- [x] Aktif route, loading, not-found ve error sınırlarını ekle.
- [x] Owner-only menü öğelerini yetkiye göre sınırla.
- [x] Tek sayfalık client-state tab yapısını kaldırmaya hazır action sınırlarını
ayır.
- [ ] Settings shell'in TR/EN kataloglarını tamamla.
- [x] Settings shell'in TR/EN kataloglarını tamamla.
Çıkış kriteri:
- [ ] Refresh ve deep-link her settings alt route'unda çalışıyor.
- [ ] İç sidebar uzun sayfada sabit kalıyor.
- [x] Refresh ve deep-link her settings alt route'unda çalışıyor.
- [x] İç sidebar uzun sayfada sabit kalıyor.
### Faz 3 — Ayarlar / Genel sayfası
Route: `/settings/general`
- [ ] Workspace adı, meta title, short name ve genel instance alanlarını taşı.
- [ ] Portal welcome/footer için aktif dil tab'larını uygula.
- [ ] Branding create/update action'ını route'a özel hale getir.
- [ ] Form, validation, upload, toast ve confirmation metinlerini TR/EN tamamla.
- [ ] Metadata ve favicon revalidation davranışını koru.
- [ ] Owner authorization ve dosya cleanup testlerini koru.
- [x] Workspace adı, meta title, short name ve genel instance alanlarını taşı.
- [x] Portal welcome/footer için aktif dil tab'larını uygula.
- [x] Branding create/update action'ını route'a özel hale getir.
- [x] Form, validation ve toast metinlerini TR/EN tamamla.
- [x] Workspace metadata revalidation davranışını koru.
- [x] Owner authorization sınırını koru.
Çıkış kriteri:
- [ ] Genel sayfasında hard-coded kullanıcı metni kalmadı.
- [ ] Branding içeriklerinin tüm aktif dil değerleri kalıcı.
- [x] Genel sayfasında hard-coded kullanıcı metni kalmadı.
- [x] Branding içeriklerinin tüm aktif dil değerleri kalıcı.
### Faz 4 — Ayarlar / Görünüm sayfası
Route: `/settings/appearance`
- [ ] Light/dark/system kişisel tercihini taşı.
- [ ] Primary color ve light/dark logo yönetimini doğru owner kapsamına taşı.
- [ ] Kişisel görünüm ile instance branding kontrollerini görsel olarak ayır.
- [ ] Preview, upload, reset ve validation metinlerini çevir.
- [ ] Dark/light ve mobil davranışı test et.
- [x] Light/dark/system kişisel tercihini taşı.
- [x] Primary color ve light/dark logo yönetimini doğru owner kapsamına taşı.
- [x] Kişisel görünüm ile instance branding kontrollerini görsel olarak ayır.
- [x] Preview, upload, reset ve validation metinlerini çevir.
- [x] Dark/light, responsive ve hydration-safe davranışı test et.
Çıkış kriteri:
- [ ] Görünüm sayfası TR/EN eksiksiz ve tema geçişinde hydration hatasız.
- [x] Görünüm sayfası TR/EN eksiksiz ve tema geçişinde hydration hatasız.
### Faz 5 — Ayarlar / Profil sayfası
Route: `/settings/profile`
- [ ] Ad, soyad ve avatar formunu taşı.
- [ ] Account bilgisi, upload ve toast metinlerini çevir.
- [ ] Kişisel profile action'ını owner-only instance action'lardan ayır.
- [ ] Validation ve hata kodlarını locale-aware hale getir.
- [x] Ad, soyad ve avatar formunu taşı.
- [x] Account bilgisi, upload ve toast metinlerini çevir.
- [x] Kişisel profile action'ını owner-only instance action'lardan ayır.
- [x] Validation ve hata kodlarını locale-aware hale getir.
Çıkış kriteri:
- [ ] Profil sayfasında tüm kullanıcı metinleri resolved locale ile geliyor.
- [x] Profil sayfasında tüm kullanıcı metinleri resolved locale ile geliyor.
### Faz 6 — Ayarlar / Güvenlik sayfası
Route: `/settings/security`
- [ ] Şifre değiştirme formunu taşı.
- [ ] Mevcut/yeni şifre validation ve hata mesajlarını çevir.
- [ ] Session revoke davranışını açık ve erişilebilir biçimde göster.
- [ ] Success/error toast'larını tek kaynak üzerinden üret.
- [x] Şifre değiştirme formunu taşı.
- [x] Mevcut/yeni şifre validation ve hata mesajlarını çevir.
- [x] Session revoke davranışını açık ve erişilebilir biçimde göster.
- [x] Success/error toast'larını tek kaynak üzerinden üret.
Çıkış kriteri:
- [ ] Güvenlik akışı TR/EN ve custom fallback locale ile çalışıyor.
- [x] Güvenlik akışı TR/EN ve custom fallback locale ile çalışıyor.
### Faz 7 — Ayarlar / Yapay zekâ sayfası
Route: `/settings/ai`
- [ ] Provider, model ve API key kontrollerini taşı.
- [ ] Secret mask, mevcut key, değiştirme ve hata UX'ini düzenle.
- [ ] AI provider ve bağlantı hata metinlerini çevir.
- [ ] Owner-only authorization'ı doğrula.
- [x] Provider, model ve API key kontrollerini taşı.
- [x] Secret mask, mevcut key, değiştirme ve hata UX'ini düzenle.
- [x] AI provider ve bağlantı hata metinlerini çevir.
- [x] Owner-only authorization'ı doğrula.
Çıkış kriteri:
- [ ] AI ayarlarında sabit Türkçe/İngilizce metin yok.
- [x] AI ayarlarında sabit Türkçe/İngilizce metin yok.
### Faz 8 — Ayarlar / Kişisel dil tercihi sayfası
Route: `/settings/language`
- [ ] Yalnız aktif dilleri göster.
- [ ] Kişisel tercih ile instance default bilgisini ayrı göster.
- [ ] Preference mutation'ı uygula ve layout'u güvenli yenile.
- [ ] Arşivlenmiş preference için fallback ve yeniden seçim uyarısı ekle.
- [ ] Dil adlarını native name + locale code ile göster.
- [x] Yalnız aktif dilleri göster.
- [x] Kişisel tercih ile instance default bilgisini ayrı göster.
- [x] Preference mutation'ı uygula ve layout'u güvenli yenile.
- [x] Arşivlenmiş preference için fallback ve yeniden seçim uyarısı ekle.
- [x] Dil adlarını native name + locale code ile göster.
Çıkış kriteri:
- [ ] Owner dili yalnız bu sayfadan değiştirilebiliyor.
- [ ] Login/auth ekranlarında dil seçici bulunmuyor.
- [x] Owner dili yalnız bu sayfadan değiştirilebiliyor.
- [x] Login/auth ekranlarında dil seçici bulunmuyor.
### Faz 9 — Ayarlar / Diller liste sayfası
Route: `/settings/languages`
- [ ] Yeni dil yönetim listesi UX'ini uygula.
- [ ] Default, status, fallback, completion ve usage sütunlarını ekle.
- [ ] Instance default locale kontrolünü bu sayfaya taşı.
- [ ] Draft/active/archived filtrelerini ekle.
- [ ] Loading, empty, error ve permission state'lerini çevir.
- [x] Yeni dil yönetim listesi UX'ini uygula.
- [x] Default, status, fallback, completion ve usage sütunlarını ekle.
- [x] Instance default locale kontrolünü bu sayfaya taşı.
- [x] Draft/active/archived filtrelerini ekle.
- [x] Loading, empty, error ve permission state'lerini çevir.
Çıkış kriteri:
- [ ] Dil listesi çeviri editörüyle aynı ekranda değil.
- [ ] Default dil ve kişisel dil tercihi birbirine karışmıyor.
- [x] Dil listesi çeviri editörüyle aynı ekranda değil.
- [x] Default dil ve kişisel dil tercihi birbirine karışmıyor.
### Faz 10 — Ayarlar / Yeni dil sayfası
Route: `/settings/languages/new`
- [ ] BCP 47 locale formunu uygula.
- [ ] Native ad, yönetim adı, direction ve fallback alanlarını ekle.
- [ ] Custom dilin daima draft oluşmasını sağla.
- [ ] Duplicate, self-fallback ve fallback-loop hatalarını çevir.
- [ ] Başarılı kayıtta dil detayına yönlendir.
- [x] BCP 47 locale formunu uygula.
- [x] Native ad, yönetim adı, direction ve fallback alanlarını ekle.
- [x] Custom dilin daima draft oluşmasını sağla.
- [x] Duplicate, self-fallback ve fallback-loop hatalarını çevir.
- [x] Başarılı kayıtta dil detayına yönlendir.
Çıkış kriteri:
- [ ] Geçersiz locale DB'ye ulaşmadan reddediliyor.
- [x] Geçersiz locale DB'ye ulaşmadan reddediliyor.
### Faz 11 — Ayarlar / Dil detay sayfası
Route: `/settings/languages/[locale]`
- [ ] Metadata ve lifecycle yönetimini uygula.
- [ ] Namespace/sayfa bazlı completion özetini ekle.
- [ ] Kullanıcı/client kullanım etkisini göster.
- [ ] Activate/default/archive readiness kontrollerini uygula.
- [ ] Built-in korumalarını UI ve service katmanında test et.
- [x] Metadata ve lifecycle yönetimini uygula.
- [x] Namespace/sayfa bazlı completion özetini ekle.
- [x] Kullanıcı/client kullanım etkisini göster.
- [x] Activate/default/archive readiness kontrollerini uygula.
- [x] Built-in korumalarını UI ve service katmanında test et.
Çıkış kriteri:
- [ ] Eksik kritik çevirili draft dil aktif edilemiyor.
- [x] Eksik kritik çevirili draft dil aktif edilemiyor.
### Faz 12 — Ayarlar / Çeviri editörü