@jjlmoya/utils-finance 1.43.0 → 1.45.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 (35) hide show
  1. package/package.json +2 -2
  2. package/scripts/validate-icons.mjs +57 -0
  3. package/src/category/index.ts +2 -1
  4. package/src/entries.ts +4 -1
  5. package/src/tests/locale_completeness.test.ts +2 -2
  6. package/src/tests/tool_validation.test.ts +2 -2
  7. package/src/tool/insuranceDeductibleBreakEvenCalculator/bibliography.astro +10 -0
  8. package/src/tool/insuranceDeductibleBreakEvenCalculator/bibliography.ts +6 -0
  9. package/src/tool/insuranceDeductibleBreakEvenCalculator/component.astro +172 -0
  10. package/src/tool/insuranceDeductibleBreakEvenCalculator/currency.test.ts +13 -0
  11. package/src/tool/insuranceDeductibleBreakEvenCalculator/currency.ts +26 -0
  12. package/src/tool/insuranceDeductibleBreakEvenCalculator/entry.ts +28 -0
  13. package/src/tool/insuranceDeductibleBreakEvenCalculator/i18n/content-factory.ts +147 -0
  14. package/src/tool/insuranceDeductibleBreakEvenCalculator/i18n/de.ts +2 -0
  15. package/src/tool/insuranceDeductibleBreakEvenCalculator/i18n/en.ts +100 -0
  16. package/src/tool/insuranceDeductibleBreakEvenCalculator/i18n/es.ts +2 -0
  17. package/src/tool/insuranceDeductibleBreakEvenCalculator/i18n/fr.ts +2 -0
  18. package/src/tool/insuranceDeductibleBreakEvenCalculator/i18n/id.ts +2 -0
  19. package/src/tool/insuranceDeductibleBreakEvenCalculator/i18n/it.ts +2 -0
  20. package/src/tool/insuranceDeductibleBreakEvenCalculator/i18n/ja.ts +2 -0
  21. package/src/tool/insuranceDeductibleBreakEvenCalculator/i18n/ko.ts +2 -0
  22. package/src/tool/insuranceDeductibleBreakEvenCalculator/i18n/nl.ts +2 -0
  23. package/src/tool/insuranceDeductibleBreakEvenCalculator/i18n/pl.ts +2 -0
  24. package/src/tool/insuranceDeductibleBreakEvenCalculator/i18n/pt.ts +2 -0
  25. package/src/tool/insuranceDeductibleBreakEvenCalculator/i18n/ru.ts +2 -0
  26. package/src/tool/insuranceDeductibleBreakEvenCalculator/i18n/sv.ts +2 -0
  27. package/src/tool/insuranceDeductibleBreakEvenCalculator/i18n/tr.ts +2 -0
  28. package/src/tool/insuranceDeductibleBreakEvenCalculator/i18n/zh.ts +2 -0
  29. package/src/tool/insuranceDeductibleBreakEvenCalculator/index.ts +11 -0
  30. package/src/tool/insuranceDeductibleBreakEvenCalculator/insurance-deductible-break-even-calculator.css +424 -0
  31. package/src/tool/insuranceDeductibleBreakEvenCalculator/logic.test.ts +40 -0
  32. package/src/tool/insuranceDeductibleBreakEvenCalculator/logic.ts +72 -0
  33. package/src/tool/insuranceDeductibleBreakEvenCalculator/seo.astro +11 -0
  34. package/src/tool/insuranceDeductibleBreakEvenCalculator/ui.ts +33 -0
  35. package/src/tools.ts +2 -1
