@jjlmoya/utils-finance 1.3.0 → 1.6.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 (168) hide show
  1. package/package.json +2 -1
  2. package/src/tests/faq_count.test.ts +1 -1
  3. package/src/tests/i18n_coverage.test.ts +36 -0
  4. package/src/tests/locale_completeness.test.ts +3 -0
  5. package/src/tests/slug_uniqueness.test.ts +81 -0
  6. package/src/tests/title_quality.test.ts +1 -1
  7. package/src/tool/compoundInterest/i18n/de.ts +208 -0
  8. package/src/tool/compoundInterest/i18n/id.ts +208 -0
  9. package/src/tool/compoundInterest/i18n/it.ts +208 -0
  10. package/src/tool/compoundInterest/i18n/ja.ts +207 -0
  11. package/src/tool/compoundInterest/i18n/ko.ts +207 -0
  12. package/src/tool/compoundInterest/i18n/nl.ts +208 -0
  13. package/src/tool/compoundInterest/i18n/pl.ts +208 -0
  14. package/src/tool/compoundInterest/i18n/pt.ts +208 -0
  15. package/src/tool/compoundInterest/i18n/ru.ts +208 -0
  16. package/src/tool/compoundInterest/i18n/sv.ts +208 -0
  17. package/src/tool/compoundInterest/i18n/tr.ts +208 -0
  18. package/src/tool/compoundInterest/i18n/zh.ts +202 -0
  19. package/src/tool/compoundInterest/index.ts +15 -7
  20. package/src/tool/courtFeeCalculator/i18n/de.ts +152 -0
  21. package/src/tool/courtFeeCalculator/i18n/fr.ts +1 -1
  22. package/src/tool/courtFeeCalculator/i18n/id.ts +152 -0
  23. package/src/tool/courtFeeCalculator/i18n/it.ts +152 -0
  24. package/src/tool/courtFeeCalculator/i18n/ja.ts +152 -0
  25. package/src/tool/courtFeeCalculator/i18n/ko.ts +152 -0
  26. package/src/tool/courtFeeCalculator/i18n/nl.ts +152 -0
  27. package/src/tool/courtFeeCalculator/i18n/pl.ts +152 -0
  28. package/src/tool/courtFeeCalculator/i18n/pt.ts +152 -0
  29. package/src/tool/courtFeeCalculator/i18n/ru.ts +152 -0
  30. package/src/tool/courtFeeCalculator/i18n/sv.ts +152 -0
  31. package/src/tool/courtFeeCalculator/i18n/tr.ts +152 -0
  32. package/src/tool/courtFeeCalculator/i18n/zh.ts +152 -0
  33. package/src/tool/courtFeeCalculator/index.ts +16 -8
  34. package/src/tool/debtSnowball/i18n/de.ts +160 -0
  35. package/src/tool/debtSnowball/i18n/id.ts +160 -0
  36. package/src/tool/debtSnowball/i18n/it.ts +160 -0
  37. package/src/tool/debtSnowball/i18n/ja.ts +157 -0
  38. package/src/tool/debtSnowball/i18n/ko.ts +160 -0
  39. package/src/tool/debtSnowball/i18n/nl.ts +160 -0
  40. package/src/tool/debtSnowball/i18n/pl.ts +160 -0
  41. package/src/tool/debtSnowball/i18n/pt.ts +160 -0
  42. package/src/tool/debtSnowball/i18n/ru.ts +160 -0
  43. package/src/tool/debtSnowball/i18n/sv.ts +160 -0
  44. package/src/tool/debtSnowball/i18n/tr.ts +160 -0
  45. package/src/tool/debtSnowball/i18n/zh.ts +160 -0
  46. package/src/tool/debtSnowball/index.ts +17 -9
  47. package/src/tool/fireCalculator/component.astro +12 -3
  48. package/src/tool/fireCalculator/i18n/de.ts +261 -0
  49. package/src/tool/fireCalculator/i18n/en.ts +5 -5
  50. package/src/tool/fireCalculator/i18n/es.ts +2 -2
  51. package/src/tool/fireCalculator/i18n/fr.ts +5 -5
  52. package/src/tool/fireCalculator/i18n/id.ts +261 -0
  53. package/src/tool/fireCalculator/i18n/it.ts +261 -0
  54. package/src/tool/fireCalculator/i18n/ja.ts +261 -0
  55. package/src/tool/fireCalculator/i18n/ko.ts +261 -0
  56. package/src/tool/fireCalculator/i18n/nl.ts +261 -0
  57. package/src/tool/fireCalculator/i18n/pl.ts +261 -0
  58. package/src/tool/fireCalculator/i18n/pt.ts +261 -0
  59. package/src/tool/fireCalculator/i18n/ru.ts +261 -0
  60. package/src/tool/fireCalculator/i18n/sv.ts +261 -0
  61. package/src/tool/fireCalculator/i18n/tr.ts +261 -0
  62. package/src/tool/fireCalculator/i18n/zh.ts +261 -0
  63. package/src/tool/fireCalculator/index.ts +15 -7
  64. package/src/tool/ibanBicSwiftConverter/i18n/de.ts +128 -0
  65. package/src/tool/ibanBicSwiftConverter/i18n/id.ts +128 -0
  66. package/src/tool/ibanBicSwiftConverter/i18n/it.ts +128 -0
  67. package/src/tool/ibanBicSwiftConverter/i18n/ja.ts +128 -0
  68. package/src/tool/ibanBicSwiftConverter/i18n/ko.ts +128 -0
  69. package/src/tool/ibanBicSwiftConverter/i18n/nl.ts +128 -0
  70. package/src/tool/ibanBicSwiftConverter/i18n/pl.ts +128 -0
  71. package/src/tool/ibanBicSwiftConverter/i18n/pt.ts +128 -0
  72. package/src/tool/ibanBicSwiftConverter/i18n/ru.ts +128 -0
  73. package/src/tool/ibanBicSwiftConverter/i18n/sv.ts +128 -0
  74. package/src/tool/ibanBicSwiftConverter/i18n/tr.ts +128 -0
  75. package/src/tool/ibanBicSwiftConverter/i18n/zh.ts +128 -0
  76. package/src/tool/ibanBicSwiftConverter/index.ts +15 -7
  77. package/src/tool/inflation/i18n/de.ts +297 -0
  78. package/src/tool/inflation/i18n/id.ts +297 -0
  79. package/src/tool/inflation/i18n/it.ts +297 -0
  80. package/src/tool/inflation/i18n/ja.ts +297 -0
  81. package/src/tool/inflation/i18n/ko.ts +297 -0
  82. package/src/tool/inflation/i18n/nl.ts +297 -0
  83. package/src/tool/inflation/i18n/pl.ts +297 -0
  84. package/src/tool/inflation/i18n/pt.ts +297 -0
  85. package/src/tool/inflation/i18n/ru.ts +297 -0
  86. package/src/tool/inflation/i18n/sv.ts +297 -0
  87. package/src/tool/inflation/i18n/tr.ts +297 -0
  88. package/src/tool/inflation/i18n/zh.ts +297 -0
  89. package/src/tool/inflation/index.ts +17 -9
  90. package/src/tool/lateInterest/i18n/de.ts +224 -0
  91. package/src/tool/lateInterest/i18n/id.ts +224 -0
  92. package/src/tool/lateInterest/i18n/it.ts +224 -0
  93. package/src/tool/lateInterest/i18n/ja.ts +224 -0
  94. package/src/tool/lateInterest/i18n/ko.ts +224 -0
  95. package/src/tool/lateInterest/i18n/nl.ts +224 -0
  96. package/src/tool/lateInterest/i18n/pl.ts +224 -0
  97. package/src/tool/lateInterest/i18n/pt.ts +224 -0
  98. package/src/tool/lateInterest/i18n/ru.ts +224 -0
  99. package/src/tool/lateInterest/i18n/sv.ts +224 -0
  100. package/src/tool/lateInterest/i18n/tr.ts +224 -0
  101. package/src/tool/lateInterest/i18n/zh.ts +224 -0
  102. package/src/tool/lateInterest/index.ts +17 -9
  103. package/src/tool/legalInterestRate/i18n/de.ts +143 -0
  104. package/src/tool/legalInterestRate/i18n/id.ts +143 -0
  105. package/src/tool/legalInterestRate/i18n/it.ts +143 -0
  106. package/src/tool/legalInterestRate/i18n/ja.ts +143 -0
  107. package/src/tool/legalInterestRate/i18n/ko.ts +143 -0
  108. package/src/tool/legalInterestRate/i18n/nl.ts +143 -0
  109. package/src/tool/legalInterestRate/i18n/pl.ts +143 -0
  110. package/src/tool/legalInterestRate/i18n/pt.ts +143 -0
  111. package/src/tool/legalInterestRate/i18n/ru.ts +143 -0
  112. package/src/tool/legalInterestRate/i18n/sv.ts +143 -0
  113. package/src/tool/legalInterestRate/i18n/tr.ts +143 -0
  114. package/src/tool/legalInterestRate/i18n/zh.ts +143 -0
  115. package/src/tool/legalInterestRate/index.ts +17 -9
  116. package/src/tool/lotteryOptimizer/i18n/de.ts +177 -0
  117. package/src/tool/lotteryOptimizer/i18n/id.ts +177 -0
  118. package/src/tool/lotteryOptimizer/i18n/it.ts +177 -0
  119. package/src/tool/lotteryOptimizer/i18n/ja.ts +177 -0
  120. package/src/tool/lotteryOptimizer/i18n/ko.ts +177 -0
  121. package/src/tool/lotteryOptimizer/i18n/nl.ts +177 -0
  122. package/src/tool/lotteryOptimizer/i18n/pl.ts +177 -0
  123. package/src/tool/lotteryOptimizer/i18n/pt.ts +177 -0
  124. package/src/tool/lotteryOptimizer/i18n/ru.ts +177 -0
  125. package/src/tool/lotteryOptimizer/i18n/sv.ts +177 -0
  126. package/src/tool/lotteryOptimizer/i18n/tr.ts +177 -0
  127. package/src/tool/lotteryOptimizer/i18n/zh.ts +177 -0
  128. package/src/tool/lotteryOptimizer/index.ts +17 -9
  129. package/src/tool/mortgage/i18n/de.ts +223 -0
  130. package/src/tool/mortgage/i18n/id.ts +219 -0
  131. package/src/tool/mortgage/i18n/it.ts +223 -0
  132. package/src/tool/mortgage/i18n/ja.ts +219 -0
  133. package/src/tool/mortgage/i18n/ko.ts +219 -0
  134. package/src/tool/mortgage/i18n/nl.ts +219 -0
  135. package/src/tool/mortgage/i18n/pl.ts +219 -0
  136. package/src/tool/mortgage/i18n/pt.ts +219 -0
  137. package/src/tool/mortgage/i18n/ru.ts +219 -0
  138. package/src/tool/mortgage/i18n/sv.ts +219 -0
  139. package/src/tool/mortgage/i18n/tr.ts +219 -0
  140. package/src/tool/mortgage/i18n/zh.ts +219 -0
  141. package/src/tool/mortgage/index.ts +15 -7
  142. package/src/tool/percentageCalculator/i18n/de.ts +229 -0
  143. package/src/tool/percentageCalculator/i18n/id.ts +229 -0
  144. package/src/tool/percentageCalculator/i18n/it.ts +229 -0
  145. package/src/tool/percentageCalculator/i18n/ja.ts +229 -0
  146. package/src/tool/percentageCalculator/i18n/ko.ts +229 -0
  147. package/src/tool/percentageCalculator/i18n/nl.ts +229 -0
  148. package/src/tool/percentageCalculator/i18n/pl.ts +229 -0
  149. package/src/tool/percentageCalculator/i18n/pt.ts +229 -0
  150. package/src/tool/percentageCalculator/i18n/ru.ts +229 -0
  151. package/src/tool/percentageCalculator/i18n/sv.ts +229 -0
  152. package/src/tool/percentageCalculator/i18n/tr.ts +229 -0
  153. package/src/tool/percentageCalculator/i18n/zh.ts +229 -0
  154. package/src/tool/percentageCalculator/index.ts +15 -7
  155. package/src/tool/rentIncreaseCalculator/i18n/de.ts +136 -0
  156. package/src/tool/rentIncreaseCalculator/i18n/id.ts +136 -0
  157. package/src/tool/rentIncreaseCalculator/i18n/it.ts +136 -0
  158. package/src/tool/rentIncreaseCalculator/i18n/ja.ts +136 -0
  159. package/src/tool/rentIncreaseCalculator/i18n/ko.ts +136 -0
  160. package/src/tool/rentIncreaseCalculator/i18n/nl.ts +136 -0
  161. package/src/tool/rentIncreaseCalculator/i18n/pl.ts +136 -0
  162. package/src/tool/rentIncreaseCalculator/i18n/pt.ts +136 -0
  163. package/src/tool/rentIncreaseCalculator/i18n/ru.ts +136 -0
  164. package/src/tool/rentIncreaseCalculator/i18n/sv.ts +136 -0
  165. package/src/tool/rentIncreaseCalculator/i18n/tr.ts +136 -0
  166. package/src/tool/rentIncreaseCalculator/i18n/zh.ts +136 -0
  167. package/src/tool/rentIncreaseCalculator/index.ts +17 -9
  168. package/src/types.ts +1 -1
