@jjlmoya/utils-finance 1.18.0 → 1.20.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 (93) hide show
  1. package/package.json +1 -1
  2. package/src/category/i18n/fr.ts +9 -9
  3. package/src/category/i18n/ru.ts +4 -4
  4. package/src/layouts/PreviewLayout.astro +1 -0
  5. package/src/tests/diacritics_density.test.ts +140 -0
  6. package/src/tests/inverted_punctuation.test.ts +95 -0
  7. package/src/tests/no_en_dash.test.ts +70 -0
  8. package/src/tests/script_density.test.ts +94 -0
  9. package/src/tool/compoundInterest/i18n/de.ts +4 -4
  10. package/src/tool/compoundInterest/i18n/fr.ts +9 -9
  11. package/src/tool/compoundInterest/i18n/it.ts +18 -18
  12. package/src/tool/compoundInterest/i18n/pl.ts +2 -2
  13. package/src/tool/compoundInterest/i18n/ru.ts +7 -7
  14. package/src/tool/compoundInterest/i18n/tr.ts +7 -7
  15. package/src/tool/compoundInterest/i18n/zh.ts +4 -4
  16. package/src/tool/courtFeeCalculator/i18n/it.ts +10 -10
  17. package/src/tool/courtFeeCalculator/i18n/ru.ts +2 -2
  18. package/src/tool/courtFeeCalculator/i18n/tr.ts +6 -6
  19. package/src/tool/courtFeeCalculator/spanish-court-fees-calculator.css +47 -2
  20. package/src/tool/debtSnowball/bibliography.ts +2 -2
  21. package/src/tool/debtSnowball/i18n/it.ts +2 -2
  22. package/src/tool/debtSnowball/i18n/pl.ts +1 -1
  23. package/src/tool/debtSnowball/i18n/tr.ts +1 -1
  24. package/src/tool/debtSnowball/i18n/zh.ts +1 -1
  25. package/src/tool/financialFreedom/financial-freedom-calculator.css +89 -0
  26. package/src/tool/financialFreedom/i18n/en.ts +1 -1
  27. package/src/tool/financialFreedom/i18n/fr.ts +3 -3
  28. package/src/tool/financialFreedom/i18n/ru.ts +2 -2
  29. package/src/tool/financialFreedom/i18n/zh.ts +1 -1
  30. package/src/tool/financialFreedom/seo.astro +7 -5
  31. package/src/tool/fireCalculator/i18n/it.ts +14 -14
  32. package/src/tool/fireCalculator/i18n/ru.ts +6 -6
  33. package/src/tool/fireCalculator/i18n/tr.ts +6 -6
  34. package/src/tool/fireCalculator/i18n/zh.ts +3 -3
  35. package/src/tool/ibanBicSwiftConverter/i18n/fr.ts +1 -1
  36. package/src/tool/ibanBicSwiftConverter/i18n/it.ts +7 -7
  37. package/src/tool/ibanBicSwiftConverter/i18n/ru.ts +1 -1
  38. package/src/tool/ibanBicSwiftConverter/i18n/tr.ts +5 -5
  39. package/src/tool/ibanBicSwiftConverter/iban-to-bic-swift-converter.css +61 -3
  40. package/src/tool/inflation/i18n/de.ts +2 -2
  41. package/src/tool/inflation/i18n/fr.ts +1 -1
  42. package/src/tool/inflation/i18n/it.ts +32 -32
  43. package/src/tool/inflation/i18n/nl.ts +7 -7
  44. package/src/tool/inflation/i18n/pl.ts +2 -2
  45. package/src/tool/inflation/i18n/pt.ts +2 -2
  46. package/src/tool/inflation/i18n/ru.ts +6 -6
  47. package/src/tool/inflation/i18n/sv.ts +3 -3
  48. package/src/tool/inflation/i18n/tr.ts +14 -14
  49. package/src/tool/inflation/i18n/zh.ts +2 -2
  50. package/src/tool/lateInterest/i18n/de.ts +2 -2
  51. package/src/tool/lateInterest/i18n/es.ts +5 -5
  52. package/src/tool/lateInterest/i18n/it.ts +14 -14
  53. package/src/tool/lateInterest/i18n/nl.ts +1 -1
  54. package/src/tool/lateInterest/i18n/pl.ts +1 -1
  55. package/src/tool/lateInterest/i18n/pt.ts +1 -1
  56. package/src/tool/lateInterest/i18n/ru.ts +4 -4
  57. package/src/tool/lateInterest/i18n/sv.ts +3 -3
  58. package/src/tool/lateInterest/i18n/tr.ts +7 -7
  59. package/src/tool/lateInterest/i18n/zh.ts +1 -1
  60. package/src/tool/legalInterestRate/i18n/it.ts +15 -15
  61. package/src/tool/legalInterestRate/i18n/ru.ts +1 -1
  62. package/src/tool/legalInterestRate/i18n/tr.ts +8 -8
  63. package/src/tool/lotteryOptimizer/i18n/it.ts +7 -7
  64. package/src/tool/lotteryOptimizer/i18n/pl.ts +1 -1
  65. package/src/tool/lotteryOptimizer/i18n/ru.ts +4 -4
  66. package/src/tool/lotteryOptimizer/i18n/tr.ts +4 -4
  67. package/src/tool/lotteryOptimizer/i18n/zh.ts +3 -3
  68. package/src/tool/mortgage/i18n/de.ts +1 -1
  69. package/src/tool/mortgage/i18n/fr.ts +4 -4
  70. package/src/tool/mortgage/i18n/id.ts +1 -1
  71. package/src/tool/mortgage/i18n/it.ts +12 -12
  72. package/src/tool/mortgage/i18n/nl.ts +2 -2
  73. package/src/tool/mortgage/i18n/pl.ts +1 -1
  74. package/src/tool/mortgage/i18n/ru.ts +5 -5
  75. package/src/tool/mortgage/i18n/tr.ts +6 -6
  76. package/src/tool/mortgage/i18n/zh.ts +1 -1
  77. package/src/tool/mortgage/mortgage-calculator.css +58 -1
  78. package/src/tool/percentageCalculator/i18n/de.ts +4 -4
  79. package/src/tool/percentageCalculator/i18n/en.ts +1 -1
  80. package/src/tool/percentageCalculator/i18n/es.ts +2 -2
  81. package/src/tool/percentageCalculator/i18n/fr.ts +2 -2
  82. package/src/tool/percentageCalculator/i18n/it.ts +22 -22
  83. package/src/tool/percentageCalculator/i18n/pl.ts +4 -4
  84. package/src/tool/percentageCalculator/i18n/ru.ts +9 -9
  85. package/src/tool/percentageCalculator/i18n/tr.ts +18 -18
  86. package/src/tool/percentageCalculator/i18n/zh.ts +6 -6
  87. package/src/tool/profitability/i18n/fr.ts +2 -2
  88. package/src/tool/profitability/i18n/ru.ts +1 -1
  89. package/src/tool/profitability/i18n/zh.ts +2 -2
  90. package/src/tool/profitability/profitability-calculator.css +101 -0
  91. package/src/tool/rentIncreaseCalculator/i18n/it.ts +13 -13
  92. package/src/tool/rentIncreaseCalculator/i18n/tr.ts +5 -5
  93. package/src/tool/rentIncreaseCalculator/rent-increase-calculator.css +44 -2
