/** * Arayüz metinleri (tr-TR). Kullanıcıya görünen tüm metinler burada toplanır. * Şimdilik tek dil; ileride çok dil gerekirse bu nesnenin şekli sözleşme olur. */ export const tr = { app: { name: "BÜTÇEM", tagline: "Aile bütçesi, birikim, ev stoğu ve akıllı alışveriş", version: "Sürüm", }, common: { save: "Kaydet", cancel: "Vazgeç", close: "Kapat", delete: "Sil", edit: "Düzenle", create: "Oluştur", search: "Ara", actions: "İşlemler", loading: "Yükleniyor…", comingSoon: "Yakında", required: "Bu alan zorunlu", yes: "Evet", no: "Hayır", previous: "Önceki", next: "Sonraki", noResults: "Sonuç bulunamadı.", page: (current: number, total: number) => `Sayfa ${current} / ${total}`, rowsPerPage: "Sayfa başına", totalRows: (n: number) => `Toplam ${n} kayıt`, showPassword: "Şifreyi göster", hidePassword: "Şifreyi gizle", genericError: "Beklenmeyen bir hata oluştu. Lütfen tekrar deneyin.", unauthorized: "Bu işlem için yetkiniz yok.", notFound: "Kayıt bulunamadı.", }, swatches: { blue: "Mavi", sky: "Gök mavisi", teal: "Turkuaz", green: "Yeşil", lime: "Fıstık yeşili", amber: "Kehribar", orange: "Turuncu", red: "Kırmızı", rose: "Gül", pink: "Pembe", purple: "Mor", indigo: "Çivit", slate: "Gri", }, theme: { label: "Tema", light: "Açık", dark: "Koyu", system: "Sistem", }, nav: { main: "Menü", dashboard: "Ana sayfa", transactions: "İşlemler", accounts: "Hesaplar", categories: "Kategoriler", budget: "Bütçe", planned: "Planlı işlemler", contacts: "Cari hesaplar", savings: "Birikim", stock: "Ev stoğu", shopping: "Alışveriş", reports: "Raporlar", settings: "Ayarlar", more: "Daha fazla", admin: "Yönetim", adminUsers: "Kullanıcılar", adminHouseholds: "Haneler", toggleSidebar: "Menüyü aç/kapat", }, household: { label: "Aktif hane", select: "Hane seçin", roles: { owner: "Sahip", member: "Üye", viewer: "İzleyici" }, roleHints: { owner: "Hane ayarları, üyeler ve hesaplar", member: "İşlem girer, liste ve stok günceller", viewer: "Yalnızca görüntüler", }, switched: (name: string) => `Aktif hane: ${name}`, }, households: { lastOwner: "Hanenin son sahibi düşürülemez veya çıkarılamaz.", noHousehold: { title: "Henüz bir haneye üye değilsiniz", description: "Bütçe ve diğer verileri görmek için bir haneye üye olmanız gerekir. Yöneticiden sizi bir haneye eklemesini isteyin.", adminHint: "Yönetici olarak Yönetim › Haneler sayfasından hane oluşturabilir ve üye ekleyebilirsiniz.", adminLink: "Hanelere git", }, viewerReadOnly: "İzleyici rolündesiniz; bu hanede değişiklik yapamazsınız.", }, settings: { title: "Ayarlar", description: "Aktif hanenin ayarları ve üyeleri.", household: "Hane", householdDescription: "Bütçe ve planlama tercihleri tüm hane için geçerlidir.", ownerOnly: "Bu ayarları yalnızca hane sahipleri değiştirebilir.", fields: { name: "Hane adı", budgetMonthStartDay: "Bütçe ayı başlangıç günü", budgetMonthStartDayHint: "1 = takvim ayı. Örneğin 15 seçilirse bütçe ayı her ayın 15. günü başlar.", installmentBudgetMode: "Taksitlerin bütçeye etkisi", installmentModes: { per_installment: "Her taksit kendi ayına", purchase_month: "Tamamı harcama ayına", }, dailyPlanMode: "Günlük plan dağıtımı", dailyPlanModes: { even: "Değişken bütçe günlere eşit", previous_month_pattern: "Önceki ayın harcama örüntüsüne göre", }, includePrivateAccountsInTotals: "“Yalnızca ben” hesapları hane toplamlarına dahil edilsin", extraStoreSavingThreshold: "Ek mağaza tasarruf eşiği (TL)", extraStoreSavingThresholdHint: "Alışveriş planlayıcı, ek bir mağazayı yalnızca tasarruf bu tutarı aşarsa önerir.", }, saved: "Hane ayarları kaydedildi.", members: "Üyeler", membersDescription: "Hane içi roller. Yeni üyeyi yönetici ekler.", memberActions: (name: string) => `${name} — işlemler`, changeRole: "Rolü değiştir", removeMember: "Haneden çıkar", removeTitle: "Üye haneden çıkarılsın mı?", removeDescription: (name: string, household: string) => `${name}, “${household}” hanesine artık erişemeyecek. Kullanıcı hesabı silinmez.`, removeConfirm: "Haneden çıkar", roleChanged: (name: string) => `${name} için rol güncellendi.`, memberRemoved: (name: string) => `${name} haneden çıkarıldı.`, banned: "Askıda", }, accounts: { title: "Hesaplar", description: "Nakit, banka, birikim, kredi kartı ve yemek kartı hesapları.", newAccount: "Yeni hesap", createTitle: "Yeni hesap", editTitle: "Hesabı düzenle", formDescription: "Güncel bakiye işlemlerden hesaplanır; açılış bakiyesi başlangıç noktasıdır.", types: { cash: "Nakit", bank: "Vadesiz banka", savings: "Birikim / vadeli", credit_card: "Kredi kartı", meal_card: "Yemek kartı", }, typeGroups: { cash: "Nakit", bank: "Banka hesapları", savings: "Birikim hesapları", credit_card: "Kredi kartları", meal_card: "Yemek kartları", }, providers: { pluxee: "Pluxee (Sodexo)", multinet: "Multinet", edenred: "Edenred (Ticket)", setcard: "Setcard", metropol: "Metropol", other: "Diğer", }, fields: { name: "Hesap adı", type: "Tür", typeLockedHint: "Hesap türü oluşturulduktan sonra değiştirilemez.", institution: "Banka / kurum", institutionPlaceholder: "ör. Ziraat Bankası", provider: "Kart sağlayıcısı", openingBalance: "Açılış bakiyesi (TL)", openingDebt: "Açılış borcu (TL)", openingBalanceHint: "Banka hesabı KMH kullanıyorsa eksi girilebilir (ör. -2.500,00).", openingDebtHint: "Karttaki mevcut toplam borç; pozitif girin.", openingDate: "Açılış tarihi", owner: "Hesap sahibi", ownerNone: "— Ortak hesap —", isPrivate: "Yalnızca ben (bakiyeyi yalnızca hesap sahibi görür)", appearance: "Görünüm", advanced: "Gelişmiş ayarlar", overdraft: "Esnek hesap (KMH)", overdraftEnabled: "Bu hesapta KMH var", overdraftLimit: "KMH limiti (TL)", overdraftRate: "Aylık faiz oranı (%)", overdraftStatementDay: "Hesap kesim günü", card: "Kart bilgileri", cardLimit: "Kart limiti (TL)", cardStatementDay: "Hesap kesim günü", cardStatementDayHint: "Ayda o gün yoksa (ör. 31) ayın son günü kullanılır.", cardDueKind: "Son ödeme günü", dueKinds: { daysAfter: "Kesimden N gün sonra", fixedDay: "Ayın sabit günü" }, cardDueValueDays: "Gün sayısı", cardDueValueDay: "Ayın günü", cardPaymentAccount: "Ödeme hesabı", cardPaymentAccountNone: "— Seçilmedi —", }, summary: { assets: "Varlıklar", cardDebt: "Kart borçları", net: "Net", includesHidden: "Toplamlara gizli hesaplar dahil.", excludesHidden: "Gizli hesaplar toplamlara dahil değil (hane ayarı).", }, balance: "Bakiye", debt: "Borç", hidden: "Gizli", hiddenHint: "Bu hesap “yalnızca ben” olarak işaretli; bakiyeyi yalnızca hesap sahibi görür.", privateBadge: "Yalnızca ben", overdraftBadge: (limit: string) => `KMH ${limit}`, limitLabel: (limit: string) => `Limit ${limit}`, statementLabel: (day: number) => `Kesim: ${day}`, empty: "Henüz hesap yok.", emptyOwnerHint: "Başlamak için ilk hesabınızı ekleyin (ör. nakit cüzdan, maaş hesabı).", archivedSection: (n: number) => `Arşivlenmiş hesaplar (${n})`, archive: "Arşivle", unarchive: "Arşivden çıkar", archiveTitle: "Hesap arşivlensin mi?", archiveDescription: (name: string) => `“${name}” yeni işlemlerde seçilemez; geçmiş işlemler ve raporlar korunur. İstediğiniz zaman arşivden çıkarabilirsiniz.`, created: (name: string) => `${name} oluşturuldu.`, updated: (name: string) => `${name} güncellendi.`, archivedToast: (name: string) => `${name} arşivlendi.`, unarchivedToast: (name: string) => `${name} arşivden çıkarıldı.`, ownerNotMember: "Hesap sahibi bu hanenin üyesi olmalı.", invalidPaymentAccount: "Ödeme hesabı bu hanedeki aktif bir banka, nakit veya birikim hesabı olmalı.", typeLocked: "Hesap türü değiştirilemez.", ownerOnly: "Hesapları yalnızca hane sahipleri yönetebilir.", }, transactions: { title: "İşlemler", description: "Gelir, gider ve transferler.", new: "Yeni işlem", types: { expense: "Gider", income: "Gelir", transfer: "Transfer" }, statuses: { posted: "Gerçekleşti", planned: "Planlı", void: "İptal" }, createTitle: { expense: "Yeni gider", income: "Yeni gelir", transfer: "Yeni transfer" }, editTitle: "İşlemi düzenle", copyTitle: "İşlemi kopyala", fields: { amount: "Tutar", date: "Tarih", account: "Hesap", fromAccount: "Kaynak hesap", toAccount: "Hedef hesap", category: "Kategori", selectCategory: "Kategori seçin", selectAccount: "Hesap seçin", payee: "Satıcı / karşı taraf", payeePlaceholder: "ör. Migros", description: "Açıklama", tags: "Etiketler", tagsHint: "Virgülle ayırın (ör. tatil, indirim)", advanced: "Gelişmiş: ek, etiket, bölme", split: "Bölünmüş işlem", splitHint: "Tutarı birden çok kategoriye bölün; kalemlerin toplamı tutara eşit olmalı.", addSplit: "Kalem ekle", removeSplit: "Kalemi kaldır", splitNote: "Not", remaining: "Kalan", remainingOk: "Kalemler toplamı tutara eşit", fillRemaining: "Kalanı son kaleme ekle", suggested: "Bu satıcı için son kullanılan kategori ve hesap önerildi.", }, validation: { amountPositive: "Tutar sıfırdan büyük olmalı", selectAccount: "Hesap seçin", selectToAccount: "Hedef hesabı seçin", sameAccount: "Kaynak ve hedef hesap aynı olamaz", selectCategory: "Kategori seçin", splitMin: "Bölünmüş işlemde en az 2 kalem olmalı", splitSum: "Kalemlerin toplamı tutara eşit olmalı", accountInvalid: "Hesap bu hanede yok, arşivli veya size kapalı.", categoryInvalid: "Kategori bu hanede yok, arşivli veya işlem türüyle uyuşmuyor.", }, list: { empty: "Bu filtrelerle işlem bulunamadı.", emptyAll: "Henüz işlem yok.", split: (n: number) => `Bölünmüş · ${n} kalem`, transfer: (from: string, to: string) => `${from} → ${to}`, dayTotal: "Günlük net", total: (n: number) => `${n} işlem`, sums: { income: "Gelir", expense: "Gider", net: "Net" }, hiddenAccount: "Gizli hesap", }, filters: { title: "Filtreler", open: "Filtrele", apply: "Uygula", clear: "Temizle", from: "Başlangıç", to: "Bitiş", type: "Tür", account: "Hesap", category: "Kategori", person: "Ekleyen", status: "Durum", min: "En az (TL)", max: "En çok (TL)", tag: "Etiket", search: "Ara", searchPlaceholder: "Açıklama, satıcı veya not…", all: "Tümü", active: (n: number) => `${n} filtre`, }, detail: { title: "İşlem ayrıntısı", lines: "Kalemler", createdBy: "Ekleyen", updatedBy: "Son düzenleyen", createdAt: "Oluşturulma", }, actions: { edit: "Düzenle", copy: "Kopyala", delete: "Sil", restore: "Geri al" }, toast: { created: "İşlem kaydedildi.", updated: "İşlem güncellendi.", deleted: "İşlem silindi.", restored: "İşlem geri alındı.", }, deleteTitle: "İşlem silinsin mi?", deleteDescription: "İşlem listeden ve bakiyelerden kaldırılır. Bildirimdeki “Geri al” ile geri getirebilirsiniz.", export: "CSV indir", csv: { header: [ "İşlem No", "Tarih", "Tür", "Durum", "Hesap", "Hedef hesap", "Kategori", "Satıcı", "Açıklama", "Kalem notu", "Etiketler", "Tutar", "Ekleyen", ], filename: (date: string) => `butcem-islemler-${date}.csv`, }, adjustment: "Mutabakat düzeltmesi", adjustmentReadOnly: "Mutabakat düzeltmesi düzenlenemez; gerekirse silip mutabakatı yeniden yapın.", reconciled: "Mutabakatı yapıldı", readOnly: "İzleyici rolündesiniz; işlem ekleyemezsiniz.", noAccounts: "İşlem girmek için önce bir hesap gerekli.", noAccountsLink: "Hesaplara git", }, recurring: { title: "Planlı işlemler", description: "Düzenli ve planlı gelir/giderler. Planlı kayıtlar bakiyeyi etkilemez; onaylanınca gerçekleşir.", newRule: "Yeni düzenli işlem", createTitle: "Yeni düzenli işlem", editTitle: "Düzenli işlemi düzenle", tabs: { upcoming: "Yaklaşan", overdue: "Vadesi geçmiş", rules: "Kurallar" }, fields: { estimate: "Tutar tahmini (ör. fatura); onaylarken düzeltilir", startDate: "İlk tarih", frequency: "Sıklık", interval: "Kaç birimde bir", monthlyMode: "Ayın hangi günü", end: "Bitiş", count: "Tekrar sayısı", endDate: "Bitiş tarihi", preview: "İlk tarihler", }, frequencies: { daily: "Günlük", weekly: "Haftalık", monthly: "Aylık", yearly: "Yıllık" }, units: { daily: "gün", weekly: "hafta", monthly: "ay", yearly: "yıl" }, monthlyModes: { day: "İlk tarihin günü", last: "Ayın son günü" }, endKinds: { never: "Bitiş yok", count: "Tekrar sayısı", date: "Bitiş tarihi" }, actions: { confirm: "Onayla", skip: "Atla", postpone: "Ertele", edit: "Düzenle", delete: "Sil", more: "Diğer işlemler", }, confirmTitle: "İşlemi onayla", confirmDescription: "Gerçekleşen tutarı ve tarihi kontrol edin; onaylanınca bakiyeye yansır.", postponeTitle: "Ertele", postponeDate: "Yeni tarih", scopeTitle: "Hangi kayıtlar değişsin?", scopes: { one: "Yalnızca bu", following: "Bu ve sonrakiler", all: "Tümü" }, scopeHints: { one: "Yalnızca bu planlı kayıt değişir; seri aynı kalır.", following: "Seri bu tarihten itibaren yeni değerlerle devam eder.", all: "Onaylanmamış tüm planlı kayıtlar yeni değerlerle yeniden oluşturulur. Gerçekleşmiş kayıtlar değişmez.", }, deleteTitle: "Düzenli işlem silinsin mi?", deleteDescription: "Gerçekleşmiş kayıtlar korunur; yalnızca onaylanmamış planlı kayıtlar silinir.", deleteScopes: { following: "Bu ve sonrakileri sil", all: "Tüm seriyi sil" }, estimate: "Tahmini", next: (date: string) => `Sıradaki: ${date}`, remaining: (n: number) => `${n} tekrar kaldı`, endless: "Süresiz", series: (pos: string) => `${pos}`, empty: { upcoming: "Önümüzdeki 60 günde planlı işlem yok.", overdue: "Vadesi geçmiş planlı işlem yok.", rules: "Henüz düzenli işlem yok. Kira, faturalar ve abonelikler için ekleyin.", }, overdueBanner: (n: number) => `${n} planlı işlemin tarihi geçti; onaylayın, erteleyin veya atlayın.`, overdueLink: "Planlı işlemlere git", upcomingTitle: "Yaklaşan planlı işlemler", toast: { created: "Düzenli işlem kaydedildi.", updated: "Düzenli işlem güncellendi.", deleted: "Düzenli işlem silindi.", confirmed: "İşlem onaylandı.", skipped: "Bu tekrar atlandı.", postponed: "İşlem ertelendi.", }, validation: { interval: "1 ile 12 arasında olmalı", count: "1 ile 600 arasında bir sayı girin", endBeforeStart: "Bitiş tarihi ilk tarihten önce olamaz", }, errors: { splitAmount: "Bölünmüş planlı işlemin tutarı değiştirilemez.", postponeDate: "Yeni tarih mevcut tarihten sonra olmalı.", }, }, attachments: { title: "Ekler", add: "Ek ekle", addHint: { image: "Fiş veya fatura fotoğrafı", imagePdf: "Görsel veya PDF (ör. bordro)" }, count: (n: number) => `${n} ek`, uploading: "Yükleniyor…", remove: "Eki kaldır", open: "Aç", download: "İndir", fullscreen: "Tam ekran", exitFullscreen: "Tam ekrandan çık", previous: "Önceki", next: "Sonraki", position: (i: number, n: number) => `${i} / ${n}`, viewerTitle: "Ek dosyalar", pdf: "PDF belgesi", moreCount: (n: number) => `+${n}`, waitForUploads: "Yüklemeler bitmeden kaydedilemez.", errors: { empty: "Dosya seçilmedi veya dosya boş.", tooLarge: (mb: number) => `Dosya çok büyük (en fazla ${mb} MB).`, tooMany: (n: number) => `Bir kayda en fazla ${n} dosya eklenebilir.`, tooManyPending: "Kaydedilmemiş çok fazla ek var; önce formu kaydedin.", unsupported: "Desteklenmeyen dosya türü. JPEG, PNG, WebP, HEIC veya PDF yükleyin.", unreadable: "Dosya okunamadı veya bozuk.", kindNotAllowed: "Gider işlemlerine yalnızca görsel eklenebilir (PDF gelir ve transferlerde).", invalid: "Ek dosya bulunamadı veya bu kayda eklenemez.", upload: "Dosya yüklenemedi.", }, }, statement: { title: "Hesap ekstresi", back: "Hesaplar", allTransactions: "Tüm işlemler", prevMonth: "Önceki ay", nextMonth: "Sonraki ay", opening: "Ay başı bakiye", inflow: "Giriş", outflow: "Çıkış", closing: "Ay sonu bakiye", current: "Güncel bakiye", balanceAfter: "Bakiye", empty: "Bu ayda işlem yok.", truncated: "Çok fazla işlem var; yalnızca ilk 2.000 işlem gösteriliyor.", lastReconciliation: (date: string, balance: string) => `Son mutabakat: ${date} · ekstre bakiyesi ${balance}`, noReconciliation: "Henüz mutabakat yapılmadı.", reconciledHint: "Mutabakatı yapılmış işlem", adjustmentDescription: (statementBalance: string) => `Ekstre bakiyesi ${statementBalance} ile fark`, reconcile: { open: "Mutabakat yap", title: "Mutabakat", description: "Banka veya kart ekstrenizdeki tarihi ve bakiyeyi girin; uygulamadaki bakiye ile karşılaştırılır.", date: "Ekstre tarihi", balance: "Ekstredeki bakiye (TL)", debt: "Ekstredeki borç (TL)", balanceHint: "Eksi bakiye için başına - koyun (ör. KMH kullanımı).", debtHint: "Karttaki toplam borcu pozitif girin.", check: "Karşılaştır", statementBalance: "Ekstre", appBalance: "Uygulama", difference: "Fark", matches: "Bakiyeler tutuyor.", mismatch: "Bakiyeler tutmuyor. Eksik veya hatalı işlem olabilir.", adjustmentOffer: (amount: string, kind: string) => `Farkı kapatmak için ${amount} tutarında bir “${kind}” düzeltme işlemi oluşturulsun.`, acceptAdjustment: "Düzeltme işlemi oluştur", unreconciled: (n: number) => `${n} işlem işaretlenecek.`, confirm: "Mutabakatı tamamla", confirmWithAdjustment: "Düzelt ve tamamla", done: (n: number) => `Mutabakat tamamlandı; ${n} işlem işaretlendi.`, doneWithAdjustment: (n: number) => `Düzeltme işlemi oluşturuldu ve ${n} işlem işaretlendi.`, }, errors: { date: "Geçerli ve bugünden ileri olmayan bir tarih girin.", archived: "Arşivlenmiş hesapta mutabakat yapılamaz.", needsAdjustment: "Bakiyeler tutmuyor; düzeltme işlemini onaylayın veya işlemleri kontrol edin.", }, }, categories: { title: "Kategoriler", description: "Gelir ve gider kategorileri. Alt kategoriler raporlarda üst kategoriye toplanır.", expense: "Gider", income: "Gelir", newCategory: "Yeni kategori", addChild: "Alt kategori ekle", edit: "Düzenle", moveUp: "Yukarı taşı", moveDown: "Aşağı taşı", archive: "Arşivle", unarchive: "Arşivden çıkar", showArchived: "Arşivi göster", archived: "Arşivli", defaultBadge: "Varsayılan", empty: "Bu türde kategori yok.", createTitle: "Yeni kategori", editTitle: "Kategoriyi düzenle", formDescription: "Alt kategori için bir üst kategori seçin; boş bırakılırsa ana kategori olur.", name: "Ad", parent: "Üst kategori", noParent: "— Ana kategori —", icon: "İkon", color: "Renk", created: (name: string) => `${name} oluşturuldu.`, updated: (name: string) => `${name} güncellendi.`, archivedToast: (name: string) => `${name} arşivlendi.`, unarchivedToast: (name: string) => `${name} arşivden çıkarıldı.`, archiveTitle: "Kategori arşivlensin mi?", archiveDescription: (name: string) => `“${name}” ve alt kategorileri yeni işlemlerde seçilemez. Geçmiş işlemler ve raporlar etkilenmez.`, duplicate: "Bu düzeyde aynı adlı bir kategori zaten var.", violations: { self: "Kategori kendi altına taşınamaz.", descendant: "Kategori kendi alt kategorisinin altına taşınamaz.", kind: "Gelir ve gider kategorileri birbirinin altına konamaz.", depth: "En fazla 5 seviye derinliğe izin verilir.", parentNotFound: "Üst kategori bulunamadı.", parentArchived: "Üst kategori arşivli; önce onu arşivden çıkarın.", }, readOnly: "İzleyici rolündesiniz; kategorileri değiştiremezsiniz.", }, adminHouseholds: { title: "Haneler", description: "Hane oluşturma, kullanıcıları haneye atama ve hane içi roller.", newHousehold: "Yeni hane", createTitle: "Yeni hane", createDescription: "Hane oluşturulur ve seçilen kullanıcı ilk sahibi olur.", name: "Hane adı", owner: "İlk sahip", selectUser: "Kullanıcı seçin", created: (name: string) => `${name} hanesi oluşturuldu.`, members: (n: number) => `${n} üye`, owners: "Sahipler", noOwner: "Sahibi yok", addMember: "Üye ekle", addMemberTitle: (household: string) => `${household} — üye ekle`, addMemberDescription: "Kullanıcı zaten üyeyse rolü güncellenir.", user: "Kullanıcı", role: "Hane içi rol", memberAdded: (name: string) => `${name} haneye eklendi.`, empty: "Henüz hane yok.", privacyNote: "Yöneticiler haneleri ve üyelikleri yönetir; üyesi olmadıkları hanenin finansal verisini göremez.", }, userMenu: { open: "Kullanıcı menüsü", profile: "Profil", logout: "Çıkış yap", loggedOut: "Çıkış yapıldı.", }, roles: { admin: "Yönetici", user: "Kullanıcı" }, quickAdd: { button: "Hızlı ekle", title: "Hızlı ekle", description: "Ne eklemek istiyorsunuz?", expense: "Gider", income: "Gelir", transfer: "Transfer", expenseHint: "Harcama, fatura, alışveriş", incomeHint: "Maaş, ek gelir, iade", transferHint: "Hesaplar ve cariler arası", noAccounts: "İşlem girmek için önce bir hesap gerekli.", }, auth: { loginTitle: "Giriş yap", loginDescription: "Hesabınıza kullanıcı adı veya e-posta ile giriş yapın.", identifier: "Kullanıcı adı veya e-posta", identifierPlaceholder: "ornek veya ornek@eposta.com", password: "Şifre", submit: "Giriş yap", submitting: "Giriş yapılıyor…", invalidCredentials: "Kullanıcı adı/e-posta veya şifre hatalı.", banned: "Hesabınız askıya alınmış. Lütfen yöneticiyle iletişime geçin.", tooManyAttempts: "Çok fazla deneme yapıldı. Lütfen bir dakika sonra tekrar deneyin.", noSignUp: "Hesaplar yalnızca yönetici tarafından açılır.", identifierRequired: "Kullanıcı adı veya e-posta girin", passwordRequired: "Şifre girin", }, dashboard: { title: "Ana sayfa", welcome: (name: string) => `Hoş geldin, ${name}`, welcomeDescription: "Bu ayın özetini burada göreceksin. Veriler sonraki fazlarda bağlanacak.", cards: { monthIncome: "Bu ay gelir", monthExpense: "Bu ay gider", monthRemaining: "Kalan", totalBalance: "Toplam hesap bakiyesi", cardDebt: "Kart borçları", netWorth: "Net varlık", }, noData: "Henüz veri yok", }, adminUsers: { title: "Kullanıcılar", description: "Kullanıcı oluşturma, rol, şifre ve erişim yönetimi.", newUser: "Yeni kullanıcı", searchPlaceholder: "Ad, kullanıcı adı veya e-posta ara…", columns: { name: "Ad soyad", username: "Kullanıcı adı", email: "E-posta", role: "Rol", status: "Durum", createdAt: "Oluşturulma", }, status: { active: "Aktif", banned: "Askıda" }, actions: { edit: "Düzenle", changeRole: "Rolü değiştir", makeAdmin: "Yönetici yap", makeUser: "Kullanıcı yap", resetPassword: "Şifre sıfırla", ban: "Askıya al", unban: "Askıyı kaldır", delete: "Sil", }, form: { createTitle: "Yeni kullanıcı", createDescription: "Kullanıcı kendi hesabını açamaz; hesapları buradan oluşturun.", editTitle: "Kullanıcıyı düzenle", editDescription: "Ad, kullanıcı adı, e-posta ve rol bilgilerini güncelleyin.", name: "Ad soyad", username: "Kullanıcı adı", usernameHint: "Küçük harf, rakam, nokta, alt çizgi; 3–30 karakter.", email: "E-posta", emailHint: "İsteğe bağlı. Boş bırakılırsa giriş kullanıcı adıyla yapılır.", role: "Sistem rolü", password: "Geçici şifre", passwordHint: "En az 8 karakter. Kullanıcıya güvenli bir kanaldan iletin.", }, password: { title: "Şifre sıfırla", description: (name: string) => `${name} için yeni bir şifre belirleyin.`, newPassword: "Yeni şifre", confirm: "Şifreyi belirle", }, ban: { title: "Kullanıcıyı askıya al", description: (name: string) => `${name} giriş yapamayacak ve açık oturumları kapatılacak.`, reason: "Neden (isteğe bağlı)", confirm: "Askıya al", }, remove: { title: "Kullanıcı silinsin mi?", description: (name: string) => `${name} kalıcı olarak silinecek. Bu işlem geri alınamaz.`, confirm: "Kalıcı olarak sil", }, toast: { created: (name: string) => `${name} oluşturuldu.`, updated: (name: string) => `${name} güncellendi.`, roleChanged: (name: string) => `${name} için rol değiştirildi.`, passwordSet: (name: string) => `${name} için şifre güncellendi.`, banned: (name: string) => `${name} askıya alındı.`, unbanned: (name: string) => `${name} için askı kaldırıldı.`, removed: (name: string) => `${name} silindi.`, }, guards: { self: "Kendi hesabınız için bu işlem yapılamaz.", lastAdmin: "Sistemdeki son yönetici silinemez veya rolü düşürülemez.", }, errors: { usernameTaken: "Bu kullanıcı adı kullanılıyor.", emailTaken: "Bu e-posta adresi kullanılıyor.", checkFields: "Lütfen işaretli alanları düzeltin.", }, you: "Siz", noEmail: "—", }, validation: { nameMin: "Ad en az 2 karakter olmalı", nameMax: "Ad en fazla 80 karakter olabilir", usernameFormat: "Yalnızca küçük harf, rakam, nokta ve alt çizgi; 3–30 karakter", email: "Geçerli bir e-posta adresi girin", passwordMin: "Şifre en az 8 karakter olmalı", passwordMax: "Şifre en fazla 128 karakter olabilir", banReasonMax: "Neden en fazla 200 karakter olabilir", householdNameMin: "Hane adı en az 2 karakter olmalı", householdNameMax: "Hane adı en fazla 80 karakter olabilir", selectUser: "Bir kullanıcı seçin", wholeNumber: "Tam sayı girin", money: "Geçerli bir tutar girin (ör. 1.250,50)", moneyNonNegative: "Tutar negatif olamaz", percent: "0 ile 100 arasında bir oran girin (ör. 4,25)", date: "Geçerli bir tarih seçin", selectProvider: "Kart sağlayıcısını seçin", privateNeedsOwner: "“Yalnızca ben” hesabı için hesap sahibini seçin", dueDays: "Kesimden sonra en fazla 30 gün olabilir", }, errors: { notFoundTitle: "Sayfa bulunamadı", notFoundDescription: "Aradığınız sayfa taşınmış veya hiç var olmamış olabilir.", backHome: "Ana sayfaya dön", errorTitle: "Bir şeyler ters gitti", errorDescription: "Sayfa yüklenirken bir hata oluştu. Tekrar deneyebilirsiniz.", retry: "Tekrar dene", reference: "Hata kodu", }, } as const; export type Messages = typeof tr;