Files
kakeibo/frontend/src/lib/strings.ts
T
suphicakir 861bfba85a feat(değerlendirme): geçmiş dönemler ve düzeltme için yeniden açma
- Defter, Plan ve Değerlendirme'de dönem seçici (?donem=)
- Kapalı dönem salt okunur; düzeltmedeki dönem düzenlenebilir ve yeniden kapatılır
- Hane sahibi için onaylı "Düzeltme için yeniden aç"
- Geçmiş dönemler listesi, dönem durum rozeti

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
2026-11-12 23:11:04 +03:00

408 lines
17 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 tek yerde (KAKEIBO_PROMPT §15 — ileride çok dil desteği için).
* Yeni ekran eklerken metinleri buraya, ilgili bölümün altına ekleyin.
*/
export const t = {
app: {
name: 'Kakeibo',
tagline: 'Kişisel Ev Finans Defteri',
},
nav: {
dashboard: 'Panel',
ledger: 'Defter',
planning: 'Plan',
savings: 'Birikim',
more: 'Diğer',
review: 'Değerlendirme',
reports: 'Raporlar',
settings: 'Ayarlar',
main: 'Ana menü',
},
pages: {
dashboard: { title: 'Panel', description: 'Gelir, harcama ve birikimin tek bakışta özeti.' },
ledger: { title: 'Günlük Defter', description: 'Haftalık harcama girişleri.' },
planning: {
title: 'Aylık Plan',
description: 'Gelir, sabit giderler, birikim hedefi ve bütçe dağıtımı.',
},
savings: { title: 'Birikimler', description: 'TL, altın ve döviz varlıkların, kâr/zarar.' },
review: {
title: 'Ay Sonu Değerlendirmesi',
description: "Kakeibo'nun dört sorusu ve dönem kapanışı.",
},
reports: { title: 'Raporlar', description: 'Gelir–gider, kategori ve bütçe sapma raporları.' },
settings: { title: 'Ayarlar', description: 'Kategoriler, ödeme türleri, hane ve hesap.' },
more: { title: 'Diğer' },
notFound: {
title: 'Sayfa bulunamadı',
description: 'Aradığınız sayfa taşınmış ya da hiç var olmamış olabilir.',
action: 'Panele dön',
},
},
comingSoon: (when: string) => `Bu ekran ${when} geliştirilecek.`,
account: {
owner: 'Hane sahibi',
member: 'Üye',
logout: 'Çıkış yap',
theme: 'Tema',
},
auth: {
login: {
title: 'Tekrar hoş geldin',
description: 'Defterine devam etmek için giriş yap.',
email: 'E-posta',
password: 'Şifre',
remember: 'Beni hatırla',
rememberHint: '30 gün boyunca bu cihazda oturum açık kalır.',
submit: 'Giriş yap',
submitting: 'Giriş yapılıyor…',
noAccount: 'Hesabın yok mu?',
toRegister: 'Kayıt ol',
welcome: (name: string) => `Hoş geldin, ${name} 👋`,
},
register: {
title: 'Hesap oluştur',
description: 'Hane bütçeni Kakeibo yöntemiyle tutmaya başla.',
name: 'Adın',
email: 'E-posta',
password: 'Şifre',
passwordHint: 'En az 8 karakter.',
modeLabel: 'Hane',
modeNew: 'Yeni hane kur',
modeJoin: 'Davetle katıl',
householdName: 'Hane adı',
householdHint: (name: string) => (name ? `Boş bırakırsan: "${name} Hanesi"` : 'İsteğe bağlı'),
inviteCode: 'Davet kodu',
inviteHint: 'Hane sahibinden aldığın 8 karakterlik kod (ör. ABCD-EFGH).',
closedNote:
'Bu sunucuda yeni hane kaydı kapalı. Katılmak için hane sahibinden davet bağlantısı ya da kodu iste.',
submit: 'Hesabı oluştur',
submitting: 'Oluşturuluyor…',
hasAccount: 'Zaten hesabın var mı?',
toLogin: 'Giriş yap',
welcome: (household: string) => `Hesabın hazır! ${household} defterin açıldı 📒`,
joined: (household: string) => `${household} hanesine katıldın 🎉`,
},
validation: {
emailRequired: 'E-posta gerekli',
emailInvalid: 'Geçerli bir e-posta adresi girin',
passwordRequired: 'Şifre gerekli',
passwordTooShort: 'Şifre en az 8 karakter olmalı',
passwordTooLong: 'Şifre en fazla 128 karakter olabilir',
nameRequired: 'Adını yaz',
nameTooLong: 'Ad en fazla 80 karakter olabilir',
householdTooLong: 'Hane adı en fazla 80 karakter olabilir',
inviteRequired: 'Davet kodunu yaz',
inviteInvalid: 'Davet kodu 8 karakter olmalı',
},
},
noPeriod: {
title: 'Henüz açık bir dönem yok',
description:
'Kakeibo her ay bir planla başlar: gelirini, sabit giderlerini ve birikim hedefini yaz, kalanı 4 gruba dağıt. Birkaç dakika sürer.',
action: 'Dönemi başlat',
},
wizard: {
title: 'Yeni dönem',
description:
'Dönemini birkaç adımda planla. Her adım hemen kaydedilir; istediğin an ara verebilirsin.',
steps: ['Dönem', 'Gelirler', 'Giderler', 'Birikim', 'Bütçe'],
stepOf: (n: number, total: number) => `Adım ${n}/${total}`,
back: 'Geri',
next: 'İleri',
saving: 'Kaydediliyor…',
dates: {
title: 'Dönemin tarihleri',
hint: 'Çoğu kişi takvim ayını seçer. Maaşın ayın ortasında yatıyorsa dönemi o güne göre de başlatabilirsin.',
presetsLabel: 'Hızlı seçim',
start: 'Başlangıç',
last: 'Son gün',
name: 'Dönem adı',
nameHint: 'Boş bırakırsan tarihlere göre otomatik verilir (ör. "Aralık 2026").',
days: (n: number) => `${n} gün · haftalar Pazartesi başlar`,
created: 'Dönem açıldı',
startRequired: 'Başlangıç tarihini seçin',
lastRequired: 'Son günü seçin',
lastBeforeStart: 'Son gün, başlangıçtan önce olamaz',
tooLong: (max: number) => `Dönem en fazla ${max} gün olabilir`,
nameTooLong: 'Dönem adı en fazla 60 karakter olabilir',
},
items: {
income: {
title: 'Sabit gelirler',
hint: 'Bu dönem beklediğin gelirler: maaş, kira geliri, burs… Tarih isteğe bağlı.',
placeholder: 'ör. Maaş',
empty: 'Henüz gelir eklenmedi.',
total: 'Toplam gelir',
},
expense: {
title: 'Sabit giderler',
hint: 'Her ay ödediğin, tutarı belli giderler: kira, aidat, faturalar, abonelikler, kredi taksiti.',
placeholder: 'ör. Kira',
empty: 'Henüz sabit gider eklenmedi.',
total: 'Toplam sabit gider',
},
name: 'Ad',
amount: 'Tutar',
date: 'Tarih (isteğe bağlı)',
add: 'Ekle',
remove: (name: string) => `${name} kalemini sil`,
removed: (name: string) => `${name} silindi`,
copy: 'Önceki dönemden kopyala',
copyHint: 'Önceki dönemin gelir ve giderleri eklenir; aynı adda olanlar atlanır.',
copied: (n: number) => (n > 0 ? `${n} kalem kopyalandı` : 'Kopyalanacak yeni kalem yok'),
nameRequired: 'Adını yazın',
nameTooLong: 'Ad en fazla 60 karakter olabilir',
dateOutside: 'Tarih dönemin içinde olmalı',
},
savings: {
title: 'Birikim hedefi',
hint: 'Kakeibo’da birikim, harcamadan önce ayrılır. Bu dönem kenara koymak istediğin tutarı yaz.',
available: 'Gelir − sabit giderler',
goal: 'Birikim hedefi',
after: 'Harcanabilir kalan',
negative: 'Birikim hedefi bu dönemin gelirini aşıyor. Tutarı azaltmayı düşünebilirsin.',
},
budget: {
title: 'Bütçe dağıtımı',
hint: 'Harcanabilir tutarı 4 gruba böl. Haftalık bütçeler, haftaların gün sayısına göre otomatik hesaplanır.',
method: 'Öneri',
methods: { default: 'Varsayılan %', previous: 'Önceki dönem', avg3: 'Son 3 dönem' },
apply: 'Öneriyi uygula',
distributed: 'Dağıtılan',
unallocated: (amount: string) => `${amount} dağıtılmadı`,
over: (amount: string) => `Harcanabilir tutar ${amount} aşıldı`,
balanced: 'Tamamı dağıtıldı 👌',
finish: 'Planı tamamla',
done: 'Dönemin hazır! Harcamalarını Defter’e yazmaya başlayabilirsin 📒',
},
},
plan: {
edit: 'Düzenle',
save: 'Kaydet',
cancel: 'Vazgeç',
saving: 'Kaydediliyor…',
saved: 'Plan kaydedildi',
noChanges: 'Değişiklik yok',
editing: 'Düzenleme modu',
editingHint: 'Değişiklikler "Kaydet"e basınca kaydedilir.',
saveFailed: (msg: string) => `${msg} Ekranda kaydedilmiş son durum gösteriliyor.`,
leaveConfirm: 'Kaydedilmemiş değişiklikler var. Yine de çıkılsın mı?',
periodInfo: (days: number, weeks: number) => `${days} gün · ${weeks} hafta`,
changeDates: 'Tarihleri değiştir',
add: { income: 'Gelir ekle', expense: 'Gider ekle' },
savings: 'Birikim hedefi',
budget: 'Bütçe dağıtımı',
weekly: 'Haftalık döküm',
week: (n: number) => `${n}. hafta`,
weekDays: (n: number) => `${n} gün`,
manual: 'elle',
resetWeek: (n: number) => `${n}. haftayı otomatiğe döndür`,
weekHint: 'Boş bırakılan haftalar kalan tutarı gün sayısına göre paylaşır.',
weeklyOver: 'Elle girilen haftaların toplamı aylık tutarı aşıyor.',
suggestionHint: 'Öneri, kaydedilmiş gelir ve giderlere göre hesaplanır.',
emptyBudget: 'Henüz bütçe dağıtılmadı. "Düzenle" ile 4 gruba dağıtabilirsin.',
},
notes: {
title: 'Notlar',
empty: 'Henüz not yok. Bu dönemle ilgili düşüncelerini, kararlarını ya da yapılacakları yaz.',
add: 'Not ekle',
edit: 'Düzenle',
remove: 'Sil',
editNote: (title: string) => `${title} notunu düzenle`,
removeNote: (title: string) => `${title} notunu sil`,
confirmRemove: (title: string) => `"${title}" notu silinsin mi?`,
removed: 'Not silindi',
saved: 'Not kaydedildi',
noteTitle: 'Başlık',
titlePlaceholder: 'ör. Bu ayın hedefleri',
body: 'Metin',
bodyPlaceholder: '- [ ] Elektrik faturasını öde\n- Dışarıda yemek ayda en fazla 2 kez',
write: 'Yaz',
preview: 'Önizle',
previewEmpty: 'Önizlenecek bir şey yok.',
markdownHint: 'Markdown: **kalın**, *italik*, - liste, - [ ] yapılacak, # başlık',
save: 'Kaydet',
cancel: 'Vazgeç',
saving: 'Kaydediliyor…',
meta: (date: string, author?: string) => (author ? `${date} · ${author}` : date),
titleRequired: 'Başlık yazın',
titleTooLong: 'Başlık en fazla 120 karakter olabilir',
bodyTooLong: 'Metin en fazla 20.000 karakter olabilir',
},
summary: {
income: 'Gelir',
fixed: 'Sabit giderler',
savings: 'Birikim',
debt: 'Devreden borç',
surplus: 'Devreden artı',
spendable: 'Harcanabilir',
},
ledger: {
readOnly:
'Bu dönem kapalı; kayıtlar yalnızca görüntülenebilir. Düzeltme için hane sahibi Değerlendirme’den yeniden açabilir.',
week: (n: number, count: number) => `${n}. hafta / ${count}`,
prevWeek: 'Önceki hafta',
nextWeek: 'Sonraki hafta',
thisWeek: 'Bu hafta',
weekSpent: 'Bu hafta harcanan',
weekBudget: 'bütçe',
formTitle: 'Harcama ekle',
amount: 'Tutar',
group: 'Ana grup',
category: 'Kategori',
noCategory: 'Bu grupta aktif kategori yok.',
paymentMethod: 'Ödeme türü',
noPaymentMethod: 'Belirtme',
date: 'Tarih',
description: 'Açıklama',
descriptionHint: 'İsteğe bağlı (ör. "Haftalık market")',
save: 'Kaydet',
saving: 'Kaydediliyor…',
saved: (amount: string, category: string) => `Eklendi: ${amount} · ${category}`,
groupRequired: 'Ana grubu seçin',
categoryRequired: 'Kategori seçin',
dateInvalid: 'Tarih geçersiz',
dateOutside: 'Tarih dönem içinde olmalı',
descriptionTooLong: 'Açıklama en fazla 200 karakter olabilir',
editTitle: 'Harcamayı düzenle',
update: 'Güncelle',
cancel: 'Vazgeç',
updated: 'Harcama güncellendi',
listTitle: 'Haftanın girişleri',
empty: 'Bu hafta henüz harcama yok.',
dayTotal: 'Gün toplamı',
edit: (what: string) => `${what} harcamasını düzenle`,
remove: (what: string) => `${what} harcamasını sil`,
deleted: 'Harcama silindi',
undo: '↩️ Geri al',
restored: 'Harcama geri alındı',
editing: 'Düzenleniyor',
summaryTitle: 'Haftalık özet',
budget: 'Bütçe',
spent: 'Harcanan',
left: 'Kalan',
over: 'Aşıldı',
},
review: {
ongoing: (last: string) => `Dönem ${last} tarihinde bitiyor; değerler kayıt girdikçe değişir.`,
q1: 'Ne kadar param vardı?',
q1Detail: (income: string, fixed: string) => `Gelir ${income} − sabit giderler ${fixed}`,
q1Debt: (debt: string) => ` − devreden borç ${debt}`,
q1Surplus: (surplus: string) => ` + devreden artı ${surplus}`,
q2: 'Ne kadar biriktirmek istedim?',
q2Detail: 'Dönem başında belirlenen birikim hedefi',
q3: 'Ne kadar harcadım?',
q3Detail: (budget: string, pct: string) => `Bütçenin ${pct} kadarı (${budget})`,
q3NoBudget: 'Bütçe dağıtılmamış',
q4: 'Ne kadar biriktirdim?',
above: (x: string) => (x === '0,00 ₺' ? 'Hedefe tam ulaşıldı' : `Hedefin ${x} üstünde 🎉`),
below: (x: string) => `Hedefin ${x} altında`,
deficit: (x: string) => `${x} açık; borç olarak sonraki döneme devreder`,
groupsTitle: 'Planlanan ve gerçekleşen',
groupLine: (spent: string, planned: string) => `${spent} / ${planned}`,
left: (x: string) => `${x} kaldı`,
over: (x: string) => `${x} aşıldı`,
categoriesTitle: 'En çok harcanan kategoriler',
categoriesEmpty: 'Bu dönemde henüz harcama yok.',
count: (n: number) => `${n} kayıt`,
showAll: (n: number) => `Tümünü göster (${n})`,
showLess: 'Daha az göster',
weeksTitle: 'Haftalık dağılım',
week: (n: number) => `${n}. hafta`,
reflectionTitle: 'Nasıl daha iyi yapabilirim?',
reflectionEmpty: 'Bu ay neler iyi gitti, neyi değiştirmek istersin? Kısa notlar yeterli.',
reflectionNone: 'Bu dönem için yazılmamış.',
reflectionPlaceholder:
'- Dışarıda yemeği haftada bire indir\n- Market alışverişini listeyle yap',
reflectionSaved: 'Kaydedildi',
reflectionTooLong: 'Metin en fazla 20.000 karakter olabilir',
edit: 'Düzenle',
write: 'Yaz',
closeTitle: 'Dönemi kapat',
closeHint:
'Değerlendirme bittiyse dönemi kapat: birikimin ayrılır, kalan artı ya da açık sonraki döneme devreder.',
closeAction: '🔒 Dönemi Kapat',
closedInfo: (date: string, saved: string) =>
`Bu dönem ${date} tarihinde kapandı. Birikime aktarılan: ${saved}.`,
reopen: 'Düzeltme için yeniden aç',
reopenConfirm:
'Dönem düzeltmeye açılır: kayıt ve plan değiştirilebilir. Bitince yeniden kapatman gerekir; devir o zaman yeniden hesaplanır.',
reopenYes: 'Evet, yeniden aç',
reopenNo: 'Vazgeç',
reopened: 'Dönem düzeltmeye açıldı',
reopenBlocked: 'Sonraki dönem kapalı olduğu için bu dönem yeniden açılamaz.',
correctingTitle: 'Bu dönem düzeltmede',
correctingHint:
'Kayıtları ve planı düzelt, bitince yeniden kapat; sonraki döneme devir güncellenir.',
recloseAction: '🔒 Yeniden Kapat',
fixInLedger: 'Defter’de düzelt',
fixInPlan: 'Plan’da düzelt',
},
periods: {
picker: 'Dönem',
status: { open: 'Açık', closed: '🔒 Kapalı', correcting: '✏️ Düzeltmede' },
notFound: 'Dönem bulunamadı. Listeden başka bir dönem seç.',
history: 'Geçmiş dönemler',
toSavings: (x: string) => `Birikime ${x}`,
},
closing: {
title: 'Dönemi Kapat',
description: 'Birkaç adımda dönemi kapat ve devri belirle.',
steps: ['Özet', 'Birikim', 'Onay'],
early: (last: string) =>
`Dönem ${last} tarihinde bitiyor. Şimdi kapatırsan kalan günler için kayıt giremezsin.`,
noReflection: '"Nasıl daha iyi yapabilirim?" henüz boş. Kapanınca değiştirilemez.',
writeReflection: 'Değerlendirmeye dön ve yaz',
savingsTitle: 'Birikim ve devir',
savingsHint: (x: string) =>
`Bu dönem ${x} biriktirdin. Ne kadarını birikime ayırmak istersin? Kalanı sonraki döneme artı olarak devreder.`,
toSavings: 'Birikime aktarılacak',
all: 'Tamamı',
none: 'Hiçbiri',
tooMuch: (x: string) => `En fazla ${x} aktarabilirsin`,
deficitHint: (x: string) =>
`Bu dönem ${x} açık verdin. Açık, sonraki dönemin "Ne kadar param vardı?" hesabından borç olarak düşülür.`,
zeroHint: 'Bu dönemde ne birikim ne açık var; sonraki döneme bir şey devretmez.',
confirmTitle: 'Onayla',
confirmHint: 'Kapatmadan önce son bir kez kontrol et.',
willClose: (name: string) => `${name} kapanacak; kayıt eklenemez ve değiştirilemez.`,
savingsLine: 'Birikime aktarılacak',
surplusLine: 'Sonraki döneme artı olarak devreden',
debtLine: 'Sonraki döneme borç olarak devreden',
carryLine: 'Sonraki döneme devreden',
noCarry: 'Sonraki döneme devreden yok.',
reopenNote: 'Hata fark edersen hane sahibi dönemi düzeltme için yeniden açabilir.',
submit: '🔒 Dönemi Kapat',
submitting: 'Kapatılıyor…',
done: (name: string) => `${name} kapandı`,
resultHint: 'Sonraki dönemi açtığında devir otomatik olarak eklenir.',
resultAttached: 'Devir açık olan sonraki döneme eklendi.',
realized: 'Gerçekleşen birikim',
newPeriod: 'Yeni dönemi aç',
toPlan: 'Plana git',
toDashboard: 'Panele dön',
noOpen: 'Kapatılacak açık dönem yok.',
alreadyClosed: 'Bu dönem zaten kapalı.',
},
common: {
loading: 'Yükleniyor…',
retry: 'Tekrar dene',
},
} as const