@@ -0,0 +1,160 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { DebtSnowballUI } from '../ui';
4
+
5
+ const slug = 'borc-kartopu-metodu-hesaplayici';
6
+ const title = 'Borç Kartopu Hesaplayıcı: Borç Ödeme Planı 2026';
7
+ const description = 'Dave Ramsey’in kartopu metodu ile finansal özgürlük tarihinizi hesaplayın. Borçlarınızı düzenleyin ve aylık ödeme planınızı görselleştirin.';
8
+
9
+ const faqData = [
10
+ {
11
+ question: 'Borç kartopu metodu nedir?',
12
+ answer: 'Faiz oranına bakılmaksızın borçların en küçük bakiyeden en büyüğe doğru ödenmesini içeren bir stratejidir. Küçük hesapları hızla kapatmanın getirdiği psikolojik başarıya odaklanır.',
13
+ },
14
+ {
15
+ question: 'Neden faiz oranına (Çığ Metodu) göre sıralanmıyor?',
16
+ answer: 'Matematiksel olarak en yüksek faizi önce ödemek daha fazla para kazandırır. Ancak birçok kişi hemen sonuç görmediği için pes eder. Kartopu motivasyona öncelik verir.',
17
+ },
18
+ {
19
+ question: 'Plana başlamadan önce birikimim olmalı mı?',
20
+ answer: 'Borçlara saldırmadan önce küçük bir "Acil Durum Fonu" (yaklaşık 1.000€) oluşturulması önerilir. Bu, beklenmedik durumlarda tekrar kredi kartına sarılmanızı önler.',
21
+ },
22
+ {
23
+ question: 'Hesaplayıcıya hangi borçları dahil etmeliyim?',
24
+ answer: 'Tüm tüketici borçları: kredi kartları, kişisel krediler, araç kredileri, gecikmiş faturalar. Konut kredisi genellikle hacmi nedeniyle sonraki aşamaya bırakılır.',
25
+ },
26
+ ];
27
+
28
+ const howToData = [
29
+ {
30
+ name: 'Borçlarınızı listeleyin',
31
+ text: 'Tüm borçlarınızı, kalan bakiyeleri ve aylık minimum ödeme tutarlarını belirterek not edin.',
32
+ },
33
+ {
34
+ name: 'Ek bütçenizi belirleyin',
35
+ text: 'Minimum ödemelerin üzerine her ay ne kadar ek para ayırabileceğinizi hesaplayın.',
36
+ },
37
+ {
38
+ name: 'Sıralayın ve önceliklendirin',
39
+ text: 'Hesaplayıcı otomatik olarak en küçük bakiyeden en büyüğe doğru sıralayacaktır. En küçüğü hariç hepsinde minimumu ödeyin.',
40
+ },
41
+ {
42
+ name: 'Basamağı uygulayın',
43
+ text: 'En küçük borcu kapattığınızda, ona ayırdığınız tüm parayı alın ve listedeki bir sonraki borcun ödemesine ekleyin.',
44
+ },
45
+ ];
46
+
47
+ const bibliographyData = [
48
+ {
49
+ name: 'Investopedia — Debt Snowball vs. Debt Avalanche',
50
+ url: 'https://www.investopedia.com/',
51
+ },
52
+ {
53
+ name: 'Harvard Business Review — Research on Debt Payoff Strategies',
54
+ url: 'https://hbr.org/',
55
+ },
56
+ ];
57
+
58
+ const faqSchema: WithContext<FAQPage> = {
59
+ '@context': 'https://schema.org',
60
+ '@type': 'FAQPage',
61
+ mainEntity: faqData.map((item) => ({
62
+ '@type': 'Question',
63
+ name: item.question,
64
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
65
+ })),
66
+ };
67
+
68
+ const howToSchema: WithContext<HowTo> = {
69
+ '@context': 'https://schema.org',
70
+ '@type': 'HowTo',
71
+ name: title,
72
+ description,
73
+ step: howToData.map((step, i) => ({
74
+ '@type': 'HowToStep',
75
+ position: i + 1,
76
+ name: step.name,
77
+ text: step.text,
78
+ })),
79
+ };
80
+
81
+ const appSchema: WithContext<SoftwareApplication> = {
82
+ '@context': 'https://schema.org',
83
+ '@type': 'SoftwareApplication',
84
+ name: title,
85
+ description,
86
+ applicationCategory: 'FinanceApplication',
87
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
88
+ };
89
+
90
+ export const content: ToolLocaleContent<DebtSnowballUI> = {
91
+ slug,
92
+ title,
93
+ description,
94
+ faqTitle: 'Sıkça Sorulan Sorular',
95
+ faq: faqData,
96
+ bibliographyTitle: 'Kaynaklar ve Referanslar',
97
+ bibliography: bibliographyData,
98
+ howTo: howToData,
99
+ schemas: [faqSchema, howToSchema, appSchema],
100
+ seo: [
101
+ {
102
+ type: 'title',
103
+ text: 'Borç Kartopu Metodu Hesaplayıcı: Kılavuz 2026',
104
+ level: 2,
105
+ },
106
+ {
107
+ type: 'paragraph',
108
+ html: 'Borçla yaşamak zordur. <strong>Kartopu metodu</strong>, finansal özgürlüğü geri kazanmak için en etkili stratejilerden biri olduğunu kanıtlamıştır.',
109
+ },
110
+ ],
111
+ ui: {
112
+ labelTitle: 'Tam özgürlük',
113
+ labelDescription: 'Finansal özgürlüğe giden yolunuza psikolojik olarak en etkili yöntemle başlayın.',
114
+ labelExtraBudget: 'AYLIK EK BÜTÇE',
115
+ labelExtraBudgetHelp: 'Minimum ödemelerin üzerindeki ek para.',
116
+ labelSnowballMethod: 'KARTOPU',
117
+ labelAvalancheMethod: 'ÇIĞ',
118
+ labelAddNewDebt: 'YENİ BORÇ EKLE',
119
+ labelDebtName: 'İsim',
120
+ labelDebtNamePlaceholder: 'Örn: Visa',
121
+ labelDebtBalance: 'BORCUNUZ NE KADAR',
122
+ labelDebtBalancePlaceholder: '0',
123
+ labelMinPayment: 'MİNİMUM ÖDEME',
124
+ labelInterestRate: 'FAİZ ORANI',
125
+ labelInterestHelp: 'YILLIK',
126
+ labelAddButton: 'PLANA EKLE',
127
+ labelClearData: 'Ayarları temizle',
128
+ labelClearDataConfirm: 'Plan boşaltılsın mı?',
129
+ labelDeleteDebt: 'Sil',
130
+ labelDebtInventory: 'Borç Envanteri',
131
+ labelFreedomDate: 'FİNANSAL ÖZGÜRLÜK TARİHİ',
132
+ labelActiveMethod: 'METOT',
133
+ labelMonthsRemaining: 'KALAN AY SAYISI',
134
+ labelTotalInterest: 'TOPLAM FAİZ',
135
+ labelTotalPaid: 'TOPLAM FİNAL ÖDEMESİ',
136
+ labelInterestSaved: 'FAİZ TASARRUFU',
137
+ labelYourStrategy: 'Adım Adım Stratejiniz',
138
+ labelStrategyHelp: 'Her adım toplam ödemenizi gösterir.',
139
+ labelPriority: 'EN YÜKSEK ÖNCELİK',
140
+ labelStep: 'ADIM',
141
+ labelAfterPaying: 'ÖNCEKİNİ KAPATTIKTAN SONRA',
142
+ labelMonthlyPayment: 'Aylık ödeme',
143
+ labelDetailedAmortization: 'Detaylı Amortisman',
144
+ labelExportCSV: '.CSV Olarak Dışa Aktar',
145
+ labelDate: 'Tarih',
146
+ labelStartingBalance: 'Başlangıç Bakiyesi',
147
+ labelInterest: 'Faiz',
148
+ labelAmortization: 'Amortisman',
149
+ labelTotalMonth: 'Aylık Toplam',
150
+ labelRemaining: 'Kalan',
151
+ labelFree: 'ÖZGÜR',
152
+ labelDebtInfinite: 'SONSUZ BORÇ',
153
+ labelInvalidInput: 'Toplam bakiye ve minimum ödemeyi belirtin',
154
+ labelEmptyStateTitle: 'Planınıza başlayın',
155
+ labelEmptyStateDescription: 'Borçlarınız sonsuza kadar sürmeyecek. Borçlarınızı ekleyin.',
156
+ currencySymbol: '€',
157
+ currencyCode: 'EUR',
158
+ currencyLocale: 'tr-TR',
159
+ },
160
+ };
@@ -0,0 +1,160 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { DebtSnowballUI } from '../ui';
4
+
5
+ const slug = 'debt-snowball-calculator';
6
+ const title = '债务雪球法计算器:2026 年还款计划';
7
+ const description = '使用 Dave Ramsey 的雪球法计算您的财务自由日期。整理您的债务并查看详细的每月还款计划。';
8
+
9
+ const faqData = [
10
+ {
11
+ question: '什么是债务雪球法?',
12
+ answer: '这是一种债务偿还策略,要求按照债务余额从小到大的顺序偿还债务,而不考虑利率。它的核心在于通过快速消除小额账户来获得心理上的成就感和动力。',
13
+ },
14
+ {
15
+ question: '为什么不按照利率排序(雪崩法)?',
16
+ answer: '从数学上讲,先偿还高利率债务可以节省更多利息。然而,许多人因为看不到即时结果而中途放弃。雪球法优先考虑动机:看到债务迅速消失能给您应对大额债务的能量。',
17
+ },
18
+ {
19
+ question: '在开始计划之前我需要有储蓄吗?',
20
+ answer: '建议在攻击债务之前先建立一个“初始紧急基金”(约 1,000 欧元)。这可以防止在遇到突发情况时不得不再次使用信用卡而破坏您的进度。',
21
+ },
22
+ {
23
+ question: '我应该在计算器中包含哪些债务?',
24
+ answer: '所有的消费债务:信用卡、个人贷款、汽车贷款、逾期账单。房贷通常因为金额巨大而被留到后期。',
25
+ },
26
+ ];
27
+
28
+ const howToData = [
29
+ {
30
+ name: '列出您的债务',
31
+ text: '写下您所有的债务,注明当前的剩余余额和您每月支付的最低还款额。',
32
+ },
33
+ {
34
+ name: '确定额外预算',
35
+ text: '计算您每个月在最低还款额之外还能投入多少额外资金用于还债。',
36
+ },
37
+ {
38
+ name: '排序并确定优先级',
39
+ text: '计算器将自动按余额从小到大排序。对除最小债务外的所有债务支付最低额,将所有额外资金投入最小的债务。',
40
+ },
41
+ {
42
+ name: '执行级联还款',
43
+ text: '当清完最小的一笔债务后,将原来用于该债务的所有资金(最低还款额 + 额外资金)全部转入下一笔债务。',
44
+ },
45
+ ];
46
+
47
+ const bibliographyData = [
48
+ {
49
+ name: 'Investopedia — Debt Snowball vs. Debt Avalanche',
50
+ url: 'https://www.investopedia.com/',
51
+ },
52
+ {
53
+ name: 'Harvard Business Review — Research on Debt Payoff Strategies',
54
+ url: 'https://hbr.org/',
55
+ },
56
+ ];
57
+
58
+ const faqSchema: WithContext<FAQPage> = {
59
+ '@context': 'https://schema.org',
60
+ '@type': 'FAQPage',
61
+ mainEntity: faqData.map((item) => ({
62
+ '@type': 'Question',
63
+ name: item.question,
64
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
65
+ })),
66
+ };
67
+
68
+ const howToSchema: WithContext<HowTo> = {
69
+ '@context': 'https://schema.org',
70
+ '@type': 'HowTo',
71
+ name: title,
72
+ description,
73
+ step: howToData.map((step, i) => ({
74
+ '@type': 'HowToStep',
75
+ position: i + 1,
76
+ name: step.name,
77
+ text: step.text,
78
+ })),
79
+ };
80
+
81
+ const appSchema: WithContext<SoftwareApplication> = {
82
+ '@context': 'https://schema.org',
83
+ '@type': 'SoftwareApplication',
84
+ name: title,
85
+ description,
86
+ applicationCategory: 'FinanceApplication',
87
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
88
+ };
89
+
90
+ export const content: ToolLocaleContent<DebtSnowballUI> = {
91
+ slug,
92
+ title,
93
+ description,
94
+ faqTitle: '常见问题',
95
+ faq: faqData,
96
+ bibliographyTitle: '来源与参考资料',
97
+ bibliography: bibliographyData,
98
+ howTo: howToData,
99
+ schemas: [faqSchema, howToSchema, appSchema],
100
+ seo: [
101
+ {
102
+ type: 'title',
103
+ text: '债务雪球法计算器:2026 年完整指南',
104
+ level: 2,
105
+ },
106
+ {
107
+ type: 'paragraph',
108
+ html: '带着债务生活就像背着重负跑马拉松。<strong>债务雪球法</strong>已被证明是重获财务自由最有效的策略之一。',
109
+ },
110
+ ],
111
+ ui: {
112
+ labelTitle: '彻底自由',
113
+ labelDescription: '用心理上最有效的方法开始您的财务自由之路。',
114
+ labelExtraBudget: '每月额外预算',
115
+ labelExtraBudgetHelp: '在最低还款额之外的资金。',
116
+ labelSnowballMethod: '雪球法',
117
+ labelAvalancheMethod: '雪崩法',
118
+ labelAddNewDebt: '添加新债务',
119
+ labelDebtName: '名称',
120
+ labelDebtNamePlaceholder: '例如:Visa 卡',
121
+ labelDebtBalance: '欠款金额',
122
+ labelDebtBalancePlaceholder: '0',
123
+ labelMinPayment: '最低还款额',
124
+ labelInterestRate: '年利率',
125
+ labelInterestHelp: '年化',
126
+ labelAddButton: '添加到计划',
127
+ labelClearData: '清除设置',
128
+ labelClearDataConfirm: '清空计划?',
129
+ labelDeleteDebt: '删除',
130
+ labelDebtInventory: '债务清单',
131
+ labelFreedomDate: '财务自由日期',
132
+ labelActiveMethod: '方法',
133
+ labelMonthsRemaining: '剩余月数',
134
+ labelTotalInterest: '总利息',
135
+ labelTotalPaid: '最终总还款',
136
+ labelInterestSaved: '节省的利息',
137
+ labelYourStrategy: '您的分步策略',
138
+ labelStrategyHelp: '每一步都显示您的总还款额。',
139
+ labelPriority: '最高优先级',
140
+ labelStep: '步骤',
141
+ labelAfterPaying: '在结清上一笔后',
142
+ labelMonthlyPayment: '每月还款',
143
+ labelDetailedAmortization: '详细摊销计划',
144
+ labelExportCSV: '导出 .CSV',
145
+ labelDate: '日期',
146
+ labelStartingBalance: '起始余额',
147
+ labelInterest: '利息',
148
+ labelAmortization: '已偿还本金',
149
+ labelTotalMonth: '月计',
150
+ labelRemaining: '剩余',
151
+ labelFree: '自由',
152
+ labelDebtInfinite: '债务无限',
153
+ labelInvalidInput: '请输入总余额和最低还款额',
154
+ labelEmptyStateTitle: '开始您的计划',
155
+ labelEmptyStateDescription: '债务不是永久的。添加您的债务以查看自由之路。',
156
+ currencySymbol: '€',
157
+ currencyCode: 'EUR',
158
+ currencyLocale: 'zh-CN',
159
+ },
160
+ };
@@ -8,20 +8,28 @@ import { DebtSnowballLogic, type Debt, type SimulationResult, type ProjectionMon
8
8
  export type DebtSnowballLocaleContent = ToolLocaleContent<DebtSnowballUI>;
9
9
  export type { Debt, SimulationResult, ProjectionMonth };
10
10
 
11
- import { content as es } from './i18n/es';
12
- import { content as en } from './i18n/en';
13
- import { content as fr } from './i18n/fr';
14
-
15
11
  export const debtSnowball: FinanceToolEntry<DebtSnowballUI> = {
16
12
  id: 'bola-nieve-deuda',
17
13
  icons: {
18
- bg: 'mdi:chart-line',
19
- fg: 'mdi:trending-up',
14
+ bg: 'mdi:snowflake',
15
+ fg: 'mdi:trending-down',
20
16
  },
21
17
  i18n: {
22
- es: async () => es,
23
- en: async () => en,
24
- fr: async () => fr,
18
+ de: () => import('./i18n/de').then((m) => m.content),
19
+ en: () => import('./i18n/en').then((m) => m.content),
20
+ es: () => import('./i18n/es').then((m) => m.content),
21
+ fr: () => import('./i18n/fr').then((m) => m.content),
22
+ id: () => import('./i18n/id').then((m) => m.content),
23
+ it: () => import('./i18n/it').then((m) => m.content),
24
+ ja: () => import('./i18n/ja').then((m) => m.content),
25
+ ko: () => import('./i18n/ko').then((m) => m.content),
26
+ nl: () => import('./i18n/nl').then((m) => m.content),
27
+ pl: () => import('./i18n/pl').then((m) => m.content),
28
+ pt: () => import('./i18n/pt').then((m) => m.content),
29
+ ru: () => import('./i18n/ru').then((m) => m.content),
30
+ sv: () => import('./i18n/sv').then((m) => m.content),
31
+ tr: () => import('./i18n/tr').then((m) => m.content),
32
+ zh: () => import('./i18n/zh').then((m) => m.content),
25
33
  },
26
34
  };
27
35
 
@@ -10,7 +10,15 @@ interface Props {
10
10
  const { ui } = Astro.props;
11
11
  ---
12
12
 
13
- <div class="fire-container" id="fire-calculator-main" data-currency-symbol={ui.currencySymbol} data-currency-code={ui.currencyCode} data-currency-locale={ui.currencyLocale} data-time-format={ui.labelTimeRemainingFormat} data-already-fi={ui.labelAlreadyFI} data-unachievable={ui.labelUnachievable}>
13
+ <div class="fire-container" id="fire-calculator-main"
14
+ data-currency-symbol={ui.currencySymbol}
15
+ data-currency-code={ui.currencyCode}
16
+ data-currency-locale={ui.currencyLocale}
17
+ data-time-format={ui.labelTimeRemainingFormat}
18
+ data-already-fi={ui.labelAlreadyFI}
19
+ data-unachievable={ui.labelUnachievable}
20
+ data-label-added={ui.labelAdded}
21
+ >
14
22
  <div class="fire-grid">
15
23
  <div class="fire-panel">
16
24
  <div class="fire-input-group">
@@ -547,6 +555,7 @@ const { ui } = Astro.props;
547
555
  const timeFormatTemplate = container?.getAttribute('data-time-format') || 'You have {years} years and {months} months left';
548
556
  const labelAlreadyFI = container?.getAttribute('data-already-fi') || 'You have already achieved financial freedom!';
549
557
  const labelUnachievable = container?.getAttribute('data-unachievable') || 'Goal unachievable with this savings rate';
558
+ const labelAdded = container?.getAttribute('data-label-added') || 'Added:';
550
559
 
551
560
  function formatCurrency(val: number): string {
552
561
  return new Intl.NumberFormat(currencyLocale, {
@@ -641,7 +650,7 @@ const { ui } = Astro.props;
641
650
  const target = e.target as HTMLInputElement;
642
651
  if (target && checklistFeedback) {
643
652
  if (target.checked) {
644
- checklistFeedback.textContent = `Añadido: ${target.parentElement?.textContent?.trim()}`;
653
+ checklistFeedback.textContent = `${labelAdded} ${target.parentElement?.textContent?.trim()}`;
645
654
  checklistFeedback.classList.add('visible');
646
655
  setTimeout(() => checklistFeedback.classList.remove('visible'), 2000);
647
656
  }
@@ -677,7 +686,7 @@ const { ui } = Astro.props;
677
686
  const imgData = canvas.toDataURL('image/png');
678
687
  const pdf = new jsPDF('p', 'pt', 'a4');
679
688
  pdf.addImage(imgData, 'PNG', 0, 0, 595.28, (canvas.height * 595.28) / canvas.width);
680
- pdf.save('mi-plan-fire.pdf');
689
+ pdf.save('fire-plan.pdf');
681
690
  }
682
691
 
683
692
  const btnExport = document.getElementById('btn-export');
@@ -0,0 +1,261 @@
1
+ import type { WithContext, FAQPage, HowTo, SoftwareApplication } from 'schema-dts';
2
+ import type { ToolLocaleContent } from '../../../types';
3
+ import type { FIRECalculatorUI } from '../ui';
4
+
5
+ const slug = 'fire-rechner-4-prozent-regel';
6
+ const title = 'FIRE Rechner: Die 4% Regel für Ihre finanzielle Freiheit';
7
+ const description = 'Berechnen Sie Ihre magische Zahl für die finanzielle Unabhängigkeit mit der 4%-Regel. Planen Sie Ihren vorzeitigen Ruhestand und visualisieren Sie Ihren Weg zur wirtschaftlichen Freiheit.';
8
+
9
+ const faqData = [
10
+ {
11
+ question: 'Was ist die 4%-Regel?',
12
+ answer: 'Die 4%-Regel ist eine Entnahmestrategie basierend auf der Trinity-Studie. Sie besagt, dass man im ersten Jahr des Ruhestands 4 % seines Vermögens entnehmen und in den Folgejahren an die Inflation anpassen kann, ohne dass das Geld innerhalb von 30 Jahren ausgeht.',
13
+ },
14
+ {
15
+ question: 'Was bedeutet FIRE?',
16
+ answer: 'FIRE steht für Financial Independence, Retire Early (Finanzielle Unabhängigkeit, früher Ruhestand). Es ist eine Bewegung, die darauf abzielt, wirtschaftliche Freiheit durch eine aggressive Kombination aus Sparen und klugem Investieren zu erreichen.',
17
+ },
18
+ {
19
+ question: 'Was ist meine magische Zahl?',
20
+ answer: 'Ihre magische Zahl ist das gesamte Vermögen, das Sie anhäufen müssen, um von den Erträgen leben zu können, ohne zu arbeiten. Sie wird berechnet, indem Sie Ihre jährlichen Ausgaben durch die sichere Entnahmerate (meist 4 %) teilen.',
21
+ },
22
+ {
23
+ question: 'Was ist der Unterschied zwischen Lean, Barista und Fat FIRE?',
24
+ answer: 'Lean FIRE bedeutet, mit minimalen Ausgaben zu leben (70 % der aktuellen Ausgaben), Barista FIRE bedeutet, Teilzeit zu arbeiten, während die Erträge den Rest decken (50 % der Ausgaben), und Fat FIRE bedeutet einen komfortablen Lebensstil (150 % der Ausgaben).',
25
+ },
26
+ {
27
+ question: 'Ist die 4%-Regel realistisch?',
28
+ answer: 'Die 4%-Regel hat eine historische Erfolgswahrscheinlichkeit von 95 % bei einem Portfolio aus 50 % Aktien und 50 % Anleihen über 30 Jahre. Sie berücksichtigt jedoch nicht das Reihenfolgerisiko der Renditen und basiert hauptsächlich auf US-Marktdaten.',
29
+ },
30
+ ];
31
+
32
+ const howToData = [
33
+ {
34
+ name: 'Berechnen Sie Ihre monatlichen Ausgaben',
35
+ text: 'Analysieren Sie, wie viel Sie tatsächlich jeden Monat ausgeben, einschließlich Wohnen, Verpflegung, Dienstleistungen und Unterhaltung.',
36
+ },
37
+ {
38
+ name: 'Wählen Sie Ihre sichere Entnahmerate',
39
+ text: 'Die 4%-Regel ist der Standard, aber Sie können je nach Risikotoleranz zwischen 2,5 % (konservativer) und 6 % (aggressiver) anpassen.',
40
+ },
41
+ {
42
+ name: 'Geben Sie Ihr aktuelles Vermögen ein',
43
+ text: 'Addieren Sie die Summe Ihrer Investitionen, Ersparnisse und Vermögenswerte, die passives Einkommen generieren.',
44
+ },
45
+ {
46
+ name: 'Visualisieren Sie Ihren Fortschritt',
47
+ text: 'Beobachten Sie das Wachstumsdiagramm und die Meilensteine der Freiheit (Lean, Barista, Fat FIRE), um zu verstehen, wann Sie Ihr Ziel erreichen.',
48
+ },
49
+ ];
50
+
51
+ const bibliographyData = [
52
+ {
53
+ name: 'The Trinity Study: Portfolio Survivability',
54
+ url: 'https://en.wikipedia.org/wiki/Trinity_study',
55
+ },
56
+ {
57
+ name: 'Early Retirement Forum - 4% Rule Discussion',
58
+ url: 'https://www.bogleheads.org/forum/',
59
+ },
60
+ {
61
+ name: 'Shiller CAPE Index - Market Valuations',
62
+ url: 'https://www.multpl.com/shiller-pe',
63
+ },
64
+ {
65
+ name: 'Bogleheads - Anlageleitfaden',
66
+ url: 'https://bogleheads.es/',
67
+ },
68
+ ];
69
+
70
+ const faqSchema: WithContext<FAQPage> = {
71
+ '@context': 'https://schema.org',
72
+ '@type': 'FAQPage',
73
+ mainEntity: faqData.map((item) => ({
74
+ '@type': 'Question',
75
+ name: item.question,
76
+ acceptedAnswer: { '@type': 'Answer', text: item.answer },
77
+ })),
78
+ };
79
+
80
+ const howToSchema: WithContext<HowTo> = {
81
+ '@context': 'https://schema.org',
82
+ '@type': 'HowTo',
83
+ name: title,
84
+ description,
85
+ step: howToData.map((step, i) => ({
86
+ '@type': 'HowToStep',
87
+ position: i + 1,
88
+ name: step.name,
89
+ text: step.text,
90
+ })),
91
+ };
92
+
93
+ const appSchema: WithContext<SoftwareApplication> = {
94
+ '@context': 'https://schema.org',
95
+ '@type': 'SoftwareApplication',
96
+ name: title,
97
+ description,
98
+ applicationCategory: 'FinanceApplication',
99
+ operatingSystem: 'All',
100
+ offers: { '@type': 'Offer', price: '0', priceCurrency: 'EUR' },
101
+ inLanguage: 'de',
102
+ };
103
+
104
+ export const content: ToolLocaleContent<FIRECalculatorUI> = {
105
+ slug,
106
+ title,
107
+ description,
108
+ faqTitle: 'Häufig gestellte Fragen zu FIRE',
109
+ faq: faqData,
110
+ bibliographyTitle: 'Quellen und Referenzen',
111
+ bibliography: bibliographyData,
112
+ howTo: howToData,
113
+ schemas: [faqSchema, howToSchema, appSchema],
114
+ seo: [
115
+ {
116
+ type: 'title',
117
+ text: 'Die 4%-Regel: Der heilige Gral des vorzeitigen Ruhestands',
118
+ level: 2,
119
+ },
120
+ {
121
+ type: 'paragraph',
122
+ html: 'Finden Sie heraus, wie Sie das Vermögen berechnen, das Sie benötigen, um für immer von Ihren Erträgen zu leben. Die <strong>4%-Regel</strong> entstammt der Trinity-Studie, die 1998 von drei Finanzprofessoren durchgeführt wurde. Sie analysierten historische Daten seit 1926, um zu bestimmen, welcher Prozentsatz jährlich entnommen werden konnte, ohne das Portfolio über 30 Jahre hinweg aufzehren.',
123
+ },
124
+ {
125
+ type: 'stats',
126
+ columns: 4,
127
+ items: [
128
+ { value: '95%', label: 'Historischer Erfolg' },
129
+ { value: '50/50', label: 'Aktien/Anleihen-Mix' },
130
+ { value: '30', label: 'Jahre Horizont' },
131
+ { value: '4%', label: 'Sichere Entnahme' },
132
+ ],
133
+ },
134
+ {
135
+ type: 'title',
136
+ text: 'Was ist die FIRE-Bewegung?',
137
+ level: 3,
138
+ },
139
+ {
140
+ type: 'list',
141
+ items: [
142
+ 'FIRE ist das Akronym für Financial Independence, Retire Early (Finanzielle Unabhängigkeit, früher Ruhestand).',
143
+ 'Sie strebt die Freiheit an, selbst zu entscheiden, was man mit seiner Zeit anfangen möchte, ohne dass Geld ein limitierender Faktor ist.',
144
+ 'Sie basiert auf der Optimierung des Sparens und kluger Investition.',
145
+ 'Das Ziel ist, dass Ihre Vermögenswerte genügend Cashflow generieren, um Ihre Ausgaben zu decken.',
146
+ ],
147
+ },
148
+ {
149
+ type: 'title',
150
+ text: 'Arten der finanziellen Freiheit',
151
+ level: 3,
152
+ },
153
+ {
154
+ type: 'comparative',
155
+ columns: 3,
156
+ items: [
157
+ {
158
+ title: 'Lean FIRE',
159
+ description: 'Minimalistischer Lebensstil. Deckt nur die grundlegenden Überlebenskosten.',
160
+ points: ['Extremes Sparen', 'Sehr geringe Ausgaben', 'Frugale Freiheit'],
161
+ },
162
+ {
163
+ title: 'Barista FIRE',
164
+ description: 'Hybride Situation, in der Ihre Investitionen die Hälfte Ihrer Ausgaben decken.',
165
+ points: ['Arbeit zum Vergnügen', 'Sozialversicherung abgedeckt', 'Weniger Stress'],
166
+ },
167
+ {
168
+ title: 'Fat FIRE',
169
+ description: 'Ruhestand mit einem großzügigen Budget, das Luxus und Reisen ermöglicht.',
170
+ points: ['Hohes Vermögen', 'Keine Einschränkungen', 'Familienerbe'],
171
+ },
172
+ ],
173
+ },
174
+ {
175
+ type: 'title',
176
+ text: 'Wie benutzt man unseren FIRE-Rechner?',
177
+ level: 3,
178
+ },
179
+ {
180
+ type: 'list',
181
+ items: [
182
+ '<strong>Ausgaben-Tracking:</strong> Analysieren Sie Ihre tatsächlichen Ausgaben der letzten 12 Monate.',
183
+ '<strong>SWR-Definition:</strong> Wählen Sie Ihre sichere Entnahmerate je nach Risiko.',
184
+ '<strong>Aktuelles Vermögen:</strong> Geben Sie den Wert Ihrer aktuellen Investitionen ein.',
185
+ '<strong>Sparkapazität:</strong> Projizieren Sie, wie viel Zeit Ihnen bis zum Ziel bleibt.',
186
+ '<strong>Visuelle Darstellung:</strong> Analysieren Sie das Wachstumsdiagramm Ihres Vermögens.',
187
+ ],
188
+ },
189
+ {
190
+ type: 'title',
191
+ text: 'Analyse der 4%-Regel',
192
+ level: 3,
193
+ },
194
+ {
195
+ type: 'comparative',
196
+ columns: 2,
197
+ items: [
198
+ {
199
+ title: 'Vorteile',
200
+ description: 'Warum die 4%-Regel funktioniert',
201
+ points: [
202
+ 'Mathematische Einfachheit für schnelle Planung.',
203
+ 'Basiert auf historischen Daten von fast einem Jahrhundert.',
204
+ 'Anpassbar an jedes Ausgabenniveau.',
205
+ ],
206
+ },
207
+ {
208
+ title: 'Einschränkungen',
209
+ description: 'Was die 4%-Regel nicht abdeckt',
210
+ points: [
211
+ 'Das Reihenfolgerisiko der Renditen wird nicht berücksichtigt.',
212
+ 'Basiert hauptsächlich auf dem US-Markt.',
213
+ 'Ignoriert drastische Änderungen in der lokalen Steuergesetzgebung.',
214
+ ],
215
+ },
216
+ ],
217
+ },
218
+ {
219
+ type: 'title',
220
+ text: 'Kritischer Faktor: Die Inflation',
221
+ level: 3,
222
+ },
223
+ {
224
+ type: 'paragraph',
225
+ html: 'Denken Sie daran, dass 1.000 € heute in Zukunft nicht dasselbe kaufen werden. Es ist entscheidend, reale Renditen (inflationsbereinigt) zu verwenden, damit Ihre Projektionen die heutige Kaufkraft beibehalten. Die 4%-Regel geht davon aus, dass Sie Ihre Entnahmen jährlich an die Inflation anpassen.',
226
+ },
227
+ ],
228
+ ui: {
229
+ labelTitle: 'FIRE-Rechner: 4%-Regel',
230
+ labelDescription: 'Berechnen Sie Ihre magische Zahl für die finanzielle Unabhängigkeit mit der 4%-Regel und visualisieren Sie Ihre Meilensteine zur Freiheit.',
231
+ labelMonthlyExpenses: 'Monatliche Ausgaben',
232
+ labelSWR: 'Entnahmerate (SWR)',
233
+ labelCurrentWorth: 'Aktuelles Vermögen',
234
+ labelMonthlySavings: 'Monatliche Sparrate',
235
+ labelAnnualReturn: 'Geschätzte Rendite (Netto)',
236
+ labelFreedomMilestones: 'Meilensteine der Freiheit',
237
+ labelLeanFIRE: 'Lean FIRE (70 % Grundsicherung)',
238
+ labelBaristaFIRE: 'Barista FIRE (50 % Einkommen)',
239
+ labelFatFIRE: 'Fat FIRE (150 % Luxus)',
240
+ labelMagicNumber: 'Ihre magische Zahl für die Freiheit',
241
+ labelMagicNumberDesc: 'Benötigtes Kapital, um von den Erträgen zu leben',
242
+ labelTimeRemaining: 'Zeit bis zur finanziellen Freiheit',
243
+ labelTimeRemainingFormat: 'Es fehlen noch {years} Jahre und {months} Monate',
244
+ labelAlreadyFI: 'Sie haben die finanzielle Freiheit bereits erreicht!',
245
+ labelUnachievable: 'Ziel mit dieser Sparrate unerreichbar',
246
+ labelHiddenCostsChecklist: 'Checkliste versteckte Kosten',
247
+ labelHealth: 'Krankenversicherung (+200€)',
248
+ labelTaxes: 'Steuern (+150€)',
249
+ labelHome: 'Instandhaltung Heim (+100€)',
250
+ labelTravel: 'Reisen und Freizeit (+300€)',
251
+ labelEmergency: 'Notfallfonds (+100€)',
252
+ labelSubscriptions: 'Abonnements (+50€)',
253
+ labelAdded: 'Hinzugefügt:',
254
+ labelSavePlan: 'Plan speichern',
255
+ labelSWRTooltip: 'Safe Withdrawal Rate: Prozentsatz Ihrer Ersparnisse, den Sie jedes Jahr entnehmen können, ohne dass das Geld ausgeht.',
256
+ labelReturnTooltip: 'Jährliche Marktrendite (bereits inflationsbereinigt). Der historische Standard liegt bei 7 %.',
257
+ currencySymbol: '€',
258
+ currencyCode: 'EUR',
259
+ currencyLocale: 'de-DE',
260
+ },
261
+ };