@jjlmoya/utils-babies 1.13.0 → 1.15.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (46) hide show
  1. package/package.json +2 -2
  2. package/src/category/index.ts +3 -0
  3. package/src/entries.ts +4 -1
  4. package/src/index.ts +1 -0
  5. package/src/pages/[locale]/[slug].astro +31 -39
  6. package/src/tests/locale_completeness.test.ts +2 -2
  7. package/src/tests/shared-test-helpers.ts +56 -0
  8. package/src/tests/tool_exports.test.ts +34 -0
  9. package/src/tests/tool_validation.test.ts +2 -2
  10. package/src/tool/baby-budget-planner/baby-budget-planner.css +405 -0
  11. package/src/tool/baby-budget-planner/bibliography.astro +14 -0
  12. package/src/tool/baby-budget-planner/bibliography.ts +14 -0
  13. package/src/tool/baby-budget-planner/component.astro +406 -0
  14. package/src/tool/baby-budget-planner/entry.ts +77 -0
  15. package/src/tool/baby-budget-planner/i18n/de.ts +182 -0
  16. package/src/tool/baby-budget-planner/i18n/en.ts +184 -0
  17. package/src/tool/baby-budget-planner/i18n/es.ts +183 -0
  18. package/src/tool/baby-budget-planner/i18n/fr.ts +183 -0
  19. package/src/tool/baby-budget-planner/i18n/id.ts +183 -0
  20. package/src/tool/baby-budget-planner/i18n/it.ts +183 -0
  21. package/src/tool/baby-budget-planner/i18n/ja.ts +183 -0
  22. package/src/tool/baby-budget-planner/i18n/ko.ts +183 -0
  23. package/src/tool/baby-budget-planner/i18n/nl.ts +183 -0
  24. package/src/tool/baby-budget-planner/i18n/pl.ts +183 -0
  25. package/src/tool/baby-budget-planner/i18n/pt.ts +183 -0
  26. package/src/tool/baby-budget-planner/i18n/ru.ts +183 -0
  27. package/src/tool/baby-budget-planner/i18n/sv.ts +183 -0
  28. package/src/tool/baby-budget-planner/i18n/tr.ts +183 -0
  29. package/src/tool/baby-budget-planner/i18n/zh.ts +183 -0
  30. package/src/tool/baby-budget-planner/index.ts +10 -0
  31. package/src/tool/baby-budget-planner/logic.ts +68 -0
  32. package/src/tool/baby-budget-planner/seo.astro +15 -0
  33. package/src/tool/baby-feeding-calculator/baby-feeding-calculator.css +40 -40
  34. package/src/tool/baby-feeding-calculator/bibliography.astro +9 -6
  35. package/src/tool/baby-feeding-calculator/seo.astro +2 -45
  36. package/src/tool/baby-percentile-calculator/baby-weight-height-percentile.css +43 -43
  37. package/src/tool/baby-percentile-calculator/seo.astro +7 -28
  38. package/src/tool/baby-size-converter/baby-size-converter.css +42 -42
  39. package/src/tool/baby-size-converter/seo.astro +7 -28
  40. package/src/tool/fertile-days-estimator/fertile-days-calculator.css +23 -23
  41. package/src/tool/fertile-days-estimator/seo.astro +7 -28
  42. package/src/tool/pregnancy-calculator/pregnancy-weeks-calculator.css +37 -37
  43. package/src/tool/pregnancy-calculator/seo.astro +7 -28
  44. package/src/tool/vaccination-calendar/baby-vaccination-calendar-spain.css +16 -16
  45. package/src/tool/vaccination-calendar/seo.astro +7 -28
  46. package/src/tools.ts +2 -0
