861bfba85a
- 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>
408 lines
17 KiB
TypeScript
408 lines
17 KiB
TypeScript
/**
|
||
* 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
|