From c03f6d84b83e8fdcadd0bb5b7e57741480c321ac Mon Sep 17 00:00:00 2001 From: fitzgpt Date: Mon, 14 Sep 2026 21:49:03 +0300 Subject: [PATCH] feat(i18n): add Turkish localization to the web UI --- web/src/lib/i18n/index.ts | 4 +- web/src/lib/i18n/translations.ts | 151 +++++++++++++++++++++++++++++++ 2 files changed, 153 insertions(+), 2 deletions(-) diff --git a/web/src/lib/i18n/index.ts b/web/src/lib/i18n/index.ts index deba563..5b93b7f 100644 --- a/web/src/lib/i18n/index.ts +++ b/web/src/lib/i18n/index.ts @@ -8,7 +8,7 @@ import { } from "react"; import { translations, type Lang, type TranslationKey } from "./translations"; -const LANGS: Lang[] = ["en", "zh", "ar"]; +const LANGS: Lang[] = ["en", "zh", "ar", "tr"]; export type TranslateFn = ( key: TranslationKey | string, @@ -18,7 +18,7 @@ export type TranslateFn = ( function readLang(): Lang { if (typeof window === "undefined") return "en"; const stored = localStorage.getItem("opencode-mem-lang"); - if (stored === "en" || stored === "zh" || stored === "ar") return stored; + if (stored === "en" || stored === "zh" || stored === "ar" || stored === "tr") return stored; return "en"; } diff --git a/web/src/lib/i18n/translations.ts b/web/src/lib/i18n/translations.ts index 5d7127d..15b561b 100644 --- a/web/src/lib/i18n/translations.ts +++ b/web/src/lib/i18n/translations.ts @@ -484,6 +484,157 @@ export const translations = { "auth-warning-text": "التحرير عبر المصادر معطّل. قم بتعيين webServerAuthPassword لتفعيله.", }, + tr: { + title: "OpenCode Hafıza Gezgini", + brand: "opencode-mem", + "tab-project": "PROJE HAFIZASI", + "tab-profile": "KULLANICI PROFİLİ", + "nav-menu": "Menü", + "nav-close": "Menüyü kapat", + "nav-language": "Dil", + "nav-theme": "Tema", + "theme-dark": "Koyu", + "theme-light": "Açık", + "label-tag": "Etiket:", + "label-type": "Tür:", + "label-tags": "Etiketler:", + "label-content": "İçerik:", + "btn-cleanup": "Temizle", + "btn-deduplicate": "Yinelenenleri kaldır", + "btn-delete-selected": "Seçilenleri sil", + "btn-select-all": "Sayfayı seç", + "btn-deselect-all": "Seçimi kaldır", + "btn-add-memory": "Hafıza ekle", + "section-project": "Proje hafızası ({count})", + "section-profile": "Kullanıcı profili", + "section-add": "Yeni hafıza ekle", + "opt-all-tags": "Tüm etiketler", + "opt-select-tag": "Etiket seç", + "opt-other": "diğer (other)", + "opt-feature": "özellik (feature)", + "opt-bug-fix": "hata düzeltme (bug-fix)", + "opt-refactor": "yeniden düzenleme (refactor)", + "opt-architecture": "mimari (architecture)", + "opt-rule": "kural (rule)", + "opt-documentation": "dokümantasyon (documentation)", + "opt-discussion": "tartışma (discussion)", + "opt-analysis": "analiz (analysis)", + "opt-configuration": "yapılandırma (configuration)", + "modal-edit-title": "Hafızayı düzenle", + "modal-migration-title": "Hafıza etiketleme geçişi", + "modal-changelog-title": "Profil sürüm geçmişi", + "btn-cancel": "İptal", + "btn-save": "Değişiklikleri kaydet", + "btn-start-migration": "Geçişi başlat", + "loading-init": "Başlatılıyor...", + "loading-profile": "Profil yükleniyor...", + "loading-changelog": "Değişiklik günlüğü yükleniyor...", + "migration-mismatch": "Model boyut uyumsuzluğu algılandı!", + "migration-understand": + "Bu işlemin geri alınamaz olduğunu ve saklanan tüm hafızaları etkileyeceğini anlıyorum", + "btn-fresh-start": "Yeni başlangıç (tümünü sil)", + "btn-reembed": "Yeniden gömme (verileri koru)", + "migration-note": + "Lütfen tarayıcıyı kapatmayın. Hafızalarınız arama doğruluğunu artırmak için teknik etiketlerle yeniden vektörlenecek.", + "placeholder-search": "Hafızalarda ara...", + "placeholder-tags": "react, hooks, auth (virgülle ayrılmış)", + "placeholder-content": "Hafıza içeriğini girin...", + "toast-add-success": "Hafıza başarıyla eklendi", + "toast-add-error": "İçerik ve etiket zorunludur", + "toast-add-failed": "Hafıza eklenemedi", + "toast-delete-success": "Hafıza başarıyla silindi", + "toast-delete-failed": "Hafıza silinemedi", + "toast-update-success": "Hafıza başarıyla güncellendi", + "toast-update-failed": "Hafıza güncellenemedi", + "toast-cleanup-success": "Temizleme başarıyla tamamlandı", + "toast-cleanup-failed": "Temizleme başarısız oldu", + "toast-dedup-success": "Yinelenenleri kaldırma tamamlandı", + "toast-dedup-failed": "Yinelenenleri kaldırma başarısız oldu", + "toast-bulk-delete-success": "Seçilen hafızalar başarıyla silindi", + "toast-bulk-delete-failed": "Seçilen hafızalar silinemedi", + "toast-migration-success": "Geçiş başarıyla tamamlandı", + "toast-migration-failed": "Geçiş başarısız oldu", + "toast-fresh-start-success": "Yeni başlangıç başarıyla tamamlandı", + "toast-fresh-start-failed": "Yeni başlangıç başarısız oldu", + "confirm-delete": "Bu hafıza silinsin mi?", + "confirm-delete-title": "Silmeyi onayla", + "confirm-delete-pair": "Bu hafıza VE bağlı olduğu istem silinsin mi?", + "confirm-delete-prompt": "Bu istem VE bağlı olduğu hafıza silinsin mi?", + "confirm-bulk-delete": "Seçilen {count} hafıza silinsin mi?", + "confirm-cleanup": "Bu işlem, artık geçerli olmayan tüm hafızaları kaldırır. Devam edilsin mi?", + "confirm-dedup": + "Bu işlem, yinelenen veya birbirine çok benzer hafızaları birleştirir. Devam edilsin mi?", + "text-selected": "{count} seçili", + "text-page": "Sayfa {current} / {total}", + "text-total": "Toplam: {count}", + "empty-memories": "Hafıza bulunamadı", + "empty-changelog": "Değişiklik günlüğü yok", + "status-cleanup": "Temizleme çalışıyor...", + "status-dedup": "Yinelenenleri kaldırma çalışıyor...", + "status-migration-init": "Geçiş hazırlanıyor...", + "status-migration-progress": "Geçiş sürüyor... {current}/{total}", + "profile-version": "SÜRÜM", + "profile-prompts": "İSTEMLER", + "profile-updated": "SON GÜNCELLEME", + "profile-preferences": "TERCİHLER", + "profile-type-pref": "Tercih", + "profile-type-pat": "Desen", + "profile-type-wf": "Akış", + "profile-patterns": "DESENLER", + "profile-workflows": "İŞ AKIŞLARI", + "label-evidence-tooltip": "AI analizi {count} kez yakaladı", + "badge-prompt": "KULLANICI İSTEMİ", + "badge-memory": "HAFIZA", + "badge-pinned": "SABİTLENDİ", + "badge-linked": "BAĞLI", + "date-created": "Oluşturma:", + "date-updated": "Güncelleme:", + "empty-preferences": "Henüz öğrenilen tercih yok", + "empty-patterns": "Henüz algılanan desen yok", + "empty-workflows": "Henüz tanımlanan iş akışı yok", + "btn-delete-pair": "Çifti sil", + "btn-edit": "Düzenle", + "btn-delete": "Sil", + "label-category": "Kategori", + "label-description": "Açıklama", + "label-steps": "Adımlar", + "btn-add-step": "+ Adım ekle", + "text-generated-above": "Yukarıdaki hafızadan üretildi", + "text-from-below": "Aşağıdaki istemden", + "btn-refresh": "Yenile", + "btn-ai-cleanup": "AI temizleme", + "label-ai-cleanup-title": "AI profil temizliği", + "label-ai-cleanup-loading": "AI profili analiz ediyor...", + "label-ai-cleanup-merged": "Birleştirilen", + "label-ai-cleanup-removed": "Kaldırılan", + "label-ai-cleanup-kept": "Kalan", + "label-ai-cleanup-none": "Yok", + "label-ai-cleanup-select-all": "Tümünü seç", + "label-ai-cleanup-deselect-all": "Seçimi temizle", + "label-ai-cleanup-apply": "Değişiklikleri uygula", + "label-ai-cleanup-merge-check": "Birleştir", + "label-ai-cleanup-remove-check": "Kaldır", + "label-ai-cleanup-changes-selected": "{selected}/{total} değişiklik seçildi", + "label-ai-cleanup-merged-header": "Birleştirilen ({count} grup)", + "label-ai-cleanup-removed-header": "Kaldırılan ({count} öğe)", + "btn-apply": "Uygula", + "toast-ai-cleanup-success": "Profil temizliği tamamlandı", + "toast-ai-cleanup-failed": "AI temizleme başarısız oldu", + "toast-cleanup-apply-failed": "Temizlik uygulanamadı", + "label-ai-cleanup-select": "Temizlik analizi için öğe seçin", + "label-ai-cleanup-select-low": "Düşük sıklık (≤3)", + "label-ai-cleanup-select-same-cat": "Aynı kategoridekiler", + "label-ai-cleanup-analyze": "Seçilenleri analiz et", + "label-ai-cleanup-selected": "{count} seçili", + "migration-found-tags": "Teknik etiket gerektiren {count} hafıza bulundu.", + "migration-stopped": "Geçiş durduruldu: maksimum deneme sayısına ulaşıldı", + "migration-shards-mismatch": "{count} parçada farklı boyutlar var", + "migration-dimension-mismatch": "boyut uyumsuzluğu algılandı", + "migration-mismatch-details": + "Model uyumsuzluğu: Yapılandırma {configDimensions}D ({configModel}) kullanıyor, ancak {shardInfo}.", + "auth-warning-text": + "Çapraz kaynak düzenleme devre dışı. Etkinleştirmek için webServerAuthPassword ayarlayın.", + }, } as const; export type Lang = keyof typeof translations; export type TranslationKey = keyof typeof translations.en;