@@ -5,7 +5,7 @@ import type { LotteryOptimizerUI } from '../ui';
5
5
 
6
6
  const slug = 'piyango-optimize-edici-olasilik-hesaplayici';
7
7
  const title = 'Piyango Optimize Edici ve Olasılık Hesaplayıcı';
8
- const description = 'İspanya Noel Piyangosu, Euromillions ve Bonoloto’daki olasılıklarınızı analiz edin. İdeal bilet sayısını ve bahsinizin beklenen değerini hesaplayın.';
8
+ const description = 'İspanya Noel Piyangosu, Euromillions ve Bonoloto\'daki olasılıklarınızı analiz edin. İdeal bilet sayısını ve bahsinizin beklenen değerini hesaplayın.';
9
9
 
10
10
  const faqData = [
11
11
  {
@@ -18,7 +18,7 @@ const faqData = [
18
18
  },
19
19
  {
20
20
  question: 'İspanya Noel Piyangosu (El Gordo) oynamak gerçekten mantıklı mı?',
21
- answer: 'Tamamen matematiksel bir bakış açısıyla, hayır. Toplanan paranın sadece %70’i dağıtılır. Ancak, büyük ikramiye olasılığı (100.000’de 1), Euromillions’tan (140 milyonda 1) çok daha yüksektir.',
21
+ answer: 'Tamamen matematiksel bir bakış açısıyla, hayır. Toplanan paranın sadece %70\'i dağıtılır. Ancak, büyük ikramiye olasılığı (100.000\'de 1), Euromillions\'tan (140 milyonda 1) çok daha yüksektir.',
22
22
  },
23
23
  {
24
24
  question: 'İstatistiklerle şansımı artırabilir miyim?',
@@ -68,7 +68,7 @@ const gameTranslations = {
68
68
  },
69
69
  nino: {
70
70
  name: 'Çocuk Piyangosu (El Niño)',
71
- description: 'Noel’e göre amorti olasılığını üç katına çıkarır.',
71
+ description: 'Noel\'e göre amorti olasılığını üç katına çıkarır.',
72
72
  },
73
73
  euromillones: {
74
74
  name: 'Euromillions',
@@ -76,7 +76,7 @@ const gameTranslations = {
76
76
  },
77
77
  primitiva: {
78
78
  name: 'La Primitiva',
79
- description: 'İspanya’nın en eski piyangosu. Zor ama daha ucuz.',
79
+ description: 'İspanya\'nın en eski piyangosu. Zor ama daha ucuz.',
80
80
  },
81
81
  bonoloto: {
82
82
  name: 'Bonoloto',
@@ -14,7 +14,7 @@ const faqData = [
14
14
  },
15
15
  {
16
16
  question: '是买很多不同的号码好,还是买很多张同一个号码好?',
17
- answer: '如果您是为了中“点儿什么”,分散号码会增加您获得小奖的概率。如果您是为了头奖,买一个号码和多个号码对头奖的概率是一样的,但如果中了,奖金会更高。',
17
+ answer: '如果您是为了中"点儿什么",分散号码会增加您获得小奖的概率。如果您是为了头奖,买一个号码和多个号码对头奖的概率是一样的,但如果中了,奖金会更高。',
18
18
  },
19
19
  {
20
20
  question: '玩西班牙圣诞彩票 (El Gordo) 真的划算吗?',
@@ -25,7 +25,7 @@ const faqData = [
25
25
  answer: '不。彩票开奖是独立的随机过程。昨天开出的号码绝对不会影响今天开出的号码。每个号码在每次开奖中的概率都是完全一样的。',
26
26
  },
27
27
  {
28
- question: '对比表中的“难度”是什么意思?',
28
+ question: '对比表中的"难度"是什么意思?',
29
29
  answer: '它是衡量赢得头奖难易程度的相对指标。容易(小于 20 万分之一)、困难(小于 2000 万分之一)、极难(大于 2000 万分之一)。',
30
30
  },
31
31
  ];
@@ -45,7 +45,7 @@ const howToData = [
45
45
  },
46
46
  {
47
47
  name: '评估风险/收益',
48
- text: '查看数学期望,以了解统计学上您每投入一欧元相当于“捐献”了多少钱。',
48
+ text: '查看数学期望,以了解统计学上您每投入一欧元相当于"捐献"了多少钱。',
49
49
  },
50
50
  ];
51
51
 
@@ -105,7 +105,7 @@ export const content: ToolLocaleContent<MortgageUI> = {
105
105
  },
106
106
  {
107
107
  type: 'title',
108
- text: 'Die „Falle“ des Annuitätendarlehens: Die Zusammensetzung Ihrer Rate verstehen',
108
+ text: 'Die "Falle" des Annuitätendarlehens: Die Zusammensetzung Ihrer Rate verstehen',
109
109
  level: 3,
110
110
  },
111
111
  {
@@ -96,7 +96,7 @@ export const content: ToolLocaleContent<MortgageUI> = {
96
96
  seo: [
97
97
  {
98
98
  type: 'title',
99
- text: 'Guide Complet du Crédit Immobilier : Comprendre l\'Amortissement',
99
+ text: 'Guide Complet du Crédit Immobilier: Comprendre l\'Amortissement',
100
100
  level: 2,
101
101
  },
102
102
  {
@@ -105,7 +105,7 @@ export const content: ToolLocaleContent<MortgageUI> = {
105
105
  },
106
106
  {
107
107
  type: 'title',
108
- text: 'Le "Piège" des Intérêts Prépondérants : Comprendre Votre Ventilation de Paiement',
108
+ text: 'Le "Piège" des Intérêts Prépondérants: Comprendre Votre Ventilation de Paiement',
109
109
  level: 3,
110
110
  },
111
111
  {
@@ -132,7 +132,7 @@ export const content: ToolLocaleContent<MortgageUI> = {
132
132
  },
133
133
  {
134
134
  type: 'title',
135
- text: 'Contexte 2026 : Taux Fixe vs Variable',
135
+ text: 'Contexte 2026: Taux Fixe vs Variable',
136
136
  level: 3,
137
137
  },
138
138
  {
@@ -168,7 +168,7 @@ export const content: ToolLocaleContent<MortgageUI> = {
168
168
  },
169
169
  {
170
170
  type: 'tip',
171
- title: 'Taux Fixe vs Variable : Cela Dépend de Votre Profil',
171
+ title: 'Taux Fixe vs Variable: Cela Dépend de Votre Profil',
172
172
  html: '<p><strong>Choisissez Taux Fixe si :</strong> Votre budget est serré, vous recherchez la certitude, vous ne tolérez pas les surprises de paiement.</p><p><strong>Choisissez Taux Variable si :</strong> Vous avez un coussin financier, vous croyez que les taux baisseront, votre crédit est petit ou à court terme.</p>',
173
173
  },
174
174
  ],
@@ -105,7 +105,7 @@ export const content: ToolLocaleContent<MortgageUI> = {
105
105
  },
106
106
  {
107
107
  type: 'title',
108
- text: '„Jebakan” Sistem Prancis: Memahami Komposisi Angsuran Anda',
108
+ text: '"Jebakan" Sistem Prancis: Memahami Komposisi Angsuran Anda',
109
109
  level: 3,
110
110
  },
111
111
  {
@@ -6,13 +6,13 @@ import type { MortgageUI } from '../ui';
6
6
  const slug = 'mutuo';
7
7
  const title = 'Simulatore di Mutuo e Piano di Ammortamento alla Francese';
8
8
  const description =
9
- 'Calcola la tua rata mensile del mutuo, scopri quanto pagherai d’interessi e visualizza istantaneamente il tuo piano di ammortamento completo.';
9
+ 'Calcola la tua rata mensile del mutuo, scopri quanto pagherai d\'interessi e visualizza istantaneamente il tuo piano di ammortamento completo.';
10
10
 
11
11
  const faqData = [
12
12
  {
13
- question: 'Cos’è il sistema di ammortamento francese?',
13
+ question: 'Cos\'è il sistema di ammortamento francese?',
14
14
  answer:
15
- 'È il sistema più utilizzato. La rata mensile rimane costante, ma all’inizio paghi quasi solo interessi e pochissimo capitale. Alla fine, avviene il contrario. Per questo estinguere anticipatamente il mutuo è più vantaggioso nei primi anni.',
15
+ 'È il sistema più utilizzato. La rata mensile rimane costante, ma all\'inizio paghi quasi solo interessi e pochissimo capitale. Alla fine, avviene il contrario. Per questo estinguere anticipatamente il mutuo è più vantaggioso nei primi anni.',
16
16
  },
17
17
  {
18
18
  question: 'Tasso fisso o variabile nel 2026?',
@@ -33,12 +33,12 @@ const faqData = [
33
33
 
34
34
  const howToData = [
35
35
  {
36
- name: 'Inserire l’importo del prestito',
36
+ name: 'Inserire l\'importo del prestito',
37
37
  text: 'Scrivi la cifra totale che devi richiedere alla banca (sottraendo i tuoi risparmi versati come anticipo).',
38
38
  },
39
39
  {
40
40
  name: 'Regolare il tasso di interesse',
41
- text: 'Inserisci il TAN (Tasso Annuo Nominale) offerto dall’istituto. Puoi confrontare tra tasso fisso o variabile.',
41
+ text: 'Inserisci il TAN (Tasso Annuo Nominale) offerto dall\'istituto. Puoi confrontare tra tasso fisso o variabile.',
42
42
  },
43
43
  {
44
44
  name: 'Scegliere la durata del rimborso',
@@ -46,7 +46,7 @@ const howToData = [
46
46
  },
47
47
  {
48
48
  name: 'Analizzare il piano di ammortamento',
49
- text: 'Controlla mese per mese l’evoluzione del tuo debito e quanta parte della tua rata è destinata agli interessi rispetto al capitale.',
49
+ text: 'Controlla mese per mese l\'evoluzione del tuo debito e quanta parte della tua rata è destinata agli interessi rispetto al capitale.',
50
50
  },
51
51
  ];
52
52
 
@@ -105,7 +105,7 @@ export const content: ToolLocaleContent<MortgageUI> = {
105
105
  },
106
106
  {
107
107
  type: 'title',
108
- text: 'La „Trappola” del Sistema Francese: Capire la Composizione della tua Rata',
108
+ text: 'La "Trappola" del Sistema Francese: Capire la Composizione della tua Rata',
109
109
  level: 3,
110
110
  },
111
111
  {
@@ -115,7 +115,7 @@ export const content: ToolLocaleContent<MortgageUI> = {
115
115
  {
116
116
  type: 'tip',
117
117
  title: 'Come si Evolverà la tua Rata',
118
- html: '<p><strong>All’inizio (Anni 1-10):</strong> Paghi quasi solo INTERESSI e restituisci pochissimo capitale. Su un mutuo di 250.000€ al 3%, il tuo primo pagamento potrebbe essere per l’80% composto da interessi.</p><p><strong>A metà (Anni 11-25):</strong> La proporzione si equilibra gradualmente.</p><p><strong>Alla fine (Anni 26-30):</strong> Paghi quasi tutto CAPITALE e pochissimi interessi.</p>',
118
+ html: '<p><strong>All\'inizio (Anni 1-10):</strong> Paghi quasi solo INTERESSI e restituisci pochissimo capitale. Su un mutuo di 250.000€ al 3%, il tuo primo pagamento potrebbe essere per l\'80% composto da interessi.</p><p><strong>A metà (Anni 11-25):</strong> La proporzione si equilibra gradualmente.</p><p><strong>Alla fine (Anni 26-30):</strong> Paghi quasi tutto CAPITALE e pochissimi interessi.</p>',
119
119
  },
120
120
  {
121
121
  type: 'paragraph',
@@ -128,7 +128,7 @@ export const content: ToolLocaleContent<MortgageUI> = {
128
128
  },
129
129
  {
130
130
  type: 'paragraph',
131
- html: 'La Banca d’Italia raccomanda che il mutuo <strong>non superi il 30-35% del tuo reddito netto mensile</strong>. Se superi questa soglia, aumenti significativamente il rischio di default in caso di imprevisti (perdita del lavoro, malattie, ecc.).',
131
+ html: 'La Banca d\'Italia raccomanda che il mutuo <strong>non superi il 30-35% del tuo reddito netto mensile</strong>. Se superi questa soglia, aumenti significativamente il rischio di default in caso di imprevisti (perdita del lavoro, malattie, ecc.).',
132
132
  },
133
133
  {
134
134
  type: 'title',
@@ -137,7 +137,7 @@ export const content: ToolLocaleContent<MortgageUI> = {
137
137
  },
138
138
  {
139
139
  type: 'paragraph',
140
- html: 'Con l’Euribor fluttuante, scegliere tra <strong>Tasso Fisso</strong> o <strong>Tasso Variabile</strong> è una decisione strategica che può costare migliaia di euro all’anno.',
140
+ html: 'Con l\'Euribor fluttuante, scegliere tra <strong>Tasso Fisso</strong> o <strong>Tasso Variabile</strong> è una decisione strategica che può costare migliaia di euro all\'anno.',
141
141
  },
142
142
  {
143
143
  type: 'comparative',
@@ -145,11 +145,11 @@ export const content: ToolLocaleContent<MortgageUI> = {
145
145
  items: [
146
146
  {
147
147
  title: 'Tasso Fisso',
148
- description: 'Paghi un po’ di più ora, ma dormi sereno sapendo che la tua rata non aumenterà mai.',
148
+ description: 'Paghi un po\' di più ora, ma dormi sereno sapendo che la tua rata non aumenterà mai.',
149
149
  points: [
150
150
  'Rata prevedibile per 30 anni',
151
151
  'Protezione contro il rialzo dei tassi',
152
- 'Pace mentale in un’economia incerta',
152
+ 'Pace mentale in un\'economia incerta',
153
153
  'Ideale per budget limitati',
154
154
  ],
155
155
  },
@@ -101,7 +101,7 @@ export const content: ToolLocaleContent<MortgageUI> = {
101
101
  },
102
102
  {
103
103
  type: 'paragraph',
104
- html: 'Een hypotheek is waarschijnlijk de grootste financiële verplichting die u in uw leven aangaat. Begrijpen hoe het aflossingssysteem werkt is cruciaal om slimme beslissingen te nemen die u tienduizenden euro’s kunnen besparen.',
104
+ html: 'Een hypotheek is waarschijnlijk de grootste financiële verplichting die u in uw leven aangaat. Begrijpen hoe het aflossingssysteem werkt is cruciaal om slimme beslissingen te nemen die u tienduizenden euro\'s kunnen besparen.',
105
105
  },
106
106
  {
107
107
  type: 'title',
@@ -137,7 +137,7 @@ export const content: ToolLocaleContent<MortgageUI> = {
137
137
  },
138
138
  {
139
139
  type: 'paragraph',
140
- html: 'Met een schommelende rente is de keuze tussen <strong>Vaste Rente</strong> of <strong>Variabele Rente</strong> een strategische beslissing die elk jaar duizenden euro’s kan schelen.',
140
+ html: 'Met een schommelende rente is de keuze tussen <strong>Vaste Rente</strong> of <strong>Variabele Rente</strong> een strategische beslissing die elk jaar duizenden euro\'s kan schelen.',
141
141
  },
142
142
  {
143
143
  type: 'comparative',
@@ -105,7 +105,7 @@ export const content: ToolLocaleContent<MortgageUI> = {
105
105
  },
106
106
  {
107
107
  type: 'title',
108
- text: '„Pułapka” Systemu Francuskiego: Z czego składa się Twoja rata?',
108
+ text: '"Pułapka" Systemu Francuskiego: Z czego składa się Twoja rata?',
109
109
  level: 3,
110
110
  },
111
111
  {
@@ -27,7 +27,7 @@ const faqData = [
27
27
  {
28
28
  question: 'Какой процент дохода должен уходить на ипотеку?',
29
29
  answer:
30
- 'Общая рекомендация — не превышать 30-35% от вашего чистого ежемесячного дохода (включая другие долги). Превышение этого порога значительно повышает риск неплатежеспособности при непредвиденных обстоятельствах.',
30
+ 'Общая рекомендация - не превышать 30-35% от вашего чистого ежемесячного дохода (включая другие долги). Превышение этого порога значительно повышает риск неплатежеспособности при непредвиденных обстоятельствах.',
31
31
  },
32
32
  ];
33
33
 
@@ -46,7 +46,7 @@ const howToData = [
46
46
  },
47
47
  {
48
48
  name: 'Проанализируйте график платежей',
49
- text: 'Просмотрите помесячно, как уменьшается ваш долг и какая часть платежа идет на проценты, а какая — на погашение основного долга.',
49
+ text: 'Просмотрите помесячно, как уменьшается ваш долг и какая часть платежа идет на проценты, а какая - на погашение основного долга.',
50
50
  },
51
51
  ];
52
52
 
@@ -101,11 +101,11 @@ export const content: ToolLocaleContent<MortgageUI> = {
101
101
  },
102
102
  {
103
103
  type: 'paragraph',
104
- html: 'Ипотека — это, вероятно, самый большой долг, который вы возьмете в своей жизни. Понимание того, как работает аннуитетная система погашения, крайне важно для принятия разумных решений, которые могут сэкономить вам сотни тысяч рублей.',
104
+ html: 'Ипотека - это, вероятно, самый большой долг, который вы возьмете в своей жизни. Понимание того, как работает аннуитетная система погашения, крайне важно для принятия разумных решений, которые могут сэкономить вам сотни тысяч рублей.',
105
105
  },
106
106
  {
107
107
  type: 'title',
108
- text: '«Ловушка» аннуитетной системы: состав вашего платежа',
108
+ text: '"Ловушка" аннуитетной системы: состав вашего платежа',
109
109
  level: 3,
110
110
  },
111
111
  {
@@ -137,7 +137,7 @@ export const content: ToolLocaleContent<MortgageUI> = {
137
137
  },
138
138
  {
139
139
  type: 'paragraph',
140
- html: 'В условиях волатильности выбор между <strong>Фиксированной ставкой</strong> или <strong>Переменной ставкой</strong> — это стратегическое решение, которое может стоить сотни тысяч рублей в год.',
140
+ html: 'В условиях волатильности выбор между <strong>Фиксированной ставкой</strong> или <strong>Переменной ставкой</strong> - это стратегическое решение, которое может стоить сотни тысяч рублей в год.',
141
141
  },
142
142
  {
143
143
  type: 'comparative',
@@ -15,19 +15,19 @@ const faqData = [
15
15
  'En yaygın kullanılan sistemdir. Aylık taksit her zaman aynıdır, ancak başlangıçta ödemenizin neredeyse tamamı faize, çok azı ise ana paraya gider. Sonunda ise durum tam tersidir. Bu nedenle erken ödeme yapmak ilk yıllarda daha karlıdır.',
16
16
  },
17
17
  {
18
- question: '2026’da sabit mi yoksa değişken faiz mi tercih edilmeli?',
18
+ question: '2026\'da sabit mi yoksa değişken faiz mi tercih edilmeli?',
19
19
  answer:
20
20
  'Sabit faiz: Şimdi biraz daha fazla ödersiniz ama 30 yıl boyunca huzurla uyursunuz. Değişken faiz: Bugün daha ucuz olabilir, ancak faizler yükselirse taksitleriniz fırlayabilir. Bu, risk toleransınıza bağlıdır.',
21
21
  },
22
22
  {
23
23
  question: '10.000 TL erken ödeme yaparsam ne kadar tasarruf ederim?',
24
24
  answer:
25
- 'Zamana göre değişir. 200.000 TL’lik %3 faizli bir kredinin 1. yılında ödeme yaparsanız 15.000 TL’den fazla faiz tasarrufu sağlayabilirsiniz. 20. yılda yaparsanız tasarruf 2.000 TL’yi zor bulur. Zamanlama kritiktir.',
25
+ 'Zamana göre değişir. 200.000 TL\'lik %3 faizli bir kredinin 1. yılında ödeme yaparsanız 15.000 TL\'den fazla faiz tasarrufu sağlayabilirsiniz. 20. yılda yaparsanız tasarruf 2.000 TL\'yi zor bulur. Zamanlama kritiktir.',
26
26
  },
27
27
  {
28
28
  question: 'Maaşımın yüzde kaçını krediye ayırmalıyım?',
29
29
  answer:
30
- 'Genel tavsiye, aylık net gelirinizin %30-35’ini (diğer borçlar dahil) geçmemesidir. Bu eşiğin aşılması, beklenmedik durumlarda temerrüt riskini önemli ölçüde artırır.',
30
+ 'Genel tavsiye, aylık net gelirinizin %30-35\'ini (diğer borçlar dahil) geçmemesidir. Bu eşiğin aşılması, beklenmedik durumlarda temerrüt riskini önemli ölçüde artırır.',
31
31
  },
32
32
  ];
33
33
 
@@ -105,12 +105,12 @@ export const content: ToolLocaleContent<MortgageUI> = {
105
105
  },
106
106
  {
107
107
  type: 'title',
108
- text: 'Fransız Sisteminin „Tuzağı”: Taksit Kompozisyonunu Anlamak',
108
+ text: 'Fransız Sisteminin "Tuzağı": Taksit Kompozisyonunu Anlamak',
109
109
  level: 3,
110
110
  },
111
111
  {
112
112
  type: 'paragraph',
113
- html: 'Türkiye’deki çoğu kredi <strong>Fransız Amortisman Sistemi</strong> (eşit taksitli) kullanır. Ana özelliği, aylık taksitin her zaman aynı olmasıdır (sabit faiz durumunda), ancak içindeki ana para ve faiz oranları zamanla köklü bir şekilde değişir.',
113
+ html: 'Türkiye\'deki çoğu kredi <strong>Fransız Amortisman Sistemi</strong> (eşit taksitli) kullanır. Ana özelliği, aylık taksitin her zaman aynı olmasıdır (sabit faiz durumunda), ancak içindeki ana para ve faiz oranları zamanla köklü bir şekilde değişir.',
114
114
  },
115
115
  {
116
116
  type: 'tip',
@@ -128,7 +128,7 @@ export const content: ToolLocaleContent<MortgageUI> = {
128
128
  },
129
129
  {
130
130
  type: 'paragraph',
131
- html: 'Genel tavsiye, kredi taksitlerinizin <strong>aylık net gelirinizin %30-35’ini geçmemesidir</strong>. Bu eşiğin aşılması, iş kaybı, hastalık gibi durumlarda ödeme zorluğu riskini ciddi şekilde artırır.',
131
+ html: 'Genel tavsiye, kredi taksitlerinizin <strong>aylık net gelirinizin %30-35\'ini geçmemesidir</strong>. Bu eşiğin aşılması, iş kaybı, hastalık gibi durumlarda ödeme zorluğu riskini ciddi şekilde artırır.',
132
132
  },
133
133
  {
134
134
  type: 'title',
@@ -105,7 +105,7 @@ export const content: ToolLocaleContent<MortgageUI> = {
105
105
  },
106
106
  {
107
107
  type: 'title',
108
- text: '等额本息系统的“陷阱”:了解月供的构成',
108
+ text: '等额本息系统的"陷阱":了解月供的构成',
109
109
  level: 3,
110
110
  },
111
111
  {
@@ -67,6 +67,14 @@
67
67
  box-shadow: 0 1px 3px 0 rgba(0, 0, 0, 0.1);
68
68
  border: 1px solid var(--mortgage-color-border);
69
69
  overflow: hidden;
70
+ width: 100%;
71
+ max-width: 100%;
72
+ }
73
+
74
+ .mortgage-container *,
75
+ .mortgage-container *::before,
76
+ .mortgage-container *::after {
77
+ box-sizing: border-box;
70
78
  }
71
79
 
72
80
  .mortgage-header {
@@ -79,6 +87,7 @@
79
87
  display: flex;
80
88
  align-items: center;
81
89
  gap: 0.75rem;
90
+ min-width: 0;
82
91
  }
83
92
 
84
93
  .mortgage-header-icon {
@@ -101,6 +110,7 @@
101
110
  font-weight: 700;
102
111
  color: var(--mortgage-color-text-primary);
103
112
  margin: 0;
113
+ overflow-wrap: anywhere;
104
114
  }
105
115
 
106
116
  .mortgage-grid {
@@ -108,6 +118,7 @@
108
118
  grid-template-columns: 1fr;
109
119
  gap: 0;
110
120
  padding: 0;
121
+ min-width: 0;
111
122
  }
112
123
 
113
124
  @media (min-width: 1024px) {
@@ -125,6 +136,7 @@
125
136
  flex-direction: column;
126
137
  gap: 2rem;
127
138
  border-right: 1px solid var(--mortgage-color-border);
139
+ min-width: 0;
128
140
  }
129
141
 
130
142
  @media (max-width: 1023px) {
@@ -139,6 +151,7 @@
139
151
  display: flex;
140
152
  flex-direction: column;
141
153
  gap: 2.5rem;
154
+ min-width: 0;
142
155
  }
143
156
 
144
157
  .mortgage-input-group {
@@ -271,6 +284,7 @@
271
284
  font-weight: 900;
272
285
  letter-spacing: -0.02em;
273
286
  margin-bottom: 0.5rem;
287
+ overflow-wrap: anywhere;
274
288
  }
275
289
 
276
290
  .mortgage-payment-duration {
@@ -335,6 +349,7 @@
335
349
  font-size: 1.25rem;
336
350
  font-weight: 700;
337
351
  color: var(--mortgage-color-text-primary);
352
+ overflow-wrap: anywhere;
338
353
  }
339
354
 
340
355
  .mortgage-section {
@@ -379,6 +394,7 @@
379
394
  text-transform: uppercase;
380
395
  letter-spacing: 0.05em;
381
396
  color: var(--mortgage-color-text-light);
397
+ gap: 0.75rem;
382
398
  }
383
399
 
384
400
  .mortgage-timeline-label-optimized {
@@ -466,6 +482,7 @@
466
482
  gap: 1rem;
467
483
  font-size: 0.875rem;
468
484
  color: var(--mortgage-color-text-secondary);
485
+ min-width: 0;
469
486
  }
470
487
 
471
488
  .mortgage-breakdown-item {
@@ -534,15 +551,55 @@
534
551
  overflow-x: auto;
535
552
  max-height: 500px;
536
553
  overflow-y: auto;
554
+ width: 100%;
537
555
  }
538
556
 
539
557
  .mortgage-table {
540
558
  width: 100%;
559
+ min-width: 560px;
541
560
  text-align: left;
542
561
  border-collapse: collapse;
543
562
  font-size: 0.75rem;
544
563
  }
545
564
 
565
+ @media (max-width: 640px) {
566
+ .mortgage-header,
567
+ .mortgage-left,
568
+ .mortgage-right {
569
+ padding: 1rem;
570
+ }
571
+
572
+ .mortgage-input-row,
573
+ .mortgage-savings-grid {
574
+ grid-template-columns: 1fr;
575
+ }
576
+
577
+ .mortgage-payment-card,
578
+ .mortgage-savings-card {
579
+ padding: 1rem;
580
+ }
581
+
582
+ .mortgage-payment-value {
583
+ font-size: 2rem;
584
+ }
585
+
586
+ .mortgage-timeline-header,
587
+ .mortgage-breakdown-summary,
588
+ .mortgage-table-header {
589
+ align-items: flex-start;
590
+ flex-direction: column;
591
+ }
592
+
593
+ .mortgage-breakdown-bar {
594
+ height: 3rem;
595
+ font-size: 0.625rem;
596
+ }
597
+
598
+ .mortgage-table-container {
599
+ border-radius: 0.75rem;
600
+ }
601
+ }
602
+
546
603
  .mortgage-table thead {
547
604
  position: sticky;
548
605
  top: 0;
@@ -636,4 +693,4 @@
636
693
  color: var(--mortgage-color-success);
637
694
  text-transform: uppercase;
638
695
  letter-spacing: 0.05em;
639
- }
696
+ }
@@ -17,7 +17,7 @@ const faqData = [
17
17
  {
18
18
  question: 'Ist er für die Berechnung der Mehrwertsteuer oder von Steuern geeignet?',
19
19
  answer:
20
- 'Ja, Block 4 („Prozentsatz addieren oder subtrahieren“) ist genau für Fälle wie die Anwendung einer MwSt. von 19 % auf einen Basispreis oder die Berechnung einer negativen Einkommensteuer konzipiert.',
20
+ 'Ja, Block 4 ("Prozentsatz addieren oder subtrahieren") ist genau für Fälle wie die Anwendung einer MwSt. von 19 % auf einen Basispreis oder die Berechnung einer negativen Einkommensteuer konzipiert.',
21
21
  },
22
22
  {
23
23
  question: 'Können Dezimalzahlen und negative Zahlen verarbeitet werden?',
@@ -38,7 +38,7 @@ const howToData = [
38
38
  },
39
39
  {
40
40
  name: 'Geben Sie die Zahlen ein',
41
- text: 'Füllen Sie die Felder „X“ und „Y“ aus. Machen Sie sich keine Sorgen um die Reihenfolge, der Text jedes Blocks führt Sie visuell.',
41
+ text: 'Füllen Sie die Felder "X" und "Y" aus. Machen Sie sich keine Sorgen um die Reihenfolge, der Text jedes Blocks führt Sie visuell.',
42
42
  },
43
43
  {
44
44
  name: 'Kopieren Sie das Sofortergebnis',
@@ -106,7 +106,7 @@ export const content: ToolLocaleContent<PercentageCalculatorUI> = {
106
106
  },
107
107
  {
108
108
  type: 'paragraph',
109
- html: 'Unser 4 in 1 Prozentrechner gruppiert die am häufigsten nachgefragten Szenarien. Sie müssen nicht mehr bei Google nach „wie berechnet man 20 Prozent“ oder „Formel zur Prozentrechnung“ suchen. Sie haben die vier wesentlichen Operationen an einem Ort, interaktiv und mit sofortigen Ergebnissen.',
109
+ html: 'Unser 4 in 1 Prozentrechner gruppiert die am häufigsten nachgefragten Szenarien. Sie müssen nicht mehr bei Google nach "wie berechnet man 20 Prozent" oder "Formel zur Prozentrechnung" suchen. Sie haben die vier wesentlichen Operationen an einem Ort, interaktiv und mit sofortigen Ergebnissen.',
110
110
  },
111
111
  {
112
112
  type: 'title',
@@ -148,7 +148,7 @@ export const content: ToolLocaleContent<PercentageCalculatorUI> = {
148
148
  },
149
149
  {
150
150
  type: 'paragraph',
151
- html: 'Oft blockieren wir, wenn wir große Prozentsätze oder Dezimalzahlen sehen, aber es gibt einige mathematische „Tricks“, die Ihnen das Leben erleichtern können. Der bekannteste ist die <strong>Reversibilität von Prozentsätzen</strong>.',
151
+ html: 'Oft blockieren wir, wenn wir große Prozentsätze oder Dezimalzahlen sehen, aber es gibt einige mathematische "Tricks", die Ihnen das Leben erleichtern können. Der bekannteste ist die <strong>Reversibilität von Prozentsätzen</strong>.',
152
152
  },
153
153
  {
154
154
  type: 'tip',
@@ -153,7 +153,7 @@ export const content: ToolLocaleContent<PercentageCalculatorUI> = {
153
153
  {
154
154
  type: 'tip',
155
155
  title: 'The Reversibility Trick',
156
- html: '<p>Did you know that X% of Y equals Y% of X exactly? For example, if you\'re asked to calculate 18% of 50 in your head, it sounds complicated. But flip it around—50% of 18 is easy: it\'s 9! This works for absolutely any numbers and is an amazing lifesaver in daily calculations.</p>',
156
+ html: '<p>Did you know that X% of Y equals Y% of X exactly? For example, if you\'re asked to calculate 18% of 50 in your head, it sounds complicated. But flip it around-50% of 18 is easy: it\'s 9! This works for absolutely any numbers and is an amazing lifesaver in daily calculations.</p>',
157
157
  },
158
158
  {
159
159
  type: 'title',
@@ -190,12 +190,12 @@ export const content: ToolLocaleContent<PercentageCalculatorUI> = {
190
190
  ui: {
191
191
  labelTitle: 'Calculadora de Porcentajes',
192
192
  labelCase1Title: 'Caso 1',
193
- labelCase1Question: 'Cuánto es el X% de Y?',
193
+ labelCase1Question: '¿Cuánto es el X% de Y?',
194
194
  labelCase1Placeholder1: 'X',
195
195
  labelCase1Placeholder2: 'Y',
196
196
  labelCase1Formula: 'Fórmula: (X / 100) × Y',
197
197
  labelCase2Title: 'Caso 2',
198
- labelCase2Question: 'Qué porcentaje es X de Y?',
198
+ labelCase2Question: '¿Qué porcentaje es X de Y?',
199
199
  labelCase2Placeholder1: 'X',
200
200
  labelCase2Placeholder2: 'Y',
201
201
  labelCase2Formula: 'Fórmula: (X / Y) × 100',
@@ -92,7 +92,7 @@ export const content: ToolLocaleContent<PercentageCalculatorUI> = {
92
92
  seo: [
93
93
  {
94
94
  type: 'title',
95
- text: 'Calculatrice de Pourcentages 4-en-1 : Maîtrisez les Calculs Rapides',
95
+ text: 'Calculatrice de Pourcentages 4-en-1: Maîtrisez les Calculs Rapides',
96
96
  level: 2,
97
97
  },
98
98
  {
@@ -153,7 +153,7 @@ export const content: ToolLocaleContent<PercentageCalculatorUI> = {
153
153
  {
154
154
  type: 'tip',
155
155
  title: 'L\'Astuce de Réversibilité',
156
- html: '<p>Saviez-vous que X% de Y est exactement égal à Y% de X? Par exemple, si on vous demande de calculer 18% de 50 de tête, cela semble compliqué. Mais inversez-le—50% de 18 est facile: c\'est 9! Cela fonctionne pour absolument tous les nombres et c\'est une astuce incroyable au quotidien.</p>',
156
+ html: '<p>Saviez-vous que X% de Y est exactement égal à Y% de X? Par exemple, si on vous demande de calculer 18% de 50 de tête, cela semble compliqué. Mais inversez-le-50% de 18 est facile: c\'est 9! Cela fonctionne pour absolument tous les nombres et c\'est une astuce incroyable au quotidien.</p>',
157
157
  },
158
158
  {
159
159
  type: 'title',