@@ -0,0 +1,147 @@
1
+ import type { HowToStep, ToolLocaleContent } from '../../../types';
2
+ import type { SEOSection } from '@jjlmoya/utils-shared';
3
+ import type { Thing, WithContext } from 'schema-dts';
4
+ import { bibliography } from '../bibliography';
5
+ import { ui as englishUi } from './en';
6
+ import type { InsuranceDeductibleBreakEvenCalculatorUI } from '../ui';
7
+
8
+ type RawPack = {
9
+ title: string; description: string; question: string; intro: string; needTitle: string; need: string[]; readingTitle: string; reading: string; claimTitle: string; claimDescription: string; claimPoints: string[]; selfPayTitle: string; selfPayDescription: string; selfPayPoints: string[]; limitsTitle: string; limits: string; faqQ: string[]; faqA: string[]; steps: HowToStep[]; ui?: Partial<InsuranceDeductibleBreakEvenCalculatorUI>;
10
+ };
11
+
12
+ const translatedUi = (patch: Partial<InsuranceDeductibleBreakEvenCalculatorUI>): InsuranceDeductibleBreakEvenCalculatorUI => ({ ...englishUi, ...patch });
13
+ const make = (pack: RawPack): RawPack => pack;
14
+
15
+ const packs: Record<string, RawPack> = {
16
+ de: make({ title: 'Versicherungsrechner für den Break even beim Selbstbehalt', description: 'Vergleiche eine Schadenmeldung mit der Zahlung aus eigener Tasche anhand von Schaden, Selbstbehalt, Jahresprämie und möglicher Erhöhung.', question: 'Schaden melden oder selbst bezahlen?', intro: 'Ein kleiner Schaden kann eine unangenehme Versicherungsentscheidung auslösen. Neben dem Selbstbehalt kann auch eine spätere Prämienerhöhung zählen. Dieser Rechner stellt deine Annahmen transparent gegenüber, bevor du die Versicherung kontaktierst.', needTitle: 'Diese Angaben brauchst du', need: ['Geschätzte Kosten für Schaden oder Reparatur.', 'Selbstbehalt für diese Deckung.', 'Aktuelle Jahresprämie.', 'Mögliche Erhöhung und angenommene Dauer.'], readingTitle: 'Das Ergebnis richtig einordnen', reading: 'Die Schätzung für eine Schadenmeldung kombiniert den Selbstbehalt mit dem eingegebenen Gesamtzuschlag. Die Selbstzahlung entspricht der vollständigen Schadensumme. Der Wendepunkt ist nur ein Kostenvergleich und bestätigt weder Deckung noch Anspruch.', claimTitle: 'Schaden melden', claimDescription: 'Kann sinnvoll sein, wenn der gedeckte Betrag über dem Selbstbehalt den möglichen Zuschlag überwiegt.', claimPoints: ['Selbstbehalt wird berücksichtigt', 'Prämienwirkung wird eingerechnet', 'Versicherungsanteil wird geschätzt'], selfPayTitle: 'Selbst bezahlen', selfPayDescription: 'Kann sinnvoll sein, wenn der Schaden am Wendepunkt oder darunter liegt.', selfPayPoints: ['Der modellierte Zuschlag entfällt', 'Die vollständige Schadensumme wird bezahlt', 'Ein Meldeprozess kann entfallen, wenn die Police das erlaubt'], limitsTitle: 'Grenzen und Datenschutz', limits: 'Der Rechner liest deine Police nicht, prüft keine Deckung und sagt keine Prämie voraus. Alle Werte werden lokal im Browser verarbeitet.', faqQ: ['Was vergleicht der Rechner?', 'Was ist der Wendepunkt?', 'Sagt er eine Prämienerhöhung voraus?', 'Was gilt bei einem Schaden unter dem Selbstbehalt?', 'Ist das Rechtsberatung?'], faqA: ['Er vergleicht die Eigenkosten einer Schadenmeldung mit der vollständigen Selbstzahlung.', 'Selbstbehalt plus geschätzter Gesamtzuschlag.', 'Nein. Prozentsatz und Dauer sind deine Annahmen.', 'Das Modell zeigt keinen Versicherungsanteil. Prüfe trotzdem die Meldepflicht.', 'Nein, es ist ein Vergleich deiner eigenen Zahlen.'], steps: [{ name: 'Schaden eingeben', text: 'Trage den erwarteten Reparatur- oder Verlustbetrag ein.' }, { name: 'Selbstbehalt ergänzen', text: 'Verwende den Wert für diese Schadenart.' }, { name: 'Prämienwirkung testen', text: 'Gib Erhöhung und Jahre ein oder null für keinen Zuschlag.' }, { name: 'Grenze lesen', text: 'Vergleiche beide Wege und bestätige die Deckung bei der Versicherung.' }], ui: translatedUi({ labelDamageCost: 'Geschätzte Schadensumme', labelDeductible: 'Selbstbehalt der Police', labelAnnualPremium: 'Aktuelle Jahresprämie', labelClaimRoute: 'Schaden melden', labelPayYourselfRoute: 'Selbst bezahlen', labelReset: 'Beispiel zurücksetzen', labelCopy: 'Zusammenfassung kopieren', labelCurrency: 'Anzeigewährung' }) }),
17
+ es: make({ title: 'Calculadora del punto de equilibrio de la franquicia', description: 'Compara dar un parte con pagar el daño por tu cuenta usando el coste del daño, la franquicia, la prima anual y una posible subida.', question: 'Dar un parte o pagar el daño?', intro: 'Un daño pequeño puede plantear una decisión incómoda. La franquicia es solo una parte si un parte afecta a futuras primas. Esta calculadora reúne tus supuestos y muestra el umbral antes de hablar con la aseguradora.', needTitle: 'Qué necesitas introducir', need: ['Coste estimado del daño o la reparación.', 'Franquicia de esa cobertura.', 'Prima anual actual.', 'Posible subida y duración que quieres modelar.'], readingTitle: 'Cómo interpretar el resultado', reading: 'La estimación del parte combina la franquicia con el recargo total introducido. Pagarlo tú equivale al coste completo del daño. El punto de equilibrio solo compara costes y no confirma cobertura ni indemnización.', claimTitle: 'Dar un parte', claimDescription: 'Puede compensar cuando el importe cubierto por encima de la franquicia supera el posible recargo.', claimPoints: ['Cuenta la franquicia', 'Incluye el efecto sobre la prima', 'Muestra la aportación estimada'], selfPayTitle: 'Pagarlo tú', selfPayDescription: 'Puede compensar cuando el daño está cerca o por debajo del punto de equilibrio.', selfPayPoints: ['Evitas el recargo modelado', 'Pagas todo el daño', 'Puedes evitar el trámite según la póliza'], limitsTitle: 'Límites y privacidad', limits: 'No lee tu póliza, no comprueba coberturas ni predice la prima. Todas las cifras se procesan en tu navegador.', faqQ: ['Qué compara la calculadora?', 'Qué es el punto de equilibrio?', 'Predice una subida de prima?', 'Y si el daño es menor que la franquicia?', 'Es asesoramiento legal?'], faqA: ['Compara el coste estimado de dar un parte con el coste completo de pagar el daño.', 'La franquicia más el recargo total estimado.', 'No. El porcentaje y los años son hipótesis que introduces tú.', 'El modelo muestra una aportación del seguro de cero. Revisa la póliza.', 'No, es una comparación transparente de tus propios números.'], steps: [{ name: 'Introduce el daño', text: 'Escribe el importe estimado de reparación o sustitución.' }, { name: 'Añade la franquicia', text: 'Usa la franquicia aplicable a este siniestro.' }, { name: 'Prueba la subida', text: 'Introduce porcentaje y años, o cero para excluir el recargo.' }, { name: 'Lee el límite', text: 'Compara las opciones y confirma cobertura y plazos.' }], ui: translatedUi({ labelDamageCost: 'Coste estimado del daño', labelDeductible: 'Franquicia de la póliza', labelAnnualPremium: 'Prima anual actual', labelClaimRoute: 'Dar un parte', labelPayYourselfRoute: 'Pagarlo tú', labelReset: 'Restablecer ejemplo', labelCopy: 'Copiar resumen', labelCurrency: 'Moneda de visualización', labelClaimRecommended: 'Dar un parte puede salir más barato', labelPayYourselfRecommended: 'Pagarlo tú puede salir más barato' }) }),
18
+ fr: make({ title: 'Calculateur du seuil de rentabilité de la franchise', description: 'Comparez une déclaration de sinistre avec le paiement des dommages vous-même selon le dommage, la franchise, la prime annuelle et une hausse possible.', question: 'Déclarer ou payer soi-même?', intro: 'Même un petit dommage peut rendre la décision délicate. La franchise ne suffit pas si une déclaration influence les primes futures. Ce calculateur compare vos hypothèses avant de contacter l&apos;assureur.', needTitle: 'Informations nécessaires', need: ['Co�00BBt estimé du dommage ou de la réparation.', 'Franchise applicable.', 'Prime annuelle actuelle.', 'Hausse possible et durée à modéliser.'], readingTitle: 'Interpréter le résultat', reading: 'La déclaration combine la franchise et le surco�00BBt saisi. Le paiement direct correspond au dommage complet. Le seuil est une comparaison de co�00BBts et ne confirme pas la garantie.', claimTitle: 'Déclarer un sinistre', claimDescription: 'Peut être intéressant lorsque le montant couvert au-dessus de la franchise dépasse le surco�00BBt possible.', claimPoints: ['La franchise est comptée', 'L&apos;effet sur la prime est inclus', 'La part estimée de l&apos;assureur est affichée'], selfPayTitle: 'Payer soi-même', selfPayDescription: 'Peut être intéressant lorsque le dommage est proche du seuil ou inférieur.', selfPayPoints: ['Le surco�00BBt modélisé est évité', 'Le dommage total est payé', 'La déclaration peut être évitée selon le contrat'], limitsTitle: 'Limites et confidentialité', limits: 'Le modèle ne lit pas votre contrat, ne vérifie pas la garantie et ne prédit pas la prime. Les calculs restent dans le navigateur.', faqQ: ['Que compare le calculateur?', 'Quel est le seuil?', 'Prévoit-il une hausse de prime?', 'Si le dommage est inférieur à la franchise?', 'Est-ce un conseil d&apos;assurance?'], faqA: ['Il compare le co�00BBt d&apos;une déclaration avec celui d&apos;un paiement direct complet.', 'La franchise additionnée au surco�00BBt total estimé.', 'Non. Le pourcentage et la durée sont vos hypothèses.', 'La contribution estimée de l&apos;assureur est nulle dans ce modèle.', 'Non, seulement une comparaison de vos données.'], steps: [{ name: 'Saisir le dommage', text: 'Indiquez le montant de réparation ou de remplacement.' }, { name: 'Ajouter la franchise', text: 'Utilisez la franchise de cette garantie.' }, { name: 'Tester la prime', text: 'Ajoutez une hausse et une durée, ou zéro.' }, { name: 'Lire le seuil', text: 'Comparez les co�00BBts puis confirmez la garantie.' }], ui: translatedUi({ labelDamageCost: 'Co�00BBt estimé des dommages', labelDeductible: 'Franchise du contrat', labelAnnualPremium: 'Prime annuelle actuelle', labelClaimRoute: 'Déclarer un sinistre', labelPayYourselfRoute: 'Payer soi-même', labelReset: 'Réinitialiser l&apos;exemple', labelCopy: 'Copier le résumé', labelCurrency: 'Devise d&apos;affichage' }) }),
19
+ it: make({ title: 'Calcolatore del punto di pareggio della franchigia assicurativa', description: 'Confronta la denuncia di un sinistro con il pagamento diretto del danno usando costo, franchigia, premio annuo e possibile aumento.', question: 'Denunciare o pagare di tasca propria?', intro: 'Anche un danno piccolo può rendere difficile la scelta. Oltre alla franchigia, considera un eventuale aumento futuro del premio. Il calcolatore confronta le tue ipotesi prima di contattare l&apos;assicuratore.', needTitle: 'Cosa inserire', need: ['Costo stimato del danno.', 'Franchigia della garanzia.', 'Premio annuo attuale.', 'Possibile aumento e durata.'], readingTitle: 'Come leggere il risultato', reading: 'La denuncia combina franchigia e sovrappremio inserito; il pagamento diretto equivale al danno completo. Il punto di pareggio è solo un confronto economico.', claimTitle: 'Denunciare il sinistro', claimDescription: 'Può convenire quando l&apos;importo coperto oltre la franchigia supera il sovrappremio possibile.', claimPoints: ['Considera la franchigia', 'Include l&apos;effetto sul premio', 'Mostra la quota dell&apos;assicuratore'], selfPayTitle: 'Pagare direttamente', selfPayDescription: 'Può convenire quando il danno è vicino o sotto il punto di pareggio.', selfPayPoints: ['Evita il sovrappremio stimato', 'Paga il danno completo', 'Può evitare la denuncia secondo la polizza'], limitsTitle: 'Limiti e privacy', limits: 'Non legge la polizza, non verifica la copertura e non predice il premio. I calcoli restano nel browser.', faqQ: ['Cosa confronta il calcolatore?', 'Cos&apos;è il punto di pareggio?', 'Prevede l&apos;aumento del premio?', 'Se il danno è sotto la franchigia?', 'È consulenza assicurativa?'], faqA: ['Confronta denuncia e pagamento diretto completo.', 'Franchigia più sovrappremio totale stimato.', 'No, sono ipotesi inserite da te.', 'La quota dell&apos;assicuratore è zero nel modello.', 'No, è un confronto dei tuoi numeri.'], steps: [{ name: 'Inserisci il danno', text: 'Indica il costo stimato nella valuta mostrata.' }, { name: 'Aggiungi la franchigia', text: 'Usa quella applicabile al sinistro.' }, { name: 'Prova l&apos;aumento', text: 'Inserisci percentuale e anni, oppure zero.' }, { name: 'Confronta i percorsi', text: 'Leggi il risultato e verifica la copertura.' }], ui: translatedUi({ labelDamageCost: 'Costo stimato del danno', labelDeductible: 'Franchigia della polizza', labelAnnualPremium: 'Premio annuo attuale', labelClaimRoute: 'Denunciare il sinistro', labelPayYourselfRoute: 'Pagare direttamente', labelReset: 'Ripristina esempio', labelCopy: 'Copia riepilogo', labelCurrency: 'Valuta visualizzata' }) }),
20
+ pt: make({ title: 'Calculadora do ponto de equilíbrio da franquia do seguro', description: 'Compare participar um sinistro com pagar os danos do próprio bolso usando o dano, a franquia, o prémio anual e um possível aumento.', question: 'Participar ou pagar por conta própria?', intro: 'Um dano pequeno pode tornar a decisão difícil. Além da franquia, uma subida futura do prémio também pode pesar. Esta calculadora compara os seus valores antes de falar com a seguradora.', needTitle: 'O que introduzir', need: ['Custo estimado do dano.', 'Franquia desta cobertura.', 'Prémio anual atual.', 'Aumento possível e duração.'], readingTitle: 'Como interpretar', reading: 'A participação combina a franquia com o acréscimo indicado; o pagamento direto corresponde ao dano total. O ponto de equilíbrio é apenas uma comparação de custos.', claimTitle: 'Participar o sinistro', claimDescription: 'Pode compensar quando o valor coberto acima da franquia supera o acréscimo possível.', claimPoints: ['Considera a franquia', 'Inclui o efeito no prémio', 'Mostra a parte da seguradora'], selfPayTitle: 'Pagar diretamente', selfPayDescription: 'Pode compensar quando o dano está perto ou abaixo do ponto de equilíbrio.', selfPayPoints: ['Evita o acréscimo modelado', 'Paga o dano completo', 'Pode evitar a participação conforme a apólice'], limitsTitle: 'Limites e privacidade', limits: 'Não lê a apólice, não verifica cobertura nem prevê o prémio. Os cálculos ficam no navegador.', faqQ: ['O que compara a calculadora?', 'O que é o ponto de equilíbrio?', 'Prevê uma subida do prémio?', 'E se o dano for menor que a franquia?', 'É aconselhamento de seguros?'], faqA: ['Compara participação e pagamento direto total.', 'Franquia mais acréscimo total estimado.', 'Não, a percentagem e os anos são hipóteses suas.', 'A contribuição estimada da seguradora é zero.', 'Não, é uma comparação dos seus valores.'], steps: [{ name: 'Introduza o dano', text: 'Indique o custo estimado na moeda apresentada.' }, { name: 'Adicione a franquia', text: 'Use a franquia desta cobertura.' }, { name: 'Teste o aumento', text: 'Indique percentagem e anos, ou zero.' }, { name: 'Compare os custos', text: 'Leia o resultado e confirme a cobertura.' }], ui: translatedUi({ labelDamageCost: 'Custo estimado do dano', labelDeductible: 'Franquia da apólice', labelAnnualPremium: 'Prémio anual atual', labelClaimRoute: 'Participar o sinistro', labelPayYourselfRoute: 'Pagar diretamente', labelReset: 'Repor exemplo', labelCopy: 'Copiar resumo', labelCurrency: 'Moeda apresentada' }) }),
21
+ };
22
+
23
+ const extra: Record<string, RawPack> = {
24
+ id: make({ title: 'Kalkulator titik impas risiko sendiri asuransi', description: 'Bandingkan pengajuan klaim dengan membayar kerusakan sendiri berdasarkan biaya kerusakan, risiko sendiri, premi tahunan, dan kenaikan.', question: 'Ajukan klaim atau bayar sendiri?', intro: 'Kerusakan kecil dapat membuat keputusan asuransi sulit. Selain risiko sendiri, kenaikan premi juga penting. Kalkulator ini membandingkan asumsi Anda secara pribadi di browser.', needTitle: 'Data yang diperlukan', need: ['Biaya kerusakan atau perbaikan.', 'Risiko sendiri polis.', 'Premi tahunan saat ini.', 'Kenaikan dan jumlah tahun.'], readingTitle: 'Cara membaca hasil', reading: 'Biaya klaim menggabungkan risiko sendiri dan tambahan premi. Biaya bayar sendiri adalah seluruh kerusakan. Nilai impas hanya membandingkan biaya dan tidak memastikan pertanggungan.', claimTitle: 'Ajukan klaim', claimDescription: 'Dapat menguntungkan jika pertanggungan di atas risiko sendiri lebih besar daripada tambahan premi.', claimPoints: ['Risiko sendiri dihitung', 'Dampak premi dimasukkan', 'Kontribusi penanggung ditampilkan'], selfPayTitle: 'Bayar sendiri', selfPayDescription: 'Dapat menguntungkan jika kerusakan dekat atau di bawah nilai impas.', selfPayPoints: ['Menghindari tambahan premi', 'Membayar seluruh kerusakan', 'Mungkin menghindari proses klaim'], limitsTitle: 'Batasan dan privasi', limits: 'Model tidak membaca polis atau memprediksi premi. Semua angka diproses di browser.', faqQ: ['Apa yang dibandingkan?', 'Apa nilai impas?', 'Apakah kenaikan premi diprediksi?', 'Jika kerusakan di bawah risiko sendiri?', 'Apakah ini nasihat asuransi?'], faqA: ['Biaya klaim dan biaya penuh membayar sendiri.', 'Risiko sendiri ditambah tambahan premi.', 'Tidak, itu asumsi yang Anda masukkan.', 'Kontribusi penanggung ditampilkan nol.', 'Bukan, ini perbandingan angka Anda.'], steps: [{ name: 'Masukkan kerusakan', text: 'Masukkan perkiraan biaya.' }, { name: 'Tambahkan risiko sendiri', text: 'Gunakan nilai pada polis.' }, { name: 'Uji dampak premi', text: 'Masukkan kenaikan dan tahun.' }, { name: 'Baca batasnya', text: 'Konfirmasi pertanggungan kepada penanggung.' }], ui: translatedUi({ labelDamageCost: 'Perkiraan biaya kerusakan', labelDeductible: 'Risiko sendiri polis', labelCurrency: 'Mata uang tampilan' }) }),
25
+ ja: make({ title: '保険免責額の損益分岐点計算機', description: '損害額、免責額、年間保険料、保険料の上昇見込みを使って、保険求と自己負担を比較します。', question: '求するか、自分で支払うか?', intro: '小さな損害でも保険を求するか迷うことがあります。免責額だけでなく将来の保険料上昇も�00ABめて、保険会社�00AB連絡する前�00AB比較できます。', needTitle: '入力する項目', need: ['損害または修理の推定額。', '適用される免責額。', '現在の年間保険料。', '想定する上昇率と年数。'], readingTitle: '結果の見方', reading: '求�00BB用は免責額と保険料上乗せを�00ABみます。自己負担�00BB用は損害全額です。損益分岐点は�00BB用比較であり、補償を確定しません。', claimTitle: '保険金を求する', claimDescription: '免責額を超える補償額が上乗せ額を上回る場合�00AB役ちます。', claimPoints: ['免責額を�00ABむ', '保険料の影響を�00ABむ', '保険会社の負担額を表示'], selfPayTitle: '自分で支払う', selfPayDescription: '損害が損益分岐点下の場合�00AB役ちます。', selfPayPoints: ['上乗せを避ける', '損害全額を支払う', '契約�00ABよっては求を避ける'], limitsTitle: '限界とプライバシー', limits: '契約を読み取らず、補償や保険料を予測しません。数値はブラウザー内で処理します。', faqQ: ['何を比較しますか?', '損益分岐点とは?', '保険料を予測できますか?', '免責額より小さい損害なら?', '保険の助言ですか?'], faqA: ['免責額を�00ABむ求�00BB用と自己負担�00BB用です。', '免責額と推定上乗せ額の合計です。', 'いいえ、入力値は定です。', '保険会社の負担はゼロと表示されます。', 'いいえ、入力値の比較です。'], steps: [{ name: '損害額を入力', text: '表示通貨で推定額を入力します。' }, { name: '免責額を追加', text: 'この損害�00AB適用される額を使います。' }, { name: '保険料を試す', text: '上昇率と年数を入力します。' }, { name: '境界を読む', text: '補償内容を保険会社�00AB確認します。' }], ui: translatedUi({ labelDamageCost: '推定損害額', labelDeductible: '保険契約の免責額', labelCurrency: '表示通貨' }) }),
26
+ ko: make({ title: '보험 자기부담금 손익분기 계산기', description: '손해액, 자기부담금, 연간 보험료와 예상 인상률을 사용해 보험 청구와 직접 부담을 비교합니다.', question: '보험금을 청구할까요, 직접 부담할까요?', intro: '작은 손해라도 청구 여부를 결정하기 어렵습니다. 자기부담금과 미래 보험료 영향을 함 비교해 보세요.', needTitle: '입력할 내용', need: ['예상 손해 비용.', '적용 자기부담금.', '현재 연간 보험료.', '예상 인상률과 기간.'], readingTitle: '결과 읽기', reading: '청구 비용은 자기부담금과 추가 부담을 포함하고 직접 부담 비용은 전체 손해입니다. 손익분기액은 비용 비교일 뿐 보장을 확정하지 않습니다.', claimTitle: '보험금 청구', claimDescription: '자기부담금 초과 보장액이 추가 부담보다 클 때 참고할 수 있습니다.', claimPoints: ['자기부담금 포함', '보험료 영향 반영', '보험사 부담액 표시'], selfPayTitle: '직접 부담', selfPayDescription: '손해가 손익분기액과 비슷하거나 작을 때 참고할 수 있습니다.', selfPayPoints: ['추가 부담 회피', '전체 손해 부담', '약관에 따라 청구 절차 회피'], limitsTitle: '한계와 개인정보', limits: '약관을 읽거나 보장과 보험료를 예측하지 않습니다. 수치는 브라우저에서만 처리됩니다.', faqQ: ['무엇을 비교하나요?', '손익분기액은 무엇인가요?', '보험료를 예측하나요?', '손해가 자기부담금보다 작으면?', '보험 상담인가요?'], faqA: ['청구 비용과 직접 부담 비용을 비교합니다.', '자기부담금과 예상 추가 부담의 합입니다.', '아니요, 입력값은 가정입니다.', '보험사 부담이 0으로 표시됩니다.', '아니요, 입력 금액의 비교입니다.'], steps: [{ name: '손해액 입력', text: '표시 통화로 예상 비용을 입력합니다.' }, { name: '자기부담금 추가', text: '적용되는 금액을 사용합니다.' }, { name: '보험료 영향 시험', text: '인상률과 기간을 입력합니다.' }, { name: '경계 확인', text: '보장 내용을 보험사에 확인합니다.' }], ui: translatedUi({ labelDamageCost: '예상 손해 비용', labelDeductible: '보험 증권 자기부담금', labelCurrency: '표시 통화' }) }),
27
+ };
28
+
29
+ Object.assign(packs, extra);
30
+ const simple: Record<string, { title: string; description: string; question: string; intro: string; needTitle: string; readingTitle: string; reading: string; claimTitle: string; selfPayTitle: string; limitsTitle: string; limits: string; items: string[]; answers: string[]; steps: HowToStep[] }> = {
31
+ nl: { title: 'Calculator voor het omslagpunt van het eigen risico', description: 'Vergelijk een claim met zelf betalen op basis van schade, eigen risico, jaarpremie en een mogelijke verhoging.', question: 'Claimen of de schade zelf betalen?', intro: 'Een kleine schade maakt de verzekeringskeuze soms lastig. Naast het eigen risico kan een toekomstige premieverhoging meetellen. Deze calculator vergelijkt je aannames in de browser.', needTitle: 'Wat je invult', readingTitle: 'De uitkomst lezen', reading: 'De claimschatting bevat het eigen risico en de ingevoerde toeslag. Zelf betalen betekent de volledige schade. Het omslagpunt is alleen een kostenvergelijking.', claimTitle: 'Een claim indienen', selfPayTitle: 'Zelf betalen', limitsTitle: 'Grenzen en privacy', limits: 'Het model leest je polis niet en voorspelt de premie niet. Alle cijfers blijven in de browser.', items: ['Geschatte schade of reparatie.', 'Eigen risico voor deze dekking.', 'Huidige jaarpremie.', 'Mogelijke verhoging en aantal jaren.'], answers: ['De kosten van een claim en de volledige kosten van zelf betalen.', 'Het eigen risico plus de geschatte totale toeslag.', 'Nee, percentage en jaren zijn aannames.', 'De bijdrage van de verzekeraar wordt nul.', 'Nee, het is een vergelijking van je cijfers.'], steps: [{ name: 'Vul de schade in', text: 'Voer het geschatte bedrag in.' }, { name: 'Voeg het eigen risico toe', text: 'Gebruik de waarde voor deze dekking.' }, { name: 'Test het premie-effect', text: 'Vul verhoging en jaren in.' }, { name: 'Bekijk het omslagpunt', text: 'Controleer de uitkomst bij je verzekeraar.' }] },
32
+ pl: { title: 'Kalkulator progu opłacalności udziału własnego', description: 'Porównaj zgłoszenie szkody z samodzielną zapłatą na podstawie szkody, udziału własnego, składki i podwyżki.', question: 'Zgłosić szkodę czy zapłacić samodzielnie?', intro: 'Nawet mała szkoda może utrudnić decyzję. Oprócz udziału własnego znaczenie ma możliwa podwyżka składki. Kalkulator porównuje Twoje założenia w przeglądarce.', needTitle: 'Potrzebne dane', readingTitle: 'Jak czytać wynik', reading: 'Koszt zgłoszenia obejmuje udział własny i dopłatę. Samodzielna zapłata oznacza całą szkodę. Próg służy tylko do porównania kosztów.', claimTitle: 'Zgłosić szkodę', selfPayTitle: 'Zapłacić samodzielnie', limitsTitle: 'Ograniczenia i prywatność', limits: 'Model nie czyta polisy i nie przewiduje składki. Liczby pozostają w przeglądarce.', items: ['Szacowany koszt szkody.', 'Udział własny dla tej ochrony.', 'Obecna składka roczna.', 'Możliwa podwyżka i liczba lat.'], answers: ['Koszt zgłoszenia i pełny koszt samodzielnej zapłaty.', 'Udział własny powiększony o szacowaną dopłatę.', 'Nie, podwyżka jest Twoim założeniem.', 'Udział ubezpieczyciela wynosi zero.', 'Nie, to porównanie Twoich danych.'], steps: [{ name: 'Wpisz szkodę', text: 'Podaj szacowaną kwotę.' }, { name: 'Dodaj udział własny', text: 'Użyj wartości z polisy.' }, { name: 'Sprawdź podwyżkę', text: 'Wprowadź procent i lata.' }, { name: 'Odczytaj próg', text: 'Potwierdź ochronę u ubezpieczyciela.' }] },
33
+ ru: { title: 'Ка�00BBьку�00BBятор точки равновесия франшизы', description: 'Сравните заяв�00BBение страховщику с самостояте�00BBьной оп�00BBатой по ущербу, франшизе, премии и повышению.', question: 'Подать заяв�00BBение и�00BBи зап�00BBатить самому?', intro: 'Даже небо�00BBьшой ущерб может ус�00BBожнить выбор. Кроме франшизы, учитывайте возможное повышение премии. Ка�00BBьку�00BBятор сравнивает ваши предпо�00BBожения в браузере.', needTitle: 'Что ввести', readingTitle: 'Как понять резу�00BBьтат', reading: 'Стоимость заяв�00BBения вк�00BBючает франшизу и доп�00BBату. Самостояте�00BBьная оп�00BBата равна всему ущербу. Точка равновесия сравнивает расходы и не подтверждает покрытие.', claimTitle: 'Подать заяв�00BBение', selfPayTitle: 'Оп�00BBатить самому', limitsTitle: 'Ограничения и конфиденциа�00BBьность', limits: 'Моде�00BBь не читает по�00BBис и не предсказывает премию. Все чис�00BBа обрабатываются в браузере.', items: ['Оценка ущерба и�00BBи ремонта.', 'Франшиза д�00BBя покрытия.', 'Текущая годовая премия.', 'Повышение и чис�00BBо �00BBет.'], answers: ['Стоимость заяв�00BBения и по�00BBную самостояте�00BBьную оп�00BBату.', 'Франшиза п�00BBюс общая оценочная доп�00BBата.', 'Нет, процент и годы задаёте вы.', 'Вк�00BBад страховщика равен ну�00BBю.', 'Нет, это сравнение ваших чисе�00BB.'], steps: [{ name: 'Введите ущерб', text: 'Укажите оценочную сумму.' }, { name: 'Добавьте франшизу', text: 'Испо�00BBьзуйте значение по�00BBиса.' }, { name: 'Проверьте премию', text: 'Введите повышение и годы.' }, { name: 'Прочитайте границу', text: 'Уточните покрытие у страховщика.' }] },
34
+ sv: { title: 'Kalkylator för försäkringens brytpunkt', description: 'Jämför en skadeanmälan med egen betalning utifrån skada, självrisk, årspremie och möjlig höjning.', question: 'Anmäla skadan eller betala själv?', intro: 'Även en liten skada kan göra valet svårt. Utöver självrisken kan en framtida premiehöjning spela roll. Kalkylatorn jämför dina antaganden i webbläsaren.', needTitle: 'Det du anger', readingTitle: 'Så läser du resultatet', reading: 'Anmälningskostnaden innehåller självrisken och tillägget. Egen betalning är hela skadan. Brytpunkten är bara en kostnadsjämförelse.', claimTitle: 'Anmäl skadan', selfPayTitle: 'Betala själv', limitsTitle: 'Begränsningar och integritet', limits: 'Modellen läser inte villkoren och förutsäger inte premien. Siffrorna behandlas i webbläsaren.', items: ['Beräknad skadekostnad.', 'Självrisk för försäkringen.', 'Aktuell årspremie.', 'Möjlig höjning och antal år.'], answers: ['Anmälningskostnaden och hela kostnaden för egen betalning.', 'Självrisken plus det uppskattade tillägget.', 'Nej, höjningen är ett antagande.', 'Ersättningen visas som noll.', 'Nej, det är en jämförelse av dina siffror.'], steps: [{ name: 'Ange skadan', text: 'Skriv in den beräknade kostnaden.' }, { name: 'Lägg till självrisken', text: 'Använd värdet i försäkringen.' }, { name: 'Testa premieeffekten', text: 'Ange höjning och år.' }, { name: 'Läs brytpunkten', text: 'Bekräfta täckningen med bolaget.' }] },
35
+ tr: { title: 'Sigorta muafiyeti başabaş hesaplayıcısı', description: 'Hasar, muafiyet, yıllık prim ve olası artış bilgileriyle bildirim ile kendi ödemeyi karşılaştırın.', question: 'Hasar bildirilmeli mi, kendin mi ödenmeli?', intro: 'Küçük bir hasar bile karar vermeyi zorlaştırabilir. Muafiyetin yanında gelecekteki prim artışını düşünün. Hesaplayıcı varsayımlarınızı tarayıcıda karşılaştırır.', needTitle: 'Gerekli bilgiler', readingTitle: 'Sonuç nasıl okunur', reading: 'Bildirim maliyeti muafiyet ve ek primi içerir. Kendi ödeme maliyeti hasarın tamamıdır. Başabaş tutarı yalnızca maliyet karşılaştırmasıdır.', claimTitle: 'Hasar bildir', selfPayTitle: 'Kendin öde', limitsTitle: 'Sınırlar ve gizlilik', limits: 'Model poliçeyi okumaz ve primi tahmin etmez. Rakamlar tarayıcıda işlenir.', items: ['Tahmini hasar maliyeti.', 'Bu teminatın muafiyeti.', 'Mevcut yıllık prim.', 'Olası artış ve yıl sayısı.'], answers: ['Bildirim maliyeti ile hasarı kendin ödeme maliyeti.', 'Muafiyet ve tahmini ek ücretin toplamı.', 'Hayır, oran ve yıllar varsayımdır.', 'Sigortacı katkısı sıfır gösterilir.', 'Hayır, kendi rakamlarınızın karşılaştırmasıdır.'], steps: [{ name: 'Hasarı girin', text: 'Tahmini tutarı yazın.' }, { name: 'Muafiyeti ekleyin', text: 'Poliçedeki değeri kullanın.' }, { name: 'Prim etkisini deneyin', text: 'Artış ve yılları girin.' }, { name: 'Sınırı okuyun', text: 'Teminatı sigortacınızla doğrulayın.' }] },
36
+ zh: { title: '保险免赔额盈亏平衡计算器', description: '根据损失、免赔额、年度保费和可能上涨,比较申请理赔与自行支。', question: '申请理赔还是自行支?', intro: '即使是小额损失,也可能让选择变得困难。除了免赔额,未来保费上涨也可能影响决定。计算器会在浏览器中比较你的假设。', needTitle: '需要输入的内容', readingTitle: '如何理解果', reading: '理赔成本包�00AB免赔额和附加保费。自行支成本是全部损失。盈亏平衡金额只用于成本比较。', claimTitle: '申请理赔', selfPayTitle: '自行支', limitsTitle: '限制与隐私', limits: '模型不会�00BB取保单或预测保费。所有数字只在浏览器中处理。', items: ['预计损失或修费用。', '适用的免赔额。', '当前年度保费。', '预计上涨比例和年数。'], answers: ['理赔成本和自行支全部损失的成本。', '免赔额加预计附加费用。', '不能,上涨比例和年数是你的假设。', '保险公司承担金额显示为零。', '不是,只是输入金额的比较。'], steps: [{ name: '输入损失', text: '输入预计费用。' }, { name: '�00BB加免赔额', text: '使用保单适用金额。' }, { name: '测试保费影响', text: '输入上涨比例和年数。' }, { name: '查看边界', text: '向保险公司确认保障范围。' }] },
37
+ };
38
+ for (const [locale, item] of Object.entries(simple)) {
39
+ packs[locale] = make({ ...item, need: item.items, claimDescription: item.claimTitle, claimPoints: item.items.slice(0, 3), selfPayDescription: item.selfPayTitle, selfPayPoints: item.items.slice(1, 4), faqQ: item.answers.map((_, index) => `${index + 1} ${item.title}`), faqA: item.answers, steps: item.steps, ui: translatedUi({ labelDamageCost: item.items[0], labelDeductible: item.items[1], labelCurrency: item.title }) });
40
+ }
41
+
42
+ packs.es.question = '¿Dar un parte o pagar el daño?';
43
+ packs.es.faqQ = ['¿Qué compara la calculadora?', '¿Qué es el punto de equilibrio?', '¿Predice una subida de prima?', '¿Y si el daño es menor que la franquicia?', '¿Es asesoramiento legal?'];
44
+
45
+ Object.assign(packs.ja, {
46
+ title: '保険免責額の損益分岐点計算機',
47
+ description: '損害額、免責額、年間保険料、保険料の上昇見込みを使って、保険金請求と自己負担を比較します。',
48
+ question: '保険金を請求しますか、それとも自分で支払いますか?',
49
+ intro: '小さな損害でも保険を請求するか迷うことがあります。免責額だけでなく、将来の保険料上昇も含めて、保険会社へ連絡する前に比較できます。',
50
+ needTitle: '入力する項目',
51
+ need: ['損害または修理の推定額', '適用される免責額', '現在の年間保険料', '想定する上昇率と年数'],
52
+ readingTitle: '結果の見方',
53
+ reading: '保険金請求の費用は免責額と保険料の上乗せを含みます。自己負担の費用は損害全額です。損益分岐点は費用の比較であり、補償を確定するものではありません。',
54
+ claimTitle: '保険金を請求する',
55
+ claimDescription: '免責額を超える補償額が保険料の上乗せを上回る場合に役立ちます。',
56
+ claimPoints: ['免責額を含める', '保険料への影響を含める', '保険会社の負担額を表示する'],
57
+ selfPayTitle: '自分で支払う',
58
+ selfPayDescription: '損害が損益分岐点以下の場合に役立ちます。',
59
+ selfPayPoints: ['上乗せを避ける', '損害全額を支払う', '契約によっては請求手続きを避ける'],
60
+ limitsTitle: '限界とプライバシー',
61
+ limits: '契約を読み取らず、補償や保険料を予測しません。数値はブラウザー内で処理します。',
62
+ faqQ: ['何を比較しますか?', '損益分岐点とは何ですか?', '保険料を予測できますか?', '免責額より小さい損害ならどうなりますか?', '保険の助言ですか?'],
63
+ faqA: ['免責額を含む保険金請求と自己負担の費用を比較します。', '免責額と推定される保険料の上乗せの合計です。', 'いいえ、入力値はあなたが設定する仮定です。', '保険会社の負担はゼロと表示されます。契約を確認してください。', 'いいえ、入力した数値を比較するだけです。'],
64
+ steps: [{ name: '損害額を入力', text: '表示通貨で推定額を入力します。' }, { name: '免責額を追加', text: 'この損害に適用される免責額を使います。' }, { name: '保険料を試す', text: '上昇率と年数を入力します。' }, { name: '境界を読む', text: '補償内容を保険会社に確認します。' }],
65
+ ui: translatedUi({ labelDamageCost: '推定損害額', labelDeductible: '保険契約の免責額', labelAnnualPremium: '現在の年間保険料', labelPremiumIncrease: '保険料の上昇率', labelSurchargeYears: '上昇が続く年数', labelCurrency: '表示通貨', labelClaimRoute: '保険金を請求する', labelPayYourselfRoute: '自分で支払う', labelClaimCost: '請求した場合の推定費用', labelPayYourselfCost: '自己負担の推定費用', labelPremiumSurcharge: '推定保険料上乗せ', labelInsurerShare: '免責額を超える金額', labelBreakEvenDamage: '損益分岐点の損害額', labelDifference: '安い方法による差額', labelRecommendation: 'モデルの提案', labelClaimRecommended: '請求の方が安い可能性があります', labelPayYourselfRecommended: '自己負担の方が安い可能性があります', labelBreakEvenRecommendation: '両方の費用はほぼ同じです', labelVisual: '保険金請求と自己負担の推定費用の比較', labelReset: '例をリセット', labelCopy: '概要をコピー', labelCopied: '概要をコピーしました', labelCopyFailed: '結果から手動でコピーしてください', labelInvalidInput: '強調表示された値を確認してください', labelMethodTitle: 'この推定の仕組み', labelMethodText: '請求費用は免責額または損害額と、入力した上昇率による保険料の上乗せとして計算します。自己負担では損害全額を支払うものとして比較します。', labelPrivacyNote: '入力した数値はこのブラウザー内に残ります。', labelAmountPlaceholder: '0.00', labelPercentPlaceholder: '0から100', labelYearsPlaceholder: '0.5から20', labelApproximateRates: '通貨換算は計画用の概算係数であり、最新の為替レートではありません。' })
66
+ });
67
+
68
+ Object.assign(packs.ko, {
69
+ title: '보험 자기부담금 손익분기 계산기',
70
+ description: '손해액, 자기부담금, 연간 보험료와 예상 인상률을 사용해 보험 청구와 직접 부담을 비교합니다.',
71
+ question: '보험금을 청구할까요, 직접 부담할까요?',
72
+ intro: '작은 손해라도 청구 여부를 결정하기 어렵습니다. 자기부담금과 미래 보험료 영향을 함께 비교해 보세요.',
73
+ needTitle: '입력할 내용',
74
+ need: ['예상 손해 비용', '적용 자기부담금', '현재 연간 보험료', '예상 인상률과 기간'],
75
+ readingTitle: '결과 읽기',
76
+ reading: '청구 비용은 자기부담금과 추가 보험료를 포함하고 직접 부담 비용은 전체 손해입니다. 손익분기액은 비용 비교일 뿐 보장을 확정하지 않습니다.',
77
+ claimTitle: '보험금 청구',
78
+ claimDescription: '자기부담금을 초과하는 보장액이 추가 부담보다 클 때 참고할 수 있습니다.',
79
+ claimPoints: ['자기부담금 포함', '보험료 영향 반영', '보험사 부담액 표시'],
80
+ selfPayTitle: '직접 부담',
81
+ selfPayDescription: '손해가 손익분기액과 비슷하거나 작을 때 참고할 수 있습니다.',
82
+ selfPayPoints: ['추가 부담 회피', '전체 손해 부담', '약관에 따라 청구 절차 회피'],
83
+ limitsTitle: '한계와 개인정보',
84
+ limits: '약관을 읽거나 보장과 보험료를 예측하지 않습니다. 수치는 브라우저에서만 처리됩니다.',
85
+ faqQ: ['무엇을 비교하나요?', '손익분기액은 무엇인가요?', '보험료를 예측하나요?', '손해가 자기부담금보다 작으면 어떻게 되나요?', '보험 상담인가요?'],
86
+ faqA: ['청구 비용과 직접 부담 비용을 비교합니다.', '자기부담금과 예상 추가 부담의 합입니다.', '아니요, 입력값은 사용자가 정한 가정입니다.', '보험사 부담이 0으로 표시됩니다. 약관을 확인하세요.', '아니요, 입력 금액을 비교하는 도구입니다.'],
87
+ steps: [{ name: '손해액 입력', text: '표시 통화로 예상 비용을 입력합니다.' }, { name: '자기부담금 추가', text: '해당 손해에 적용되는 금액을 사용합니다.' }, { name: '보험료 영향 시험', text: '인상률과 기간을 입력합니다.' }, { name: '경계 확인', text: '보장 내용을 보험사에 확인합니다.' }],
88
+ ui: translatedUi({ labelDamageCost: '예상 손해 비용', labelDeductible: '보험 증권 자기부담금', labelAnnualPremium: '현재 연간 보험료', labelPremiumIncrease: '예상 보험료 인상률', labelSurchargeYears: '인상 기간', labelCurrency: '표시 통화', labelClaimRoute: '보험금 청구', labelPayYourselfRoute: '직접 부담', labelClaimCost: '예상 청구 비용', labelPayYourselfCost: '예상 직접 부담 비용', labelPremiumSurcharge: '예상 보험료 추가 부담', labelInsurerShare: '자기부담금 초과 금액', labelBreakEvenDamage: '손익분기 손해액', labelDifference: '더 저렴한 선택의 예상 차액', labelRecommendation: '모델 추천', labelClaimRecommended: '청구가 더 저렴할 수 있습니다', labelPayYourselfRecommended: '직접 부담이 더 저렴할 수 있습니다', labelBreakEvenRecommendation: '두 선택의 비용이 거의 같습니다', labelVisual: '보험 청구와 직접 부담의 예상 비용 비교', labelReset: '예시 초기화', labelCopy: '요약 복사', labelCopied: '요약이 복사되었습니다', labelCopyFailed: '결과에서 직접 복사하세요', labelInvalidInput: '강조된 값을 확인하세요', labelMethodTitle: '계산 방식', labelMethodText: '청구 비용은 자기부담금과 입력한 인상률로 생기는 추가 보험료를 합산합니다. 직접 부담은 전체 손해를 지불하는 것으로 비교합니다.', labelPrivacyNote: '입력한 수치는 이 브라우저 안에만 보관됩니다.', labelAmountPlaceholder: '0.00', labelPercentPlaceholder: '0에서 100', labelYearsPlaceholder: '0.5에서 20', labelApproximateRates: '통화 변환은 계획용 근사 계수이며 실시간 환율이 아닙니다.' })
89
+ });
90
+
91
+ Object.assign(packs.ru, {
92
+ title: 'Калькулятор точки безубыточности страховой франшизы',
93
+ description: 'Сравните обращение к страховщику с самостоятельной оплатой ущерба с учетом франшизы, годовой премии и возможного повышения.',
94
+ question: 'Подать заявление или заплатить самому?',
95
+ intro: 'Даже небольшой ущерб может усложнить выбор. Помимо франшизы, учитывайте возможное повышение премии. Калькулятор сравнивает ваши предположения в браузере.',
96
+ needTitle: 'Что ввести',
97
+ need: ['Оценку ущерба или ремонта', 'Франшизу для этого покрытия', 'Текущую годовую премию', 'Повышение и число лет'],
98
+ readingTitle: 'Как понять результат',
99
+ reading: 'Стоимость заявления включает франшизу и дополнительную премию. Самостоятельная оплата равна всему ущербу. Точка безубыточности сравнивает расходы и не подтверждает покрытие.',
100
+ claimTitle: 'Подать заявление',
101
+ claimDescription: 'Это может быть выгодно, если сумма покрытия сверх франшизы больше возможной доплаты.',
102
+ claimPoints: ['Учитывает франшизу', 'Учитывает влияние на премию', 'Показывает вклад страховщика'],
103
+ selfPayTitle: 'Оплатить самому',
104
+ selfPayDescription: 'Это может быть выгодно, если ущерб близок к точке безубыточности или ниже нее.',
105
+ selfPayPoints: ['Избегает доплаты', 'Оплачивает весь ущерб', 'Может избежать процедуры заявления'],
106
+ limitsTitle: 'Ограничения и конфиденциальность',
107
+ limits: 'Модель не читает полис, не проверяет покрытие и не предсказывает премию. Все числа обрабатываются в браузере.',
108
+ faqQ: ['Что сравнивает калькулятор?', 'Что такое точка безубыточности?', 'Предсказывает ли он повышение премии?', 'Что если ущерб меньше франшизы?', 'Является ли результат страховой консультацией?'],
109
+ faqA: ['Стоимость заявления и полную стоимость самостоятельной оплаты.', 'Франшиза плюс общая оценочная доплата.', 'Нет, процент и годы задаете вы.', 'Вклад страховщика равен нулю в этой модели. Проверьте полис.', 'Нет, это сравнение введенных вами чисел.'],
110
+ steps: [{ name: 'Введите ущерб', text: 'Укажите оценочную сумму ремонта или замены.' }, { name: 'Добавьте франшизу', text: 'Используйте значение для этого вида заявления.' }, { name: 'Проверьте премию', text: 'Введите повышение и число лет.' }, { name: 'Прочитайте границу', text: 'Сравните варианты и уточните покрытие у страховщика.' }],
111
+ ui: translatedUi({ labelDamageCost: 'Оценка ущерба', labelDeductible: 'Франшиза полиса', labelAnnualPremium: 'Текущая годовая премия', labelPremiumIncrease: 'Возможное повышение премии', labelSurchargeYears: 'Число лет повышения', labelCurrency: 'Валюта отображения', labelClaimRoute: 'Подать заявление', labelPayYourselfRoute: 'Оплатить самому', labelClaimCost: 'Оценочная стоимость заявления', labelPayYourselfCost: 'Оценочная стоимость самостоятельной оплаты', labelPremiumSurcharge: 'Оценочная доплата к премии', labelInsurerShare: 'Сумма сверх франшизы', labelBreakEvenDamage: 'Ущерб в точке безубыточности', labelDifference: 'Возможная экономия более дешевого варианта', labelRecommendation: 'Рекомендация модели', labelClaimRecommended: 'Заявление может быть дешевле', labelPayYourselfRecommended: 'Самостоятельная оплата может быть дешевле', labelBreakEvenRecommendation: 'Оба варианта стоят примерно одинаково', labelVisual: 'Сравнение стоимости заявления и самостоятельной оплаты', labelReset: 'Сбросить пример', labelCopy: 'Копировать сводку', labelCopied: 'Сводка скопирована', labelCopyFailed: 'Скопируйте результат вручную', labelInvalidInput: 'Проверьте выделенное значение', labelMethodTitle: 'Как работает оценка', labelMethodText: 'Стоимость заявления равна франшизе и доплате, рассчитанной по введенному повышению премии. Самостоятельная оплата равна полному ущербу.', labelPrivacyNote: 'Введенные числа остаются в этом браузере.', labelAmountPlaceholder: '0.00', labelPercentPlaceholder: 'от 0 до 100', labelYearsPlaceholder: 'от 0.5 до 20', labelApproximateRates: 'Конвертация валюты использует приблизительные коэффициенты, а не актуальные курсы.' })
112
+ });
113
+
114
+ Object.assign(packs.zh, {
115
+ title: '保险免赔额盈亏平衡计算器',
116
+ description: '根据损失金额、免赔额、年度保费和可能的上涨幅度,比较申请理赔与自行支付。',
117
+ question: '申请理赔还是自行支付?',
118
+ intro: '即使是小额损失,也可能让选择变得困难。除了免赔额,未来保费上涨也可能影响决定。计算器会在浏览器中比较你的假设。',
119
+ needTitle: '需要输入的内容',
120
+ need: ['预计损失或维修费用', '适用的免赔额', '当前年度保费', '预计上涨比例和年数'],
121
+ readingTitle: '如何理解结果',
122
+ reading: '理赔成本包括免赔额和附加保费。自行支付的成本是全部损失。盈亏平衡金额只用于成本比较,不会确认保障范围。',
123
+ claimTitle: '申请理赔',
124
+ claimDescription: '当免赔额以上的保障金额超过可能的附加保费时,这种方式可能更划算。',
125
+ claimPoints: ['计入免赔额', '计入保费影响', '显示保险公司承担金额'],
126
+ selfPayTitle: '自行支付',
127
+ selfPayDescription: '当损失接近或低于盈亏平衡金额时,这种方式可能更划算。',
128
+ selfPayPoints: ['避免附加保费', '支付全部损失', '根据保单可能避免理赔流程'],
129
+ limitsTitle: '限制与隐私',
130
+ limits: '模型不会读取保单、检查保障范围或预测保费。所有数字只在浏览器中处理。',
131
+ faqQ: ['计算器比较什么?', '什么是盈亏平衡金额?', '可以预测保费上涨吗?', '如果损失小于免赔额怎么办?', '这是保险建议吗?'],
132
+ faqA: ['比较申请理赔的估算成本和自行支付全部损失的成本。', '它是免赔额加上预计附加保费的总和。', '不能,上涨比例和年数是你输入的假设。', '模型会显示保险公司承担金额为零,请查看保单。', '不是,这只是对你输入金额的透明比较。'],
133
+ steps: [{ name: '输入损失', text: '用显示的货币输入预计维修或更换费用。' }, { name: '加入免赔额', text: '使用这类损失在保单中适用的金额。' }, { name: '测试保费影响', text: '输入上涨比例和年数。' }, { name: '查看平衡点', text: '比较两种成本并向保险公司确认保障范围。' }],
134
+ ui: translatedUi({ labelDamageCost: '预计损失金额', labelDeductible: '保单免赔额', labelAnnualPremium: '当前年度保费', labelPremiumIncrease: '可能的保费上涨', labelSurchargeYears: '上涨持续年数', labelCurrency: '显示货币', labelClaimRoute: '申请理赔', labelPayYourselfRoute: '自行支付', labelClaimCost: '预计理赔成本', labelPayYourselfCost: '预计自行支付成本', labelPremiumSurcharge: '预计保费附加费用', labelInsurerShare: '超过免赔额的金额', labelBreakEvenDamage: '盈亏平衡损失金额', labelDifference: '选择较低成本方案的可能节省', labelRecommendation: '模型建议', labelClaimRecommended: '申请理赔可能更便宜', labelPayYourselfRecommended: '自行支付可能更便宜', labelBreakEvenRecommendation: '两种方式的成本大致相同', labelVisual: '申请理赔与自行支付的预计成本比较', labelReset: '重置示例', labelCopy: '复制摘要', labelCopied: '摘要已复制', labelCopyFailed: '请从结果中手动复制', labelInvalidInput: '请检查突出显示的数值', labelMethodTitle: '估算方法', labelMethodText: '理赔成本包括免赔额和根据输入上涨比例计算的附加保费。自行支付则按全部损失进行比较。', labelPrivacyNote: '你输入的数字只保存在此浏览器中。', labelAmountPlaceholder: '0.00', labelPercentPlaceholder: '0到100', labelYearsPlaceholder: '0.5到20', labelApproximateRates: '货币转换使用规划用近似系数,不是实时汇率。' })
135
+ });
136
+ const slugs: Record<string, string> = { de: 'versicherungs-franchise-break-even-rechner', es: 'calculadora-franquicia-seguro-punto-equilibrio', fr: 'calculateur-franchise-assurance-seuil-rentabilite', id: 'kalkulator-titik-impas-risiko-sendiri-asuransi', it: 'calcolatore-punto-pareggio-franchigia-assicurativa', ja: 'insurance-deductible-break-even-calculator', ko: 'insurance-deductible-break-even-calculator', nl: 'verzekerings-eigen-risico-omslagpunt-calculator', pl: 'kalkulator-progu-oplacalnosci-udzialu-wlasnego', pt: 'calculadora-ponto-equilibrio-franquia-seguro', ru: 'kalkulyator-tochki-ravnovesiya-franshizy', sv: 'kalkylator-forsakring-sjalvrisk-brytpunkt', tr: 'sigorta-muafiyeti-basabas-hesaplayici', zh: 'insurance-deductible-break-even-calculator' };
137
+
138
+ export function createInsuranceDeductibleContent(locale: string): ToolLocaleContent<InsuranceDeductibleBreakEvenCalculatorUI> {
139
+ const selected = packs[locale];
140
+ if (!selected) throw new Error(`Missing insurance calculator locale: ${locale}`);
141
+ const faq = selected.faqQ.map((question, index) => ({ question, answer: selected.faqA[index] ?? '' }));
142
+ const seo: SEOSection[] = [{ type: 'title', text: selected.question, level: 2 }, { type: 'paragraph', html: `<p>${selected.intro}</p>` }, { type: 'title', text: selected.needTitle, level: 2 }, { type: 'list', items: selected.need }, { type: 'title', text: selected.readingTitle, level: 2 }, { type: 'paragraph', html: `<p>${selected.reading}</p>` }, { type: 'comparative', columns: 2, items: [{ title: selected.claimTitle, description: selected.claimDescription, points: selected.claimPoints }, { title: selected.selfPayTitle, description: selected.selfPayDescription, points: selected.selfPayPoints }] }, { type: 'title', text: selected.limitsTitle, level: 2 }, { type: 'paragraph', html: `<p>${selected.limits}</p>` }];
143
+ const faqSchema = { '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) } as const;
144
+ const howToSchema = { '@context': 'https://schema.org', '@type': 'HowTo', name: selected.title, description: selected.description, step: selected.steps.map((step, index) => ({ '@type': 'HowToStep', position: index + 1, name: step.name, text: step.text })) } as const;
145
+ const appSchema = { '@context': 'https://schema.org', '@type': 'SoftwareApplication', name: selected.title, description: selected.description, applicationCategory: 'FinanceApplication', operatingSystem: 'All', offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' }, inLanguage: locale } as const;
146
+ return { slug: slugs[locale] ?? 'insurance-deductible-break-even-calculator', title: selected.title, description: selected.description, ui: selected.ui ?? englishUi, seo, faq, bibliography, howTo: selected.steps, schemas: [faqSchema, howToSchema, appSchema] as unknown as WithContext<Thing>[] };
147
+ }
@@ -0,0 +1,2 @@
1
+ import { createInsuranceDeductibleContent } from './content-factory';
2
+ export const content = createInsuranceDeductibleContent('de');
@@ -0,0 +1,100 @@
1
+ import type { ToolLocaleContent } from '../../../types';
2
+ import { bibliography } from '../bibliography';
3
+ import type { InsuranceDeductibleBreakEvenCalculatorUI } from '../ui';
4
+
5
+ export const ui: InsuranceDeductibleBreakEvenCalculatorUI = {
6
+ labelDamageCost: 'Estimated damage cost',
7
+ labelDeductible: 'Policy deductible',
8
+ labelAnnualPremium: 'Current annual premium',
9
+ labelPremiumIncrease: 'Possible premium increase',
10
+ labelSurchargeYears: 'Years with the increase',
11
+ labelCurrency: 'Display currency',
12
+ labelClaimRoute: 'File a claim',
13
+ labelPayYourselfRoute: 'Pay the damage yourself',
14
+ labelClaimCost: 'Your estimated claim cost',
15
+ labelPayYourselfCost: 'Your estimated self-pay cost',
16
+ labelPremiumSurcharge: 'Estimated premium surcharge',
17
+ labelInsurerShare: 'Amount above the deductible',
18
+ labelBreakEvenDamage: 'Break-even damage amount',
19
+ labelDifference: 'Potential saving by choosing the cheaper route',
20
+ labelRecommendation: 'Model recommendation',
21
+ labelClaimRecommended: 'Filing may cost less',
22
+ labelPayYourselfRecommended: 'Paying yourself may cost less',
23
+ labelBreakEvenRecommendation: 'Both routes cost about the same',
24
+ labelVisual: 'Comparison of estimated costs for filing a claim and paying the damage yourself',
25
+ labelReset: 'Reset example',
26
+ labelCopy: 'Copy summary',
27
+ labelCopied: 'Summary copied',
28
+ labelCopyFailed: 'Copy it manually from the result',
29
+ labelInvalidInput: 'Check the highlighted value',
30
+ labelMethodTitle: 'How this estimate works',
31
+ labelMethodText: 'The model treats the claim route as the deductible, or the full damage when the damage is below the deductible, plus the extra premium caused by the increase you enter. It compares that amount with paying the full damage yourself. The break-even damage amount is the deductible plus the estimated total surcharge. Check that your policy covers this type of loss and ask your insurer how a claim could affect your premium.',
32
+ labelPrivacyNote: 'Your figures stay in this browser. No account, API or server calculation is required.',
33
+ labelAmountPlaceholder: '0.00',
34
+ labelPercentPlaceholder: '0 to 100',
35
+ labelYearsPlaceholder: '0.5 to 20',
36
+ labelApproximateRates: 'Currency changes use approximate planning factors, not live exchange rates.',
37
+ };
38
+
39
+ const slug = 'insurance-deductible-break-even-calculator';
40
+ const title = 'Insurance Deductible Break Even Calculator';
41
+ const description = 'Compare filing an insurance claim with paying for a loss yourself using your damage cost, deductible, premium and possible surcharge. This private browser estimate helps you see the break-even amount without predicting your insurer\'s decision.';
42
+
43
+ const faq = [
44
+ {
45
+ question: 'What does this insurance deductible calculator compare?',
46
+ answer: 'It compares two user-defined routes for one loss: the estimated out-of-pocket cost of filing a claim and the full cost of paying for the damage yourself. The claim route includes the deductible and the possible premium surcharge you enter.',
47
+ },
48
+ {
49
+ question: 'What is the break-even damage amount?',
50
+ answer: 'In this model, it is the deductible plus the estimated total premium surcharge. Damage above that amount may make a claim cheaper, while damage below it may make self-payment cheaper. The result assumes the loss is covered and the insurer pays the eligible amount above the deductible.',
51
+ },
52
+ {
53
+ question: 'Can this calculator predict whether my premium will increase?',
54
+ answer: 'No. You provide the possible percentage and the number of years for the estimate. Your insurer, policy, claim history, location and type of loss determine what actually happens.',
55
+ },
56
+ {
57
+ question: 'What if the damage is smaller than my deductible?',
58
+ answer: 'The model shows no insurer contribution because the damage does not exceed the deductible. Filing may still have policy or reporting implications, so check your policy and ask the insurer before deciding.',
59
+ },
60
+ {
61
+ question: 'Is the result insurance or legal advice?',
62
+ answer: 'No. It is a transparent comparison using your own assumptions. It does not check coverage, depreciation, claim limits, taxes, reporting deadlines or local rules, and it does not recommend concealing a loss or delaying a required notice.',
63
+ },
64
+ ];
65
+
66
+ const howTo = [
67
+ { name: 'Enter the estimated damage', text: 'Use the repair, replacement or loss amount you are currently considering, in the currency shown.' },
68
+ { name: 'Add the policy deductible', text: 'Enter the deductible that applies to this type of claim, rather than a different deductible from another part of the policy.' },
69
+ { name: 'Test the premium effect', text: 'Enter a possible percentage increase and how many years you want to include. Use zero when you want to see the deductible-only comparison.' },
70
+ { name: 'Read the decision boundary', text: 'Compare the two estimated costs and the break-even damage amount, then confirm coverage and any reporting requirement with your insurer.' },
71
+ ];
72
+
73
+ export const content: ToolLocaleContent<InsuranceDeductibleBreakEvenCalculatorUI> = {
74
+ slug,
75
+ title,
76
+ description,
77
+ ui,
78
+ seo: [
79
+ { type: 'title', text: 'Should you file a claim or pay for the damage?', level: 2 },
80
+ { type: 'paragraph', html: '<p>A small loss can create an awkward insurance decision. The deductible is only part of the picture if you expect a claim to affect future premiums. This calculator puts your own damage estimate, deductible and possible surcharge into one transparent comparison so you can see the cost boundary before contacting the insurer.</p>' },
81
+ { type: 'title', text: 'What you need to enter', level: 2 },
82
+ { type: 'list', items: ['The estimated cost of the damage or repair.', 'The deductible shown for this coverage in your policy.', 'Your current annual premium.', 'A possible premium increase and how long you want to model it.'] },
83
+ { type: 'title', text: 'How to interpret the result', level: 2 },
84
+ { type: 'paragraph', html: '<p>The claim estimate combines the deductible with the total surcharge you entered. The self-pay estimate is the full damage cost. The break-even amount shows the loss size at which those two simplified routes meet. A recommendation is only a cost comparison: it does not establish coverage, claim eligibility or the insurer\'s actual premium decision.</p>' },
85
+ { type: 'comparative', columns: 2, items: [
86
+ { title: 'File a claim', description: 'Useful when the covered amount above the deductible outweighs the possible surcharge.', points: ['Pays the deductible in the model', 'Includes the entered premium effect', 'Shows the estimated insurer contribution'] },
87
+ { title: 'Pay yourself', description: 'Useful when the loss is close to or below the modelled break-even amount.', points: ['Avoids the modelled surcharge', 'Pays the full damage estimate', 'May avoid a claim process, subject to your policy'] },
88
+ ] },
89
+ { type: 'title', text: 'Limits and privacy', level: 2 },
90
+ { type: 'paragraph', html: '<p>This is not a claim decision engine. It does not read your policy, check whether the loss is covered, estimate depreciation or predict a premium. It assumes a simple covered loss where the insurer pays eligible costs above the deductible. All figures are processed in your browser, so you can test private scenarios without uploading them.</p>' },
91
+ ],
92
+ faq,
93
+ bibliography,
94
+ howTo,
95
+ schemas: [
96
+ { '@context': 'https://schema.org', '@type': 'FAQPage', mainEntity: faq.map((item) => ({ '@type': 'Question', name: item.question, acceptedAnswer: { '@type': 'Answer', text: item.answer } })) },
97
+ { '@context': 'https://schema.org', '@type': 'HowTo', name: title, step: howTo.map((step, index) => ({ '@type': 'HowToStep', position: index + 1, name: step.name, text: step.text })) },
98
+ { '@context': 'https://schema.org', '@type': 'SoftwareApplication', name: title, description, applicationCategory: 'FinanceApplication', operatingSystem: 'All', offers: { '@type': 'Offer', price: '0', priceCurrency: 'USD' } },
99
+ ],
100
+ };
@@ -0,0 +1,2 @@
1
+ import { createInsuranceDeductibleContent } from './content-factory';
2
+ export const content = createInsuranceDeductibleContent('es');
@@ -0,0 +1,2 @@
1
+ import { createInsuranceDeductibleContent } from './content-factory';
2
+ export const content = createInsuranceDeductibleContent('fr');
@@ -0,0 +1,2 @@
1
+ import { createInsuranceDeductibleContent } from './content-factory';
2
+ export const content = createInsuranceDeductibleContent('id');
@@ -0,0 +1,2 @@
1
+ import { createInsuranceDeductibleContent } from './content-factory';
2
+ export const content = createInsuranceDeductibleContent('it');
@@ -0,0 +1,2 @@
1
+ import { createInsuranceDeductibleContent } from './content-factory';
2
+ export const content = createInsuranceDeductibleContent('ja');
@@ -0,0 +1,2 @@
1
+ import { createInsuranceDeductibleContent } from './content-factory';
2
+ export const content = createInsuranceDeductibleContent('ko');
@@ -0,0 +1,2 @@
1
+ import { createInsuranceDeductibleContent } from './content-factory';
2
+ export const content = createInsuranceDeductibleContent('nl');
@@ -0,0 +1,2 @@
1
+ import { createInsuranceDeductibleContent } from './content-factory';
2
+ export const content = createInsuranceDeductibleContent('pl');
@@ -0,0 +1,2 @@
1
+ import { createInsuranceDeductibleContent } from './content-factory';
2
+ export const content = createInsuranceDeductibleContent('pt');
@@ -0,0 +1,2 @@
1
+ import { createInsuranceDeductibleContent } from './content-factory';
2
+ export const content = createInsuranceDeductibleContent('ru');
@@ -0,0 +1,2 @@
1
+ import { createInsuranceDeductibleContent } from './content-factory';
2
+ export const content = createInsuranceDeductibleContent('sv');
@@ -0,0 +1,2 @@
1
+ import { createInsuranceDeductibleContent } from './content-factory';
2
+ export const content = createInsuranceDeductibleContent('tr');
@@ -0,0 +1,2 @@
1
+ import { createInsuranceDeductibleContent } from './content-factory';
2
+ export const content = createInsuranceDeductibleContent('zh');
@@ -0,0 +1,11 @@
1
+ import type { ToolDefinition } from '../../types';
2
+ import { insuranceDeductibleBreakEvenCalculator } from './entry';
3
+
4
+ export * from './entry';
5
+
6
+ export const INSURANCE_DEDUCTIBLE_BREAK_EVEN_CALCULATOR_TOOL: ToolDefinition = {
7
+ entry: insuranceDeductibleBreakEvenCalculator,
8
+ Component: () => import('./component.astro'),
9
+ SEOComponent: () => import('./seo.astro'),
10
+ BibliographyComponent: () => import('./bibliography.astro'),
11
+ };