@jjlmoya/utils-finance 1.38.0 → 1.40.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.
- package/package.json +1 -1
- package/src/category/index.ts +3 -1
- package/src/entries.ts +7 -1
- package/src/index.ts +1 -0
- package/src/tests/locale_completeness.test.ts +2 -2
- package/src/tests/tool_validation.test.ts +2 -2
- package/src/tool/loanToIncomeRatio/bibliography.astro +11 -0
- package/src/tool/loanToIncomeRatio/bibliography.ts +12 -0
- package/src/tool/loanToIncomeRatio/component.astro +453 -0
- package/src/tool/loanToIncomeRatio/content.test.ts +37 -0
- package/src/tool/loanToIncomeRatio/content.ts +247 -0
- package/src/tool/loanToIncomeRatio/currency.test.ts +21 -0
- package/src/tool/loanToIncomeRatio/currency.ts +19 -0
- package/src/tool/loanToIncomeRatio/entry.ts +31 -0
- package/src/tool/loanToIncomeRatio/i18n/de.ts +2 -0
- package/src/tool/loanToIncomeRatio/i18n/en.ts +3 -0
- package/src/tool/loanToIncomeRatio/i18n/es.ts +2 -0
- package/src/tool/loanToIncomeRatio/i18n/fr.ts +2 -0
- package/src/tool/loanToIncomeRatio/i18n/id.ts +2 -0
- package/src/tool/loanToIncomeRatio/i18n/it.ts +2 -0
- package/src/tool/loanToIncomeRatio/i18n/ja.ts +2 -0
- package/src/tool/loanToIncomeRatio/i18n/ko.ts +2 -0
- package/src/tool/loanToIncomeRatio/i18n/nl.ts +2 -0
- package/src/tool/loanToIncomeRatio/i18n/pl.ts +2 -0
- package/src/tool/loanToIncomeRatio/i18n/pt.ts +2 -0
- package/src/tool/loanToIncomeRatio/i18n/ru.ts +2 -0
- package/src/tool/loanToIncomeRatio/i18n/sv.ts +2 -0
- package/src/tool/loanToIncomeRatio/i18n/tr.ts +2 -0
- package/src/tool/loanToIncomeRatio/i18n/zh.ts +2 -0
- package/src/tool/loanToIncomeRatio/index.ts +11 -0
- package/src/tool/loanToIncomeRatio/loan-to-income-ratio.css +580 -0
- package/src/tool/loanToIncomeRatio/logic.test.ts +55 -0
- package/src/tool/loanToIncomeRatio/logic.ts +92 -0
- package/src/tool/loanToIncomeRatio/seo.astro +11 -0
- package/src/tool/loanToIncomeRatio/ui.ts +55 -0
- package/src/tool/loanToIncomeRatio/validation.ts +34 -0
- package/src/tool/subscriptionCostAnnualizer/bibliography.astro +11 -0
- package/src/tool/subscriptionCostAnnualizer/bibliography.ts +6 -0
- package/src/tool/subscriptionCostAnnualizer/component.astro +58 -0
- package/src/tool/subscriptionCostAnnualizer/content.ts +716 -0
- package/src/tool/subscriptionCostAnnualizer/controller.ts +72 -0
- package/src/tool/subscriptionCostAnnualizer/dom-views.ts +38 -0
- package/src/tool/subscriptionCostAnnualizer/entry.ts +28 -0
- package/src/tool/subscriptionCostAnnualizer/i18n/de.ts +2 -0
- package/src/tool/subscriptionCostAnnualizer/i18n/en.ts +2 -0
- package/src/tool/subscriptionCostAnnualizer/i18n/es.ts +2 -0
- package/src/tool/subscriptionCostAnnualizer/i18n/fr.ts +2 -0
- package/src/tool/subscriptionCostAnnualizer/i18n/id.ts +2 -0
- package/src/tool/subscriptionCostAnnualizer/i18n/it.ts +2 -0
- package/src/tool/subscriptionCostAnnualizer/i18n/ja.ts +2 -0
- package/src/tool/subscriptionCostAnnualizer/i18n/ko.ts +2 -0
- package/src/tool/subscriptionCostAnnualizer/i18n/nl.ts +2 -0
- package/src/tool/subscriptionCostAnnualizer/i18n/pl.ts +2 -0
- package/src/tool/subscriptionCostAnnualizer/i18n/pt.ts +2 -0
- package/src/tool/subscriptionCostAnnualizer/i18n/ru.ts +2 -0
- package/src/tool/subscriptionCostAnnualizer/i18n/sv.ts +2 -0
- package/src/tool/subscriptionCostAnnualizer/i18n/tr.ts +2 -0
- package/src/tool/subscriptionCostAnnualizer/i18n/zh.ts +2 -0
- package/src/tool/subscriptionCostAnnualizer/index.ts +12 -0
- package/src/tool/subscriptionCostAnnualizer/logic.test.ts +37 -0
- package/src/tool/subscriptionCostAnnualizer/logic.ts +120 -0
- package/src/tool/subscriptionCostAnnualizer/seo.astro +11 -0
- package/src/tool/subscriptionCostAnnualizer/storage.ts +28 -0
- package/src/tool/subscriptionCostAnnualizer/subscription-cost-annualizer.css +408 -0
- package/src/tool/subscriptionCostAnnualizer/ui.ts +38 -0
- package/src/tools.ts +3 -1
|
@@ -0,0 +1,247 @@
|
|
|
1
|
+
import type { FAQItem, HowToStep, ToolLocaleContent } from '../../types';
|
|
2
|
+
import { bibliography } from './bibliography';
|
|
3
|
+
import type { LoanToIncomeRatioUI } from './ui';
|
|
4
|
+
|
|
5
|
+
type LocaleKey = 'de' | 'en' | 'es' | 'fr' | 'id' | 'it' | 'ja' | 'ko' | 'nl' | 'pl' | 'pt' | 'ru' | 'sv' | 'tr' | 'zh';
|
|
6
|
+
|
|
7
|
+
type CopyPack = {
|
|
8
|
+
title: string;
|
|
9
|
+
description: string;
|
|
10
|
+
intro: string;
|
|
11
|
+
formula: string;
|
|
12
|
+
limit: string;
|
|
13
|
+
faq: FAQItem[];
|
|
14
|
+
howTo: HowToStep[];
|
|
15
|
+
seoTitle: string;
|
|
16
|
+
seoResultTitle: string;
|
|
17
|
+
seoResult: string;
|
|
18
|
+
seoTipTitle: string;
|
|
19
|
+
seoTip: string;
|
|
20
|
+
seoList: string[];
|
|
21
|
+
seoClosing: string;
|
|
22
|
+
};
|
|
23
|
+
|
|
24
|
+
const baseUI: LoanToIncomeRatioUI = {
|
|
25
|
+
labelIncome: 'Monthly income',
|
|
26
|
+
labelIncomeHelp: 'Choose gross or net below and keep the basis consistent.',
|
|
27
|
+
labelIncomeBasis: 'Income basis',
|
|
28
|
+
labelGrossIncome: 'Gross income',
|
|
29
|
+
labelNetIncome: 'Net income',
|
|
30
|
+
labelExistingPayments: 'Current monthly debt payments',
|
|
31
|
+
labelExistingPaymentsHelp: 'Include the payments you already make each month.',
|
|
32
|
+
labelNewPayment: 'Proposed new monthly payment',
|
|
33
|
+
labelNewPaymentHelp: 'Use the payment from the offer or scenario you want to test.',
|
|
34
|
+
labelLoanTerm: 'New loan term',
|
|
35
|
+
labelMonths: 'months',
|
|
36
|
+
labelThreshold: 'Your threshold',
|
|
37
|
+
labelThresholdHelp: 'A comparison limit you choose, not a universal lending rule.',
|
|
38
|
+
labelCurrentScenario: 'Current scenario',
|
|
39
|
+
labelProjectedScenario: 'Projected scenario',
|
|
40
|
+
labelCurrentRatio: 'Current ratio',
|
|
41
|
+
labelProjectedRatio: 'Projected ratio',
|
|
42
|
+
labelMonthlyDebt: 'Monthly debt',
|
|
43
|
+
labelRemainingIncome: 'Income remaining',
|
|
44
|
+
labelRatioChange: 'Change in ratio',
|
|
45
|
+
labelThresholdMargin: 'Margin to threshold',
|
|
46
|
+
labelNewLoanTotal: 'New payment total',
|
|
47
|
+
labelWithinThreshold: 'Within your threshold',
|
|
48
|
+
labelOverThreshold: 'Over your threshold',
|
|
49
|
+
labelNoNewLoan: 'No new payment is included in this scenario.',
|
|
50
|
+
labelInvalidInput: 'Check the highlighted values: income must be positive, amounts cannot be negative and a new payment needs a term.',
|
|
51
|
+
labelFormula: 'Formula',
|
|
52
|
+
labelFormulaExpression: 'monthly debt / selected monthly income × 100',
|
|
53
|
+
labelHowToRead: 'Build your comparison',
|
|
54
|
+
labelCopyResult: 'Copy result',
|
|
55
|
+
labelCopied: 'Copied',
|
|
56
|
+
labelReset: 'Reset',
|
|
57
|
+
labelCurrency: 'Currency',
|
|
58
|
+
labelCurrencyHelp: 'Changing currency converts every money input and result using the reference rate shown here.',
|
|
59
|
+
labelCurrencyRate: 'Reference rate',
|
|
60
|
+
labelCurrencyRateDate: 'EUR rates dated 4 Sep 2026; RUB rate dated 5 Sep 2026',
|
|
61
|
+
labelSelectCurrency: 'Select display currency',
|
|
62
|
+
labelEuro: 'Euro',
|
|
63
|
+
labelUSDollar: 'US dollar',
|
|
64
|
+
labelPoundSterling: 'Pound sterling',
|
|
65
|
+
labelRussianRuble: 'Russian ruble',
|
|
66
|
+
labelJapaneseYen: 'Japanese yen',
|
|
67
|
+
labelSwedishKrona: 'Swedish krona',
|
|
68
|
+
labelPolishZloty: 'Polish zloty',
|
|
69
|
+
labelIndonesianRupiah: 'Indonesian rupiah',
|
|
70
|
+
labelTurkishLira: 'Turkish lira',
|
|
71
|
+
labelSouthKoreanWon: 'South Korean won',
|
|
72
|
+
labelChineseYuan: 'Chinese yuan',
|
|
73
|
+
labelZeroPercent: '0%',
|
|
74
|
+
labelFullPercent: '100%',
|
|
75
|
+
labelPercentagePoints: 'percentage points',
|
|
76
|
+
currencyCode: 'EUR',
|
|
77
|
+
currencyLocale: 'en-IE',
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
const uiPatches: Record<LocaleKey, Partial<LoanToIncomeRatioUI>> = {
|
|
81
|
+
en: {},
|
|
82
|
+
de: { labelIncome: 'Monatliches Einkommen', labelIncomeHelp: 'Wähle Brutto- oder Nettoeinkommen und bleibe bei einer Grundlage.', labelIncomeBasis: 'Einkommensbasis', labelGrossIncome: 'Bruttoeinkommen', labelNetIncome: 'Nettoeinkommen', labelExistingPayments: 'Aktuelle monatliche Schuldzahlungen', labelExistingPaymentsHelp: 'Beziehe die Zahlungen ein, die du bereits jeden Monat leistest.', labelNewPayment: 'Neue geplante Monatsrate', labelNewPaymentHelp: 'Nutze die Rate aus dem Angebot oder Szenario, das du prüfen möchtest.', labelLoanTerm: 'Laufzeit des neuen Kredits', labelMonths: 'Monate', labelThreshold: 'Dein Grenzwert', labelThresholdHelp: 'Eine von dir gewählte Vergleichsgrenze, keine allgemeine Kreditregel.', labelCurrentScenario: 'Aktuelles Szenario', labelProjectedScenario: 'Geplantes Szenario', labelCurrentRatio: 'Aktuelle Quote', labelProjectedRatio: 'Geplante Quote', labelMonthlyDebt: 'Monatliche Schulden', labelRemainingIncome: 'Verbleibendes Einkommen', labelRatioChange: 'Änderung der Quote', labelThresholdMargin: 'Abstand zum Grenzwert', labelNewLoanTotal: 'Gesamtsumme der neuen Rate', labelWithinThreshold: 'Innerhalb deines Grenzwerts', labelOverThreshold: 'Über deinem Grenzwert', labelNoNewLoan: 'In diesem Szenario ist keine neue Rate enthalten.', labelInvalidInput: 'Prüfe die markierten Werte: Das Einkommen muss positiv sein, Beträge dürfen nicht negativ sein und eine neue Rate braucht eine Laufzeit.', labelHowToRead: 'Deinen Vergleich aufbauen', labelCopyResult: 'Ergebnis kopieren', labelCopied: 'Kopiert', labelReset: 'Zurücksetzen', labelCurrency: 'Währung', labelCurrencyHelp: 'Beim Wechsel werden alle Geldbeträge mit dem angezeigten Referenzkurs umgerechnet.', labelCurrencyRate: 'Referenzkurs', labelCurrencyRateDate: 'Kurse vom 5. September 2026', labelSelectCurrency: 'Anzeigewährung wählen', labelEuro: 'Euro', labelUSDollar: 'US-Dollar', labelPoundSterling: 'Britisches Pfund', labelRussianRuble: 'Russischer Rubel', labelPercentagePoints: 'Prozentpunkte', currencyLocale: 'de-DE' },
|
|
83
|
+
es: { labelIncome: 'Ingresos mensuales', labelIncomeHelp: 'Elige ingresos brutos o netos y mantén la misma base.', labelIncomeBasis: 'Base de ingresos', labelGrossIncome: 'Ingresos brutos', labelNetIncome: 'Ingresos netos', labelExistingPayments: 'Pagos de deuda mensuales actuales', labelExistingPaymentsHelp: 'Incluye las cuotas que ya pagas cada mes.', labelNewPayment: 'Nueva cuota mensual propuesta', labelNewPaymentHelp: 'Usa la cuota de la oferta o escenario que quieres probar.', labelLoanTerm: 'Plazo del nuevo préstamo', labelMonths: 'meses', labelThreshold: 'Tu umbral', labelThresholdHelp: 'Un límite que eliges para comparar, no una regla universal de aprobación.', labelCurrentScenario: 'Escenario actual', labelProjectedScenario: 'Escenario proyectado', labelCurrentRatio: 'Ratio actual', labelProjectedRatio: 'Ratio proyectado', labelMonthlyDebt: 'Deuda mensual', labelRemainingIncome: 'Ingresos restantes', labelRatioChange: 'Cambio del ratio', labelThresholdMargin: 'Margen hasta el umbral', labelNewLoanTotal: 'Total de la nueva cuota', labelWithinThreshold: 'Dentro de tu umbral', labelOverThreshold: 'Por encima de tu umbral', labelNoNewLoan: 'Este escenario no incluye una cuota nueva.', labelInvalidInput: 'Revisa los valores marcados: los ingresos deben ser positivos, los importes no pueden ser negativos y una cuota nueva necesita plazo.', labelHowToRead: 'Construye tu comparación', labelCopyResult: 'Copiar resultado', labelCopied: 'Copiado', labelReset: 'Restablecer', labelCurrency: 'Moneda', labelCurrencyHelp: 'Al cambiar de moneda se convierten todos los importes con el tipo de referencia mostrado.', labelCurrencyRate: 'Tipo de referencia', labelCurrencyRateDate: 'Tipos del 5 de septiembre de 2026', labelSelectCurrency: 'Selecciona la moneda de visualización', labelEuro: 'Euro', labelUSDollar: 'Dólar estadounidense', labelPoundSterling: 'Libra esterlina', labelRussianRuble: 'Rublo ruso', labelPercentagePoints: 'puntos porcentuales', currencyLocale: 'es-ES' },
|
|
84
|
+
fr: { labelIncome: 'Revenu mensuel', labelIncomeHelp: 'Choisissez le revenu brut ou net et gardez la même base.', labelIncomeBasis: 'Base de revenu', labelGrossIncome: 'Revenu brut', labelNetIncome: 'Revenu net', labelExistingPayments: 'Mensualités de dettes actuelles', labelExistingPaymentsHelp: 'Incluez les paiements que vous effectuez déjà chaque mois.', labelNewPayment: 'Nouvelle mensualité envisagée', labelNewPaymentHelp: "Utilisez la mensualité de l'offre ou du scénario à tester.", labelLoanTerm: 'Durée du nouveau prêt', labelMonths: 'mois', labelThreshold: 'Votre seuil', labelThresholdHelp: 'Une limite de comparaison choisie par vous, pas une règle universelle.', labelCurrentScenario: 'Scénario actuel', labelProjectedScenario: 'Scénario projeté', labelCurrentRatio: 'Ratio actuel', labelProjectedRatio: 'Ratio projeté', labelMonthlyDebt: 'Dette mensuelle', labelRemainingIncome: 'Revenu restant', labelRatioChange: 'Variation du ratio', labelThresholdMargin: 'Marge jusqu’au seuil', labelNewLoanTotal: 'Total des nouvelles mensualités', labelWithinThreshold: 'Dans votre seuil', labelOverThreshold: 'Au-dessus de votre seuil', labelNoNewLoan: 'Aucun nouveau paiement n’est inclus dans ce scénario.', labelInvalidInput: 'Vérifiez les valeurs indiquées : le revenu doit être positif, les montants ne peuvent pas être négatifs et une nouvelle mensualité exige une durée.', labelHowToRead: 'Construire votre comparaison', labelCopyResult: 'Copier le résultat', labelCopied: 'Copié', labelReset: 'Réinitialiser', labelCurrency: 'Devise', labelCurrencyHelp: 'Changer de devise convertit chaque montant avec le taux de référence affiché.', labelCurrencyRate: 'Taux de référence', labelCurrencyRateDate: 'Taux du 5 septembre 2026', labelSelectCurrency: 'Choisir la devise d’affichage', labelEuro: 'Euro', labelUSDollar: 'Dollar américain', labelPoundSterling: 'Livre sterling', labelRussianRuble: 'Rouble russe', labelPercentagePoints: 'points de pourcentage', currencyLocale: 'fr-FR' },
|
|
85
|
+
id: { labelIncome: 'Pendapatan bulanan', labelIncomeHelp: 'Pilih pendapatan kotor atau bersih dan gunakan dasar yang sama.', labelIncomeBasis: 'Dasar pendapatan', labelGrossIncome: 'Pendapatan kotor', labelNetIncome: 'Pendapatan bersih', labelExistingPayments: 'Pembayaran utang bulanan saat ini', labelExistingPaymentsHelp: 'Masukkan pembayaran yang sudah Anda lakukan setiap bulan.', labelNewPayment: 'Cicilan bulanan baru yang direncanakan', labelNewPaymentHelp: 'Gunakan cicilan dari penawaran atau skenario yang ingin diuji.', labelLoanTerm: 'Jangka waktu pinjaman baru', labelMonths: 'bulan', labelThreshold: 'Batas Anda', labelThresholdHelp: 'Batas perbandingan pilihan Anda, bukan aturan persetujuan universal.', labelCurrentScenario: 'Skenario saat ini', labelProjectedScenario: 'Skenario proyeksi', labelCurrentRatio: 'Rasio saat ini', labelProjectedRatio: 'Rasio proyeksi', labelMonthlyDebt: 'Utang bulanan', labelRemainingIncome: 'Pendapatan tersisa', labelRatioChange: 'Perubahan rasio', labelThresholdMargin: 'Jarak ke batas', labelNewLoanTotal: 'Total cicilan baru', labelWithinThreshold: 'Masih dalam batas Anda', labelOverThreshold: 'Melebihi batas Anda', labelNoNewLoan: 'Tidak ada pembayaran baru dalam skenario ini.', labelInvalidInput: 'Periksa nilai yang ditandai: pendapatan harus positif, jumlah tidak boleh negatif, dan cicilan baru memerlukan jangka waktu.', labelHowToRead: 'Bangun perbandingan Anda', labelCopyResult: 'Salin hasil', labelCopied: 'Tersalin', labelReset: 'Atur ulang', labelCurrency: 'Mata uang', labelCurrencyHelp: 'Mengganti mata uang mengonversi semua jumlah dengan kurs referensi yang ditampilkan.', labelCurrencyRate: 'Kurs referensi', labelCurrencyRateDate: 'Kurs per 5 September 2026', labelSelectCurrency: 'Pilih mata uang tampilan', labelEuro: 'Euro', labelUSDollar: 'Dolar AS', labelPoundSterling: 'Pound sterling', labelRussianRuble: 'Rubel Rusia', labelPercentagePoints: 'poin persentase', currencyLocale: 'id-ID' },
|
|
86
|
+
it: { labelIncome: 'Reddito mensile', labelIncomeHelp: 'Scegli il reddito lordo o netto e mantieni la stessa base.', labelIncomeBasis: 'Base del reddito', labelGrossIncome: 'Reddito lordo', labelNetIncome: 'Reddito netto', labelExistingPayments: 'Pagamenti mensili dei debiti attuali', labelExistingPaymentsHelp: 'Includi le rate che paghi già ogni mese.', labelNewPayment: 'Nuova rata mensile proposta', labelNewPaymentHelp: "Usa la rata dell'offerta o dello scenario che vuoi verificare.", labelLoanTerm: 'Durata del nuovo prestito', labelMonths: 'mesi', labelThreshold: 'La tua soglia', labelThresholdHelp: 'Un limite di confronto scelto da te, non una regola universale.', labelCurrentScenario: 'Scenario attuale', labelProjectedScenario: 'Scenario previsto', labelCurrentRatio: 'Rapporto attuale', labelProjectedRatio: 'Rapporto previsto', labelMonthlyDebt: 'Debito mensile', labelRemainingIncome: 'Reddito residuo', labelRatioChange: 'Variazione del rapporto', labelThresholdMargin: 'Margine dalla soglia', labelNewLoanTotal: 'Totale della nuova rata', labelWithinThreshold: 'Entro la tua soglia', labelOverThreshold: 'Oltre la tua soglia', labelNoNewLoan: 'Questo scenario non include una nuova rata.', labelInvalidInput: 'Controlla i valori indicati: il reddito deve essere positivo, gli importi non possono essere negativi e una nuova rata richiede una durata.', labelHowToRead: 'Costruisci il confronto', labelCopyResult: 'Copia risultato', labelCopied: 'Copiato', labelReset: 'Reimposta', labelCurrency: 'Valuta', labelCurrencyHelp: 'Cambiando valuta, tutti gli importi vengono convertiti con il tasso di riferimento mostrato.', labelCurrencyRate: 'Tasso di riferimento', labelCurrencyRateDate: 'Tassi del 5 settembre 2026', labelSelectCurrency: 'Scegli la valuta di visualizzazione', labelEuro: 'Euro', labelUSDollar: 'Dollaro USA', labelPoundSterling: 'Sterlina britannica', labelRussianRuble: 'Rublo russo', labelPercentagePoints: 'punti percentuali', currencyLocale: 'it-IT' },
|
|
87
|
+
ja: { labelIncome: '月収', labelIncomeHelp: '総収入か手取りを選び、同じ基準で比較してください。', labelIncomeBasis: '収入の基準', labelGrossIncome: '総収入', labelNetIncome: '手取り収入', labelExistingPayments: '現在の毎月の借入返済額', labelExistingPaymentsHelp: 'すでに毎月支払っている返済額を入力します。', labelNewPayment: '新しい毎月の返済額', labelNewPaymentHelp: '確認したい提案またはシナリオの返済額を入力します。', labelLoanTerm: '新しいローン期間', labelMonths: 'か月', labelThreshold: '設定する上限', labelThresholdHelp: '比較のために選ぶ上限であり、普遍的な審査基準ではありません。', labelCurrentScenario: '現在のシナリオ', labelProjectedScenario: '予測シナリオ', labelCurrentRatio: '現在の比率', labelProjectedRatio: '予測比率', labelMonthlyDebt: '毎月の負債', labelRemainingIncome: '残る収入', labelRatioChange: '比率の変化', labelThresholdMargin: '上限までの余裕', labelNewLoanTotal: '新しい返済総額', labelWithinThreshold: '設定した上限以内', labelOverThreshold: '設定した上限超過', labelNoNewLoan: 'このシナリオには新しい返済を含めていません。', labelInvalidInput: '入力を確認してください。収入は正数、金額は負数不可で、新しい返済には期間が必要です。', labelHowToRead: '比較を組み立てる', labelCopyResult: '結果をコピー', labelCopied: 'コピーしました', labelReset: 'リセット', labelCurrency: '通貨', labelCurrencyHelp: '通貨を変えると、表示された基準レートで入力と結果の金額を換算します。', labelCurrencyRate: '基準レート', labelCurrencyRateDate: '2026年9月5日時点のレート', labelSelectCurrency: '表示通貨を選択', labelEuro: 'ユーロ', labelUSDollar: '米ドル', labelPoundSterling: '英ポンド', labelRussianRuble: 'ロシアルーブル', labelPercentagePoints: 'ポイント', currencyLocale: 'ja-JP' },
|
|
88
|
+
ko: { labelIncome: '월 소득', labelIncomeHelp: '총소득 또는 순소득을 선택하고 같은 기준으로 비교하세요.', labelIncomeBasis: '소득 기준', labelGrossIncome: '총소득', labelNetIncome: '순소득', labelExistingPayments: '현재 월 부채 상환액', labelExistingPaymentsHelp: '매달 이미 납부하는 금액을 입력하세요.', labelNewPayment: '예상 신규 월 상환액', labelNewPaymentHelp: '확인하려는 제안이나 시나리오의 상환액을 입력하세요.', labelLoanTerm: '신규 대출 기간', labelMonths: '개월', labelThreshold: '내 기준선', labelThresholdHelp: '직접 정한 비교 한도이며 보편적인 대출 승인 기준이 아닙니다.', labelCurrentScenario: '현재 시나리오', labelProjectedScenario: '예상 시나리오', labelCurrentRatio: '현재 비율', labelProjectedRatio: '예상 비율', labelMonthlyDebt: '월 부채', labelRemainingIncome: '남는 소득', labelRatioChange: '비율 변화', labelThresholdMargin: '기준선까지 여유', labelNewLoanTotal: '신규 상환 총액', labelWithinThreshold: '내 기준선 이내', labelOverThreshold: '내 기준선 초과', labelNoNewLoan: '이 시나리오에는 신규 상환액이 없습니다.', labelInvalidInput: '입력값을 확인하세요. 소득은 양수여야 하고 금액은 음수가 될 수 없으며 신규 상환에는 기간이 필요합니다.', labelHowToRead: '비교 만들기', labelCopyResult: '결과 복사', labelCopied: '복사됨', labelReset: '초기화', labelCurrency: '통화', labelCurrencyHelp: '통화를 바꾸면 표시된 기준 환율로 모든 금액을 변환합니다.', labelCurrencyRate: '기준 환율', labelCurrencyRateDate: '2026년 9월 5일 기준', labelSelectCurrency: '표시 통화 선택', labelEuro: '유로', labelUSDollar: '미국 달러', labelPoundSterling: '영국 파운드', labelRussianRuble: '러시아 루블', labelPercentagePoints: '퍼센트포인트', currencyLocale: 'ko-KR' },
|
|
89
|
+
nl: { labelIncome: 'Maandelijks inkomen', labelIncomeHelp: 'Kies bruto of netto en gebruik dezelfde basis.', labelIncomeBasis: 'Inkomensbasis', labelGrossIncome: 'Bruto-inkomen', labelNetIncome: 'Netto-inkomen', labelExistingPayments: 'Huidige maandelijkse schuldbetalingen', labelExistingPaymentsHelp: 'Neem de betalingen op die je elke maand al doet.', labelNewPayment: 'Voorgestelde nieuwe maandbetaling', labelNewPaymentHelp: 'Gebruik de betaling uit het aanbod of scenario dat je wilt testen.', labelLoanTerm: 'Looptijd nieuwe lening', labelMonths: 'maanden', labelThreshold: 'Jouw grens', labelThresholdHelp: 'Een grens die je kiest om te vergelijken, geen universele kredietregel.', labelCurrentScenario: 'Huidig scenario', labelProjectedScenario: 'Verwacht scenario', labelCurrentRatio: 'Huidige verhouding', labelProjectedRatio: 'Verwachte verhouding', labelMonthlyDebt: 'Maandelijkse schuld', labelRemainingIncome: 'Resterend inkomen', labelRatioChange: 'Verandering in verhouding', labelThresholdMargin: 'Ruimte tot de grens', labelNewLoanTotal: 'Totaal nieuwe betaling', labelWithinThreshold: 'Binnen jouw grens', labelOverThreshold: 'Boven jouw grens', labelNoNewLoan: 'Dit scenario bevat geen nieuwe betaling.', labelInvalidInput: 'Controleer de gemarkeerde waarden: inkomen moet positief zijn, bedragen mogen niet negatief zijn en een nieuwe betaling heeft een looptijd nodig.', labelHowToRead: 'Bouw je vergelijking', labelCopyResult: 'Resultaat kopiëren', labelCopied: 'Gekopieerd', labelReset: 'Herstellen', labelCurrency: 'Valuta', labelCurrencyHelp: 'Bij een andere valuta worden alle bedragen omgerekend met de getoonde referentiekoers.', labelCurrencyRate: 'Referentiekoers', labelCurrencyRateDate: 'Koersen van 5 september 2026', labelSelectCurrency: 'Valuta voor weergave kiezen', labelEuro: 'Euro', labelUSDollar: 'Amerikaanse dollar', labelPoundSterling: 'Britse pond', labelRussianRuble: 'Russische roebel', labelPercentagePoints: 'procentpunten', currencyLocale: 'nl-NL' },
|
|
90
|
+
pl: { labelIncome: 'Miesięczny dochód', labelIncomeHelp: 'Wybierz dochód brutto lub netto i zachowaj tę samą podstawę.', labelIncomeBasis: 'Podstawa dochodu', labelGrossIncome: 'Dochód brutto', labelNetIncome: 'Dochód netto', labelExistingPayments: 'Obecne miesięczne spłaty długów', labelExistingPaymentsHelp: 'Uwzględnij raty, które już płacisz co miesiąc.', labelNewPayment: 'Proponowana nowa rata miesięczna', labelNewPaymentHelp: 'Wpisz ratę z oferty lub scenariusza, który chcesz sprawdzić.', labelLoanTerm: 'Okres nowej pożyczki', labelMonths: 'mies.', labelThreshold: 'Twój próg', labelThresholdHelp: 'Wybrany przez Ciebie limit porównania, a nie uniwersalna zasada kredytowa.', labelCurrentScenario: 'Obecny scenariusz', labelProjectedScenario: 'Przewidywany scenariusz', labelCurrentRatio: 'Obecny wskaźnik', labelProjectedRatio: 'Przewidywany wskaźnik', labelMonthlyDebt: 'Dług miesięczny', labelRemainingIncome: 'Pozostały dochód', labelRatioChange: 'Zmiana wskaźnika', labelThresholdMargin: 'Margines do progu', labelNewLoanTotal: 'Łączna wartość nowej raty', labelWithinThreshold: 'W granicach Twojego progu', labelOverThreshold: 'Powyżej Twojego progu', labelNoNewLoan: 'Ten scenariusz nie zawiera nowej raty.', labelInvalidInput: 'Sprawdź zaznaczone wartości: dochód musi być dodatni, kwoty nie mogą być ujemne, a nowa rata wymaga okresu.', labelHowToRead: 'Zbuduj porównanie', labelCopyResult: 'Kopiuj wynik', labelCopied: 'Skopiowano', labelReset: 'Resetuj', labelCurrency: 'Waluta', labelCurrencyHelp: 'Zmiana waluty przelicza wszystkie kwoty według pokazanej stawki referencyjnej.', labelCurrencyRate: 'Kurs referencyjny', labelCurrencyRateDate: 'Kursy z 5 września 2026', labelSelectCurrency: 'Wybierz walutę wyświetlania', labelEuro: 'Euro', labelUSDollar: 'Dolar amerykański', labelPoundSterling: 'Funt brytyjski', labelRussianRuble: 'Rubel rosyjski', labelPercentagePoints: 'punktów procentowych', currencyLocale: 'pl-PL' },
|
|
91
|
+
pt: { labelIncome: 'Rendimento mensal', labelIncomeHelp: 'Escolha rendimento bruto ou líquido e mantenha a mesma base.', labelIncomeBasis: 'Base do rendimento', labelGrossIncome: 'Rendimento bruto', labelNetIncome: 'Rendimento líquido', labelExistingPayments: 'Pagamentos mensais de dívida atuais', labelExistingPaymentsHelp: 'Inclua as prestações que já paga todos os meses.', labelNewPayment: 'Nova prestação mensal proposta', labelNewPaymentHelp: 'Use a prestação da oferta ou do cenário que quer testar.', labelLoanTerm: 'Prazo do novo empréstimo', labelMonths: 'meses', labelThreshold: 'O seu limite', labelThresholdHelp: 'Um limite de comparação escolhido por si, não uma regra universal de crédito.', labelCurrentScenario: 'Cenário atual', labelProjectedScenario: 'Cenário projetado', labelCurrentRatio: 'Rácio atual', labelProjectedRatio: 'Rácio projetado', labelMonthlyDebt: 'Dívida mensal', labelRemainingIncome: 'Rendimento restante', labelRatioChange: 'Variação do rácio', labelThresholdMargin: 'Margem até ao limite', labelNewLoanTotal: 'Total da nova prestação', labelWithinThreshold: 'Dentro do seu limite', labelOverThreshold: 'Acima do seu limite', labelNoNewLoan: 'Este cenário não inclui uma nova prestação.', labelInvalidInput: 'Reveja os valores assinalados: o rendimento deve ser positivo, os montantes não podem ser negativos e uma nova prestação precisa de prazo.', labelHowToRead: 'Construa a comparação', labelCopyResult: 'Copiar resultado', labelCopied: 'Copiado', labelReset: 'Repor', labelCurrency: 'Moeda', labelCurrencyHelp: 'Ao mudar de moeda, todos os valores são convertidos pela taxa de referência apresentada.', labelCurrencyRate: 'Taxa de referência', labelCurrencyRateDate: 'Taxas de 5 de setembro de 2026', labelSelectCurrency: 'Escolha a moeda de apresentação', labelEuro: 'Euro', labelUSDollar: 'Dólar americano', labelPoundSterling: 'Libra esterlina', labelRussianRuble: 'Rublo russo', labelPercentagePoints: 'pontos percentuais', currencyLocale: 'pt-PT' },
|
|
92
|
+
ru: { labelIncome: 'Ежемесячный доход', labelIncomeHelp: 'Выберите доход до или после налогов и используйте одну основу.', labelIncomeBasis: 'Основа дохода', labelGrossIncome: 'Доход до налогов', labelNetIncome: 'Доход после налогов', labelExistingPayments: 'Текущие ежемесячные платежи по долгам', labelExistingPaymentsHelp: 'Укажите платежи, которые уже вносите каждый месяц.', labelNewPayment: 'Предлагаемый новый ежемесячный платёж', labelNewPaymentHelp: 'Введите платёж из предложения или сценария, который хотите проверить.', labelLoanTerm: 'Срок нового кредита', labelMonths: 'мес.', labelThreshold: 'Ваш порог', labelThresholdHelp: 'Выбранный вами предел для сравнения, а не универсальное правило кредитора.', labelCurrentScenario: 'Текущий сценарий', labelProjectedScenario: 'Прогнозный сценарий', labelCurrentRatio: 'Текущая доля', labelProjectedRatio: 'Прогнозная доля', labelMonthlyDebt: 'Ежемесячный долг', labelRemainingIncome: 'Оставшийся доход', labelRatioChange: 'Изменение доли', labelThresholdMargin: 'Запас до порога', labelNewLoanTotal: 'Общая сумма новых платежей', labelWithinThreshold: 'В пределах вашего порога', labelOverThreshold: 'Выше вашего порога', labelNoNewLoan: 'В этом сценарии нет нового платежа.', labelInvalidInput: 'Проверьте отмеченные значения: доход должен быть положительным, суммы не могут быть отрицательными, а для нового платежа нужен срок.', labelHowToRead: 'Соберите сравнение', labelCopyResult: 'Скопировать результат', labelCopied: 'Скопировано', labelReset: 'Сбросить', labelCurrency: 'Валюта', labelCurrencyHelp: 'При смене валюты все суммы пересчитываются по показанному справочному курсу.', labelCurrencyRate: 'Справочный курс', labelCurrencyRateDate: 'Курсы на 5 сентября 2026 года', labelSelectCurrency: 'Выберите валюту отображения', labelEuro: 'Евро', labelUSDollar: 'Доллар США', labelPoundSterling: 'Фунт стерлингов', labelRussianRuble: 'Российский рубль', labelPercentagePoints: 'процентных пунктов', currencyLocale: 'ru-RU' },
|
|
93
|
+
sv: { labelIncome: 'Månadsinkomst', labelIncomeHelp: 'Välj brutto- eller nettoinkomst och använd samma grund.', labelIncomeBasis: 'Inkomstgrund', labelGrossIncome: 'Bruttoinkomst', labelNetIncome: 'Nettoinkomst', labelExistingPayments: 'Nuvarande månatliga skuldbetalningar', labelExistingPaymentsHelp: 'Ta med betalningarna du redan gör varje månad.', labelNewPayment: 'Föreslagen ny månadsbetalning', labelNewPaymentHelp: 'Använd betalningen från erbjudandet eller scenariot du vill testa.', labelLoanTerm: 'Den nya lånets löptid', labelMonths: 'månader', labelThreshold: 'Din gräns', labelThresholdHelp: 'En jämförelsegräns du väljer, inte en universell kreditregel.', labelCurrentScenario: 'Nuvarande scenario', labelProjectedScenario: 'Beräknat scenario', labelCurrentRatio: 'Nuvarande kvot', labelProjectedRatio: 'Beräknad kvot', labelMonthlyDebt: 'Månadsskuld', labelRemainingIncome: 'Kvarvarande inkomst', labelRatioChange: 'Förändring av kvoten', labelThresholdMargin: 'Marginal till gränsen', labelNewLoanTotal: 'Total ny betalning', labelWithinThreshold: 'Inom din gräns', labelOverThreshold: 'Över din gräns', labelNoNewLoan: 'Detta scenario innehåller ingen ny betalning.', labelInvalidInput: 'Kontrollera de markerade värdena: inkomsten måste vara positiv, belopp får inte vara negativa och en ny betalning behöver en löptid.', labelHowToRead: 'Bygg din jämförelse', labelCopyResult: 'Kopiera resultat', labelCopied: 'Kopierat', labelReset: 'Återställ', labelCurrency: 'Valuta', labelCurrencyHelp: 'När du byter valuta omvandlas alla belopp med den visade referenskursen.', labelCurrencyRate: 'Referenskurs', labelCurrencyRateDate: 'Kurser från 5 september 2026', labelSelectCurrency: 'Välj visningsvaluta', labelEuro: 'Euro', labelUSDollar: 'Amerikansk dollar', labelPoundSterling: 'Brittiskt pund', labelRussianRuble: 'Rysk rubel', labelPercentagePoints: 'procentenheter', currencyLocale: 'sv-SE' },
|
|
94
|
+
tr: { labelIncome: 'Aylık gelir', labelIncomeHelp: 'Brüt veya net geliri seçin ve aynı temeli koruyun.', labelIncomeBasis: 'Gelir temeli', labelGrossIncome: 'Brüt gelir', labelNetIncome: 'Net gelir', labelExistingPayments: 'Mevcut aylık borç ödemeleri', labelExistingPaymentsHelp: 'Her ay zaten yaptığınız ödemeleri ekleyin.', labelNewPayment: 'Önerilen yeni aylık ödeme', labelNewPaymentHelp: 'Test etmek istediğiniz teklif veya senaryodaki ödemeyi kullanın.', labelLoanTerm: 'Yeni kredi vadesi', labelMonths: 'ay', labelThreshold: 'Eşiğiniz', labelThresholdHelp: 'Sizin seçtiğiniz karşılaştırma sınırıdır; evrensel bir kredi kuralı değildir.', labelCurrentScenario: 'Mevcut senaryo', labelProjectedScenario: 'Öngörülen senaryo', labelCurrentRatio: 'Mevcut oran', labelProjectedRatio: 'Öngörülen oran', labelMonthlyDebt: 'Aylık borç', labelRemainingIncome: 'Kalan gelir', labelRatioChange: 'Oran değişimi', labelThresholdMargin: 'Eşiğe kalan pay', labelNewLoanTotal: 'Yeni ödemenin toplamı', labelWithinThreshold: 'Eşiğinizin içinde', labelOverThreshold: 'Eşiğin üzerinde', labelNoNewLoan: 'Bu senaryoda yeni ödeme bulunmuyor.', labelInvalidInput: 'İşaretli değerleri kontrol edin: gelir pozitif olmalı, tutarlar negatif olamaz ve yeni ödeme için vade gerekir.', labelHowToRead: 'Karşılaştırmanızı oluşturun', labelCopyResult: 'Sonucu kopyala', labelCopied: 'Kopyalandı', labelReset: 'Sıfırla', labelCurrency: 'Para birimi', labelCurrencyHelp: 'Para birimini değiştirmek, tüm tutarları gösterilen referans kurla dönüştürür.', labelCurrencyRate: 'Referans kur', labelCurrencyRateDate: '5 Eylül 2026 kurları', labelSelectCurrency: 'Görüntüleme para birimini seçin', labelEuro: 'Euro', labelUSDollar: 'ABD doları', labelPoundSterling: 'İngiliz sterlini', labelRussianRuble: 'Rus rublesi', labelPercentagePoints: 'yüzde puan', currencyLocale: 'tr-TR' },
|
|
95
|
+
zh: { labelIncome: '月收入', labelIncomeHelp: '选择税前或税后收入,并在比较中保持一致。', labelIncomeBasis: '收入口径', labelGrossIncome: '税前收入', labelNetIncome: '税后收入', labelExistingPayments: '当前每月债务还款', labelExistingPaymentsHelp: '填入你已经每月支付的金额。', labelNewPayment: '预计新增月供', labelNewPaymentHelp: '填入你想测试的报价或方案中的月供。', labelLoanTerm: '新贷款期限', labelMonths: '个月', labelThreshold: '你的阈值', labelThresholdHelp: '这是你选择的比较上限,不是通用的放贷规则。', labelCurrentScenario: '当前方案', labelProjectedScenario: '预计方案', labelCurrentRatio: '当前比例', labelProjectedRatio: '预计比例', labelMonthlyDebt: '每月债务', labelRemainingIncome: '剩余收入', labelRatioChange: '比例变化', labelThresholdMargin: '距离阈值', labelNewLoanTotal: '新增还款总额', labelWithinThreshold: '在你的阈值内', labelOverThreshold: '超过你的阈值', labelNoNewLoan: '此方案不包含新增还款。', labelInvalidInput: '请检查标记的数值:收入必须为正数,金额不能为负数,新增还款需要填写期限。', labelHowToRead: '建立你的比较', labelCopyResult: '复制结果', labelCopied: '已复制', labelReset: '重置', labelCurrency: '货币', labelCurrencyHelp: '切换货币会按照这里显示的参考汇率转换所有金额。', labelCurrencyRate: '参考汇率', labelCurrencyRateDate: '2026年9月5日汇率', labelSelectCurrency: '选择显示货币', labelEuro: '欧元', labelUSDollar: '美元', labelPoundSterling: '英镑', labelRussianRuble: '俄罗斯卢布', labelPercentagePoints: '个百分点', currencyLocale: 'zh-CN' },
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
const packs: Record<LocaleKey, CopyPack> = {
|
|
99
|
+
en: { title: 'Debt to Income Ratio Calculator', description: 'Compare your current debt-to-income ratio with a new loan scenario, convert amounts across eleven major currencies, and test the threshold you choose before adding another monthly payment.', intro: 'A new monthly payment can look manageable on its own while changing the share of income already committed to debt. Enter the income basis and payments you know, then test the new commitment against a threshold you choose.', formula: 'The basic calculation is monthly debt payments ÷ selected monthly income × 100. The current scenario uses existing payments; the projected scenario adds the proposed payment.', limit: 'A threshold is useful for comparing options, but it is not a universal approval rule. Lenders can define income, debt and limits differently.', faq: [{ question: 'What is a debt-to-income ratio?', answer: 'It is the share of selected monthly income that goes toward monthly debt payments. The calculator expresses that share as a percentage.' }, { question: 'Should I use gross or net income?', answer: 'Use the basis that matches your comparison and keep it consistent. Lenders and products may define income and debt differently.' }, { question: 'Does this predict approval?', answer: 'No. It compares the values you enter and cannot decide whether a lender will approve an application.' }], howTo: [{ name: 'Choose the basis', text: 'Choose a currency, then select gross or net income.' }, { name: 'Add current payments', text: 'Enter the monthly debt payments you already make.' }, { name: 'Model the new loan', text: 'Add the proposed payment, term and threshold.' }, { name: 'Read the change', text: 'Compare both ratios, remaining income and the margin to your threshold.' }], seoTitle: 'Compare the current and projected debt load', seoResultTitle: 'What the comparison shows', seoResult: 'The current ratio uses existing monthly payments. The projected ratio adds the proposed payment, while the term shows the scheduled total of that new payment.', seoTipTitle: 'Treat the threshold as a scenario, not a verdict', seoTip: 'Use the threshold to compare options, not as a promise of approval. Check the lender’s definitions and your complete household budget before committing.', seoList: ['Whether the new payment moves the ratio above your chosen limit.', 'How much income remains after current and projected payments.', 'How many percentage points the new payment adds.', 'The scheduled total across the entered term.'], seoClosing: 'Currency switching is a display conversion using dated reference rates, not a live quote.' },
|
|
100
|
+
de: { title: 'Schulden-Einkommens-Quotenrechner', description: 'Vergleiche deine aktuelle Schuldenquote mit einem neuen Kredit, rechne Beträge zwischen EUR, USD, GBP und RUB um und prüfe deinen eigenen Grenzwert.', intro: 'Eine neue Monatsrate kann allein tragbar wirken und trotzdem den bereits gebundenen Einkommensanteil verändern. Trage deine Werte ein und vergleiche das neue Szenario mit deinem Grenzwert.', formula: 'Die Grundrechnung lautet monatliche Schuldzahlungen ÷ gewähltes Monatseinkommen × 100. Das geplante Szenario ergänzt die neue Rate.', limit: 'Der Grenzwert dient dem Vergleich, ist aber keine allgemeine Zusage für eine Kreditentscheidung. Anbieter können Einkommen und Schulden anders definieren.', faq: [{ question: 'Was bedeutet die Schulden-Einkommens-Quote?', answer: 'Sie zeigt, welcher Anteil des gewählten Monatseinkommens für monatliche Schuldzahlungen verwendet wird.' }, { question: 'Soll ich Brutto- oder Nettoeinkommen verwenden?', answer: 'Nutze die Grundlage, die zu deinem Vergleich passt, und bleibe in beiden Szenarien dabei.' }, { question: 'Sagt der Rechner eine Zusage voraus?', answer: 'Nein. Er vergleicht nur deine Eingaben und ersetzt keine Prüfung durch einen Kreditgeber.' }], howTo: [{ name: 'Grundlage wählen', text: 'Wähle die Währung sowie Brutto- oder Nettoeinkommen.' }, { name: 'Aktuelle Raten eintragen', text: 'Trage deine bestehenden monatlichen Zahlungen ein.' }, { name: 'Neuen Kredit prüfen', text: 'Gib Rate, Laufzeit und Grenzwert ein.' }, { name: 'Ergebnis lesen', text: 'Vergleiche Quoten, verbleibendes Einkommen und Abstand zum Grenzwert.' }], seoTitle: 'Aktuelle und geplante Schuldenlast vergleichen', seoResultTitle: 'Was der Vergleich zeigt', seoResult: 'Die aktuelle Quote nutzt bestehende Zahlungen. Die geplante Quote ergänzt die neue Rate; die Laufzeit zeigt deren geplante Gesamtsumme.', seoTipTitle: 'Den Grenzwert als Szenario verstehen', seoTip: 'Ein Grenzwert ist eine Vergleichshilfe und keine Zusage. Prüfe die Definitionen des Anbieters und dein gesamtes Haushaltsbudget.', seoList: ['Ob die neue Rate deinen gewählten Grenzwert überschreitet.', 'Wie viel Einkommen nach den Zahlungen bleibt.', 'Wie viele Prozentpunkte die neue Rate hinzufügt.', 'Welche Gesamtsumme über die Laufzeit entsteht.'], seoClosing: 'Der Währungswechsel ist eine Anzeigeumrechnung mit datierten Referenzkursen, kein Live-Kurs.' },
|
|
101
|
+
es: { title: 'Calculadora de ratio deuda-ingresos', description: 'Compara tu ratio de deuda actual con un nuevo préstamo, convierte importes entre EUR, USD, GBP y RUB y prueba el umbral que elijas.', intro: 'Una cuota nueva puede parecer asumible por separado y cambiar mucho la parte de ingresos ya comprometida. Introduce tus pagos y comprueba el nuevo escenario con tu propio umbral.', formula: 'El cálculo es pagos mensuales de deuda ÷ ingresos mensuales elegidos × 100. El escenario proyectado suma la nueva cuota.', limit: 'El umbral sirve para comparar opciones, pero no es una regla universal de aprobación. Cada entidad puede definir ingresos y deuda de forma distinta.', faq: [{ question: '¿Qué es el ratio deuda-ingresos?', answer: 'Es la parte de los ingresos mensuales elegidos que se destina a pagar deudas mensuales, expresada como porcentaje.' }, { question: '¿Uso ingresos brutos o netos?', answer: 'Usa la base que encaje con tu comparación y mantenla igual en los dos escenarios.' }, { question: '¿Predice si me aprobarán el préstamo?', answer: 'No. Solo compara los datos que introduces y no sustituye el análisis de una entidad.' }], howTo: [{ name: 'Elige la base', text: 'Selecciona moneda e ingresos brutos o netos.' }, { name: 'Añade tus pagos', text: 'Introduce las cuotas mensuales que ya pagas.' }, { name: 'Modela el préstamo', text: 'Añade la cuota propuesta, el plazo y tu umbral.' }, { name: 'Lee el cambio', text: 'Compara ambos ratios, los ingresos restantes y el margen.' }], seoTitle: 'Compara tu deuda actual y proyectada', seoResultTitle: 'Qué te enseña la comparación', seoResult: 'El ratio actual usa tus pagos existentes. El proyectado suma la nueva cuota y el plazo muestra el total programado de esa cuota.', seoTipTitle: 'Usa el umbral como escenario, no como veredicto', seoTip: 'El umbral te ayuda a comparar opciones, pero no garantiza una aprobación. Contrasta las definiciones de la entidad con tu presupuesto completo.', seoList: ['Si la nueva cuota supera el límite elegido.', 'Cuánto ingreso queda después de los pagos.', 'Cuántos puntos porcentuales añade la nueva cuota.', 'El total programado durante el plazo.'], seoClosing: 'Cambiar de moneda es una conversión de visualización con tipos de referencia fechados, no una cotización en tiempo real.' },
|
|
102
|
+
fr: { title: 'Calculateur du ratio dette-revenu', description: 'Comparez votre ratio actuel avec un nouveau prêt, convertissez les montants entre EUR, USD, GBP et RUB et testez le seuil de votre choix.', intro: 'Une nouvelle mensualité peut sembler supportable seule tout en augmentant la part du revenu déjà consacrée aux dettes. Saisissez vos montants et comparez le scénario.', formula: 'Le calcul est mensualités de dettes ÷ revenu mensuel choisi × 100. Le scénario projeté ajoute la nouvelle mensualité.', limit: 'Le seuil sert à comparer des options, mais ne constitue pas une règle universelle d’acceptation. Les prêteurs peuvent définir les revenus et les dettes autrement.', faq: [{ question: 'Qu’est-ce que le ratio dette-revenu ?', answer: 'C’est la part du revenu mensuel choisi consacrée aux paiements de dettes, exprimée en pourcentage.' }, { question: 'Dois-je utiliser le revenu brut ou net ?', answer: 'Choisissez la base adaptée à votre comparaison et conservez-la dans les deux scénarios.' }, { question: 'Le calculateur prédit-il une acceptation ?', answer: 'Non. Il compare vos données et ne remplace pas l’étude du prêteur.' }], howTo: [{ name: 'Choisir la base', text: 'Choisissez la devise et le revenu brut ou net.' }, { name: 'Ajouter les paiements', text: 'Saisissez les mensualités que vous payez déjà.' }, { name: 'Tester le nouveau prêt', text: 'Ajoutez la mensualité, la durée et votre seuil.' }, { name: 'Lire l’évolution', text: 'Comparez les ratios, le revenu restant et la marge.' }], seoTitle: 'Comparer la dette actuelle et projetée', seoResultTitle: 'Ce que montre la comparaison', seoResult: 'Le ratio actuel utilise les paiements existants. Le ratio projeté ajoute la nouvelle mensualité et la durée affiche son total prévu.', seoTipTitle: 'Considérez le seuil comme un scénario', seoTip: 'Un seuil aide à comparer, mais ne garantit pas une acceptation. Vérifiez les définitions du prêteur et votre budget complet.', seoList: ['Le dépassement éventuel de votre limite.', 'Le revenu restant après les paiements.', 'Les points ajoutés par la nouvelle mensualité.', 'Le total prévu sur la durée saisie.'], seoClosing: 'Le changement de devise est une conversion d’affichage avec des taux de référence datés, pas un cours en direct.' },
|
|
103
|
+
id: { title: 'Kalkulator Rasio Utang terhadap Pendapatan', description: 'Bandingkan rasio utang saat ini dengan pinjaman baru, konversi jumlah EUR, USD, GBP, dan RUB, lalu uji batas pilihan Anda.', intro: 'Cicilan baru dapat terlihat ringan sendiri tetapi mengubah bagian pendapatan yang sudah terikat. Masukkan pembayaran Anda dan bandingkan skenario baru dengan batas yang dipilih.', formula: 'Perhitungannya adalah pembayaran utang bulanan ÷ pendapatan bulanan yang dipilih × 100. Skenario proyeksi menambahkan cicilan baru.', limit: 'Batas membantu membandingkan pilihan, tetapi bukan aturan persetujuan universal. Pemberi pinjaman dapat mendefinisikan pendapatan dan utang secara berbeda.', faq: [{ question: 'Apa itu rasio utang terhadap pendapatan?', answer: 'Rasio ini menunjukkan bagian pendapatan bulanan yang digunakan untuk membayar utang bulanan, dalam bentuk persentase.' }, { question: 'Haruskah memakai pendapatan kotor atau bersih?', answer: 'Gunakan dasar yang sesuai dengan perbandingan Anda dan pertahankan untuk kedua skenario.' }, { question: 'Apakah kalkulator ini memprediksi persetujuan?', answer: 'Tidak. Kalkulator hanya membandingkan data Anda dan bukan keputusan pemberi pinjaman.' }], howTo: [{ name: 'Pilih dasar', text: 'Pilih mata uang dan pendapatan kotor atau bersih.' }, { name: 'Masukkan pembayaran', text: 'Tambahkan pembayaran utang bulanan yang sudah berjalan.' }, { name: 'Uji pinjaman baru', text: 'Masukkan cicilan, jangka waktu, dan batas Anda.' }, { name: 'Baca perubahannya', text: 'Bandingkan rasio, pendapatan tersisa, dan jarak ke batas.' }], seoTitle: 'Bandingkan beban utang saat ini dan proyeksi', seoResultTitle: 'Apa yang ditunjukkan perbandingan', seoResult: 'Rasio saat ini memakai pembayaran yang ada. Rasio proyeksi menambahkan cicilan baru, sedangkan jangka waktu menunjukkan total terjadwalnya.', seoTipTitle: 'Gunakan batas sebagai skenario, bukan keputusan', seoTip: 'Batas berguna untuk membandingkan pilihan, tetapi tidak menjamin persetujuan. Periksa definisi pemberi pinjaman dan anggaran rumah tangga Anda.', seoList: ['Apakah cicilan baru melewati batas yang dipilih.', 'Berapa pendapatan yang tersisa setelah pembayaran.', 'Berapa poin persentase yang ditambahkan.', 'Total terjadwal selama jangka waktu.'], seoClosing: 'Pergantian mata uang adalah konversi tampilan dengan kurs referensi bertanggal, bukan kurs langsung.' },
|
|
104
|
+
it: { title: 'Calcolatore del rapporto debito-reddito', description: 'Confronta il rapporto attuale con un nuovo prestito, converti gli importi tra EUR, USD, GBP e RUB e prova la soglia che scegli.', intro: 'Una nuova rata può sembrare gestibile da sola e cambiare la quota di reddito già impegnata. Inserisci i pagamenti e confronta lo scenario previsto.', formula: 'Il calcolo è pagamenti mensili del debito ÷ reddito mensile scelto × 100. Lo scenario previsto aggiunge la nuova rata.', limit: 'La soglia serve a confrontare le opzioni, ma non è una regola universale di approvazione. Gli istituti possono definire reddito e debito in modo diverso.', faq: [{ question: 'Cos’è il rapporto debito-reddito?', answer: 'È la parte del reddito mensile scelto destinata ai pagamenti dei debiti, espressa in percentuale.' }, { question: 'Uso il reddito lordo o netto?', answer: 'Scegli la base adatta al confronto e usala in entrambi gli scenari.' }, { question: 'Il calcolatore prevede l’approvazione?', answer: 'No. Confronta i dati inseriti e non sostituisce la valutazione del finanziatore.' }], howTo: [{ name: 'Scegli la base', text: 'Scegli valuta e reddito lordo o netto.' }, { name: 'Inserisci i pagamenti', text: 'Aggiungi le rate mensili già presenti.' }, { name: 'Prova il nuovo prestito', text: 'Inserisci rata, durata e soglia.' }, { name: 'Leggi la variazione', text: 'Confronta rapporti, reddito residuo e margine.' }], seoTitle: 'Confronta il debito attuale e previsto', seoResultTitle: 'Cosa mostra il confronto', seoResult: 'Il rapporto attuale usa i pagamenti esistenti. Quello previsto aggiunge la nuova rata e la durata mostra il totale programmato.', seoTipTitle: 'Considera la soglia uno scenario', seoTip: 'La soglia aiuta a confrontare, ma non garantisce l’approvazione. Verifica definizioni e budget completo.', seoList: ['Se la nuova rata supera il limite scelto.', 'Quanto reddito rimane dopo i pagamenti.', 'Quanti punti percentuali aggiunge la rata.', 'Il totale previsto per tutta la durata.'], seoClosing: 'Cambiare valuta è una conversione di visualizzazione con tassi di riferimento datati, non una quotazione in tempo reale.' },
|
|
105
|
+
ja: { title: '借入負担率計算ツール', description: '現在の借入負担率と新しいローンのシナリオを比較し、EUR・USD・GBP・RUBを換算して、設定した上限を確認します。', intro: '新しい返済額は単独では無理がなく見えても、すでに返済に回している収入の割合を変えます。金額を入力して予測シナリオを比べましょう。', formula: '計算式は毎月の債務返済額 ÷ 選択した月収 × 100です。予測シナリオでは新しい返済額を加えます。', limit: '上限は選択肢を比べるための目安であり、審査結果を示す普遍的なルールではありません。', faq: [{ question: '借入負担率とは何ですか?', answer: '選択した月収のうち、毎月の借入返済に使われる割合をパーセントで示したものです。' }, { question: '総収入と手取りのどちらを使いますか?', answer: '目的に合う基準を選び、現在と予測の両方で同じ基準を使ってください。' }, { question: '審査の可否を予測できますか?', answer: 'いいえ。入力値を比較するツールであり、金融機関の審査を代替しません。' }], howTo: [{ name: '基準を選ぶ', text: '通貨と総収入または手取りを選択します。' }, { name: '現在の返済を入力', text: 'すでに支払っている毎月の返済額を入力します。' }, { name: '新しいローンを試す', text: '新しい返済額、期間、上限を入力します。' }, { name: '変化を読む', text: '比率、残る収入、上限までの余裕を比べます。' }], seoTitle: '現在と予測の借入負担を比較', seoResultTitle: '比較で分かること', seoResult: '現在の比率は既存の返済額を使います。予測比率は新しい返済額を加え、期間から予定総額を確認できます。', seoTipTitle: '上限は判定ではなくシナリオ', seoTip: '上限は選択肢の比較に使い、承認の保証とは考えないでください。金融機関の定義と家計全体を確認しましょう。', seoList: ['新しい返済額で上限を超えるか。', '返済後に残る毎月の収入。', '新しい返済額が加えるポイント数。', '入力した期間の予定総額。'], seoClosing: '通貨変更は日付付きの参考レートによる表示換算で、リアルタイム相場ではありません。' },
|
|
106
|
+
ko: { title: '부채 소득 비율 계산기', description: '현재 부채 소득 비율과 신규 대출 시나리오를 비교하고 EUR, USD, GBP, RUB 금액을 변환해 원하는 기준선을 확인하세요.', intro: '새 월 상환액은 단독으로는 감당할 만해 보여도 이미 부채에 쓰는 소득의 비율을 바꿀 수 있습니다. 금액을 입력하고 예상 시나리오를 비교하세요.', formula: '계산식은 월 부채 상환액 ÷ 선택한 월 소득 × 100입니다. 예상 시나리오에는 신규 상환액이 더해집니다.', limit: '기준선은 선택지를 비교하기 위한 값이며 보편적인 승인 규칙이 아닙니다. 대출기관마다 소득과 부채의 정의가 다를 수 있습니다.', faq: [{ question: '부채 소득 비율이란 무엇인가요?', answer: '선택한 월 소득 중 매월 부채를 상환하는 데 쓰이는 비율을 백분율로 나타낸 값입니다.' }, { question: '총소득과 순소득 중 무엇을 사용하나요?', answer: '비교 목적에 맞는 기준을 선택하고 두 시나리오에서 동일하게 사용하세요.' }, { question: '대출 승인을 예측하나요?', answer: '아니요. 입력한 값을 비교할 뿐이며 대출기관의 심사를 대신하지 않습니다.' }], howTo: [{ name: '기준 선택', text: '통화와 총소득 또는 순소득을 선택합니다.' }, { name: '현재 상환액 입력', text: '이미 납부 중인 월 부채 상환액을 입력합니다.' }, { name: '신규 대출 모델링', text: '신규 상환액, 기간, 기준선을 입력합니다.' }, { name: '변화 확인', text: '비율과 남는 소득, 기준선까지의 여유를 비교합니다.' }], seoTitle: '현재와 예상 부채 부담 비교', seoResultTitle: '비교 결과로 알 수 있는 것', seoResult: '현재 비율은 기존 상환액을 사용합니다. 예상 비율은 신규 상환액을 더하고 기간으로 예정 총액을 보여줍니다.', seoTipTitle: '기준선은 판정이 아닌 시나리오', seoTip: '기준선은 비교용이며 승인 보장이 아닙니다. 대출기관의 정의와 전체 가계 예산을 확인하세요.', seoList: ['신규 상환액이 선택한 한도를 넘는지.', '상환 후 남는 소득이 얼마인지.', '신규 상환액이 더하는 퍼센트포인트.', '입력한 기간 동안의 예정 총액.'], seoClosing: '통화 변경은 날짜가 표시된 기준 환율을 이용한 화면 변환이며 실시간 시세가 아닙니다.' },
|
|
107
|
+
nl: { title: 'Schuld-inkomensverhouding calculator', description: 'Vergelijk je huidige schuld-inkomensverhouding met een nieuwe lening, reken bedragen om tussen EUR, USD, GBP en RUB en test je eigen grens.', intro: 'Een nieuwe maandbetaling kan op zichzelf haalbaar lijken, maar het deel van je inkomen voor schulden veranderen. Vul je betalingen in en vergelijk het verwachte scenario.', formula: 'De berekening is maandelijkse schuld ÷ gekozen maandinkomen × 100. Het verwachte scenario telt de nieuwe betaling op.', limit: 'De grens helpt opties vergelijken, maar is geen universele goedkeuringsregel. Kredietverstrekkers kunnen inkomen en schuld anders definiëren.', faq: [{ question: 'Wat is de schuld-inkomensverhouding?', answer: 'Het is het aandeel van je gekozen maandinkomen dat naar maandelijkse schuldaflossingen gaat, uitgedrukt als percentage.' }, { question: 'Gebruik ik bruto- of netto-inkomen?', answer: 'Kies de basis die bij je vergelijking past en gebruik die in beide scenario’s.' }, { question: 'Voorspelt de calculator goedkeuring?', answer: 'Nee. Hij vergelijkt je invoer en vervangt geen beoordeling door een kredietverstrekker.' }], howTo: [{ name: 'Kies de basis', text: 'Kies valuta en bruto- of netto-inkomen.' }, { name: 'Voeg betalingen toe', text: 'Vul je bestaande maandelijkse schuldbetalingen in.' }, { name: 'Test de nieuwe lening', text: 'Voeg betaling, looptijd en grens toe.' }, { name: 'Lees de verandering', text: 'Vergelijk verhoudingen, resterend inkomen en marge.' }], seoTitle: 'Huidige en verwachte schuldenlast vergelijken', seoResultTitle: 'Wat de vergelijking laat zien', seoResult: 'De huidige verhouding gebruikt bestaande betalingen. De verwachte verhouding telt de nieuwe betaling op en de looptijd toont het geplande totaal.', seoTipTitle: 'Zie de grens als scenario', seoTip: 'Een grens helpt vergelijken, maar garandeert geen goedkeuring. Controleer de definities van de verstrekker en je volledige budget.', seoList: ['Of de nieuwe betaling je gekozen grens overschrijdt.', 'Hoeveel inkomen na de betalingen overblijft.', 'Hoeveel procentpunten de betaling toevoegt.', 'Het geplande totaal over de looptijd.'], seoClosing: 'Een valutawissel is een weergaveconversie met gedateerde referentiekoersen, geen live koers.' },
|
|
108
|
+
pl: { title: 'Kalkulator relacji długu do dochodu', description: 'Porównaj obecną relację długu do dochodu z nową pożyczką, przelicz kwoty między EUR, USD, GBP i RUB oraz sprawdź własny próg.', intro: 'Nowa rata może wyglądać na łatwą do udźwignięcia, a jednocześnie zmienić część dochodu przeznaczoną już na długi. Wpisz płatności i porównaj scenariusz.', formula: 'Wzór to miesięczne spłaty długu ÷ wybrany miesięczny dochód × 100. Scenariusz przewidywany dodaje nową ratę.', limit: 'Próg służy do porównania opcji, ale nie jest uniwersalną zasadą decyzji kredytowej. Kredytodawcy mogą inaczej definiować dochód i dług.', faq: [{ question: 'Czym jest relacja długu do dochodu?', answer: 'Pokazuje, jaka część wybranego miesięcznego dochodu trafia na spłaty długów, jako procent.' }, { question: 'Użyć dochodu brutto czy netto?', answer: 'Wybierz podstawę odpowiednią do porównania i stosuj ją w obu scenariuszach.' }, { question: 'Czy kalkulator przewiduje zgodę kredytową?', answer: 'Nie. Porównuje podane wartości i nie zastępuje analizy kredytodawcy.' }], howTo: [{ name: 'Wybierz podstawę', text: 'Wybierz walutę oraz dochód brutto lub netto.' }, { name: 'Dodaj obecne raty', text: 'Wpisz miesięczne spłaty, które już ponosisz.' }, { name: 'Sprawdź nową pożyczkę', text: 'Dodaj ratę, okres i własny próg.' }, { name: 'Odczytaj zmianę', text: 'Porównaj wskaźniki, pozostały dochód i margines.' }], seoTitle: 'Porównaj obecne i przewidywane zadłużenie', seoResultTitle: 'Co pokazuje porównanie', seoResult: 'Obecny wskaźnik korzysta z istniejących rat. Przewidywany dodaje nową ratę, a okres pokazuje jej zaplanowaną sumę.', seoTipTitle: 'Traktuj próg jak scenariusz', seoTip: 'Próg pomaga porównywać opcje, ale nie gwarantuje zgody. Sprawdź definicje kredytodawcy i cały budżet.', seoList: ['Czy nowa rata przekracza wybrany limit.', 'Ile dochodu zostaje po płatnościach.', 'Ile punktów procentowych dodaje rata.', 'Łączna suma w podanym okresie.'], seoClosing: 'Zmiana waluty to przeliczenie prezentacyjne według datowanych kursów referencyjnych, nie kurs na żywo.' },
|
|
109
|
+
pt: { title: 'Calculadora de rácio dívida-rendimento', description: 'Compare o rácio atual com um novo empréstimo, converta valores entre EUR, USD, GBP e RUB e teste o limite que escolher.', intro: 'Uma nova prestação pode parecer suportável isoladamente e alterar a parte do rendimento já comprometida. Introduza os pagamentos e compare o cenário previsto.', formula: 'O cálculo é pagamentos mensais de dívida ÷ rendimento mensal escolhido × 100. O cenário projetado soma a nova prestação.', limit: 'O limite ajuda a comparar opções, mas não é uma regra universal de aprovação. Os credores podem definir rendimento e dívida de formas diferentes.', faq: [{ question: 'O que é o rácio dívida-rendimento?', answer: 'É a parte do rendimento mensal escolhido destinada a pagamentos de dívida, expressa em percentagem.' }, { question: 'Uso rendimento bruto ou líquido?', answer: 'Escolha a base adequada à comparação e mantenha-a nos dois cenários.' }, { question: 'A calculadora prevê a aprovação?', answer: 'Não. Compara os valores introduzidos e não substitui a análise do credor.' }], howTo: [{ name: 'Escolher a base', text: 'Escolha a moeda e o rendimento bruto ou líquido.' }, { name: 'Adicionar pagamentos', text: 'Introduza as prestações mensais que já paga.' }, { name: 'Testar o novo empréstimo', text: 'Adicione prestação, prazo e limite.' }, { name: 'Ler a mudança', text: 'Compare rácios, rendimento restante e margem.' }], seoTitle: 'Compare a dívida atual e projetada', seoResultTitle: 'O que a comparação mostra', seoResult: 'O rácio atual usa os pagamentos existentes. O projetado soma a nova prestação e o prazo mostra o total previsto.', seoTipTitle: 'Veja o limite como cenário', seoTip: 'Um limite ajuda a comparar, mas não garante aprovação. Confirme as definições do credor e o orçamento completo.', seoList: ['Se a nova prestação ultrapassa o limite escolhido.', 'Quanto rendimento sobra depois dos pagamentos.', 'Quantos pontos percentuais a prestação acrescenta.', 'O total previsto ao longo do prazo.'], seoClosing: 'Mudar de moeda é uma conversão de apresentação com taxas de referência datadas, não uma cotação em direto.' },
|
|
110
|
+
ru: { title: 'Калькулятор долговой нагрузки', description: 'Сравните текущую долговую нагрузку с новым кредитом, пересчитайте суммы между EUR, USD, GBP и RUB и проверьте выбранный порог.', intro: 'Новый ежемесячный платёж может казаться посильным сам по себе, но изменить долю дохода, уже занятую долгами. Введите данные и сравните прогнозный сценарий.', formula: 'Формула: ежемесячные платежи по долгам ÷ выбранный месячный доход × 100. В прогнозный сценарий добавляется новый платёж.', limit: 'Порог помогает сравнивать варианты, но не является универсальным правилом одобрения. Кредиторы могут по-разному определять доход и долг.', faq: [{ question: 'Что такое долговая нагрузка?', answer: 'Это доля выбранного месячного дохода, которая уходит на ежемесячные платежи по долгам, в процентах.' }, { question: 'Использовать доход до или после налогов?', answer: 'Выберите основу для своего сравнения и используйте её в обоих сценариях.' }, { question: 'Предсказывает ли калькулятор одобрение?', answer: 'Нет. Он сравнивает введённые значения и не заменяет проверку кредитора.' }], howTo: [{ name: 'Выберите основу', text: 'Выберите валюту и доход до или после налогов.' }, { name: 'Добавьте текущие платежи', text: 'Введите уже существующие ежемесячные платежи.' }, { name: 'Проверьте новый кредит', text: 'Укажите платёж, срок и свой порог.' }, { name: 'Оцените изменение', text: 'Сравните доли, оставшийся доход и запас до порога.' }], seoTitle: 'Сравните текущую и прогнозную долговую нагрузку', seoResultTitle: 'Что показывает сравнение', seoResult: 'Текущая доля использует существующие платежи. Прогнозная добавляет новый платёж, а срок показывает его плановую сумму.', seoTipTitle: 'Считайте порог сценарием, а не вердиктом', seoTip: 'Порог помогает сравнить варианты, но не гарантирует одобрение. Проверьте определения кредитора и весь семейный бюджет.', seoList: ['Превышает ли новый платёж выбранный предел.', 'Сколько дохода остаётся после платежей.', 'Сколько процентных пунктов добавляет платёж.', 'Плановую сумму за указанный срок.'], seoClosing: 'Смена валюты — это отображаемый пересчёт по датированным справочным курсам, а не текущая котировка.' },
|
|
111
|
+
sv: { title: 'Kalkylator för skuld-inkomstkvot', description: 'Jämför din nuvarande skuld-inkomstkvot med ett nytt lån, omvandla belopp mellan EUR, USD, GBP och RUB och testa din egen gräns.', intro: 'En ny månadsbetalning kan verka rimlig ensam men ändra den del av inkomsten som redan går till skulder. Ange dina betalningar och jämför scenariot.', formula: 'Beräkningen är månatliga skuldbetalningar ÷ vald månadsinkomst × 100. Det beräknade scenariot lägger till den nya betalningen.', limit: 'Gränsen hjälper dig att jämföra alternativ men är ingen universell kreditregel. Långivare kan definiera inkomst och skuld på olika sätt.', faq: [{ question: 'Vad är skuld-inkomstkvoten?', answer: 'Det är den andel av den valda månadsinkomsten som går till månatliga skuldbetalningar, uttryckt i procent.' }, { question: 'Ska jag använda brutto- eller nettoinkomst?', answer: 'Välj den grund som passar jämförelsen och använd den i båda scenarierna.' }, { question: 'Förutser kalkylatorn ett godkännande?', answer: 'Nej. Den jämför dina värden och ersätter inte långivarens prövning.' }], howTo: [{ name: 'Välj grund', text: 'Välj valuta och brutto- eller nettoinkomst.' }, { name: 'Lägg till betalningar', text: 'Ange de månatliga skuldbetalningar du redan har.' }, { name: 'Testa det nya lånet', text: 'Lägg till betalning, löptid och gräns.' }, { name: 'Läs förändringen', text: 'Jämför kvoter, kvarvarande inkomst och marginal.' }], seoTitle: 'Jämför nuvarande och beräknad skuldbelastning', seoResultTitle: 'Vad jämförelsen visar', seoResult: 'Den nuvarande kvoten använder befintliga betalningar. Den beräknade kvoten lägger till den nya betalningen och löptiden visar totalsumman.', seoTipTitle: 'Se gränsen som ett scenario', seoTip: 'En gräns hjälper dig jämföra men garanterar inte godkännande. Kontrollera långivarens definitioner och hela budgeten.', seoList: ['Om den nya betalningen överskrider din gräns.', 'Hur mycket inkomst som finns kvar.', 'Hur många procentenheter betalningen lägger till.', 'Den planerade totalsumman under löptiden.'], seoClosing: 'Valutabyte är en visningskonvertering med daterade referenskurser, inte en livekurs.' },
|
|
112
|
+
tr: { title: 'Borç-Gelir Oranı Hesaplayıcı', description: 'Mevcut borç-gelir oranınızı yeni kredi senaryosuyla karşılaştırın, EUR, USD, GBP ve RUB tutarlarını dönüştürün ve seçtiğiniz eşiği test edin.', intro: 'Yeni bir aylık ödeme tek başına makul görünebilir ancak gelirin borca ayrılan kısmını değiştirebilir. Ödemelerinizi girin ve öngörülen senaryoyu karşılaştırın.', formula: 'Hesaplama aylık borç ödemeleri ÷ seçilen aylık gelir × 100 şeklindedir. Öngörülen senaryoya yeni ödeme eklenir.', limit: 'Eşik, seçenekleri karşılaştırmaya yarar; evrensel bir onay kuralı değildir. Kreditörler gelir ve borcu farklı tanımlayabilir.', faq: [{ question: 'Borç-gelir oranı nedir?', answer: 'Seçilen aylık gelirin ne kadarının aylık borç ödemelerine gittiğini yüzde olarak gösterir.' }, { question: 'Brüt mü net gelir mi kullanmalıyım?', answer: 'Karşılaştırmanıza uygun temeli seçin ve iki senaryoda da aynı temeli kullanın.' }, { question: 'Hesaplayıcı onayı öngörür mü?', answer: 'Hayır. Girdiğiniz değerleri karşılaştırır ve kreditör incelemesinin yerini tutmaz.' }], howTo: [{ name: 'Temeli seçin', text: 'Para birimini ve brüt veya net geliri seçin.' }, { name: 'Mevcut ödemeleri ekleyin', text: 'Zaten yaptığınız aylık borç ödemelerini girin.' }, { name: 'Yeni krediyi test edin', text: 'Ödeme, vade ve eşiği ekleyin.' }, { name: 'Değişimi okuyun', text: 'Oranları, kalan geliri ve eşiğe kalan payı karşılaştırın.' }], seoTitle: 'Mevcut ve öngörülen borç yükünü karşılaştırın', seoResultTitle: 'Karşılaştırmanın gösterdiği', seoResult: 'Mevcut oran, var olan ödemeleri kullanır. Öngörülen oran yeni ödemeyi ekler; vade planlanan toplamı gösterir.', seoTipTitle: 'Eşiği karar değil senaryo olarak görün', seoTip: 'Eşik karşılaştırmaya yardımcı olur ama onay garantisi değildir. Kreditör tanımlarını ve bütçenizin tamamını kontrol edin.', seoList: ['Yeni ödemenin seçilen sınırı aşıp aşmadığı.', 'Ödemelerden sonra kalan gelir.', 'Ödemenin eklediği yüzde puan.', 'Girilen vade boyunca planlanan toplam.'], seoClosing: 'Para birimi değişimi, tarihli referans kurlarıyla yapılan gösterim dönüşümüdür; canlı fiyat değildir.' },
|
|
113
|
+
zh: { title: '债务收入比计算器', description: '比较当前债务收入比与新增贷款方案,在 EUR、USD、GBP 和 RUB 之间换算金额,并测试你设定的阈值。', intro: '新增月供单独看似可承受,却可能改变已经用于偿债的收入比例。输入现有付款,查看新增方案的影响。', formula: '计算公式为每月债务还款 ÷ 选定的月收入 × 100。预计方案会加上新增月供。', limit: '阈值用于比较方案,不是通用的审批规则。不同贷款机构对收入、债务和上限的定义可能不同。', faq: [{ question: '什么是债务收入比?', answer: '它表示选定月收入中用于每月偿还债务的比例,并以百分比显示。' }, { question: '应该使用税前还是税后收入?', answer: '选择适合你比较目的的口径,并在两个方案中保持一致。' }, { question: '计算器能预测是否获批吗?', answer: '不能。它只比较你输入的数字,不能替代贷款机构的审核。' }], howTo: [{ name: '选择口径', text: '选择货币以及税前或税后收入。' }, { name: '添加当前还款', text: '输入你目前每月承担的债务还款。' }, { name: '测试新增贷款', text: '填写新增月供、期限和阈值。' }, { name: '查看变化', text: '比较两个比例、剩余收入和距离阈值的空间。' }], seoTitle: '比较当前和预计的债务负担', seoResultTitle: '比较结果能说明什么', seoResult: '当前比例使用已有还款。预计比例会加入新增月供,期限则显示这笔月供的计划总额。', seoTipTitle: '把阈值当作方案,而不是结论', seoTip: '阈值适合比较不同选择,但不能保证获批。请核对贷款机构的定义和完整家庭预算。', seoList: ['新增月供是否超过你设定的上限。', '还款后每月还剩多少收入。', '新增月供增加了多少个百分点。', '整个期限内的计划总额。'], seoClosing: '切换货币是根据带日期的参考汇率进行显示换算,不是实时行情。' },
|
|
114
|
+
};
|
|
115
|
+
|
|
116
|
+
const copyOverrides: Partial<Record<LocaleKey, Partial<CopyPack>>> = {
|
|
117
|
+
en: {
|
|
118
|
+
description: 'Use this debt-to-income ratio calculator to compare current debt payments with a new loan, see the income committed, and test your own limit.',
|
|
119
|
+
intro: 'Looking for a debt-to-income ratio calculator? Enter your monthly gross or net income, the debt payments you already make, and the proposed new monthly payment. The comparison shows your current ratio, projected ratio, change in percentage points, income left after debt payments, and the scheduled total over the new loan term.',
|
|
120
|
+
formula: 'DTI = monthly debt payments ÷ monthly income × 100. Current DTI uses existing payments; projected DTI uses existing payments plus the new payment. Example: 1,200 of monthly debt on 5,000 of income is 24%; adding a 500 payment makes it 34%.',
|
|
121
|
+
limit: 'Use the result for planning and comparison, not as a lending verdict. There is no universal “good” DTI: lenders may count income and debt differently, use different limits, and consider your wider application. This page calculates payment-based DTI, not a lender-specific loan-to-income test based on the loan balance.',
|
|
122
|
+
faq: [
|
|
123
|
+
{ question: 'What is a debt-to-income ratio and how is it calculated?', answer: 'DTI is the percentage of monthly income used for monthly debt payments. Divide the relevant debt payments by the monthly income you selected, then multiply by 100. This calculator shows both the current DTI and the DTI after adding a proposed payment.' },
|
|
124
|
+
{ question: 'Should I use gross or net monthly income?', answer: 'Use the basis that answers your question and keep it consistent in both scenarios. If you are comparing your own take-home budget, net income may be more useful; a lender may use a different definition.' },
|
|
125
|
+
{ question: 'Does this calculator predict loan approval?', answer: 'No. It models the payment-based ratio from the numbers you enter. Approval also depends on the lender, product, credit profile, documented income, other obligations and affordability checks.' },
|
|
126
|
+
],
|
|
127
|
+
howTo: [
|
|
128
|
+
{ name: 'Choose your income basis', text: 'Select a display currency, then choose whether the comparison uses gross or net monthly income.' },
|
|
129
|
+
{ name: 'Enter current debt payments', text: 'Add the monthly payments you already have, including the obligations relevant to your comparison.' },
|
|
130
|
+
{ name: 'Add the new loan scenario', text: 'Enter the proposed monthly payment, its term in months, and the personal threshold you want to test.' },
|
|
131
|
+
{ name: 'Use the result to decide', text: 'Compare current and projected DTI, the percentage-point change, income remaining, threshold margin and scheduled payment total.' },
|
|
132
|
+
],
|
|
133
|
+
seoTitle: 'Debt-to-income ratio calculator with a new payment',
|
|
134
|
+
seoResultTitle: 'What the calculator tells you',
|
|
135
|
+
seoResult: 'The current scenario adds the debt payments you already make. The projected scenario adds the proposed payment, so you can see whether the new commitment crosses your chosen threshold. With the example values above, the new payment adds 10 percentage points to DTI and leaves 3,300 of monthly income after projected debt payments.',
|
|
136
|
+
seoTipTitle: 'Use a threshold that matches the question you are asking',
|
|
137
|
+
seoTip: 'Set a personal budget limit when you want to know whether the payment fits your life. If you are checking a lender’s criteria, enter that lender’s stated limit only after confirming how it defines income and debt. A threshold is a comparison tool, not a promise of approval.',
|
|
138
|
+
seoList: [
|
|
139
|
+
'Your current DTI before the new loan payment.',
|
|
140
|
+
'Your projected DTI after adding the new payment.',
|
|
141
|
+
'The percentage points added by the proposed payment.',
|
|
142
|
+
'Income remaining after current and projected debt payments.',
|
|
143
|
+
'The scheduled total of the new payment across the entered term.',
|
|
144
|
+
],
|
|
145
|
+
seoClosing: 'Changing currency converts every money input and result by the displayed dated reference rate, so 300 in one currency becomes the equivalent amount in the selected currency. It is a display conversion, not a live exchange quote.',
|
|
146
|
+
},
|
|
147
|
+
es: {
|
|
148
|
+
description: 'Calcula tu ratio deuda-ingresos y comprueba cómo cambia al añadir una nueva cuota. Introduce tus ingresos, tus pagos actuales y el escenario que quieres probar.',
|
|
149
|
+
intro: '¿Una nueva cuota te cabe en el presupuesto? Compárala con lo que ya pagas cada mes y mira qué parte de tus ingresos quedaría comprometida.',
|
|
150
|
+
formula: 'El ratio deuda-ingresos se calcula dividiendo tus pagos mensuales de deuda entre los ingresos mensuales que elijas y multiplicando el resultado por 100. El escenario proyectado añade la nueva cuota.',
|
|
151
|
+
limit: 'Esto es una comparación orientativa, no una decisión de crédito. Cada entidad puede contar los ingresos y las deudas de una forma distinta.',
|
|
152
|
+
faq: [
|
|
153
|
+
{ question: '¿Qué es el ratio deuda-ingresos?', answer: 'Es el porcentaje de tus ingresos mensuales que se destina a pagar deudas. Aquí puedes compararlo antes y después de añadir una nueva cuota.' },
|
|
154
|
+
{ question: '¿Debo usar ingresos brutos o netos?', answer: 'Elige la base que quieras analizar y úsala igual en el escenario actual y en el proyectado.' },
|
|
155
|
+
{ question: '¿Sirve para saber si me concederán el préstamo?', answer: 'No. Te ayuda a comparar tu situación, pero la aprobación depende de la entidad, del producto y de tu perfil completo.' },
|
|
156
|
+
],
|
|
157
|
+
howTo: [
|
|
158
|
+
{ name: 'Elige la base', text: 'Selecciona la moneda y decide si compararás ingresos brutos o netos.' },
|
|
159
|
+
{ name: 'Introduce lo que ya pagas', text: 'Añade tus pagos mensuales de deuda actuales.' },
|
|
160
|
+
{ name: 'Prueba la nueva cuota', text: 'Indica la cuota propuesta, el plazo y el umbral que quieres vigilar.' },
|
|
161
|
+
{ name: 'Compara el resultado', text: 'Revisa los dos ratios, los ingresos que te quedan y el margen hasta tu umbral.' },
|
|
162
|
+
],
|
|
163
|
+
seoTitle: 'Calcula cómo cambia tu ratio deuda-ingresos',
|
|
164
|
+
seoResultTitle: 'Compara lo que pagas ahora con la nueva cuota',
|
|
165
|
+
seoResult: 'El escenario actual suma las cuotas que ya pagas. El proyectado añade la nueva cuota para mostrar qué porcentaje de tus ingresos quedaría comprometido, cuánto te quedaría libre y cuál sería el total durante el plazo indicado.',
|
|
166
|
+
seoTipTitle: 'Tu umbral orienta la comparación, no decide por ti',
|
|
167
|
+
seoTip: 'El porcentaje que elijas sirve para probar escenarios. No equivale al criterio de aprobación de un banco: revisa las condiciones de la oferta y tu presupuesto completo.',
|
|
168
|
+
seoList: [
|
|
169
|
+
'Si la nueva cuota te hace superar el límite que has marcado.',
|
|
170
|
+
'Cuánto dinero te queda cada mes después de pagar tus deudas.',
|
|
171
|
+
'Cuántos puntos porcentuales añade el nuevo préstamo.',
|
|
172
|
+
'Cuánto pagarías en total durante el plazo indicado.',
|
|
173
|
+
],
|
|
174
|
+
seoClosing: 'El cambio de moneda solo convierte las cantidades para mostrarlas en EUR, USD, GBP o RUB; no es una cotización en tiempo real.',
|
|
175
|
+
},
|
|
176
|
+
};
|
|
177
|
+
|
|
178
|
+
const formulaTitles: Record<LocaleKey, string> = {
|
|
179
|
+
en: 'The ratio calculation',
|
|
180
|
+
de: 'Die Berechnung der Quote',
|
|
181
|
+
es: 'El cálculo del ratio',
|
|
182
|
+
fr: 'Le calcul du ratio',
|
|
183
|
+
id: 'Perhitungan rasio',
|
|
184
|
+
it: 'Il calcolo del rapporto',
|
|
185
|
+
ja: '比率の計算方法',
|
|
186
|
+
ko: '비율 계산 방법',
|
|
187
|
+
nl: 'De berekening van de verhouding',
|
|
188
|
+
pl: 'Obliczanie wskaźnika',
|
|
189
|
+
pt: 'O cálculo do rácio',
|
|
190
|
+
ru: 'Расчёт доли',
|
|
191
|
+
sv: 'Så beräknas kvoten',
|
|
192
|
+
tr: 'Oran hesaplaması',
|
|
193
|
+
zh: '比例的计算方法',
|
|
194
|
+
};
|
|
195
|
+
|
|
196
|
+
const localizedSlugs: Record<LocaleKey, string> = {
|
|
197
|
+
en: 'loan-to-income-ratio-calculator',
|
|
198
|
+
de: 'schulden-einkommens-quotenrechner',
|
|
199
|
+
es: 'calculadora-ratio-deuda-ingresos',
|
|
200
|
+
fr: 'calculateur-ratio-dette-revenu',
|
|
201
|
+
id: 'kalkulator-rasio-utang-pendapatan',
|
|
202
|
+
it: 'calcolatore-rapporto-debito-reddito',
|
|
203
|
+
ja: 'loan-to-income-ratio-calculator',
|
|
204
|
+
ko: 'loan-to-income-ratio-calculator',
|
|
205
|
+
nl: 'schuld-inkomensverhouding-calculator',
|
|
206
|
+
pl: 'kalkulator-relacji-dlugu-do-dochodu',
|
|
207
|
+
pt: 'calculadora-racio-divida-rendimento',
|
|
208
|
+
ru: 'kalkulyator-dolgovoy-nagruzki',
|
|
209
|
+
sv: 'skuld-inkomstkvot-kalkylator',
|
|
210
|
+
tr: 'borc-gelir-orani-hesaplayici',
|
|
211
|
+
zh: 'loan-to-income-ratio-calculator',
|
|
212
|
+
};
|
|
213
|
+
|
|
214
|
+
function makeSchemas(pack: CopyPack, locale: LocaleKey) {
|
|
215
|
+
const faqSchema = { '@context': 'https://schema.org', '@type': 'FAQPage', inLanguage: locale, mainEntity: pack.faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) };
|
|
216
|
+
const howToSchema = { '@context': 'https://schema.org', '@type': 'HowTo', inLanguage: locale, name: pack.title, description: pack.description, step: pack.howTo.map((step, index) => ({ '@type': 'HowToStep', position: index + 1, name: step.name, text: step.text })) };
|
|
217
|
+
const appSchema = { '@context': 'https://schema.org', '@type': 'SoftwareApplication', inLanguage: locale, name: pack.title, description: pack.description, applicationCategory: 'FinanceApplication', operatingSystem: 'All', offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' } };
|
|
218
|
+
return [faqSchema, howToSchema, appSchema];
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
export function createLoanToIncomeContent(locale: LocaleKey): ToolLocaleContent<LoanToIncomeRatioUI> {
|
|
222
|
+
const pack = { ...packs[locale], ...copyOverrides[locale] };
|
|
223
|
+
const ui = { ...baseUI, ...uiPatches[locale] };
|
|
224
|
+
const paragraph = (html: string) => `<p>${html}</p>`;
|
|
225
|
+
return {
|
|
226
|
+
slug: localizedSlugs[locale],
|
|
227
|
+
title: pack.title,
|
|
228
|
+
description: pack.description,
|
|
229
|
+
ui,
|
|
230
|
+
faq: pack.faq,
|
|
231
|
+
bibliography,
|
|
232
|
+
howTo: pack.howTo,
|
|
233
|
+
schemas: makeSchemas(pack, locale),
|
|
234
|
+
seo: [
|
|
235
|
+
{ type: 'title', text: pack.seoTitle, level: 2 },
|
|
236
|
+
{ type: 'paragraph', html: paragraph(pack.intro) },
|
|
237
|
+
{ type: 'title', text: formulaTitles[locale], level: 3 },
|
|
238
|
+
{ type: 'paragraph', html: paragraph(pack.formula) },
|
|
239
|
+
{ type: 'tip', title: pack.seoTipTitle, html: `<p>${pack.seoTip}</p>` },
|
|
240
|
+
{ type: 'title', text: pack.seoResultTitle, level: 3 },
|
|
241
|
+
{ type: 'paragraph', html: paragraph(pack.seoResult) },
|
|
242
|
+
{ type: 'list', items: pack.seoList },
|
|
243
|
+
{ type: 'paragraph', html: paragraph(pack.seoClosing) },
|
|
244
|
+
{ type: 'paragraph', html: paragraph(pack.limit) },
|
|
245
|
+
],
|
|
246
|
+
};
|
|
247
|
+
}
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import { CURRENCIES, convertCurrencyAmount } from './currency';
|
|
3
|
+
|
|
4
|
+
describe('convertCurrencyAmount', () => {
|
|
5
|
+
it('applies the reference factor instead of relabelling the amount', () => {
|
|
6
|
+
expect(convertCurrencyAmount(300, 'EUR', 'RUB')).toBeCloseTo(30170.79, 2);
|
|
7
|
+
});
|
|
8
|
+
|
|
9
|
+
it('keeps an amount unchanged when the display currency is unchanged', () => {
|
|
10
|
+
expect(convertCurrencyAmount(300, 'EUR', 'EUR')).toBe(300);
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
it('round-trips between currencies within floating point tolerance', () => {
|
|
14
|
+
const rubles = convertCurrencyAmount(5000, 'EUR', 'RUB');
|
|
15
|
+
expect(convertCurrencyAmount(rubles, 'RUB', 'EUR')).toBeCloseTo(5000, 8);
|
|
16
|
+
});
|
|
17
|
+
|
|
18
|
+
it('includes a currency option for each supported locale family', () => {
|
|
19
|
+
expect(Object.keys(CURRENCIES)).toEqual(['EUR', 'USD', 'GBP', 'RUB']);
|
|
20
|
+
});
|
|
21
|
+
});
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
export type CurrencyCode = 'EUR' | 'USD' | 'GBP' | 'RUB';
|
|
2
|
+
|
|
3
|
+
export interface CurrencyDefinition {
|
|
4
|
+
code: CurrencyCode;
|
|
5
|
+
symbol: string;
|
|
6
|
+
locale: string;
|
|
7
|
+
unitsPerEuro: number;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export const CURRENCIES = {
|
|
11
|
+
EUR: { code: 'EUR', symbol: '€', locale: 'en-IE', unitsPerEuro: 1 },
|
|
12
|
+
USD: { code: 'USD', symbol: '$', locale: 'en-US', unitsPerEuro: 1.1622 },
|
|
13
|
+
GBP: { code: 'GBP', symbol: '£', locale: 'en-GB', unitsPerEuro: 0.85898 },
|
|
14
|
+
RUB: { code: 'RUB', symbol: '₽', locale: 'ru-RU', unitsPerEuro: 100.5693 },
|
|
15
|
+
} as const satisfies Record<CurrencyCode, CurrencyDefinition>;
|
|
16
|
+
|
|
17
|
+
export function convertCurrencyAmount(amount: number, from: CurrencyCode, to: CurrencyCode): number {
|
|
18
|
+
return amount * (CURRENCIES[to].unitsPerEuro / CURRENCIES[from].unitsPerEuro);
|
|
19
|
+
}
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import type { FinanceToolEntry, ToolLocaleContent } from '../../types';
|
|
2
|
+
import type { LoanToIncomeRatioUI } from './ui';
|
|
3
|
+
|
|
4
|
+
export type LoanToIncomeRatioLocaleContent = ToolLocaleContent<LoanToIncomeRatioUI>;
|
|
5
|
+
|
|
6
|
+
export const loanToIncomeRatio: FinanceToolEntry<LoanToIncomeRatioUI> = {
|
|
7
|
+
id: 'loan-to-income-ratio-calculator',
|
|
8
|
+
icons: {
|
|
9
|
+
bg: 'mdi:scale-balance',
|
|
10
|
+
fg: 'mdi:finance',
|
|
11
|
+
},
|
|
12
|
+
i18n: {
|
|
13
|
+
en: () => import('./i18n/en').then((m) => m.content),
|
|
14
|
+
de: () => import('./i18n/de').then((m) => m.content),
|
|
15
|
+
es: () => import('./i18n/es').then((m) => m.content),
|
|
16
|
+
fr: () => import('./i18n/fr').then((m) => m.content),
|
|
17
|
+
id: () => import('./i18n/id').then((m) => m.content),
|
|
18
|
+
it: () => import('./i18n/it').then((m) => m.content),
|
|
19
|
+
ja: () => import('./i18n/ja').then((m) => m.content),
|
|
20
|
+
ko: () => import('./i18n/ko').then((m) => m.content),
|
|
21
|
+
nl: () => import('./i18n/nl').then((m) => m.content),
|
|
22
|
+
pl: () => import('./i18n/pl').then((m) => m.content),
|
|
23
|
+
pt: () => import('./i18n/pt').then((m) => m.content),
|
|
24
|
+
ru: () => import('./i18n/ru').then((m) => m.content),
|
|
25
|
+
sv: () => import('./i18n/sv').then((m) => m.content),
|
|
26
|
+
tr: () => import('./i18n/tr').then((m) => m.content),
|
|
27
|
+
zh: () => import('./i18n/zh').then((m) => m.content),
|
|
28
|
+
},
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
export { bibliography } from './bibliography';
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import type { ToolDefinition } from '../../types';
|
|
2
|
+
import { loanToIncomeRatio } from './entry';
|
|
3
|
+
|
|
4
|
+
export * from './entry';
|
|
5
|
+
|
|
6
|
+
export const LOAN_TO_INCOME_RATIO_TOOL: ToolDefinition = {
|
|
7
|
+
entry: loanToIncomeRatio,
|
|
8
|
+
Component: () => import('./component.astro'),
|
|
9
|
+
SEOComponent: () => import('./seo.astro'),
|
|
10
|
+
BibliographyComponent: () => import('./bibliography.astro'),
|
|
11
|
+
};
|