4.2 KiB
title, status, completed_at
| title | status | completed_at |
|---|---|---|
| I18n Faz 8 — API v1 ve mobil hazırlık | completed | 2026-07-19 |
I18n Faz 8 — API v1 ve mobil hazırlık
Bu fazda self-host instance içindeki dil modeli, gelecekteki React Native istemcilerinin güvenli şekilde keşfedebileceği bir API v1 sözleşmesine taşındı. Değişiklikler geriye uyumludur; mevcut v1 response alanları değiştirilmedi, sadece additive alanlar eklendi.
Tamamlananlar
instance.localizationcapability kaydı eklendi./.well-known/netadiscovery document içine additive locale özeti eklendi./api/v1/metaiçinde localization contract genişletildi:supportedLocalesfallbackscatalogVersionnegotiatorresponseContract
/api/v1/meresponse'u kullanıcının dil bilgisini ayrı döner:languageportalLocaleresolvedLocalerequestedLocalesourcefallbackChain
Accept-Languageparser ve locale negotiation helper'ı eklendi.- Gelecek resource endpoint'leri için localized response contract'ı yazıldı.
- Owner mutation contract'ında
translationsshape'i standartlaştırıldı:Record<locale, Record<field, string | null>>. UNSUPPORTED_LOCALEhata kodu API response mapping'e eklendi.- API hata response'larında client localization için
messageKeykullanımı netleştirildi. tr,en,friçin contract fixture'ları eklendi.i18n:phase8-smokemobile localization negotiation ve contract shape'lerini runtime olarak doğrulayacak şekilde eklendi.
Mobil istemci davranışı
Mobil istemci ilk açılışta /.well-known/neta endpoint'ine gider ve
instance.localization capability'sini kontrol eder. Capability bilinmiyorsa
istemci bunu fatal hata olarak ele almamalı; capability listesi additive olduğu
için unknown capability değerleri yok sayılmalıdır.
Dil seçimi için önerilen sıra:
- Kullanıcının explicit seçimi varsa
/api/v1/me?locale=xxile gönder. - Explicit seçim yoksa
Accept-Languageheader'ını gönder. - Server
/api/v1/me.data.localization.resolvedLocaledeğerini gerçek kaynak kabul et.
locale query param'ı aktif olmayan bir locale'e işaret ederse API
UNSUPPORTED_LOCALE döner. Accept-Language içinde desteklenmeyen değer varsa
server sessizce instance default locale'e düşebilir.
Hata response'larında kullanıcıya gösterilecek metin mobile client tarafından
locale'e göre çözülmelidir. Server bu amaçla error.details.messageKey
alanını döndürür:
{
"ok": false,
"error": {
"code": "UNSUPPORTED_LOCALE",
"message": "Unsupported locale.",
"details": {
"messageKey": "validation.unsupportedLocale",
"requestedLocale": "fr"
}
}
}
Resource response contract
Gelecek /api/v1/projects, /api/v1/tasks, /api/v1/clients gibi resource
endpoint'leri şu shape'i kullanmalı:
{
resource: TResource;
localized: TResource;
locale: string;
fallbackChain: string[];
}
Bu contract sayesinde mobil taraf original kaydı ve locale çözülmüş kaydı aynı anda taşıyabilir.
Mutation translations contract
Owner/freelancer mutation endpoint'leri çok dilli alanları şu shape ile kabul etmeli:
{
translations: {
tr: { name: "Marka sitesi", description: "..." },
en: { name: "Brand website", description: "..." },
fr: { name: "Site de marque", description: "..." }
}
}
Server sadece authorized owner mutation'larında bu alanı kabul eder. Müşteri
portal oturumu translations mutation contract'ını kullanamaz; portal locale
yalnızca kendi okuma response'unu etkiler.
Cache ve URL notları
/.well-known/netave/api/v1/metapublic cache kullanır.- Metadata içindeki URL'ler
APP_URLüzerinden absolute üretilir. - Locale catalog değişikliklerinde
catalogVersionartacağı için mobil istemci meta cache'ini güvenli şekilde invalidate edebilir.
Fixture'lar
docs/self-hosted-redesign/i18n-phase-8-fixtures/api-v1-locale-tr.jsondocs/self-hosted-redesign/i18n-phase-8-fixtures/api-v1-locale-en.jsondocs/self-hosted-redesign/i18n-phase-8-fixtures/api-v1-locale-fr.json
Verification
Çalıştırılan komutlar:
pnpm i18n:phase8-smoke
pnpm typecheck
pnpm build
pnpm phase9:smoke
git diff --check