@@ -0,0 +1,183 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+ import type { BabyBudgetPlannerUI } from '../entry';
3
+ import type { FAQPage, HowTo, SoftwareApplication, WithContext } from 'schema-dts';
4
+ import { bibliography } from '../bibliography';
5
+
6
+ export const title = 'Budgetplanerare för Bebis';
7
+ export const description = 'Det ultimata verktyget för att planera utgifterna under bebisens första år. Beräkna kostnader för barnrummet, månatliga utgifter och dolda kostnader med smarta spartips.';
8
+
9
+ export const faq = [
10
+ {
11
+ question: 'Hur mycket kostar en bebis under första året?',
12
+ answer: 'I genomsnitt kan det första året kosta mellan 50 000 kr och 150 000 kr beroende på din livsstil, behov av barnomsorg och om du köper saker nya eller begagnade.',
13
+ },
14
+ {
15
+ question: 'Vilka är de dyraste sakerna för en nyfödd?',
16
+ answer: 'De största engångskostnaderna är vanligtvis barnvagnen, möbler till barnrummet (spjälsäng, byrå) och bilbarnstol. Barnomsorg är den största återkommande månatliga utgiften.',
17
+ },
18
+ {
19
+ question: 'Hur kan jag spara på bebisutgifterna?',
20
+ answer: 'Att köpa begagnat för utrustning och kläder, amma (om möjligt) och använda en önskelista så att vänner och familj kan ge bort nödvändiga saker är de mest effektiva strategierna.',
21
+ },
22
+ {
23
+ question: 'Vad är "spökutgifter" i bebisplaneringen?',
24
+ answer: 'Dessa är dolda kostnader som ökade elräkningar (värme/kyla), högre försäkringspremier för familjen och icke-obligatoriska vacciner eller medicinska förnödenheter som oftast inte finns på vanliga checklistor.',
25
+ },
26
+ ];
27
+
28
+ const faqSchema: WithContext<FAQPage> = {
29
+ '@context': 'https://schema.org',
30
+ '@type': 'FAQPage',
31
+ mainEntity: faq.map((item) => ({
32
+ '@type': 'Question',
33
+ name: item.question,
34
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
35
+ })),
36
+ };
37
+
38
+ export const howTo = [
39
+ {
40
+ name: 'Konfigurera din profil',
41
+ text: 'Välj din livsstil (Sparsam, Balanserad eller Premium), matningsmetod och strategi för barnomsorg.',
42
+ },
43
+ {
44
+ name: 'Gå igenom dina saker',
45
+ text: 'Gå igenom kategorierna (Startinvesteringar, Månatliga och Milstolpar) och justera priser eller markera saker som begagnade.',
46
+ },
47
+ {
48
+ name: 'Följ din budget',
49
+ text: 'Se det totala beloppet som behövs för det första året och följ dina framsteg allteftersom du skaffar sakerna.',
50
+ },
51
+ ];
52
+
53
+ const howToSchema: WithContext<HowTo> = {
54
+ '@context': 'https://schema.org',
55
+ '@type': 'HowTo',
56
+ name: title,
57
+ description,
58
+ step: howTo.map((step) => ({
59
+ '@type': 'HowToStep',
60
+ name: step.name,
61
+ text: step.text,
62
+ })),
63
+ };
64
+
65
+ const appSchema: WithContext<SoftwareApplication> = {
66
+ '@context': 'https://schema.org',
67
+ '@type': 'SoftwareApplication',
68
+ name: title,
69
+ operatingSystem: 'Any',
70
+ applicationCategory: 'FinanceApplication',
71
+ offers: {
72
+ '@type': 'Offer',
73
+ price: '0',
74
+ priceCurrency: 'SEK',
75
+ },
76
+ };
77
+
78
+ export const content: ToolLocaleContent<BabyBudgetPlannerUI> = {
79
+ title,
80
+ description,
81
+ slug: 'budgetplanerare-bebis',
82
+ faqTitle: 'Vanliga Frågor',
83
+ bibliographyTitle: 'Bibliografi',
84
+ seo: [
85
+ { type: 'summary', title: 'Sammanfattning: Bebisbudgetering', items: [
86
+ 'Första året kan kosta mellan 50 000 kr och 150 000 kr.',
87
+ 'Engångskostnader för start (barnrum, vagn) är det största hindret i början.',
88
+ 'Barnomsorg kan stå för upp till 50 % av den återkommande månadsbudgeten.',
89
+ 'Begagnade saker kan sänka den totala budgeten med upp till 60 %.',
90
+ ]},
91
+ { type: 'title', text: 'Vad kostar en bebis egentligen under första året?', level: 2 },
92
+ { type: 'paragraph', html: 'Planering för en bebis innebär mer än att bara köpa blöjor. Det krävs en strategisk blick på engångsinvesteringar jämfört med återkommande månadskostnader. Vår planerare hjälper dig att visualisera denna kurva och förbereda dig för den ekonomiska övergången till föräldraskap.' },
93
+ { type: 'stats', columns: 3, items: [
94
+ { value: '20 000 kr+', label: 'Startutrustning' },
95
+ { value: '1 000-1 500 kr', label: 'Blöjor/Hygien per månad' },
96
+ { value: '40%+', label: 'Besparing med begagnat' },
97
+ ]},
98
+ { type: 'title', text: 'Kategorier: Vart tar pengarna vägen?', level: 3 },
99
+ { type: 'table', headers: ['Kategori', 'Typiska saker', 'Frekvens', 'Kostnadspåverkan'], rows: [
100
+ ['Startinvestering', 'Säng, Vagn, Bilbarnstol', 'Engångs', 'Hög'],
101
+ ['Månatligt', 'Blöjor, Ersättning, Apotek', 'Varje månad', 'Medel'],
102
+ ['Milstolpar', 'Matstol, Matintroduktion, Kläder', 'Ibland', 'Medel'],
103
+ ['Omsorg', 'Förskola / Barnflicka', 'Varje månad', 'Mycket hög'],
104
+ ]},
105
+ { type: 'tip', html: '<strong>Spartips:</strong> Kvalitetsvagnar och barnmöbler har ett utmärkt andrahandsvärde. Att köpa dessa begagnade kan spara dig tiotusentals kronor utan att pruta på säkerhet eller stil.' },
106
+ { type: 'title', text: 'Jämförelse av livsstil', level: 3 },
107
+ { type: 'comparative', columns: 2, items: [
108
+ {
109
+ title: 'Sparsam',
110
+ description: 'Fokus på begagnat och det nödvändigaste.',
111
+ points: ['Ärvda kläder', 'Renoverad utrustning', 'Fokus på amning', 'Kommunal förskola']
112
+ },
113
+ {
114
+ title: 'Premium',
115
+ description: 'Senaste modellerna och maximal bekvämlighet.',
116
+ points: ['Högteknologisk utrustning', 'Ekologisk ersättning', 'Designmöbler', 'Privat barnomsorg']
117
+ },
118
+ ]},
119
+ { type: 'title', text: 'Checklista för smart planering', level: 3 },
120
+ { type: 'list', items: [
121
+ 'Kontrollera uppdateringar för familjeskydd i dina försäkringar.',
122
+ 'Budgetera för icke-obligatoriska vacciner och specialartiklar från apoteket.',
123
+ 'Räkna med 20 % ökning av hushållens elräkningar (värme/kyla).',
124
+ 'Skapa en önskelista tidigt så att familjen kan hjälpa till med stora inköp.',
125
+ ]},
126
+ ],
127
+ faq,
128
+ howTo,
129
+ bibliography,
130
+ schemas: [faqSchema as any, howToSchema as any, appSchema as any],
131
+ ui: {
132
+ title,
133
+ onboardingTitle: 'Starta din plan',
134
+ lifestyleLabel: 'Livsstilsval',
135
+ lifestyleSaving: 'Maximal sparsamhet',
136
+ lifestyleBalanced: 'Balanserad',
137
+ lifestylePremium: 'Premium',
138
+ feedingLabel: 'Matningsmetod',
139
+ feedingBreast: 'Amning',
140
+ feedingFormula: 'Ersättning',
141
+ feedingMixed: 'Blandat',
142
+ childcareLabel: 'Barnomsorgsstrategi',
143
+ childcareHome: 'Stanna hemma',
144
+ childcarePublic: 'Kommunal förskola',
145
+ childcarePrivate: 'Privat barnomsorg',
146
+ startBtn: 'Generera min budget',
147
+ categoryBeforeBirth: 'Startinvestering',
148
+ categoryMonthByMonth: 'Månatliga utgifter',
149
+ categoryMilestones: 'Framtida milstolpar',
150
+ totalNeededLabel: 'Totalmål första året',
151
+ savingsProgressLabel: 'Klart / Sparat',
152
+ chartTitle: 'Månatlig utgiftskurva',
153
+ ghostAlertsTitle: 'Varningar för dolda kostnader',
154
+ ghostInsurance: 'Kolla liv/sjukförsäkring',
155
+ ghostHeating: 'Räkna med +20% för el/värme',
156
+ ghostVaccines: 'Budget för tilläggsvaccin',
157
+ diaperCalcTitle: 'Priskoll blöjor',
158
+ diaperPriceLabel: 'Pris per paket',
159
+ diaperUnitsLabel: 'Antal per paket',
160
+ secondHandLabel: 'Begagnat / Gåva',
161
+ wishlistLabel: 'På önskelistan',
162
+ itemNursery: 'Inredning barnrum',
163
+ itemStroller: 'Barnvagn & resesystem',
164
+ itemHospitalBag: 'Innehåll i BB-väskan',
165
+ itemDiapers: 'Blöjor & våtservetter',
166
+ itemPharmacy: 'Apotek & hygien',
167
+ itemDaycare: 'Förskola / Omsorg',
168
+ itemSolidFood: 'Matintroduktion',
169
+ itemClothes: 'Säsongskläder',
170
+ itemHighChair: 'Matstol & servispaket',
171
+ editLabel: 'Redigera pris',
172
+ saveBtn: 'Spara',
173
+ exportBtn: 'Exportera JSON',
174
+ importBtn: 'Importera JSON',
175
+ resetBtn: 'Återställ plan',
176
+ currencySymbol: 'kr',
177
+ monthPrefix: 'M',
178
+ initialMonthLabel: 'Start',
179
+ perMonthLabel: '/månad',
180
+ confirmReset: 'Är du säker?',
181
+ currencyMultiplier: 11,
182
+ },
183
+ };
@@ -0,0 +1,183 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+ import type { BabyBudgetPlannerUI } from '../entry';
3
+ import type { FAQPage, HowTo, SoftwareApplication, WithContext } from 'schema-dts';
4
+ import { bibliography } from '../bibliography';
5
+
6
+ export const title = 'Bebek Bütçe Planlayıcı';
7
+ export const description = 'Bebeğinizin ilk yıl masraflarını planlamak için nihai araç. Oda hazırlığı, aylık giderler ve gizli masrafları akıllı tasarruf ipuçlarıyla hesaplayın.';
8
+
9
+ export const faq = [
10
+ {
11
+ question: 'Bir bebek ilk yılında ne kadar maliyet çıkarır?',
12
+ answer: 'Ortalama olarak, ilk yıl yaşam tarzınıza, çocuk bakım ihtiyaçlarınıza ve ürünleri yeni mi yoksa ikinci el mi aldığınıza bağlı olarak 150.000 TL ile 450.000 TL arasında maliyet çıkarabilir.',
13
+ },
14
+ {
15
+ question: 'Yeni doğan bir bebek için en pahalı ürünler nelerdir?',
16
+ answer: 'En büyük tek seferlik masraflar genellikle bebek arabası, oda mobilyaları (beşik, şifonyer) ve oto koltuğudur. Kreş veya bakıcı masrafları ise en yüksek aylık giderdir.',
17
+ },
18
+ {
19
+ question: 'Bebek masraflarından nasıl tasarruf edebilirim?',
20
+ answer: 'Ekipman ve giysiler için ikinci el alım yapmak, mümkünse anne sütü ile beslemek ve arkadaşlardan/aileden hediye almak için bir ihtiyaç listesi oluşturmak en etkili stratejilerdir.',
21
+ },
22
+ {
23
+ question: 'Bebek planlamasında "Hayalet Giderler" nelerdir?',
24
+ answer: 'Bunlar artan faturalar (ısıtma/soğutma), daha yüksek aile sigortası primleri ve standart listelerde pek bulunmayan zorunlu olmayan aşılar veya tıbbi malzemeler gibi gizli maliyetlerdir.',
25
+ },
26
+ ];
27
+
28
+ const faqSchema: WithContext<FAQPage> = {
29
+ '@context': 'https://schema.org',
30
+ '@type': 'FAQPage',
31
+ mainEntity: faq.map((item) => ({
32
+ '@type': 'Question',
33
+ name: item.question,
34
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
35
+ })),
36
+ };
37
+
38
+ export const howTo = [
39
+ {
40
+ name: 'Profilinizi Yapılandırın',
41
+ text: 'Yaşam tarzınızı (Tasarruflu, Dengeli veya Premium), besleme yöntemini ve çocuk bakım stratejinizi seçin.',
42
+ },
43
+ {
44
+ name: 'Ürünlerinizi İnceleyin',
45
+ text: 'Kategoriler arasında gezinin (İlk Yatırım, Aylık ve Önemli Adımlar) ve fiyatları ayarlayın veya ürünleri ikinci el olarak işaretleyin.',
46
+ },
47
+ {
48
+ name: 'Bütçenizi Takip Edin',
49
+ text: 'İlk yıl için gereken toplam tutarı görün ve ürünleri aldıkça ilerlemenizi takip edin.',
50
+ },
51
+ ];
52
+
53
+ const howToSchema: WithContext<HowTo> = {
54
+ '@context': 'https://schema.org',
55
+ '@type': 'HowTo',
56
+ name: title,
57
+ description,
58
+ step: howTo.map((step) => ({
59
+ '@type': 'HowToStep',
60
+ name: step.name,
61
+ text: step.text,
62
+ })),
63
+ };
64
+
65
+ const appSchema: WithContext<SoftwareApplication> = {
66
+ '@context': 'https://schema.org',
67
+ '@type': 'SoftwareApplication',
68
+ name: title,
69
+ operatingSystem: 'Any',
70
+ applicationCategory: 'FinanceApplication',
71
+ offers: {
72
+ '@type': 'Offer',
73
+ price: '0',
74
+ priceCurrency: 'TRY',
75
+ },
76
+ };
77
+
78
+ export const content: ToolLocaleContent<BabyBudgetPlannerUI> = {
79
+ title,
80
+ description,
81
+ slug: 'bebek-butce-planlayici',
82
+ faqTitle: 'Sıkça Sorulan Sorular',
83
+ bibliographyTitle: 'Bibliyografya',
84
+ seo: [
85
+ { type: 'summary', title: 'Özet: Bebek Bütçesi', items: [
86
+ 'İlk yıl masrafları yaşam tarzına göre büyük değişiklik gösterir.',
87
+ 'Tek seferlik başlangıç maliyetleri (oda, araba) ilk büyük engeldir.',
88
+ 'Çocuk bakımı, aylık bütçenin %50\'sine kadarını oluşturabilir.',
89
+ 'İkinci el ürünler toplam bütçeyi %60\'a kadar azaltabilir.',
90
+ ]},
91
+ { type: 'title', text: 'Bir bebek ilk yılında gerçekte ne kadara mal olur?', level: 2 },
92
+ { type: 'paragraph', html: 'Bir bebek için plan yapmak sadece bez almaktan ibaret değildir. Tek seferlik yatırımlarla aylık giderleri karşılaştıran stratejik bir bakış gerektirir. Planlayıcımız bu eğriyi görselleştirmenize ve ebeveynliğe finansal geçişe hazırlanmanıza yardımcı olur.' },
93
+ { type: 'stats', columns: 3, items: [
94
+ { value: '50.000 TL+', label: 'Başlangıç Ekipmanı' },
95
+ { value: '2.500-4.000 TL', label: 'Aylık Bez/Bakım' },
96
+ { value: '%40+', label: '2. El ile Tasarruf' },
97
+ ]},
98
+ { type: 'title', text: 'Kategori Dağılımı: Para Nereye Gidiyor?', level: 3 },
99
+ { type: 'table', headers: ['Kategori', 'Tipik Ürünler', 'Sıklık', 'Maliyet Etkisi'], rows: [
100
+ ['Başlangıç Yatırımı', 'Beşik, Bebek Arabası, Oto Koltuğu', 'Tek seferlik', 'Yüksek'],
101
+ ['Aylık Giderler', 'Bez, Mama, Eczane', 'Her ay', 'Orta'],
102
+ ['Önemli Adımlar', 'Mama Sandalyesi, Ek Gıda, Kıyafet', 'Ara sıra', 'Orta'],
103
+ ['Bakım', 'Kreş / Bakıcı', 'Her ay', 'Çok Yüksek'],
104
+ ]},
105
+ { type: 'tip', html: '<strong>Profesyonel Tasarruf İpucu:</strong> Kaliteli bebek arabaları ve oda mobilyalarının ikinci el değeri yüksektir. Bunları ikinci el almak, güvenlik veya stilden ödün vermeden binlerce lira tasarruf etmenizi sağlayabilir.' },
106
+ { type: 'title', text: 'Yaşam Tarzı Karşılaştırması', level: 3 },
107
+ { type: 'comparative', columns: 2, items: [
108
+ {
109
+ title: 'Tasarruflu',
110
+ description: 'İkinci el ve temel ihtiyaçlara odaklanın.',
111
+ points: ['Elden ele kıyafetler', 'Yenilenmiş ekipman', 'Anne sütü odaklı', 'Kamu destekli bakım']
112
+ },
113
+ {
114
+ title: 'Premium',
115
+ description: 'En yeni modeller ve maksimum konfor.',
116
+ points: ['Yüksek teknoloji ürünler', 'Organik mamalar', 'Tasarım bebek odası', 'Özel bakıcı desteği']
117
+ },
118
+ ]},
119
+ { type: 'title', text: 'Akıllı Planlama Kontrol Listesi', level: 3 },
120
+ { type: 'list', items: [
121
+ 'Aile sigortası kapsamı güncellemelerini kontrol edin.',
122
+ 'Zorunlu olmayan aşılar ve özel eczane ürünleri için bütçe ayırın.',
123
+ 'Ev faturalarında (ısıtma/soğutma) %20\'lik bir artış öngörün.',
124
+ 'Ailenin büyük alımlarda yardımcı olması için erkenden bir ihtiyaç listesi oluşturun.',
125
+ ]},
126
+ ],
127
+ faq,
128
+ howTo,
129
+ bibliography,
130
+ schemas: [faqSchema as any, howToSchema as any, appSchema as any],
131
+ ui: {
132
+ title,
133
+ onboardingTitle: 'Planını Başlat',
134
+ lifestyleLabel: 'Yaşam Tarzı Seçimi',
135
+ lifestyleSaving: 'Maksimum Tasarruf',
136
+ lifestyleBalanced: 'Dengeli',
137
+ lifestylePremium: 'Premium',
138
+ feedingLabel: 'Beslenme Yöntemi',
139
+ feedingBreast: 'Anne Sütü',
140
+ feedingFormula: 'Mama',
141
+ feedingMixed: 'Karışık',
142
+ childcareLabel: 'Bakım Stratejisi',
143
+ childcareHome: 'Evde Bakım',
144
+ childcarePublic: 'Devlet Kreşi',
145
+ childcarePrivate: 'Özel Kreş / Bakıcı',
146
+ startBtn: 'Bütçemi Oluştur',
147
+ categoryBeforeBirth: 'Başlangıç Yatırımı',
148
+ categoryMonthByMonth: 'Aylık Giderler',
149
+ categoryMilestones: 'Önemli Adımlar',
150
+ totalNeededLabel: '1. Yıl Toplam Hedef',
151
+ savingsProgressLabel: 'Hazır / Biriktirildi',
152
+ chartTitle: 'Aylık Gider Eğrisi',
153
+ ghostAlertsTitle: 'Hayalet Gider Uyarıları',
154
+ ghostInsurance: 'Sigorta Poliçe Kontrolü',
155
+ ghostHeating: 'Faturalarda +%20 Artış Öngör',
156
+ ghostVaccines: 'Opsiyonel Aşı Bütçesi',
157
+ diaperCalcTitle: 'Bez Fiyat Kontrolü',
158
+ diaperPriceLabel: 'Paket Fiyatı',
159
+ diaperUnitsLabel: 'Paketteki Adet',
160
+ secondHandLabel: '2. El / Hediye',
161
+ wishlistLabel: 'İhtiyaç Listesinde',
162
+ itemNursery: 'Bebek Odası Hazırlığı',
163
+ itemStroller: 'Bebek Arabası & Seyahat Seti',
164
+ itemHospitalBag: 'Hastane Çantası İhtiyaçları',
165
+ itemDiapers: 'Bez & Islak Mendil',
166
+ itemPharmacy: 'Eczane & Hijyen',
167
+ itemDaycare: 'Kreş / Çocuk Bakımı',
168
+ itemSolidFood: 'Ek Gıdaya Geçiş',
169
+ itemClothes: 'Mevsimlik Kıyafetler',
170
+ itemHighChair: 'Mama Sandalyesi & Seti',
171
+ editLabel: 'Fiyatı Düzenle',
172
+ saveBtn: 'Kaydet',
173
+ exportBtn: 'JSON Dışa Aktar',
174
+ importBtn: 'JSON İçe Aktar',
175
+ resetBtn: 'Planı Sıfırla',
176
+ currencySymbol: '₺',
177
+ monthPrefix: 'A',
178
+ initialMonthLabel: 'Başlat',
179
+ perMonthLabel: '/ay',
180
+ confirmReset: 'Emin misiniz?',
181
+ currencyMultiplier: 35,
182
+ },
183
+ };
@@ -0,0 +1,183 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+ import type { BabyBudgetPlannerUI } from '../entry';
3
+ import type { FAQPage, HowTo, SoftwareApplication, WithContext } from 'schema-dts';
4
+ import { bibliography } from '../bibliography';
5
+
6
+ export const title = '婴儿预算规划器';
7
+ export const description = '规划宝宝第一年开销的必备工具。计算育儿室准备、每月成本及隐藏开支,并提供智能省钱建议。';
8
+
9
+ export const faq = [
10
+ {
11
+ question: '宝宝第一年大约需要花费多少钱?',
12
+ answer: '平均而言,第一年的花费可能在 5 万到 15 万元人民币之间,具体取决于您的生活方式、托育需求以及您选择购买新品还是二手物品。',
13
+ },
14
+ {
15
+ question: '新生儿最昂贵的开支有哪些?',
16
+ answer: '最大的单次支出通常是婴儿车、育儿室家具(婴儿床、五斗柜)和安全座椅。托育费用则是最高的每月固定开支。',
17
+ },
18
+ {
19
+ question: '如何节省育儿开支?',
20
+ answer: '购买二手的设备和衣物、尽可能选择母乳喂养,以及利用礼品清单让亲友赠送必需品,都是非常有效的省钱策略。',
21
+ },
22
+ {
23
+ question: '婴儿预算中的“隐形成本”是什么?',
24
+ answer: '这些是隐藏的支出,例如能源账单(冷暖气)的增加、家庭保险费的上涨,以及非强制性疫苗或医疗用品,这些内容通常不在标准清单上。',
25
+ },
26
+ ];
27
+
28
+ const faqSchema: WithContext<FAQPage> = {
29
+ '@context': 'https://schema.org',
30
+ '@type': 'FAQPage',
31
+ mainEntity: faq.map((item) => ({
32
+ '@type': 'Question',
33
+ name: item.question,
34
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
35
+ })),
36
+ };
37
+
38
+ export const howTo = [
39
+ {
40
+ name: '配置您的资料',
41
+ text: '选择您的生活方式(节省型、均衡型或豪华型)、喂养方式和托育策略。',
42
+ },
43
+ {
44
+ name: '核对您的物品',
45
+ text: '浏览各个类别(初期投入、每月开销及成长里程碑),调整价格或将物品标记为二手。',
46
+ },
47
+ {
48
+ name: '追踪您的预算',
49
+ text: '查看第一年所需的总金额,并在添置物品的过程中随时监控进度。',
50
+ },
51
+ ];
52
+
53
+ const howToSchema: WithContext<HowTo> = {
54
+ '@context': 'https://schema.org',
55
+ '@type': 'HowTo',
56
+ name: title,
57
+ description,
58
+ step: howTo.map((step) => ({
59
+ '@type': 'HowToStep',
60
+ name: step.name,
61
+ text: step.text,
62
+ })),
63
+ };
64
+
65
+ const appSchema: WithContext<SoftwareApplication> = {
66
+ '@context': 'https://schema.org',
67
+ '@type': 'SoftwareApplication',
68
+ name: title,
69
+ operatingSystem: 'Any',
70
+ applicationCategory: 'FinanceApplication',
71
+ offers: {
72
+ '@type': 'Offer',
73
+ price: '0',
74
+ priceCurrency: 'CNY',
75
+ },
76
+ };
77
+
78
+ export const content: ToolLocaleContent<BabyBudgetPlannerUI> = {
79
+ title,
80
+ description,
81
+ slug: 'baby-budget-planner',
82
+ faqTitle: '常见问题',
83
+ bibliographyTitle: '参考文献',
84
+ seo: [
85
+ { type: 'summary', title: '核心摘要:育儿预算', items: [
86
+ '第一年的成本通常在 5 万至 15 万元人民币之间。',
87
+ '初期启动成本(育儿室、婴儿车)是最初最大的支出门槛。',
88
+ '托育费用可能占每月固定预算的 50% 以上。',
89
+ '选择二手物品最高可降低总预算的 60%。',
90
+ ]},
91
+ { type: 'title', text: '宝宝第一年到底要花多少钱?', level: 2 },
92
+ { type: 'paragraph', html: '养育宝宝不仅仅是买尿布。它需要战略性地审视一次性投资与每月固定支出的关系。我们的规划器可以帮助您可视化这一支出曲线,为向为人父母的经济转型做好准备。' },
93
+ { type: 'stats', columns: 3, items: [
94
+ { value: '2万元+', label: '初期装备配置' },
95
+ { value: '1-1.5千元', label: '每月尿布/洗护' },
96
+ { value: '40%+', label: '二手物品节省' },
97
+ ]},
98
+ { type: 'title', text: '类别细分:钱都花在了哪里?', level: 3 },
99
+ { type: 'table', headers: ['类别', '典型物品', '频率', '成本影响'], rows: [
100
+ ['初期投入', '婴儿床、婴儿车、安全座椅', '单次', '高'],
101
+ ['每月开销', '尿布、奶粉、药房用品', '每月', '中'],
102
+ ['里程碑', '高脚椅、辅食工具、衣物', '偶发', '中'],
103
+ ['托育', '幼儿园 / 月嫂 / 保姆', '每月', '极高'],
104
+ ]},
105
+ { type: 'tip', html: '<strong>专家省钱建议:</strong> 高品质的婴儿车和育儿室家具具有极高的二手价值。购买二手的此类物品可以为您节省数千元,且不会在安全性或风格上妥协。' },
106
+ { type: 'title', text: '生活方式对比', level: 3 },
107
+ { type: 'comparative', columns: 2, items: [
108
+ {
109
+ title: '节省型',
110
+ description: '关注二手物品和必需品。',
111
+ points: ['接手亲友旧衣物', '翻新后的装备', '以母乳喂养为主', '选择公立托育']
112
+ },
113
+ {
114
+ title: '豪华型',
115
+ description: '追求最新款和极致便利。',
116
+ points: ['高科技育儿产品', '有机奶粉', '设计师款育儿室', '私人家教式保姆']
117
+ },
118
+ ]},
119
+ { type: 'title', text: '明智规划清单', level: 3 },
120
+ { type: 'list', items: [
121
+ '检查并更新家庭医疗和人寿保险的覆盖范围。',
122
+ '为非强制性疫苗和专业药房用品预留预算。',
123
+ '预估家庭能源账单(冷暖气)将增加约 20%。',
124
+ '尽早创建礼物清单,以便亲友在大型物品上提供帮助。',
125
+ ]},
126
+ ],
127
+ faq,
128
+ howTo,
129
+ bibliography,
130
+ schemas: [faqSchema as any, howToSchema as any, appSchema as any],
131
+ ui: {
132
+ title,
133
+ onboardingTitle: '开启您的计划',
134
+ lifestyleLabel: '生活方式选择',
135
+ lifestyleSaving: '极限省钱',
136
+ lifestyleBalanced: '均衡型',
137
+ lifestylePremium: '豪华型',
138
+ feedingLabel: '喂养方式',
139
+ feedingBreast: '母乳喂养',
140
+ feedingFormula: '配方奶喂养',
141
+ feedingMixed: '混合喂养',
142
+ childcareLabel: '托育策略',
143
+ childcareHome: '居家照顾',
144
+ childcarePublic: '公立幼儿园',
145
+ childcarePrivate: '私立托育 / 月嫂',
146
+ startBtn: '生成我的预算',
147
+ categoryBeforeBirth: '初期投入',
148
+ categoryMonthByMonth: '每月开销',
149
+ categoryMilestones: '成长里程碑',
150
+ totalNeededLabel: '第一年总目标',
151
+ savingsProgressLabel: '已准备 / 已节省',
152
+ chartTitle: '每月支出曲线',
153
+ ghostAlertsTitle: '隐形成本警示',
154
+ ghostInsurance: '检查人寿/健康保险',
155
+ ghostHeating: '预留 +20% 能源费预算',
156
+ ghostVaccines: '非强制疫苗预算',
157
+ diaperCalcTitle: '尿布价格测算',
158
+ diaperPriceLabel: '每包价格',
159
+ diaperUnitsLabel: '每包片数',
160
+ secondHandLabel: '二手 / 赠送',
161
+ wishlistLabel: '在清单中',
162
+ itemNursery: '育儿室布置',
163
+ itemStroller: '婴儿车与出行系统',
164
+ itemHospitalBag: '待产包必备品',
165
+ itemDiapers: '尿布与湿纸巾',
166
+ itemPharmacy: '个护与卫生用品',
167
+ itemDaycare: '托育 / 照顾费用',
168
+ itemSolidFood: '辅食过渡准备',
169
+ itemClothes: '季节性衣物',
170
+ itemHighChair: '餐椅与餐具套装',
171
+ editLabel: '编辑价格',
172
+ saveBtn: '保存',
173
+ exportBtn: '导出 JSON',
174
+ importBtn: '导入 JSON',
175
+ resetBtn: '重置计划',
176
+ currencySymbol: '¥',
177
+ monthPrefix: 'M',
178
+ initialMonthLabel: '开始',
179
+ perMonthLabel: '/月',
180
+ confirmReset: '您确定吗?',
181
+ currencyMultiplier: 8,
182
+ },
183
+ };
@@ -0,0 +1,10 @@
1
+ import { babyBudgetPlanner } from './entry';
2
+ import type { ToolDefinition } from '../../types';
3
+
4
+ export * from './entry';
5
+ export const BABY_BUDGET_PLANNER_TOOL: ToolDefinition = {
6
+ entry: babyBudgetPlanner,
7
+ Component: () => import('./component.astro'),
8
+ SEOComponent: () => import('./seo.astro'),
9
+ BibliographyComponent: () => import('./bibliography.astro'),
10
+ };
@@ -0,0 +1,68 @@
1
+ export type Lifestyle = 'saving' | 'balanced' | 'premium';
2
+ export type Feeding = 'breast' | 'formula' | 'mixed';
3
+ export type Childcare = 'home' | 'public' | 'private';
4
+
5
+ export interface BudgetItem {
6
+ id: string;
7
+ labelKey: string;
8
+ category: 'before' | 'monthly' | 'milestones';
9
+ basePrice: Record<Lifestyle, number>;
10
+ isSecondHand: boolean;
11
+ isWishlist: boolean;
12
+ userPrice?: number;
13
+ }
14
+
15
+ export const DEFAULT_ITEMS: BudgetItem[] = [
16
+ { id: 'nursery', labelKey: 'itemNursery', category: 'before', basePrice: { saving: 100, balanced: 500, premium: 1500 }, isSecondHand: false, isWishlist: false },
17
+ { id: 'stroller', labelKey: 'itemStroller', category: 'before', basePrice: { saving: 200, balanced: 800, premium: 1500 }, isSecondHand: false, isWishlist: false },
18
+ { id: 'hospital', labelKey: 'itemHospitalBag', category: 'before', basePrice: { saving: 30, balanced: 100, premium: 300 }, isSecondHand: false, isWishlist: false },
19
+ { id: 'diapers', labelKey: 'itemDiapers', category: 'monthly', basePrice: { saving: 30, balanced: 50, premium: 80 }, isSecondHand: false, isWishlist: false },
20
+ { id: 'pharmacy', labelKey: 'itemPharmacy', category: 'monthly', basePrice: { saving: 10, balanced: 30, premium: 60 }, isSecondHand: false, isWishlist: false },
21
+ { id: 'daycare', labelKey: 'itemDaycare', category: 'monthly', basePrice: { saving: 0, balanced: 200, premium: 500 }, isSecondHand: false, isWishlist: false },
22
+ { id: 'solidFood', labelKey: 'itemSolidFood', category: 'milestones', basePrice: { saving: 50, balanced: 150, premium: 400 }, isSecondHand: false, isWishlist: false },
23
+ { id: 'clothesNext', labelKey: 'itemClothes', category: 'milestones', basePrice: { saving: 50, balanced: 150, premium: 300 }, isSecondHand: false, isWishlist: false },
24
+ { id: 'highChair', labelKey: 'itemHighChair', category: 'milestones', basePrice: { saving: 20, balanced: 80, premium: 250 }, isSecondHand: false, isWishlist: false },
25
+ ];
26
+
27
+ export function calculateItemPrice(item: BudgetItem, lifestyle: Lifestyle): number {
28
+ if (item.isSecondHand || item.isWishlist) return 0;
29
+ return item.userPrice !== undefined ? item.userPrice : item.basePrice[lifestyle];
30
+ }
31
+
32
+ export interface UserData {
33
+ lifestyle: Lifestyle;
34
+ feeding: Feeding;
35
+ childcare: Childcare;
36
+ items: BudgetItem[];
37
+ diaperCalc: {
38
+ price: number;
39
+ units: number;
40
+ };
41
+ }
42
+
43
+ export function getMonthExpense(userData: UserData, month: number): number {
44
+ let total = 0;
45
+ const { lifestyle, feeding, childcare, items } = userData;
46
+
47
+ if (month === 0) {
48
+ items.filter(i => i.category === 'before').forEach(i => {
49
+ total += calculateItemPrice(i, lifestyle);
50
+ });
51
+ }
52
+
53
+ if (month === 6) {
54
+ items.filter(i => i.category === 'milestones').forEach(i => {
55
+ total += calculateItemPrice(i, lifestyle);
56
+ });
57
+ }
58
+
59
+ items.filter(i => i.category === 'monthly').forEach(i => {
60
+ if (i.id === 'daycare' && childcare === 'home') return;
61
+ total += calculateItemPrice(i, lifestyle);
62
+ });
63
+
64
+ if (feeding === 'formula') total += (lifestyle === 'premium' ? 100 : 60);
65
+ if (feeding === 'mixed') total += (lifestyle === 'premium' ? 50 : 30);
66
+
67
+ return total;
68
+ }
@@ -0,0 +1,15 @@
1
+ ---
2
+ import { SEORenderer } from '@jjlmoya/utils-shared';
3
+ import { babyBudgetPlanner } from './index';
4
+ import type { KnownLocale } from '../../types';
5
+
6
+ interface Props {
7
+ locale?: KnownLocale;
8
+ }
9
+
10
+ const { locale = 'en' } = Astro.props;
11
+ const content = await babyBudgetPlanner.i18n[locale]?.();
12
+ if (!content) return null;
13
+ ---
14
+
15
+ {content.seo?.length > 0 && <SEORenderer content={{ locale, sections: content.seo }} />}