Files
butcem/src/i18n/tr.ts
T

736 lines
28 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/**
* 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;