From 679fb160c24ab5b194248c41e70234aea42f1acb Mon Sep 17 00:00:00 2001 From: Till JS Date: Sun, 26 Apr 2026 21:56:48 +0200 Subject: [PATCH] =?UTF-8?q?feat(invoices):=20full=20i18n=20coverage=20acro?= =?UTF-8?q?ss=2012=20files=20=E2=80=94=20DE/EN/ES/FR/IT?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Invoices module had 81 hardcoded German strings across ListView, DetailView, InvoiceForm, SenderProfileForm, ClientPicker, LinesEditor, SendModal, StatusBadge, the open-invoices widget, and 4 routes. New `invoices` namespace (~215 keys × 5 locales = ~1075 translations) covers list/detail/form/picker/sender-form/send-modal + Swiss + German VAT-rate labels. - constants.ts: STATUS_LABELS still kept as a literal map for non-Svelte callers (mail-template, PDF renderer); Svelte components now use `$_('invoices.status.')`. VAT_RATES_CH/DE switched from literal `label` to `i18nKey`, resolved per-component via $_. - Locale-aware Date.toLocaleString in DetailView meta + SenderProfileForm saved-at timestamp (was hardcoded 'de-DE'/default). - Baseline ratchet: 1817 → 1753 (64 invoices strings + a handful of SettingsSidebar follow-ons cleared). - validate:i18n-parity: 40 namespaces × 5 locales — 3596 keys aligned - svelte-check: 7647 files, 0 errors Co-Authored-By: Claude Opus 4.7 (1M context) --- .../web/src/lib/i18n/locales/invoices/de.json | 241 ++++++++++++++++++ .../web/src/lib/i18n/locales/invoices/en.json | 241 ++++++++++++++++++ .../web/src/lib/i18n/locales/invoices/es.json | 241 ++++++++++++++++++ .../web/src/lib/i18n/locales/invoices/fr.json | 241 ++++++++++++++++++ .../web/src/lib/i18n/locales/invoices/it.json | 241 ++++++++++++++++++ .../src/lib/modules/invoices/ListView.svelte | 46 ++-- .../invoices/components/ClientPicker.svelte | 35 +-- .../invoices/components/InvoiceForm.svelte | 51 ++-- .../invoices/components/LinesEditor.svelte | 42 +-- .../invoices/components/SendModal.svelte | 61 +++-- .../components/SenderProfileForm.svelte | 101 ++++---- .../invoices/components/StatusBadge.svelte | 5 +- .../web/src/lib/modules/invoices/constants.ts | 27 +- .../modules/invoices/views/DetailView.svelte | 122 +++++---- .../widgets/InvoicesOpenWidget.svelte | 21 +- .../routes/(app)/invoices/[id]/+page.svelte | 15 +- .../(app)/invoices/[id]/edit/+page.svelte | 25 +- .../routes/(app)/invoices/new/+page.svelte | 7 +- .../(app)/invoices/settings/+page.svelte | 7 +- scripts/i18n-hardcoded-baseline.json | 14 +- 20 files changed, 1541 insertions(+), 243 deletions(-) create mode 100644 apps/mana/apps/web/src/lib/i18n/locales/invoices/de.json create mode 100644 apps/mana/apps/web/src/lib/i18n/locales/invoices/en.json create mode 100644 apps/mana/apps/web/src/lib/i18n/locales/invoices/es.json create mode 100644 apps/mana/apps/web/src/lib/i18n/locales/invoices/fr.json create mode 100644 apps/mana/apps/web/src/lib/i18n/locales/invoices/it.json diff --git a/apps/mana/apps/web/src/lib/i18n/locales/invoices/de.json b/apps/mana/apps/web/src/lib/i18n/locales/invoices/de.json new file mode 100644 index 000000000..aa96793c0 --- /dev/null +++ b/apps/mana/apps/web/src/lib/i18n/locales/invoices/de.json @@ -0,0 +1,241 @@ +{ + "list": { + "title": "Rechnungen", + "subtitle": "Rechnungen stellen und Zahlungen verfolgen", + "new_invoice": "+ Neue Rechnung", + "settings_aria": "Einstellungen", + "stat_open": "Offen", + "stat_overdue": "Überfällig", + "stat_invoiced_ytd": "Fakturiert {year}", + "stat_paid_ytd": "Bezahlt {year}", + "stat_count": "{count} Rechnungen", + "chip_all": "Alle", + "search_placeholder": "Suchen (Nummer, Kunde, Betreff)", + "empty_title": "Noch keine Rechnungen", + "empty_body": "Stelle deine erste Rechnung — inklusive PDF-Export und Schweizer QR-Bill (M5).", + "empty_cta": "Erste Rechnung erstellen", + "empty_filtered": "Keine Rechnungen gefunden." + }, + "status": { + "draft": "Entwurf", + "sent": "Versendet", + "paid": "Bezahlt", + "overdue": "Überfällig", + "void": "Storniert" + }, + "detail": { + "title_default": "Rechnung", + "due": "Fällig {date}", + "edit": "Bearbeiten", + "send_via_mail": "Per Mail versenden", + "mark_sent": "Als versendet markieren", + "mark_paid": "Als bezahlt markieren", + "download_pdf": "PDF herunterladen", + "duplicate": "Duplizieren", + "cancel": "Stornieren", + "delete": "Löschen", + "confirm_void": "Diese Rechnung stornieren?", + "confirm_delete": "Rechnung endgültig löschen?", + "action_mark_sent": "Als versendet markieren", + "action_mark_paid": "Als bezahlt markieren", + "action_void": "Stornieren", + "action_duplicate": "Duplizieren", + "action_delete": "Löschen", + "err_action_failed": "{label} fehlgeschlagen", + "err_pdf_render": "PDF-Rendering fehlgeschlagen", + "err_download": "Download fehlgeschlagen", + "err_pdf": "PDF-Fehler: {error}", + "preview_title": "Vorschau", + "preview_rendering": "Rendert …", + "preview_iframe_title": "Vorschau Rechnung {number}", + "qr_warning_strong": "QR-Rechnung nicht eingefügt:", + "qr_open_settings": "Einstellungen öffnen →", + "raw_summary": "Strukturierte Daten anzeigen", + "section_recipient": "Empfänger", + "section_lines": "Positionen", + "section_totals": "Summe", + "section_notes": "Notizen", + "section_terms": "Zahlungsbedingungen", + "label_vat_number": "MwSt-Nr.: {number}", + "th_position": "Position", + "th_quantity": "Menge", + "th_unit_price": "Einzelpreis", + "th_vat": "MwSt.", + "th_net": "Netto", + "total_label_net": "Netto", + "total_label_vat": "MwSt. {rate}%", + "total_label_total": "Total", + "meta_status": "Status: {label}", + "meta_sent": "Versendet: {date}", + "meta_paid": "Bezahlt: {date}" + }, + "form": { + "section_client": "Kunde", + "section_invoice": "Rechnung", + "section_lines": "Positionen", + "section_totals": "Summe", + "section_notes": "Notizen & Zahlungsbedingungen", + "label_subject": "Betreff", + "placeholder_subject": "Beratungsleistung April", + "label_currency": "Währung", + "label_issue_date": "Rechnungsdatum", + "label_due_date": "Fällig am", + "label_notes": "Notizen (unter den Positionen)", + "label_terms": "Zahlungsbedingungen / AGB", + "cancel": "Abbrechen", + "saving": "Speichert …", + "submit_create": "Als Entwurf speichern", + "submit_update": "Änderungen speichern", + "err_client_required": "Kunde ist erforderlich", + "err_min_one_line": "Mindestens eine Position hinzufügen", + "err_save": "Speichern fehlgeschlagen", + "total_label_net": "Netto", + "total_label_vat": "MwSt. {rate}%", + "total_label_total": "Total" + }, + "client_picker": { + "label": "Kunde *", + "placeholder": "Name tippen oder aus Kontakten wählen", + "suggest_contact": "aus Kontakten", + "suggest_invoice": "aus Rechnungen", + "fallback_unnamed": "Unbenannter Kontakt", + "label_street": "Strasse + Nr.", + "label_zip": "PLZ", + "label_city": "Ort", + "label_country": "Land", + "label_email": "E-Mail", + "label_vat": "USt-IdNr. / MwSt-Nr.", + "placeholder_street": "Bahnhofstrasse 1", + "placeholder_zip": "8000", + "placeholder_city": "Zürich", + "placeholder_country": "CH", + "placeholder_email": "kontakt@kunde.ch", + "placeholder_vat": "CHE-123.456.789 MWST" + }, + "lines_editor": { + "th_position": "Position", + "th_quantity": "Menge", + "th_unit": "Einheit", + "th_unit_price": "Einzelpreis", + "th_vat": "MwSt.", + "th_total": "Total", + "empty": "Noch keine Positionen. Füge die erste hinzu.", + "placeholder_title": "Titel der Position", + "placeholder_unit": "Std", + "add_line": "+ Position", + "aria_move_up": "Nach oben", + "aria_move_down": "Nach unten", + "aria_remove": "Entfernen", + "label_total_net": "netto {amount}" + }, + "send_modal": { + "title": "Rechnung {number} versenden", + "close": "Schließen", + "intro_pre": "Die PDF wird heruntergeladen und dein Mail-Programm öffnet sich mit vorausgefüllten Feldern. ", + "intro_strong": "Die PDF musst du manuell anhängen", + "intro_post": " — Mana kann Anhänge (noch) nicht automatisch einbetten.", + "label_to": "An", + "placeholder_to": "kontakt@kunde.ch", + "invalid_email_warn": "Keine gültige E-Mail — du kannst sie gleich im Mail-Programm ergänzen.", + "label_subject": "Betreff", + "label_body": "Nachricht", + "cancel": "Abbrechen", + "open_and_download": "Öffnen & herunterladen", + "handoff_pdf": "PDF wurde heruntergeladen", + "handoff_mail": "Mail-Programm wurde geöffnet", + "handoff_hint": "Hänge die heruntergeladene PDF an und sende die Mail. Kehre danach hierher zurück und markiere die Rechnung als versendet.", + "later": "Später", + "confirming_sent": "Markiere …", + "confirm_sent": "Rechnung wurde versendet", + "err_open_failed": "Öffnen fehlgeschlagen", + "err_mark_failed": "Markieren fehlgeschlagen" + }, + "sender_form": { + "loading": "Lade Einstellungen …", + "section_sender": "Absender", + "section_sender_hint": "Erscheint im Kopf jeder Rechnung.", + "section_numbering": "Nummernkreis", + "section_numbering_hint_pre": "Nächste Rechnung: ", + "section_defaults": "Standards", + "label_logo": "Logo", + "logo_alt": "Logo-Vorschau", + "logo_replace": "Ersetzen", + "logo_remove": "Entfernen", + "logo_uploading": "Lädt hoch …", + "logo_drop": "+ Logo hochladen", + "err_upload": "Upload fehlgeschlagen", + "err_remove": "Entfernen fehlgeschlagen", + "label_name": "Name *", + "label_street": "Strasse + Nr. *", + "label_zip": "PLZ *", + "label_city": "Ort *", + "label_country": "Land", + "placeholder_street": "Bahnhofstrasse 1", + "placeholder_zip": "8000", + "placeholder_city": "Zürich", + "placeholder_country": "CH", + "legacy_address_summary": "Abweichende Adresse im PDF anzeigen (Freitext-Fallback)", + "legacy_address_hint": "Wird nur verwendet, wenn die strukturierten Felder oben leer sind. Nützlich für Postfächer / c/o-Adressen, die nicht ins Strasse+PLZ+Ort-Schema passen.", + "legacy_address_placeholder": "Postfach 123\n8021 Zürich", + "label_email": "E-Mail *", + "label_vat": "MwSt-Nummer", + "placeholder_vat": "CHE-123.456.789 MWST", + "label_iban": "IBAN *", + "placeholder_iban": "CH93 0076 2011 6238 5295 7", + "label_bic": "BIC", + "label_footer": "Fußzeile", + "placeholder_footer": "Ergänzung unter jeder Rechnung (z.B. rechtliche Hinweise)", + "label_prefix": "Präfix", + "label_padding": "Stellen", + "label_next_number": "Nächste Nummer", + "label_currency": "Währung", + "label_vat_rate": "MwSt.-Satz", + "label_due_days": "Zahlungsfrist (Tage)", + "label_terms": "Standard-AGB / Zahlungsbedingungen", + "placeholder_terms": "Zahlbar innert 30 Tagen netto.", + "saving": "Speichert …", + "save": "Speichern", + "saved_at": "Gespeichert um {time}" + }, + "vat_ch": { + "v0": "0% (ausgenommen)", + "v2_6": "2.6% (reduziert)", + "v3_8": "3.8% (Beherbergung)", + "v8_1": "8.1% (Normalsatz)" + }, + "vat_de": { + "v0": "0%", + "v7": "7% (ermäßigt)", + "v19": "19% (Regelsatz)" + }, + "widget": { + "title": "Rechnungen", + "all_link": "Alle →", + "empty": "Noch keine Rechnungen gestellt.", + "create_first": "Erste Rechnung", + "open": "Offen", + "overdue": "Überfällig", + "overdue_count": "{count} Rechnungen", + "days_overdue": "{n} Tage überfällig" + }, + "routes": { + "detail_title_fallback": "Rechnung", + "detail_doc_title": "{number} - Mana", + "detail_route_title": "Rechnung", + "not_found": "Rechnung nicht gefunden.", + "back_to_list": "Zurück zur Übersicht", + "loading": "Lädt …", + "edit_doc_title": "Rechnung bearbeiten - Mana", + "edit_heading": "Rechnung {number} bearbeiten", + "not_editable_title": "Rechnung kann nicht bearbeitet werden", + "not_editable_body_pre": "Nur Entwürfe sind editierbar. Diese Rechnung hat Status ", + "not_editable_body_post": ". Um eine versendete Rechnung zu ändern, storniere sie und dupliziere sie als neuen Entwurf.", + "back_to_detail": "Zurück zum Detail", + "new_doc_title": "Neue Rechnung - Mana", + "new_heading": "Neue Rechnung", + "new_subtitle": "Entwurf erstellen — wird nach dem Speichern noch nicht versendet.", + "settings_doc_title": "Rechnungs-Einstellungen — Mana", + "settings_heading": "Rechnungs-Einstellungen", + "settings_sub": "Absender, Nummernkreis und Standards" + } +} diff --git a/apps/mana/apps/web/src/lib/i18n/locales/invoices/en.json b/apps/mana/apps/web/src/lib/i18n/locales/invoices/en.json new file mode 100644 index 000000000..37dae2521 --- /dev/null +++ b/apps/mana/apps/web/src/lib/i18n/locales/invoices/en.json @@ -0,0 +1,241 @@ +{ + "list": { + "title": "Invoices", + "subtitle": "Issue invoices and track payments", + "new_invoice": "+ New invoice", + "settings_aria": "Settings", + "stat_open": "Open", + "stat_overdue": "Overdue", + "stat_invoiced_ytd": "Invoiced {year}", + "stat_paid_ytd": "Paid {year}", + "stat_count": "{count} invoices", + "chip_all": "All", + "search_placeholder": "Search (number, client, subject)", + "empty_title": "No invoices yet", + "empty_body": "Issue your first invoice — including PDF export and Swiss QR-Bill (M5).", + "empty_cta": "Create first invoice", + "empty_filtered": "No invoices found." + }, + "status": { + "draft": "Draft", + "sent": "Sent", + "paid": "Paid", + "overdue": "Overdue", + "void": "Void" + }, + "detail": { + "title_default": "Invoice", + "due": "Due {date}", + "edit": "Edit", + "send_via_mail": "Send via email", + "mark_sent": "Mark as sent", + "mark_paid": "Mark as paid", + "download_pdf": "Download PDF", + "duplicate": "Duplicate", + "cancel": "Void", + "delete": "Delete", + "confirm_void": "Void this invoice?", + "confirm_delete": "Permanently delete invoice?", + "action_mark_sent": "Mark as sent", + "action_mark_paid": "Mark as paid", + "action_void": "Void", + "action_duplicate": "Duplicate", + "action_delete": "Delete", + "err_action_failed": "{label} failed", + "err_pdf_render": "PDF rendering failed", + "err_download": "Download failed", + "err_pdf": "PDF error: {error}", + "preview_title": "Preview", + "preview_rendering": "Rendering …", + "preview_iframe_title": "Preview invoice {number}", + "qr_warning_strong": "QR-Bill not included:", + "qr_open_settings": "Open settings →", + "raw_summary": "Show structured data", + "section_recipient": "Recipient", + "section_lines": "Lines", + "section_totals": "Totals", + "section_notes": "Notes", + "section_terms": "Payment terms", + "label_vat_number": "VAT no.: {number}", + "th_position": "Item", + "th_quantity": "Quantity", + "th_unit_price": "Unit price", + "th_vat": "VAT", + "th_net": "Net", + "total_label_net": "Net", + "total_label_vat": "VAT {rate}%", + "total_label_total": "Total", + "meta_status": "Status: {label}", + "meta_sent": "Sent: {date}", + "meta_paid": "Paid: {date}" + }, + "form": { + "section_client": "Client", + "section_invoice": "Invoice", + "section_lines": "Lines", + "section_totals": "Totals", + "section_notes": "Notes & payment terms", + "label_subject": "Subject", + "placeholder_subject": "Consulting April", + "label_currency": "Currency", + "label_issue_date": "Issue date", + "label_due_date": "Due date", + "label_notes": "Notes (below the lines)", + "label_terms": "Payment terms / T&C", + "cancel": "Cancel", + "saving": "Saving …", + "submit_create": "Save as draft", + "submit_update": "Save changes", + "err_client_required": "Client is required", + "err_min_one_line": "Add at least one line", + "err_save": "Save failed", + "total_label_net": "Net", + "total_label_vat": "VAT {rate}%", + "total_label_total": "Total" + }, + "client_picker": { + "label": "Client *", + "placeholder": "Type a name or pick from contacts", + "suggest_contact": "from contacts", + "suggest_invoice": "from invoices", + "fallback_unnamed": "Unnamed contact", + "label_street": "Street + No.", + "label_zip": "ZIP", + "label_city": "City", + "label_country": "Country", + "label_email": "Email", + "label_vat": "VAT ID / VAT no.", + "placeholder_street": "Bahnhofstrasse 1", + "placeholder_zip": "8000", + "placeholder_city": "Zurich", + "placeholder_country": "CH", + "placeholder_email": "contact@client.com", + "placeholder_vat": "CHE-123.456.789 MWST" + }, + "lines_editor": { + "th_position": "Item", + "th_quantity": "Quantity", + "th_unit": "Unit", + "th_unit_price": "Unit price", + "th_vat": "VAT", + "th_total": "Total", + "empty": "No lines yet. Add the first one.", + "placeholder_title": "Line title", + "placeholder_unit": "hr", + "add_line": "+ Line", + "aria_move_up": "Move up", + "aria_move_down": "Move down", + "aria_remove": "Remove", + "label_total_net": "net {amount}" + }, + "send_modal": { + "title": "Send invoice {number}", + "close": "Close", + "intro_pre": "The PDF will download and your mail client will open with prefilled fields. ", + "intro_strong": "You need to attach the PDF manually", + "intro_post": " — Mana can't auto-attach (yet).", + "label_to": "To", + "placeholder_to": "contact@client.com", + "invalid_email_warn": "Not a valid email — you can fix it in your mail client.", + "label_subject": "Subject", + "label_body": "Message", + "cancel": "Cancel", + "open_and_download": "Open & download", + "handoff_pdf": "PDF was downloaded", + "handoff_mail": "Mail client opened", + "handoff_hint": "Attach the downloaded PDF and send the mail. Then come back here and mark the invoice as sent.", + "later": "Later", + "confirming_sent": "Marking …", + "confirm_sent": "Invoice was sent", + "err_open_failed": "Open failed", + "err_mark_failed": "Marking failed" + }, + "sender_form": { + "loading": "Loading settings …", + "section_sender": "Sender", + "section_sender_hint": "Appears in the header of every invoice.", + "section_numbering": "Number range", + "section_numbering_hint_pre": "Next invoice: ", + "section_defaults": "Defaults", + "label_logo": "Logo", + "logo_alt": "Logo preview", + "logo_replace": "Replace", + "logo_remove": "Remove", + "logo_uploading": "Uploading …", + "logo_drop": "+ Upload logo", + "err_upload": "Upload failed", + "err_remove": "Remove failed", + "label_name": "Name *", + "label_street": "Street + No. *", + "label_zip": "ZIP *", + "label_city": "City *", + "label_country": "Country", + "placeholder_street": "Bahnhofstrasse 1", + "placeholder_zip": "8000", + "placeholder_city": "Zurich", + "placeholder_country": "CH", + "legacy_address_summary": "Show alternate address in PDF (free-text fallback)", + "legacy_address_hint": "Used only when the structured fields above are empty. Useful for PO boxes / c/o addresses that don't fit the street+ZIP+city schema.", + "legacy_address_placeholder": "PO Box 123\n8021 Zurich", + "label_email": "Email *", + "label_vat": "VAT number", + "placeholder_vat": "CHE-123.456.789 MWST", + "label_iban": "IBAN *", + "placeholder_iban": "CH93 0076 2011 6238 5295 7", + "label_bic": "BIC", + "label_footer": "Footer", + "placeholder_footer": "Note below every invoice (e.g. legal notes)", + "label_prefix": "Prefix", + "label_padding": "Digits", + "label_next_number": "Next number", + "label_currency": "Currency", + "label_vat_rate": "VAT rate", + "label_due_days": "Payment term (days)", + "label_terms": "Default T&C / payment terms", + "placeholder_terms": "Payable within 30 days net.", + "saving": "Saving …", + "save": "Save", + "saved_at": "Saved at {time}" + }, + "vat_ch": { + "v0": "0% (exempt)", + "v2_6": "2.6% (reduced)", + "v3_8": "3.8% (lodging)", + "v8_1": "8.1% (standard)" + }, + "vat_de": { + "v0": "0%", + "v7": "7% (reduced)", + "v19": "19% (standard)" + }, + "widget": { + "title": "Invoices", + "all_link": "All →", + "empty": "No invoices issued yet.", + "create_first": "First invoice", + "open": "Open", + "overdue": "Overdue", + "overdue_count": "{count} invoices", + "days_overdue": "{n} days overdue" + }, + "routes": { + "detail_title_fallback": "Invoice", + "detail_doc_title": "{number} - Mana", + "detail_route_title": "Invoice", + "not_found": "Invoice not found.", + "back_to_list": "Back to overview", + "loading": "Loading …", + "edit_doc_title": "Edit invoice - Mana", + "edit_heading": "Edit invoice {number}", + "not_editable_title": "Invoice can't be edited", + "not_editable_body_pre": "Only drafts are editable. This invoice has status ", + "not_editable_body_post": ". To change a sent invoice, void it and duplicate it as a new draft.", + "back_to_detail": "Back to detail", + "new_doc_title": "New invoice - Mana", + "new_heading": "New invoice", + "new_subtitle": "Create a draft — won't be sent until you save.", + "settings_doc_title": "Invoice settings — Mana", + "settings_heading": "Invoice settings", + "settings_sub": "Sender, number range and defaults" + } +} diff --git a/apps/mana/apps/web/src/lib/i18n/locales/invoices/es.json b/apps/mana/apps/web/src/lib/i18n/locales/invoices/es.json new file mode 100644 index 000000000..34a9cc9d5 --- /dev/null +++ b/apps/mana/apps/web/src/lib/i18n/locales/invoices/es.json @@ -0,0 +1,241 @@ +{ + "list": { + "title": "Facturas", + "subtitle": "Emite facturas y haz seguimiento de los pagos", + "new_invoice": "+ Nueva factura", + "settings_aria": "Ajustes", + "stat_open": "Pendiente", + "stat_overdue": "Vencida", + "stat_invoiced_ytd": "Facturado {year}", + "stat_paid_ytd": "Pagado {year}", + "stat_count": "{count} facturas", + "chip_all": "Todas", + "search_placeholder": "Buscar (número, cliente, asunto)", + "empty_title": "Aún no hay facturas", + "empty_body": "Emite tu primera factura — con exportación PDF y QR-Bill suizo (M5).", + "empty_cta": "Crear primera factura", + "empty_filtered": "No se han encontrado facturas." + }, + "status": { + "draft": "Borrador", + "sent": "Enviada", + "paid": "Pagada", + "overdue": "Vencida", + "void": "Anulada" + }, + "detail": { + "title_default": "Factura", + "due": "Vence {date}", + "edit": "Editar", + "send_via_mail": "Enviar por correo", + "mark_sent": "Marcar como enviada", + "mark_paid": "Marcar como pagada", + "download_pdf": "Descargar PDF", + "duplicate": "Duplicar", + "cancel": "Anular", + "delete": "Eliminar", + "confirm_void": "¿Anular esta factura?", + "confirm_delete": "¿Eliminar la factura definitivamente?", + "action_mark_sent": "Marcar como enviada", + "action_mark_paid": "Marcar como pagada", + "action_void": "Anular", + "action_duplicate": "Duplicar", + "action_delete": "Eliminar", + "err_action_failed": "{label} ha fallado", + "err_pdf_render": "Error al renderizar el PDF", + "err_download": "Error al descargar", + "err_pdf": "Error de PDF: {error}", + "preview_title": "Vista previa", + "preview_rendering": "Renderizando …", + "preview_iframe_title": "Vista previa factura {number}", + "qr_warning_strong": "QR-Bill no incluido:", + "qr_open_settings": "Abrir ajustes →", + "raw_summary": "Mostrar datos estructurados", + "section_recipient": "Destinatario", + "section_lines": "Líneas", + "section_totals": "Totales", + "section_notes": "Notas", + "section_terms": "Condiciones de pago", + "label_vat_number": "N.º IVA: {number}", + "th_position": "Concepto", + "th_quantity": "Cantidad", + "th_unit_price": "Precio unit.", + "th_vat": "IVA", + "th_net": "Neto", + "total_label_net": "Neto", + "total_label_vat": "IVA {rate}%", + "total_label_total": "Total", + "meta_status": "Estado: {label}", + "meta_sent": "Enviada: {date}", + "meta_paid": "Pagada: {date}" + }, + "form": { + "section_client": "Cliente", + "section_invoice": "Factura", + "section_lines": "Líneas", + "section_totals": "Totales", + "section_notes": "Notas y condiciones de pago", + "label_subject": "Asunto", + "placeholder_subject": "Consultoría abril", + "label_currency": "Moneda", + "label_issue_date": "Fecha de emisión", + "label_due_date": "Vencimiento", + "label_notes": "Notas (debajo de las líneas)", + "label_terms": "Condiciones / T&C", + "cancel": "Cancelar", + "saving": "Guardando …", + "submit_create": "Guardar como borrador", + "submit_update": "Guardar cambios", + "err_client_required": "El cliente es obligatorio", + "err_min_one_line": "Añade al menos una línea", + "err_save": "Error al guardar", + "total_label_net": "Neto", + "total_label_vat": "IVA {rate}%", + "total_label_total": "Total" + }, + "client_picker": { + "label": "Cliente *", + "placeholder": "Escribe un nombre o elige de los contactos", + "suggest_contact": "de contactos", + "suggest_invoice": "de facturas", + "fallback_unnamed": "Contacto sin nombre", + "label_street": "Calle + n.º", + "label_zip": "CP", + "label_city": "Ciudad", + "label_country": "País", + "label_email": "Correo electrónico", + "label_vat": "NIF / N.º IVA", + "placeholder_street": "Bahnhofstrasse 1", + "placeholder_zip": "8000", + "placeholder_city": "Zúrich", + "placeholder_country": "CH", + "placeholder_email": "contacto@cliente.com", + "placeholder_vat": "CHE-123.456.789 MWST" + }, + "lines_editor": { + "th_position": "Concepto", + "th_quantity": "Cantidad", + "th_unit": "Unidad", + "th_unit_price": "Precio unit.", + "th_vat": "IVA", + "th_total": "Total", + "empty": "Aún no hay líneas. Añade la primera.", + "placeholder_title": "Título de la línea", + "placeholder_unit": "h", + "add_line": "+ Línea", + "aria_move_up": "Mover arriba", + "aria_move_down": "Mover abajo", + "aria_remove": "Quitar", + "label_total_net": "neto {amount}" + }, + "send_modal": { + "title": "Enviar factura {number}", + "close": "Cerrar", + "intro_pre": "El PDF se descargará y tu cliente de correo se abrirá con los campos rellenados. ", + "intro_strong": "Tienes que adjuntar el PDF manualmente", + "intro_post": " — Mana aún no puede adjuntar automáticamente.", + "label_to": "Para", + "placeholder_to": "contacto@cliente.com", + "invalid_email_warn": "No es un correo válido — puedes corregirlo en tu cliente de correo.", + "label_subject": "Asunto", + "label_body": "Mensaje", + "cancel": "Cancelar", + "open_and_download": "Abrir y descargar", + "handoff_pdf": "El PDF se ha descargado", + "handoff_mail": "Cliente de correo abierto", + "handoff_hint": "Adjunta el PDF descargado y envía el correo. Luego vuelve aquí y marca la factura como enviada.", + "later": "Más tarde", + "confirming_sent": "Marcando …", + "confirm_sent": "La factura se ha enviado", + "err_open_failed": "Error al abrir", + "err_mark_failed": "Error al marcar" + }, + "sender_form": { + "loading": "Cargando ajustes …", + "section_sender": "Emisor", + "section_sender_hint": "Aparece en el encabezado de cada factura.", + "section_numbering": "Rango de numeración", + "section_numbering_hint_pre": "Próxima factura: ", + "section_defaults": "Valores predeterminados", + "label_logo": "Logo", + "logo_alt": "Vista previa del logo", + "logo_replace": "Reemplazar", + "logo_remove": "Quitar", + "logo_uploading": "Subiendo …", + "logo_drop": "+ Subir logo", + "err_upload": "Error al subir", + "err_remove": "Error al quitar", + "label_name": "Nombre *", + "label_street": "Calle + n.º *", + "label_zip": "CP *", + "label_city": "Ciudad *", + "label_country": "País", + "placeholder_street": "Bahnhofstrasse 1", + "placeholder_zip": "8000", + "placeholder_city": "Zúrich", + "placeholder_country": "CH", + "legacy_address_summary": "Mostrar dirección alternativa en el PDF (texto libre)", + "legacy_address_hint": "Solo se usa cuando los campos estructurados de arriba están vacíos. Útil para apartados postales / direcciones c/o que no encajan en el esquema calle+CP+ciudad.", + "legacy_address_placeholder": "Apdo. 123\n8021 Zúrich", + "label_email": "Correo electrónico *", + "label_vat": "Número de IVA", + "placeholder_vat": "CHE-123.456.789 MWST", + "label_iban": "IBAN *", + "placeholder_iban": "CH93 0076 2011 6238 5295 7", + "label_bic": "BIC", + "label_footer": "Pie de página", + "placeholder_footer": "Nota debajo de cada factura (p. ej. avisos legales)", + "label_prefix": "Prefijo", + "label_padding": "Dígitos", + "label_next_number": "Próximo número", + "label_currency": "Moneda", + "label_vat_rate": "Tipo de IVA", + "label_due_days": "Plazo de pago (días)", + "label_terms": "T&C / condiciones de pago por defecto", + "placeholder_terms": "Pagadera en 30 días neto.", + "saving": "Guardando …", + "save": "Guardar", + "saved_at": "Guardado a las {time}" + }, + "vat_ch": { + "v0": "0% (exento)", + "v2_6": "2.6% (reducido)", + "v3_8": "3.8% (alojamiento)", + "v8_1": "8.1% (estándar)" + }, + "vat_de": { + "v0": "0%", + "v7": "7% (reducido)", + "v19": "19% (estándar)" + }, + "widget": { + "title": "Facturas", + "all_link": "Todas →", + "empty": "Aún no se ha emitido ninguna factura.", + "create_first": "Primera factura", + "open": "Pendiente", + "overdue": "Vencida", + "overdue_count": "{count} facturas", + "days_overdue": "{n} días vencida" + }, + "routes": { + "detail_title_fallback": "Factura", + "detail_doc_title": "{number} - Mana", + "detail_route_title": "Factura", + "not_found": "Factura no encontrada.", + "back_to_list": "Volver al listado", + "loading": "Cargando …", + "edit_doc_title": "Editar factura - Mana", + "edit_heading": "Editar factura {number}", + "not_editable_title": "La factura no se puede editar", + "not_editable_body_pre": "Solo los borradores son editables. Esta factura está en estado ", + "not_editable_body_post": ". Para cambiar una factura enviada, anúlala y duplícala como nuevo borrador.", + "back_to_detail": "Volver al detalle", + "new_doc_title": "Nueva factura - Mana", + "new_heading": "Nueva factura", + "new_subtitle": "Crear borrador — no se enviará hasta guardar.", + "settings_doc_title": "Ajustes de facturas — Mana", + "settings_heading": "Ajustes de facturas", + "settings_sub": "Emisor, rango de numeración y valores por defecto" + } +} diff --git a/apps/mana/apps/web/src/lib/i18n/locales/invoices/fr.json b/apps/mana/apps/web/src/lib/i18n/locales/invoices/fr.json new file mode 100644 index 000000000..39ec693e9 --- /dev/null +++ b/apps/mana/apps/web/src/lib/i18n/locales/invoices/fr.json @@ -0,0 +1,241 @@ +{ + "list": { + "title": "Factures", + "subtitle": "Émets des factures et suis les paiements", + "new_invoice": "+ Nouvelle facture", + "settings_aria": "Paramètres", + "stat_open": "En attente", + "stat_overdue": "En retard", + "stat_invoiced_ytd": "Facturé {year}", + "stat_paid_ytd": "Payé {year}", + "stat_count": "{count} factures", + "chip_all": "Toutes", + "search_placeholder": "Rechercher (numéro, client, objet)", + "empty_title": "Pas encore de facture", + "empty_body": "Émets ta première facture — avec export PDF et QR-Bill suisse (M5).", + "empty_cta": "Créer la première facture", + "empty_filtered": "Aucune facture trouvée." + }, + "status": { + "draft": "Brouillon", + "sent": "Envoyée", + "paid": "Payée", + "overdue": "En retard", + "void": "Annulée" + }, + "detail": { + "title_default": "Facture", + "due": "Échéance {date}", + "edit": "Modifier", + "send_via_mail": "Envoyer par e-mail", + "mark_sent": "Marquer comme envoyée", + "mark_paid": "Marquer comme payée", + "download_pdf": "Télécharger le PDF", + "duplicate": "Dupliquer", + "cancel": "Annuler", + "delete": "Supprimer", + "confirm_void": "Annuler cette facture ?", + "confirm_delete": "Supprimer définitivement la facture ?", + "action_mark_sent": "Marquer comme envoyée", + "action_mark_paid": "Marquer comme payée", + "action_void": "Annuler", + "action_duplicate": "Dupliquer", + "action_delete": "Supprimer", + "err_action_failed": "{label} a échoué", + "err_pdf_render": "Échec du rendu PDF", + "err_download": "Échec du téléchargement", + "err_pdf": "Erreur PDF : {error}", + "preview_title": "Aperçu", + "preview_rendering": "Rendu …", + "preview_iframe_title": "Aperçu facture {number}", + "qr_warning_strong": "QR-facture non incluse :", + "qr_open_settings": "Ouvrir les paramètres →", + "raw_summary": "Afficher les données structurées", + "section_recipient": "Destinataire", + "section_lines": "Lignes", + "section_totals": "Totaux", + "section_notes": "Notes", + "section_terms": "Conditions de paiement", + "label_vat_number": "N° TVA : {number}", + "th_position": "Désignation", + "th_quantity": "Quantité", + "th_unit_price": "Prix unit.", + "th_vat": "TVA", + "th_net": "Net", + "total_label_net": "Net", + "total_label_vat": "TVA {rate}%", + "total_label_total": "Total", + "meta_status": "Statut : {label}", + "meta_sent": "Envoyée : {date}", + "meta_paid": "Payée : {date}" + }, + "form": { + "section_client": "Client", + "section_invoice": "Facture", + "section_lines": "Lignes", + "section_totals": "Totaux", + "section_notes": "Notes et conditions de paiement", + "label_subject": "Objet", + "placeholder_subject": "Conseil avril", + "label_currency": "Devise", + "label_issue_date": "Date d'émission", + "label_due_date": "Échéance", + "label_notes": "Notes (sous les lignes)", + "label_terms": "Conditions / CGV", + "cancel": "Annuler", + "saving": "Enregistrement …", + "submit_create": "Enregistrer comme brouillon", + "submit_update": "Enregistrer les modifications", + "err_client_required": "Le client est obligatoire", + "err_min_one_line": "Ajoute au moins une ligne", + "err_save": "Échec de l'enregistrement", + "total_label_net": "Net", + "total_label_vat": "TVA {rate}%", + "total_label_total": "Total" + }, + "client_picker": { + "label": "Client *", + "placeholder": "Tape un nom ou choisis dans les contacts", + "suggest_contact": "des contacts", + "suggest_invoice": "des factures", + "fallback_unnamed": "Contact sans nom", + "label_street": "Rue + n°", + "label_zip": "CP", + "label_city": "Ville", + "label_country": "Pays", + "label_email": "E-mail", + "label_vat": "N° TVA / TVA intra.", + "placeholder_street": "Bahnhofstrasse 1", + "placeholder_zip": "8000", + "placeholder_city": "Zurich", + "placeholder_country": "CH", + "placeholder_email": "contact@client.com", + "placeholder_vat": "CHE-123.456.789 MWST" + }, + "lines_editor": { + "th_position": "Désignation", + "th_quantity": "Quantité", + "th_unit": "Unité", + "th_unit_price": "Prix unit.", + "th_vat": "TVA", + "th_total": "Total", + "empty": "Pas encore de lignes. Ajoute la première.", + "placeholder_title": "Titre de la ligne", + "placeholder_unit": "h", + "add_line": "+ Ligne", + "aria_move_up": "Monter", + "aria_move_down": "Descendre", + "aria_remove": "Retirer", + "label_total_net": "net {amount}" + }, + "send_modal": { + "title": "Envoyer facture {number}", + "close": "Fermer", + "intro_pre": "Le PDF sera téléchargé et ton client mail s'ouvrira avec les champs préremplis. ", + "intro_strong": "Tu dois joindre le PDF manuellement", + "intro_post": " — Mana ne peut pas (encore) joindre automatiquement.", + "label_to": "À", + "placeholder_to": "contact@client.com", + "invalid_email_warn": "Ce n'est pas un e-mail valide — tu peux le corriger dans ton client mail.", + "label_subject": "Objet", + "label_body": "Message", + "cancel": "Annuler", + "open_and_download": "Ouvrir et télécharger", + "handoff_pdf": "Le PDF a été téléchargé", + "handoff_mail": "Client mail ouvert", + "handoff_hint": "Joins le PDF téléchargé et envoie le mail. Reviens ensuite ici et marque la facture comme envoyée.", + "later": "Plus tard", + "confirming_sent": "Marquage …", + "confirm_sent": "La facture a été envoyée", + "err_open_failed": "Échec de l'ouverture", + "err_mark_failed": "Échec du marquage" + }, + "sender_form": { + "loading": "Chargement des paramètres …", + "section_sender": "Émetteur", + "section_sender_hint": "Apparaît en tête de chaque facture.", + "section_numbering": "Numérotation", + "section_numbering_hint_pre": "Prochaine facture : ", + "section_defaults": "Valeurs par défaut", + "label_logo": "Logo", + "logo_alt": "Aperçu du logo", + "logo_replace": "Remplacer", + "logo_remove": "Retirer", + "logo_uploading": "Téléversement …", + "logo_drop": "+ Téléverser le logo", + "err_upload": "Échec du téléversement", + "err_remove": "Échec du retrait", + "label_name": "Nom *", + "label_street": "Rue + n° *", + "label_zip": "CP *", + "label_city": "Ville *", + "label_country": "Pays", + "placeholder_street": "Bahnhofstrasse 1", + "placeholder_zip": "8000", + "placeholder_city": "Zurich", + "placeholder_country": "CH", + "legacy_address_summary": "Afficher une adresse différente dans le PDF (champ libre)", + "legacy_address_hint": "Utilisé seulement si les champs structurés ci-dessus sont vides. Pratique pour les boîtes postales / adresses c/o qui ne rentrent pas dans le schéma rue+CP+ville.", + "legacy_address_placeholder": "Case postale 123\n8021 Zurich", + "label_email": "E-mail *", + "label_vat": "Numéro de TVA", + "placeholder_vat": "CHE-123.456.789 MWST", + "label_iban": "IBAN *", + "placeholder_iban": "CH93 0076 2011 6238 5295 7", + "label_bic": "BIC", + "label_footer": "Pied de page", + "placeholder_footer": "Mention sous chaque facture (p. ex. mentions légales)", + "label_prefix": "Préfixe", + "label_padding": "Chiffres", + "label_next_number": "Prochain numéro", + "label_currency": "Devise", + "label_vat_rate": "Taux de TVA", + "label_due_days": "Délai de paiement (jours)", + "label_terms": "CGV / conditions de paiement par défaut", + "placeholder_terms": "Payable sous 30 jours net.", + "saving": "Enregistrement …", + "save": "Enregistrer", + "saved_at": "Enregistré à {time}" + }, + "vat_ch": { + "v0": "0% (exonéré)", + "v2_6": "2.6% (réduit)", + "v3_8": "3.8% (hébergement)", + "v8_1": "8.1% (taux normal)" + }, + "vat_de": { + "v0": "0%", + "v7": "7% (réduit)", + "v19": "19% (taux normal)" + }, + "widget": { + "title": "Factures", + "all_link": "Toutes →", + "empty": "Aucune facture émise.", + "create_first": "Première facture", + "open": "En attente", + "overdue": "En retard", + "overdue_count": "{count} factures", + "days_overdue": "{n} jours de retard" + }, + "routes": { + "detail_title_fallback": "Facture", + "detail_doc_title": "{number} - Mana", + "detail_route_title": "Facture", + "not_found": "Facture introuvable.", + "back_to_list": "Retour à la liste", + "loading": "Chargement …", + "edit_doc_title": "Modifier facture - Mana", + "edit_heading": "Modifier facture {number}", + "not_editable_title": "La facture ne peut pas être modifiée", + "not_editable_body_pre": "Seuls les brouillons sont modifiables. Cette facture a le statut ", + "not_editable_body_post": ". Pour modifier une facture envoyée, annule-la et duplique-la en nouveau brouillon.", + "back_to_detail": "Retour au détail", + "new_doc_title": "Nouvelle facture - Mana", + "new_heading": "Nouvelle facture", + "new_subtitle": "Créer un brouillon — ne sera pas envoyé avant l'enregistrement.", + "settings_doc_title": "Paramètres factures — Mana", + "settings_heading": "Paramètres factures", + "settings_sub": "Émetteur, numérotation et valeurs par défaut" + } +} diff --git a/apps/mana/apps/web/src/lib/i18n/locales/invoices/it.json b/apps/mana/apps/web/src/lib/i18n/locales/invoices/it.json new file mode 100644 index 000000000..f79fdbe5a --- /dev/null +++ b/apps/mana/apps/web/src/lib/i18n/locales/invoices/it.json @@ -0,0 +1,241 @@ +{ + "list": { + "title": "Fatture", + "subtitle": "Emetti fatture e tieni traccia dei pagamenti", + "new_invoice": "+ Nuova fattura", + "settings_aria": "Impostazioni", + "stat_open": "Aperte", + "stat_overdue": "Scadute", + "stat_invoiced_ytd": "Fatturato {year}", + "stat_paid_ytd": "Pagato {year}", + "stat_count": "{count} fatture", + "chip_all": "Tutte", + "search_placeholder": "Cerca (numero, cliente, oggetto)", + "empty_title": "Nessuna fattura", + "empty_body": "Emetti la tua prima fattura — con export PDF e QR-Bill svizzera (M5).", + "empty_cta": "Crea prima fattura", + "empty_filtered": "Nessuna fattura trovata." + }, + "status": { + "draft": "Bozza", + "sent": "Inviata", + "paid": "Pagata", + "overdue": "Scaduta", + "void": "Annullata" + }, + "detail": { + "title_default": "Fattura", + "due": "Scadenza {date}", + "edit": "Modifica", + "send_via_mail": "Invia per e-mail", + "mark_sent": "Segna come inviata", + "mark_paid": "Segna come pagata", + "download_pdf": "Scarica PDF", + "duplicate": "Duplica", + "cancel": "Annulla", + "delete": "Elimina", + "confirm_void": "Annullare questa fattura?", + "confirm_delete": "Eliminare definitivamente la fattura?", + "action_mark_sent": "Segna come inviata", + "action_mark_paid": "Segna come pagata", + "action_void": "Annulla", + "action_duplicate": "Duplica", + "action_delete": "Elimina", + "err_action_failed": "{label} non riuscito", + "err_pdf_render": "Rendering PDF non riuscito", + "err_download": "Download non riuscito", + "err_pdf": "Errore PDF: {error}", + "preview_title": "Anteprima", + "preview_rendering": "Rendering …", + "preview_iframe_title": "Anteprima fattura {number}", + "qr_warning_strong": "QR-fattura non inclusa:", + "qr_open_settings": "Apri impostazioni →", + "raw_summary": "Mostra dati strutturati", + "section_recipient": "Destinatario", + "section_lines": "Righe", + "section_totals": "Totali", + "section_notes": "Note", + "section_terms": "Condizioni di pagamento", + "label_vat_number": "N. IVA: {number}", + "th_position": "Voce", + "th_quantity": "Quantità", + "th_unit_price": "Prezzo unit.", + "th_vat": "IVA", + "th_net": "Netto", + "total_label_net": "Netto", + "total_label_vat": "IVA {rate}%", + "total_label_total": "Totale", + "meta_status": "Stato: {label}", + "meta_sent": "Inviata: {date}", + "meta_paid": "Pagata: {date}" + }, + "form": { + "section_client": "Cliente", + "section_invoice": "Fattura", + "section_lines": "Righe", + "section_totals": "Totali", + "section_notes": "Note e condizioni di pagamento", + "label_subject": "Oggetto", + "placeholder_subject": "Consulenza aprile", + "label_currency": "Valuta", + "label_issue_date": "Data emissione", + "label_due_date": "Scadenza", + "label_notes": "Note (sotto le righe)", + "label_terms": "Condizioni di pagamento / T&C", + "cancel": "Annulla", + "saving": "Salvataggio …", + "submit_create": "Salva come bozza", + "submit_update": "Salva modifiche", + "err_client_required": "Il cliente è obbligatorio", + "err_min_one_line": "Aggiungi almeno una riga", + "err_save": "Salvataggio non riuscito", + "total_label_net": "Netto", + "total_label_vat": "IVA {rate}%", + "total_label_total": "Totale" + }, + "client_picker": { + "label": "Cliente *", + "placeholder": "Digita un nome o scegli dai contatti", + "suggest_contact": "dai contatti", + "suggest_invoice": "dalle fatture", + "fallback_unnamed": "Contatto senza nome", + "label_street": "Via + n.", + "label_zip": "CAP", + "label_city": "Città", + "label_country": "Paese", + "label_email": "E-mail", + "label_vat": "P. IVA / N. IVA", + "placeholder_street": "Bahnhofstrasse 1", + "placeholder_zip": "8000", + "placeholder_city": "Zurigo", + "placeholder_country": "CH", + "placeholder_email": "contatto@cliente.com", + "placeholder_vat": "CHE-123.456.789 MWST" + }, + "lines_editor": { + "th_position": "Voce", + "th_quantity": "Quantità", + "th_unit": "Unità", + "th_unit_price": "Prezzo unit.", + "th_vat": "IVA", + "th_total": "Totale", + "empty": "Ancora nessuna riga. Aggiungi la prima.", + "placeholder_title": "Titolo della riga", + "placeholder_unit": "h", + "add_line": "+ Riga", + "aria_move_up": "Sposta su", + "aria_move_down": "Sposta giù", + "aria_remove": "Rimuovi", + "label_total_net": "netto {amount}" + }, + "send_modal": { + "title": "Invia fattura {number}", + "close": "Chiudi", + "intro_pre": "Il PDF verrà scaricato e il client mail si aprirà con i campi precompilati. ", + "intro_strong": "Devi allegare il PDF manualmente", + "intro_post": " — Mana non può ancora allegarlo automaticamente.", + "label_to": "A", + "placeholder_to": "contatto@cliente.com", + "invalid_email_warn": "Non è un'e-mail valida — puoi correggerla nel client mail.", + "label_subject": "Oggetto", + "label_body": "Messaggio", + "cancel": "Annulla", + "open_and_download": "Apri e scarica", + "handoff_pdf": "PDF scaricato", + "handoff_mail": "Client mail aperto", + "handoff_hint": "Allega il PDF scaricato e invia la mail. Poi torna qui e segna la fattura come inviata.", + "later": "Più tardi", + "confirming_sent": "Marcatura …", + "confirm_sent": "La fattura è stata inviata", + "err_open_failed": "Apertura non riuscita", + "err_mark_failed": "Marcatura non riuscita" + }, + "sender_form": { + "loading": "Caricamento impostazioni …", + "section_sender": "Mittente", + "section_sender_hint": "Compare in testa a ogni fattura.", + "section_numbering": "Numerazione", + "section_numbering_hint_pre": "Prossima fattura: ", + "section_defaults": "Predefiniti", + "label_logo": "Logo", + "logo_alt": "Anteprima logo", + "logo_replace": "Sostituisci", + "logo_remove": "Rimuovi", + "logo_uploading": "Caricamento …", + "logo_drop": "+ Carica logo", + "err_upload": "Caricamento non riuscito", + "err_remove": "Rimozione non riuscita", + "label_name": "Nome *", + "label_street": "Via + n. *", + "label_zip": "CAP *", + "label_city": "Città *", + "label_country": "Paese", + "placeholder_street": "Bahnhofstrasse 1", + "placeholder_zip": "8000", + "placeholder_city": "Zurigo", + "placeholder_country": "CH", + "legacy_address_summary": "Mostra indirizzo alternativo nel PDF (testo libero)", + "legacy_address_hint": "Usato solo quando i campi strutturati sopra sono vuoti. Utile per caselle postali / indirizzi c/o che non rientrano nello schema via+CAP+città.", + "legacy_address_placeholder": "C.P. 123\n8021 Zurigo", + "label_email": "E-mail *", + "label_vat": "Numero IVA", + "placeholder_vat": "CHE-123.456.789 MWST", + "label_iban": "IBAN *", + "placeholder_iban": "CH93 0076 2011 6238 5295 7", + "label_bic": "BIC", + "label_footer": "Piè di pagina", + "placeholder_footer": "Nota sotto ogni fattura (es. avvisi legali)", + "label_prefix": "Prefisso", + "label_padding": "Cifre", + "label_next_number": "Prossimo numero", + "label_currency": "Valuta", + "label_vat_rate": "Aliquota IVA", + "label_due_days": "Termine di pagamento (giorni)", + "label_terms": "T&C / condizioni di pagamento predefinite", + "placeholder_terms": "Pagabile entro 30 giorni netti.", + "saving": "Salvataggio …", + "save": "Salva", + "saved_at": "Salvato alle {time}" + }, + "vat_ch": { + "v0": "0% (esente)", + "v2_6": "2.6% (ridotta)", + "v3_8": "3.8% (alloggio)", + "v8_1": "8.1% (standard)" + }, + "vat_de": { + "v0": "0%", + "v7": "7% (ridotta)", + "v19": "19% (standard)" + }, + "widget": { + "title": "Fatture", + "all_link": "Tutte →", + "empty": "Nessuna fattura emessa.", + "create_first": "Prima fattura", + "open": "Aperte", + "overdue": "Scadute", + "overdue_count": "{count} fatture", + "days_overdue": "{n} giorni di ritardo" + }, + "routes": { + "detail_title_fallback": "Fattura", + "detail_doc_title": "{number} - Mana", + "detail_route_title": "Fattura", + "not_found": "Fattura non trovata.", + "back_to_list": "Torna all'elenco", + "loading": "Caricamento …", + "edit_doc_title": "Modifica fattura - Mana", + "edit_heading": "Modifica fattura {number}", + "not_editable_title": "La fattura non può essere modificata", + "not_editable_body_pre": "Solo le bozze sono modificabili. Questa fattura ha stato ", + "not_editable_body_post": ". Per modificare una fattura inviata, annullala e duplicala come nuova bozza.", + "back_to_detail": "Torna al dettaglio", + "new_doc_title": "Nuova fattura - Mana", + "new_heading": "Nuova fattura", + "new_subtitle": "Crea una bozza — non verrà inviata fino al salvataggio.", + "settings_doc_title": "Impostazioni fatture — Mana", + "settings_heading": "Impostazioni fatture", + "settings_sub": "Mittente, numerazione e predefiniti" + } +} diff --git a/apps/mana/apps/web/src/lib/modules/invoices/ListView.svelte b/apps/mana/apps/web/src/lib/modules/invoices/ListView.svelte index d4c188876..362014336 100644 --- a/apps/mana/apps/web/src/lib/modules/invoices/ListView.svelte +++ b/apps/mana/apps/web/src/lib/modules/invoices/ListView.svelte @@ -4,9 +4,9 @@ search + row navigation. FAB → /invoices/new, settings icon → /invoices/settings. --> {#if !settings} -

Lade Einstellungen …

+

{$_('invoices.sender_form.loading')}

{:else}
{ @@ -106,17 +108,17 @@ class="form" >
-

Absender

-

Erscheint im Kopf jeder Rechnung.

+

{$_('invoices.sender_form.section_sender')}

+

{$_('invoices.sender_form.section_sender_hint')}

- Logo + {$_('invoices.sender_form.label_logo')}
{#if settings.logoMediaId} Logo-Vorschau
{:else} @@ -143,7 +145,9 @@ onclick={() => logoInput?.click()} disabled={uploadingLogo} > - {uploadingLogo ? 'Lädt hoch …' : '+ Logo hochladen'} + {uploadingLogo + ? $_('invoices.sender_form.logo_uploading') + : $_('invoices.sender_form.logo_drop')} {/if}
-

Nummernkreis

-

Nächste Rechnung: {nextPreview}

+

{$_('invoices.sender_form.section_numbering')}

+

+ {$_('invoices.sender_form.section_numbering_hint_pre')}{nextPreview} +

-

Standards

+

{$_('invoices.sender_form.section_defaults')}