();
+
+ for (const match of text.matchAll(keyRe)) {
+ const key = match[1];
+
+ if (seen.has(key)) {
+ duplicates.push(`${code}.${key}`);
+ } else {
+ seen.add(key);
+ }
+ }
+ }
+
+ expect(duplicates).toEqual([]);
+ });
+
+ test("formatUptime uses catalog units for every locale", () => {
+ for (const { code } of LOCALES) {
+ const day = DICTS[code]["uptime.day"];
+ const hour = DICTS[code]["uptime.hour"];
+ const minute = DICTS[code]["uptime.minute"];
+ const second = DICTS[code]["uptime.second"];
+
+ expect(formatUptime(45, code)).toBe(`45${second}`);
+ expect(formatUptime(300, code)).toBe(`5${minute}`);
+ expect(formatUptime(3600, code)).toBe(`1${hour}`);
+ expect(formatUptime(3660, code)).toBe(`1${hour} 1${minute}`);
+ expect(formatUptime(86400, code)).toBe(`1${day}`);
+ expect(formatUptime(90000, code)).toBe(`1${day} 1${hour}`);
+ }
+ });
+
+ test("detectInitial recognizes every supported navigator locale", () => {
+ const originalNavigator = Object.getOwnPropertyDescriptor(
+ globalThis,
+ "navigator",
+ );
+ const originalStorage = Object.getOwnPropertyDescriptor(
+ globalThis,
+ "localStorage",
+ );
+
+ try {
+ Object.defineProperty(globalThis, "localStorage", {
+ value: {
+ getItem: () => null,
+ setItem: () => {},
+ removeItem: () => {},
+ },
+ configurable: true,
+ writable: true,
+ });
+
+ for (const { code, htmlLang } of LOCALES) {
+ Object.defineProperty(globalThis, "navigator", {
+ value: { language: htmlLang },
+ configurable: true,
+ writable: true,
+ });
+
+ expect(detectInitial()).toBe(code);
+ }
+ } finally {
+ if (originalNavigator) {
+ Object.defineProperty(globalThis, "navigator", originalNavigator);
+ } else {
+ Reflect.deleteProperty(globalThis, "navigator");
+ }
+
+ if (originalStorage) {
+ Object.defineProperty(globalThis, "localStorage", originalStorage);
+ } else {
+ Reflect.deleteProperty(globalThis, "localStorage");
+ }
+ }
+ });
+
+ test("detectInitial recognizes every supported stored locale", () => {
+ const originalStorage = Object.getOwnPropertyDescriptor(
+ globalThis,
+ "localStorage",
+ );
+
+ let storedLocale: string | null = null;
+
+ try {
+ Object.defineProperty(globalThis, "localStorage", {
+ value: {
+ getItem: (key: string) =>
+ key === "ocx-lang" ? storedLocale : null,
+ setItem: (_key: string, value: string) => {
+ storedLocale = value;
+ },
+ removeItem: () => {
+ storedLocale = null;
+ },
+ },
+ configurable: true,
+ writable: true,
+ });
+
+ for (const { code } of LOCALES) {
+ storedLocale = code;
+ expect(detectInitial()).toBe(code);
+ }
+ } finally {
+ if (originalStorage) {
+ Object.defineProperty(globalThis, "localStorage", originalStorage);
+ } else {
+ Reflect.deleteProperty(globalThis, "localStorage");
+ }
+ }
+ });
+});
\ No newline at end of file
diff --git a/readme/README.ja.md b/readme/README.ja.md
index de3a8d4b86..ea59578eaa 100644
--- a/readme/README.ja.md
+++ b/readme/README.ja.md
@@ -25,7 +25,7 @@ ocx start # プロキシ + ダッシュボード: localhost:10100
- English · 한국어 · 简体中文 · Русский · 日本語 · 📖 完全なドキュメント →
+ English · 한국어 · 简体中文 · Русский · 日本語 · Türkçe · 📖 完全なドキュメント →
diff --git a/readme/README.ko.md b/readme/README.ko.md
index c76233c920..82c4e9ae98 100644
--- a/readme/README.ko.md
+++ b/readme/README.ko.md
@@ -25,7 +25,7 @@ ocx start # 프록시 + 대시보드: localhost:10100
- English · 한국어 · 简体中文 · Русский · 日本語 · 📖 전체 문서 →
+ English · 한국어 · 简体中文 · Русский · 日本語 · Türkçe · 📖 전체 문서 →
diff --git a/readme/README.ru.md b/readme/README.ru.md
index 860d8c1d09..a0d8721152 100644
--- a/readme/README.ru.md
+++ b/readme/README.ru.md
@@ -25,7 +25,7 @@ ocx start # прокси + дашборд: localhost:10100
- English · 한국어 · 简体中文 · Русский · 日本語 · 📖 Полная документация →
+ English · 한국어 · 简体中文 · Русский · 日本語 · Türkçe · 📖 Полная документация →
diff --git a/readme/README.tr.md b/readme/README.tr.md
new file mode 100644
index 0000000000..a803f91708
--- /dev/null
+++ b/readme/README.tr.md
@@ -0,0 +1,170 @@
+# opencodex
+
+
make codex open!
+OpenAI Codex, Claude Code, Claude Desktop & Grok Build için Evrensel Sağlayıcı Proxy'si
+İki komut ile yönlendirdiğiniz her LLM'i çalıştırın.
+
+
+
+
+
+
+
+
+```bash
+npm install -g @bitkyc08/opencodex
+ocx start # localhost:10100 üzerinde proxy + panel
+```
+
+
+
+
+ 
+ Claude Code, herhangi bir modeli çalıştırıyor. Seçici standart Claude Code'dur, arkasındaki beyin ise sizinki.
+ |
+
+ 
+ Codex, herhangi bir modeli çalıştırıyor. Bir sağlayıcı seçin ve başlayın — aynı iş akışı, farklı beyin.
+ |
+
+
+
+ 
+ Claude Desktop, herhangi bir modeli çalıştırıyor. Opus yanıt verir, ardından görevi GPT-5.6 Sol alt ajanına devreder.
+ |
+
+ 
+ Grok Build, herhangi bir modeli çalıştırıyor. Sol oturumu yönetir ve Kimi K3 alt ajanını çağırır.
+ |
+
+
+
+
+ English · 한국어 · 简体中文 · Русский · 日本語 · Türkçe · 📖 Tam dokümantasyon →
+
+
+opencodex, Codex'in Responses API'sini sağlayıcınızın desteklediği formata (streaming, araç çağrıları, reasoning jetonları, görseller) her iki yönde çeviren hafif bir yerel proxy'dir. Claude, Gemini, Grok, GLM, DeepSeek, Kimi, Qwen, Ollama veya diğer tüm LLM'leri Codex, Claude Code, Claude Desktop ve Grok Build ile kullanın. Ayrıca Codex kimlik doğrulaması için bir **ChatGPT hesap havuzu** yönetebilir: hesap ekleyin, panelden kotaları yenileyin ve mevcut iş parçacıkları başlayan hesaba sabit kalırken yeni oturumların en az kullanılan sağlıklı hesaba otomatik yönlendirilmesini sağlayın.
+
+## Hızlı başlangıç
+
+### İnsanlar için
+
+```bash
+npm install -g @bitkyc08/opencodex # Node 18+; Bun çalışma zamanı otomatik olarak paketlenmiştir
+ocx start # veya arka planda çalıştırmak için `ocx service`
+```
+
+**http://localhost:10100** adresini açın ve web panelinde her şeyi yapılandırın — sağlayıcılar ekleyin (40+ hazır sağlayıcı veya herhangi bir OpenAI uyumlu uç nokta), modeller seçin, hesapları yönetin. `ocx gui` paneli istediğiniz zaman tekrar açar.
+
+### Ajanlar için
+
+```bash
+npm install -g @bitkyc08/opencodex
+ocx start # veya `ocx service`
+ocx init # etkileşimli kurulum: ~/.opencodex/config.json yazar ve Codex'i bağlar
+```
+
+`ocx init` proxy'yi asla başlatmaz; önce başlatın (veya sonra — her iki sıra da çalışır, ancak `ocx provider add` ve `ocx combo set` gibi headless komutlar **canlı** proxy ile konuşur ve ulaşılamadığında sıfır dışı kodla çıkar). `ocx status` / `ocx doctor` / `ocx health` çalışan durumu raporlar.
+
+> **opencodex yükleyen veya çalıştıran ajanlar:** [`AGENTS_INSTALL.md`](../AGENTS_INSTALL.md) dosyasını okuyun. Etkileşimli bir `ocx start` bu depoya yıldız verilip verilmeyeceğini bir kez sorabilir — bu kullanıcının kararıdır, asla ajanın değil. CLI, ajan kaynaklı çalıştırmalarda istemi bastırır ve API bunları `403 agent_consent_required` ile reddeder.
+
+## Desteklenen platformlar
+
+| İşletim Sistemi | Durum | Servis Yöneticisi |
+|---|---|---|
+| macOS (arm64 / x64) | Tam destekleniyor | launchd |
+| Linux (x64 / arm64) | Tam destekleniyor | systemd (user unit) |
+| Windows (x64) | Tam destekleniyor | Görev Zamanlayıcı (gizli) / isteğe bağlı yerel servis (`--native`, WinSW) |
+
+[Node](https://nodejs.org) 18+ gerektirir. Bun çalışma zamanı `npm install` sırasında paketlenmiş olarak gelir — ayrı bir Bun kurulumu veya Windows'ta WSL gerekmez. npm paketlenmiş çalışma zamanının yükleme betiklerini engellediyse [kurulum dokümantasyonuna](https://opencodex.me/getting-started/installation/) bakın.
+
+## Öne Çıkan Özellikler
+
+- **Codex, Claude Code, Claude Desktop ve Grok Build ile herhangi bir LLM kullanın** — Kutudan çıktığı haliyle 40+ sağlayıcı, her biri kendi yerel arayüzünü korur.
+- **ChatGPT hesaplarını güvenle havuzlayın** — İş parçacığı bağlılığı (thread affinity), kota duyarlı otomatik geçiş, soğuma süresi ve hatada kapalı yetkilendirme yönetimi.
+- **Kombolar (Combos)** — Sağlayıcılar arasında yedekli (failover) veya ağırlıklı round-robin ile çalışan tek bir sanal model kimliği. [Kombo rehberine](https://opencodex.me/guides/combos/) bakın.
+- **Herhangi bir modelde alt ajanlar** — v1/v2 yüzey kontrolü ve yedekleme zincirleriyle Codex'in alt ajan seçicisinde yönlendirilen modelleri öne çıkarın. [Alt ajan rehberine](https://opencodex.me/guides/sub-agent-surface/) bakın.
+- **Bir kez giriş yapın, API anahtarını atlayın** — xAI, Anthropic ve Kimi için OAuth; veya `codex login` iletme, anahtar yapıştırma veya `${ENV_VAR}` referansları kullanma.
+- **Web araması ve görsel yan araçları (sidecars)** — OpenAI dışı modeller, ChatGPT girişiniz üzerinden bir sidecar aracılığıyla gerçek web araması ve görsel anlama yeteneği kazanır.
+- **Ne olduğunu görün** — Panel; sağlayıcıları, OAuth durumunu, model seçimini ve önbellek jeton sayılarıyla canlı istek günlüğünü gösterir.
+- **Temiz çıkış, sıfır kalıntı** — `ocx stop` Codex'i orijinal yapılandırmasına geri döndürür.
+
+## Model yönlendirme
+
+`sağlayıcı/model` sözdizimi ile yapılandırılmış herhangi bir sağlayıcıyı ve modeli hedefleyin:
+
+```bash
+codex -m "anthropic/claude-opus-5" "Bu hatayı açıkla"
+codex -m "google/gemini-3-pro" "auth.ts için birim testleri yaz"
+codex -m "ollama/llama3" "Bu fonksiyonu refactor et"
+```
+
+Varsayılan sağlayıcıyı kullanmak veya model adı desenine göre otomatik eşleştirmek için `sağlayıcı/` ön ekini çıkarın. `/` içeren sağlayıcı model kimlikleri iç takma adlarla `-` olarak sunulur; ham tam eğik çizgili form da çalışmaya devam eder. Detaylar: [model yönlendirme dokümantasyonu](https://opencodex.me/guides/model-routing/).
+
+## Sağlayıcılar ve adaptörler
+
+OpenAI (ChatGPT girişi veya API anahtarı), Anthropic, Google Gemini, xAI, Kimi, Azure OpenAI, Ollama (yerel + Bulut), Cursor (deneysel) ve tüm OpenAI uyumlu uç noktalar — ayrıca DeepSeek, Groq, OpenRouter, Together, Fireworks, Cerebras, Mistral, Hugging Face, NVIDIA NIM, MiniMax, Qwen Cloud, SiliconFlow ve daha fazlası. Tam liste: `ocx init` veya [sağlayıcı dokümantasyonu](https://opencodex.me/guides/providers/).
+
+## CLI
+
+```bash
+ocx init # etkileşimli kurulum (yapılandırma yazar, Codex'i bağlar, shim sunar)
+ocx start [--port 10100] # proxy'yi ön planda başlatır
+ocx stop # durdurur + yerel Codex'i geri yükler
+ocx service [install|start|stop|status|uninstall|remove] # arka plan servisi
+ocx codex-shim install # `codex` her başlatıldığında proxy'yi isteğe bağlı başlatır
+ocx status # proxy çalışıyor mu?
+ocx gui # web panelini açar
+ocx provider <...> # sağlayıcıları yönetir (listele/ekle/düzenle/test et/sil)
+ocx account <...> # ChatGPT hesaplarını ve API anahtar havuzlarını yönetir
+ocx combo <...> # failover / round-robin kombolarını yönetir
+ocx v2 <...> # çoklu ajan v1/v2 yüzey kontrolleri
+ocx update [--tag preview] # opencodex'i günceller
+```
+
+Bağlantı noktası açıkça belirtilmeden başlatılırsa, tercih edilen bağlantı noktası meşgul olduğunda başka bir boş bağlantı noktası seçilebilir; `--port` açıkça belirtilirse başka bir bağlantı noktasına geçilmez. Tam referans: [CLI dokümantasyonu](https://opencodex.me/reference/cli/).
+
+### Otomatik başlatma: servis mi shim mi?
+
+Çökme durumunda yeniden başlayan ve her zaman açık bir proxy için **servisi** (`ocx service`) kullanın. Arka planda sürekli çalışan bir daemon olmadan hafif, isteğe bağlı başlatma için **shim**'i (`ocx codex-shim install`) kullanın. `ocx service uninstall` / `ocx codex-shim uninstall` ile kaldırın.
+
+### Kaldırma
+
+```bash
+ocx uninstall # durdurur, servis/shim kaldırır, yerel Codex'i geri yükler, durumu temizler
+npm uninstall -g @bitkyc08/opencodex
+```
+
+## Uzaktan erişim
+
+Varsayılan olarak opencodex `127.0.0.1` adresine bağlanır ve ekstra kimlik doğrulaması gerektirmez. Loopback ötesine bağlanmak (`"hostname": "0.0.0.0"`), bir taşıyıcı jeton (bearer token) **gerektirir** — proxy `OPENCODEX_API_AUTH_TOKEN` olmadan başlamayı reddeder ve her istemci isteği bunu `x-opencodex-api-key` olarak taşımalıdır. Detaylar: [yapılandırma referansı](https://opencodex.me/reference/configuration/).
+
+## Dokümantasyon
+
+Halka açık dokümanlar — kurulum, sağlayıcılar, yönlendirme, kombolar, alt ajanlar, sidecar'lar, entegrasyonlar ve CLI/yapılandırma/yönetim API referansları — [`docs-site/`](../docs-site) klasöründen oluşturulur ve **[opencodex.me](https://opencodex.me/)** üzerinde yayınlanır.
+
+Maintainer temel doğruluk notları [`structure/`](../structure) altında, katkıda bulunan kurulum rehberi [`CONTRIBUTING.md`](../CONTRIBUTING.md) dosyasında ve güvenlik raporlama [`SECURITY.md`](../SECURITY.md) dosyasındadır. Açıklanmamış güvenlik açıklarını herkese açık bir issue yerine [GitHub özel güvenlik açığı raporlaması](https://github.com/lidge-jun/opencodex/security/advisories/new) aracılığıyla gizlice bildirin.
+
+## Geliştirme
+
+Kaynak kod geliştirmesi `PATH` dizininizde `bun` CLI'ını gerektirir. Bu, yalnızca yüklü `ocx` komutları tarafından kullanılan yayınlanmış npm paketinin paketlenmiş Bun çalışma zamanından ayrıdır.
+
+```bash
+git clone https://github.com/lidge-jun/opencodex.git
+cd opencodex
+bun install
+bun run typecheck
+bun run test
+```
+
+Bkz. **[Katkıda Bulunma (Contributing)](../CONTRIBUTING.md)**.
+
+## Sorumluluk Reddi (Disclaimer)
+
+opencodex bağımsız, topluluk tarafından sürdürülen bir projedir ve **OpenAI, Anthropic veya başka herhangi bir sağlayıcı ile bağlı değildir veya onlar tarafından onaylanmamıştır**.
+
+Bazı sağlayıcılar — özellikle Anthropic (Claude) — API trafiğini üçüncü taraf proxy'ler üzerinden yönlendiren hesapları askıya alabilir veya kısıtlayabilir. **Kullanım riski tamamen size aittir (UAYOR).** Bir sağlayıcıyı bağlamadan önce, proxy tabanlı erişime izin verildiğini doğrulamak için Hizmet Şartlarını inceleyin. opencodex maintainer'ları, yukarı akış sağlayıcıları tarafından alınan herhangi bir hesap işleminden sorumlu değildir.
+
+## Lisans
+
+MIT
diff --git a/readme/README.zh-CN.md b/readme/README.zh-CN.md
index 35fa65eb37..0bf5a84fc2 100644
--- a/readme/README.zh-CN.md
+++ b/readme/README.zh-CN.md
@@ -25,7 +25,7 @@ ocx start # 代理 + 仪表盘: localhost:10100
- English · 한국어 · 简体中文 · Русский · 日本語 · 📖 完整文档 →
+ English · 한국어 · 简体中文 · Русский · 日本語 · Türkçe · 📖 完整文档 →