/** * Was die Kasse selbst sagt — auf dem Bildschirm, in beiden Huellen. * * Die Browser-Kasse und die Kassen-App sind eine Kasse. Was der Kassier bei * einem Fehler liest, steht hier genau einmal; beide Apps beziehen den Satz * von hier, und wer ihn aendert, aendert ihn auf beiden Seiten oder gar nicht. * * Nicht hier: die fachlichen Saetze des Backends („Kopplungs-Code ist * abgelaufen.", „PIN falsch, noch 2 Versuche"). Die gehen unveraendert durch. * * Ein Satz sagt, was los ist, und was zu tun ist. Nie Innereien. * * Schluessel: `bereich.name`. Ein Schluessel wird nie umgedeutet — wer den * Sinn aendert, legt einen neuen an. `only` nennt die Seite, wenn ein Satz nur * auf einer Plattform vorkommen kann. * * Die Schluessel sind seit 1.0 englisch, die Texte bleiben deutsch. Welcher * Schluessel frueher wie hiess, steht in `fixtures/renames-1.0.json`, * ebenso die Strukturschluessel (`platzhalter` -> `placeholders`, `nur` -> * `only`), die Platzhalter und die Arten der Fehlerregeln (Abschnitte * `placeholders` und `structure`). */ import type { ReceiptOutput } from '../models/receipt-output.js'; import { type ErrorOutcome } from '../client/errors.js'; export type Surface = 'web' | 'app'; export interface TextEntry { readonly text: string; /** Erlaubte Platzhalter `{name}`; muessen exakt die im Text sein. */ readonly placeholders?: readonly string[]; /** Fehlt es, gilt der Satz fuer beide Seiten. */ readonly only?: readonly Surface[]; } declare const MELDUNGEN_ROH: { readonly 'network.no_connection': { readonly text: "Keine Verbindung zum Server. Bitte die Internetverbindung prüfen und erneut versuchen."; }; readonly 'network.timeout': { readonly text: "Der Server antwortet nicht. Bitte die Internetverbindung prüfen und erneut versuchen."; }; readonly 'network.outcome_unknown': { readonly text: "Der Server hat nicht geantwortet, der Vorgang kann trotzdem gebucht sein. Bitte vor einem neuen Versuch prüfen, ob der letzte Vorgang schon gebucht ist."; }; readonly 'server.unexpected': { readonly text: "Der Server hat unerwartet geantwortet (HTTP {status}). Bitte den Support verständigen."; readonly placeholders: readonly ["status"]; }; readonly 'server.connection_disturbed': { readonly text: "Die Verbindung zum Kassenserver ist gestört. Bitte kurz warten und erneut versuchen."; }; readonly 'server.response_unreadable': { readonly text: "Die Antwort des Kassenservers war nicht lesbar. Bitte die Kasse neu öffnen und vor einem neuen Versuch prüfen, ob der letzte Vorgang schon gebucht ist."; }; readonly 'pairing.code_missing': { readonly text: "Bitte den Kopplungs-Code eingeben."; }; readonly 'pairing.failed': { readonly text: "Die Kopplung ist fehlgeschlagen. Bitte erneut versuchen."; }; readonly 'pairing.incomplete': { readonly text: "Die Kopplung ist unvollständig zurückgekommen. Bitte im Panel einen neuen Code erzeugen und noch einmal versuchen."; }; readonly 'device.browser_storage': { readonly text: "Dieses Gerät konnte nicht gespeichert werden – der Browser-Speicher steht nicht zur Verfügung. Bitte den privaten Modus verlassen."; readonly only: readonly ["web"]; }; readonly 'login.pin_missing': { readonly text: "Bitte die PIN eingeben."; }; readonly 'login.failed': { readonly text: "Die Anmeldung ist fehlgeschlagen. Bitte erneut versuchen."; }; readonly 'login.not_completed': { readonly text: "Die Anmeldung konnte nicht abgeschlossen werden. Bitte erneut versuchen."; }; readonly 'login.completing': { readonly text: "Anmeldung wird gerade abgeschlossen – bitte gleich noch einmal drücken."; }; readonly 'session.expired': { readonly text: "Die Sitzung ist abgelaufen. Bitte erneut anmelden."; }; readonly 'session.expired_offline': { readonly text: "Keine Verbindung zum Server – die Sitzung ist abgelaufen. Bitte erneut anmelden."; }; readonly 'session.none': { readonly text: "Keine Sitzung."; }; readonly 'session.logging_out': { readonly text: "Kasse meldet in {seconds} s ab – Bildschirm berühren, um weiterzuarbeiten."; readonly placeholders: readonly ["seconds"]; }; readonly 'logout.press_again': { readonly text: "Noch einmal drücken beendet die Schicht an dieser Kasse."; }; readonly 'logout.cart_cleared': { readonly text: "Noch einmal drücken meldet dich ab – der Warenkorb wird geleert."; }; readonly 'permissions.not_changeable': { readonly text: "Das darfst du nicht ändern – das Recht dafür vergibt der Inhaber im Panel."; }; readonly 'cashregister.load_failed': { readonly text: "Die Kasse konnte nicht geladen werden."; }; readonly 'articles.load_failed': { readonly text: "Die Artikel konnten nicht geladen werden."; }; readonly 'articles.none_enabled': { readonly text: "Keine Artikel an dieser Kasse. Im Panel unter „Kacheln & Gruppen“ freischalten."; }; readonly 'articles.none_found': { readonly text: "Keine Artikel gefunden."; }; readonly 'articles.vat_rate_unknown': { readonly text: "„{name}“ hat einen Steuersatz, den die Kasse nicht kennt."; readonly placeholders: readonly ["name"]; }; readonly 'item.amount_missing': { readonly text: "Bitte einen Betrag eingeben."; }; readonly 'item.description_missing': { readonly text: "Bitte eine Bezeichnung eingeben – sie steht am Beleg."; }; readonly 'discount.percent_invalid': { readonly text: "Bitte einen Prozentwert zwischen 0,1 und 100 eingeben."; }; readonly 'checkout.nothing_entered': { readonly text: "Noch nichts erfasst – bitte zuerst eine Position aufnehmen."; }; readonly 'checkout.tendered_missing': { readonly text: "Erst eintippen, was der Gast gibt – der Rückgeld-Rechner ist an."; }; readonly 'checkout.tendered_too_little': { readonly text: "Gegeben ist weniger als der Betrag."; }; readonly 'checkout.locked': { readonly text: "Kassieren gesperrt: {reason}"; readonly placeholders: readonly ["reason"]; }; readonly 'tip.over_half': { readonly text: "Über 50 % Trinkgeld – wirklich? Steuerfrei ist nur ortsübliches Trinkgeld."; }; readonly 'tip.kept_setting_hint': { readonly text: "Der Mitarbeiter steckt das Bar-Trinkgeld beim Verkauf gleich ein: es zählt nicht ins Soll der Lade und gilt als schon genommen. An der Kasse lässt es sich je Verkauf umstellen."; }; readonly 'completion.failed': { readonly text: "Der Abschluss ist fehlgeschlagen."; }; readonly 'completion.unknown': { readonly text: "Unklar, ob der Beleg entstanden ist – die Antwort kam nicht an. Bitte nicht noch einmal abschließen: der Beleg kann bereits erstellt und signiert sein. Im Panel unter „Belege“ nachsehen; nur wenn er dort fehlt, den Verkauf erneut abschließen."; }; readonly 'completion.zero_receipt_failed': { readonly text: "Der Nullbeleg konnte nicht erstellt werden."; }; readonly 'completion.signature_down': { readonly text: "Die Signatureinheit hat nicht geantwortet. Der Beleg ist gültig und trägt den Vermerk „Sicherheitseinrichtung ausgefallen“."; }; readonly 'completion.resolve_question': { readonly text: "Nur erledigen, wenn der Beleg in der Belegliste steht – sonst bleiben {amount} ohne Beleg. Bitte zuerst unter „Belege“ nachsehen."; readonly placeholders: readonly ["amount"]; }; readonly 'card_payment.not_possible': { readonly text: "Kartenzahlung nicht möglich."; }; readonly 'card_payment.not_completed': { readonly text: "Die Kartenzahlung ist nicht zustande gekommen."; }; readonly 'card_payment.not_started': { readonly text: "Kartenzahlung nicht gestartet: {reason}"; readonly placeholders: readonly ["reason"]; }; readonly 'card_payment.unknown': { readonly text: "Unklar, ob die Kartenzahlung durchgegangen ist – die Verbindung zum Terminal riss ab. Bitte am Terminal-Beleg nachsehen, BEVOR neu kassiert wird: die Karte kann belastet sein."; }; readonly 'card_payment.unknown_with_id': { readonly text: "Unklar, ob die Kartenzahlung durchgegangen ist – die Verbindung zum Terminal riss ab. Bitte am Terminal-Beleg nachsehen, BEVOR neu kassiert wird: die Karte kann belastet sein. Kennung der Zahlung: {reference}."; readonly placeholders: readonly ["reference"]; }; readonly 'card_payment.waiting_for_terminal': { readonly text: "Bitte am Terminal fortfahren …"; }; readonly 'card_payment.terminal_cancelling': { readonly text: "Das Terminal bricht gleich von selbst ab …"; }; readonly 'card_payment.card_charged_receipt_open': { readonly text: "Die Karte ist bereits mit {amount} belastet (Kennung {reference}) – der Beleg dazu fehlt noch. Bitte jetzt den Beleg erstellen und nicht erneut kassieren."; readonly placeholders: readonly ["amount", "reference"]; }; readonly 'card_payment.card_charged_cart_changed': { readonly text: "Es gibt eine gebuchte Kartenzahlung über {amount} (Kennung {reference}), aber der Korb hat sich seither geändert. Bitte zuerst entscheiden: den Beleg zur gebuchten Zahlung erstellen oder die Zahlung am Terminal stornieren und hier verwerfen."; readonly placeholders: readonly ["amount", "reference"]; }; readonly 'card_payment.connect_not_connected': { readonly text: "Kartenzahlung nicht möglich: Kasseneck Connect ist nicht verbunden – Einstellungen → Kasseneck Connect."; readonly only: readonly ["web"]; }; readonly 'card_payment.cart_locked_card_charged': { readonly text: "Die Karte ist bereits belastet – Warenkorb, Rabatt und Trinkgeld bleiben gesperrt, bis der Beleg entsteht oder die Karte zurückerstattet ist."; }; readonly 'card_payment.unpair_card_charged': { readonly text: "Auf diesem Gerät liegt noch eine gebuchte Kartenzahlung ohne Beleg – sie muss von Hand am Terminal zurückerstattet werden (Betrag siehe unten)."; }; readonly 'terminal.none_found': { readonly text: "Kein Hobex-Terminal gefunden – ist es eingeschaltet und im selben Netz wie dieser Rechner?"; readonly only: readonly ["web"]; }; readonly 'terminal.not_ready': { readonly text: "Terminal antwortet, ist aber nicht betriebsbereit: {response} – TID prüfen."; readonly placeholders: readonly ["response"]; readonly only: readonly ["web"]; }; readonly 'gptom.app_missing': { readonly text: "Die GP-Tom-App ist auf diesem Gerät nicht da."; readonly only: readonly ["app"]; }; readonly 'gptom.search_failed': { readonly text: "GP Tom: Suche nach der App fehlgeschlagen: {reason}"; readonly placeholders: readonly ["reason"]; readonly only: readonly ["app"]; }; readonly 'gptom.payment_failed': { readonly text: "GP Tom: Zahlung fehlgeschlagen: {reason}"; readonly placeholders: readonly ["reason"]; readonly only: readonly ["app"]; }; readonly 'gptom.terminal_not_responding': { readonly text: "Das Terminal hat nicht geantwortet: {reason}"; readonly placeholders: readonly ["reason"]; readonly only: readonly ["app"]; }; readonly 'gptom.payment_not_completed': { readonly text: "Die Zahlung wurde nicht abgeschlossen ({code})."; readonly placeholders: readonly ["code"]; readonly only: readonly ["app"]; }; readonly 'gptom.declined': { readonly text: "Das Terminal hat die Zahlung abgelehnt."; readonly only: readonly ["app"]; }; readonly 'gptom.declined_with_code': { readonly text: "Das Terminal hat die Zahlung abgelehnt ({code})."; readonly placeholders: readonly ["code"]; readonly only: readonly ["app"]; }; readonly 'gptom.not_opened': { readonly text: "GP Tom ließ sich nicht öffnen – bitte die GP-Tom-App prüfen und erneut versuchen."; readonly only: readonly ["app"]; }; readonly 'gptom.timeout': { readonly text: "Das Terminal hat in der Frist nicht geantwortet – die Karte kann belastet sein. Bitte am Terminal-Beleg nachsehen, BEVOR neu kassiert wird."; readonly only: readonly ["app"]; }; readonly 'gptom.timeout_with_id': { readonly text: "Das Terminal hat in der Frist nicht geantwortet – die Karte kann belastet sein. Bitte am Terminal-Beleg nachsehen, BEVOR neu kassiert wird. Kennung der Zahlung: {reference}."; readonly placeholders: readonly ["reference"]; readonly only: readonly ["app"]; }; readonly 'log.empty': { readonly text: "Noch keine Einträge – das Protokoll füllt sich mit der ersten Kartenzahlung."; }; readonly 'log.copied': { readonly text: "Das Protokoll liegt in der Zwischenablage."; }; readonly 'receipts.load_failed': { readonly text: "Die Belege konnten nicht geladen werden."; }; readonly 'receipts.none_in_period': { readonly text: "Keine Belege in diesem Zeitraum."; }; readonly 'receipt.load_failed': { readonly text: "Der Beleg konnte nicht geladen werden."; }; readonly 'receipt.not_found': { readonly text: "Der Beleg wurde nicht gefunden."; }; readonly 'cancellation.failed': { readonly text: "Das Storno ist fehlgeschlagen."; }; readonly 'cancellation.reason_missing': { readonly text: "Bitte einen Grund wählen."; }; readonly 'cancellation.item_missing': { readonly text: "Bitte mindestens eine Position wählen."; }; readonly 'cancellation.payments_missing': { readonly text: "Dieser Beleg wurde in mehreren Zahlungen bezahlt – bitte angeben, wie zurückgegeben wird."; }; readonly 'cancellation.refund_too_high': { readonly text: "Eine Rückgabe ist höher als der Rest ihrer Zahlung – bitte die Beträge prüfen."; }; readonly 'cancellation.refund_without_reference': { readonly text: "Eine Rückgabe nennt keine Zahlung des Belegs – bitte das Storno neu beginnen."; }; readonly 'cancellation.refund_reference_unknown': { readonly text: "Eine Rückgabe nennt eine Zahlung, die es am Beleg nicht gibt – bitte das Storno neu beginnen."; }; readonly 'cancellation.outcome_unknown': { readonly text: "Unklar, ob das Storno entstanden ist – es kann bereits signiert sein. Bitte nicht erneut stornieren, sondern die Belegliste in ein paar Minuten neu laden."; }; readonly 'cancellation.sum_mismatch': { readonly text: "Die Rückgaben ergeben nicht den Betrag des Stornos – bitte die Beträge prüfen."; }; readonly 'cancellation.refund_cards': { readonly text: "Das Storno ist gebucht – bitte jede Karte unten am Terminal gutschreiben und abhaken."; }; readonly 'cancellation.outcome_unknown_cards': { readonly text: "Unklar, ob das Storno entstanden ist – es kann bereits signiert sein. Bitte nicht erneut stornieren und noch keine Karte gutschreiben, sondern die Belegliste in ein paar Minuten neu laden. Steht das Storno dort, die Karten laut Storno-Beleg am Terminal gutschreiben."; }; readonly 'cancellation.cards_not_checked': { readonly text: "Noch ist nicht jede Karte abgehakt – bitte jede am Terminal gutschreiben. Ist das schon geschehen, zum Schließen noch einmal drücken."; }; readonly 'cancellation.input_rejected': { readonly text: "Die Eingabe wurde abgelehnt – bitte das Storno neu beginnen."; }; readonly 'cancellation.tip_refund_missing': { readonly text: "Bitte wählen: Trinkgeld auch zurückgeben?"; }; readonly 'cancellation.tip_source_missing': { readonly text: "Bitte wählen: Woher kommt das Trinkgeld zurück?"; }; readonly 'cancellation.tip_refunded_with_voucher': { readonly text: "Beleg mit Gutschein: Das Trinkgeld wird mitstorniert."; }; readonly 'voucher_error.not_found': { readonly text: "Diesen Gutschein gibt es in diesem Betrieb nicht."; }; readonly 'voucher_error.invalid': { readonly text: "Dieser Gutschein ist nicht gültig."; }; readonly 'voucher_error.invalid_code': { readonly text: "Der Code ist nicht vollständig oder falsch abgetippt."; }; readonly 'voucher_error.expired': { readonly text: "Der Gutschein ist abgelaufen."; }; readonly 'voucher_error.used_up': { readonly text: "Der Gutschein ist bereits aufgebraucht."; }; readonly 'voucher_error.blocked': { readonly text: "Der Gutschein ist gesperrt."; }; readonly 'voucher_error.cancelled': { readonly text: "Der Gutschein wurde storniert."; }; readonly 'voucher_error.insufficient_balance': { readonly text: "Auf dem Gutschein ist nicht genug Guthaben."; }; readonly 'voucher_error.exceeds_total': { readonly text: "Der Gutschein deckt mehr, als offen ist. Bitte den Betrag anpassen."; }; readonly 'voucher_error.balance_changed': { readonly text: "Der Gutschein wurde gerade anderswo verwendet. Bitte neu prüfen."; }; readonly 'voucher_error.rate_mismatch': { readonly text: "Dieser Gutschein gilt nur für Leistungen mit {rate} %."; readonly placeholders: readonly ["rate"]; }; readonly 'voucher_error.item_mismatch': { readonly text: "Dieser Gutschein gilt nicht für die gewählten Positionen."; }; readonly 'voucher_error.already_used': { readonly text: "Dieser Gutschein wurde bereits verwendet."; }; readonly 'voucher_error.partial_cancel': { readonly text: "Belege mit Gutschein lassen sich nur ganz stornieren."; }; readonly 'voucher_error.settings_missing': { readonly text: "Die Gutschein-Einstellungen fehlen. Bitte die Kasse neu laden."; }; readonly 'voucher_error.too_many_checks': { readonly text: "Zu viele Versuche. Bitte in einer Stunde wieder."; }; readonly 'voucher_error.sale_off': { readonly text: "Gutscheine verkaufen geht hier noch nicht."; }; readonly 'voucher.reentry_needed': { readonly text: "Die Karte ist belastet, der Beleg fehlt noch: zu jedem Gutschein den Code erneut eingeben, dann den Beleg abschließen."; }; readonly 'voucher.reentry_mismatch': { readonly text: "Mit diesen Gutscheinen ergibt der Beleg nicht mehr den belasteten Betrag – die Karte zurückbuchen."; }; readonly 'voucher.not_this_voucher': { readonly text: "Das ist nicht der Gutschein ····-{suffix}."; readonly placeholders: readonly ["suffix"]; }; readonly 'voucher.reentry_no_permission': { readonly text: "Die Karte ist belastet, der Beleg fehlt noch: den Gutschein-Code kann nur jemand mit dem Recht zum Einlösen nachtragen – sonst die Karte zurückbuchen."; }; readonly 'voucher.already_covered': { readonly text: "Diese Positionen deckt schon ein anderer Gutschein."; }; readonly 'voucher.payout_reason_too_long': { readonly text: "Der Grund hat höchstens 200 Zeichen."; }; readonly 'voucher.payout_reason_missing': { readonly text: "Für die Auszahlung fehlt der Grund."; }; readonly 'voucher.payout_check_first': { readonly text: "Die letzte Auszahlung ging unklar aus und kann schon gebucht sein. Erst unter „Belege“ die Liste neu laden und nachsehen, dann ist eine neue möglich."; }; readonly 'voucher.sale_max_amount': { readonly text: "Höchstens {amount} je Gutschein."; readonly placeholders: readonly ["amount"]; }; readonly 'voucher.sale_not_at_terminal': { readonly text: "Gutscheine mit Karte am Terminal zu verkaufen geht an dieser Kasse noch nicht – bar kassieren."; }; readonly 'voucher.no_redeem_with_sale': { readonly text: "Auf einem Beleg, der Gutscheine verkauft, lässt sich kein Gutschein einlösen."; }; readonly 'voucher.code_not_on_receipt': { readonly text: "Der Code steht nicht auf dem Bon – jetzt auf den Gutschein schreiben."; }; readonly 'cancellation.voucher_sale_cancelled': { readonly text: "Der Gutschein ····-{suffix} wird mitstorniert und gilt danach nicht mehr."; readonly placeholders: readonly ["suffix"]; }; readonly 'cancellation.promo_valid_again': { readonly text: "Der Aktionsgutschein ····-{suffix} gilt danach wieder."; readonly placeholders: readonly ["suffix"]; }; readonly 'split.setting_hint': { readonly text: "Ein Tisch zahlt in Teilen: jede Zahlung bar oder mit Karte, mit eigenem Trinkgeld – am Ende ein Beleg für alles."; }; readonly 'split.amount_over_open': { readonly text: "Der Betrag ist höher als offen – höchstens {amount}."; readonly placeholders: readonly ["amount"]; }; readonly 'split.tip_over_amount': { readonly text: "Das Trinkgeld ist höher als der Betrag dieser Zahlung."; }; readonly 'split.tendered_too_little': { readonly text: "Gegeben ist weniger als der Betrag dieser Zahlung."; }; readonly 'split.still_open': { readonly text: "Es sind noch {amount} offen – abschließen geht erst, wenn alles kassiert ist."; readonly placeholders: readonly ["amount"]; }; readonly 'split.sum_mismatch': { readonly text: "Die Zahlungen ergeben nicht den Betrag des Belegs – bitte die Liste prüfen."; }; readonly 'split.cart_locked': { readonly text: "Der Warenkorb ist gesperrt, solange Zahlungen kassiert sind – erst abschließen oder die Zahlungen entfernen."; }; readonly 'split.switch_locked': { readonly text: "Zurück zu Bar oder Karte geht erst, wenn keine Zahlung mehr kassiert ist."; }; readonly 'split.return_cash': { readonly text: "Bitte {amount} Bargeld an den Gast zurückgeben."; readonly placeholders: readonly ["amount"]; }; readonly 'split.card_reverse_running': { readonly text: "Die Kartenzahlung über {amount} wird am Terminal zurückgebucht …"; readonly placeholders: readonly ["amount"]; }; readonly 'split.card_reversed': { readonly text: "Die Kartenzahlung über {amount} ist am Terminal zurückgebucht."; readonly placeholders: readonly ["amount"]; }; readonly 'split.card_reverse_failed': { readonly text: "Die Kartenzahlung über {amount} (Kennung {reference}) ließ sich nicht zurückbuchen – sie bleibt in der Liste. Bitte am Terminal-Beleg nachsehen und erneut versuchen."; readonly placeholders: readonly ["amount", "reference"]; }; readonly 'split.card_reverse_unknown': { readonly text: "Unklar, ob die Rückbuchung über {amount} (Kennung {reference}) durchgegangen ist – die Zahlung bleibt in der Liste. Bitte am Terminal-Beleg nachsehen, BEVOR erneut zurückgebucht wird."; readonly placeholders: readonly ["amount", "reference"]; }; readonly 'split.card_already_reversed': { readonly text: "Das Terminal meldet, dass die Kartenzahlung über {amount} bereits gutgeschrieben wurde (Kennung {reference}) – bitte am Terminal-Beleg prüfen und nicht erneut zurückbuchen."; readonly placeholders: readonly ["amount", "reference"]; }; readonly 'split.external_reverse': { readonly text: "Diese Karte ist nicht an die Kasse angebunden. Bitte {amount} jetzt am Terminal zurückbuchen und danach bestätigen."; readonly placeholders: readonly ["amount"]; }; readonly 'split.session_open': { readonly text: "Eine getrennte Zahlung ist nicht abgeschlossen, {amount} sind schon kassiert. Bitte weiter kassieren oder alles zurückbuchen."; readonly placeholders: readonly ["amount"]; }; readonly 'split.session_unreadable': { readonly text: "Eine gespeicherte getrennte Zahlung auf diesem Gerät ließ sich nicht lesen – bitte prüfen, ob schon Karten belastet wurden (Kasseneck-Panel oder Terminal), und offene Beträge von Hand ausgleichen."; }; readonly 'split.storage_failed': { readonly text: "Die getrennte Zahlung ließ sich auf diesem Gerät nicht speichern – bitte die Kasse bis zum Abschluss dieses Belegs nicht neu laden, sonst stehen belastete Karten womöglich nicht mehr in der Liste."; }; readonly 'split.too_many_payments': { readonly text: "Ein Beleg lässt höchstens 20 Zahlungen zu."; }; readonly 'split.unpair_open_cards': { readonly text: "Auf diesem Gerät ist noch eine getrennte Zahlung mit belasteten Karten offen – sie müssen von Hand am Terminal zurückgebucht werden (Beträge siehe unten)."; }; readonly 'split.items_locked': { readonly text: "Nach Positionen geht nicht mehr – eine Zahlung ist schon als Betrag kassiert."; }; readonly 'split.select_items': { readonly text: "Bitte zuerst antippen, was dieser Gast zahlt."; }; readonly 'split.tendered_missing': { readonly text: "Erst eintippen, was der Gast für diese Zahlung gibt – der Rückgeld-Rechner ist an."; }; readonly 'receipt.link_copied': { readonly text: "Der Link zum Beleg liegt in der Zwischenablage."; }; readonly 'receipt.share_text': { readonly text: "Beleg {number} von {business} über {amount}: {link}"; readonly placeholders: readonly ["business", "number", "amount", "link"]; }; readonly 'receipt.not_shareable': { readonly text: "Für diesen Beleg gibt es keinen Link – er stammt aus einer älteren Kasse."; }; readonly 'receipt.test_hint_share': { readonly text: "Test-Umgebung – der Beleg ist steuerlich nicht gültig."; }; readonly 'receipt.mail_sent': { readonly text: "Der Beleg wurde an {recipient} gesendet."; readonly placeholders: readonly ["recipient"]; }; readonly 'receipt.mail_address_invalid': { readonly text: "Diese E-Mail-Adresse ist nicht gültig."; }; readonly 'receipt.mail_too_often': { readonly text: "Dieser Beleg wurde schon oft gesendet – bitte später noch einmal."; }; readonly 'receipt.mail_failed': { readonly text: "Der Beleg konnte nicht gesendet werden. Bitte noch einmal versuchen."; }; readonly 'receipt.mail_not_found': { readonly text: "Dieser Beleg wurde nicht gefunden – er konnte nicht gesendet werden."; }; readonly 'print.failed': { readonly text: "Der Ausdruck ist fehlgeschlagen."; }; readonly 'print.not_possible': { readonly text: "Druck nicht möglich: {reason}"; readonly placeholders: readonly ["reason"]; }; readonly 'print.test_print_failed': { readonly text: "Der Testdruck ist fehlgeschlagen."; }; readonly 'print.test_print_not_possible': { readonly text: "Der Testdruck ist fehlgeschlagen: {reason}"; readonly placeholders: readonly ["reason"]; }; readonly 'print.no_printer': { readonly text: "Kein Bondrucker eingerichtet – in den Einstellungen unter Drucker & Lade."; }; readonly 'print.printer_unreachable': { readonly text: "Drucker nicht erreichbar."; }; readonly 'print.job_expired': { readonly text: "Drucker hat den Beleg nicht abgeholt (abgelaufen)."; readonly only: readonly ["web"]; }; readonly 'print.no_printer_found': { readonly text: "Kein Drucker gefunden – ist er eingeschaltet und im selben Netz wie dieser Rechner?"; readonly only: readonly ["web"]; }; readonly 'print.chrome_only': { readonly text: "{channel}-Druck geht nur in Chrome oder Edge (Windows, Mac, Android) – nicht in Safari und nicht am iPad."; readonly placeholders: readonly ["channel"]; readonly only: readonly ["web"]; }; readonly 'print.no_printer_for_channel': { readonly text: "Kein {channel}-Drucker verbunden – „{channel}-Drucker verbinden“ und den Drucker im Dialog wählen."; readonly placeholders: readonly ["channel"]; readonly only: readonly ["web"]; }; readonly 'print.wizard_connect': { readonly text: "Verbinde mit {name} …"; readonly placeholders: readonly ["name"]; }; readonly 'print.wizard_test_print_question': { readonly text: "Ist der Testdruck gekommen?"; }; readonly 'print.wizard_qr_question': { readonly text: "Welcher QR-Code ist sauber gedruckt?"; }; readonly 'print.wizard_qr_none_hint': { readonly text: "Kein QR-Code kam sauber – der Beleg zeigt den QR-Code dann am Bildschirm."; }; readonly 'print.wizard_nothing_arrived': { readonly text: "Nichts gekommen? Drucker an, Papier drin, richtiges Gerät gewählt?"; }; readonly 'print.wizard_saved': { readonly text: "{name} ist eingerichtet."; readonly placeholders: readonly ["name"]; }; readonly 'print.wizard_cancelled': { readonly text: "Nichts gespeichert."; }; readonly 'codetable.question': { readonly text: "In welcher Zeile steht kein falsches Zeichen?"; }; readonly 'codetable.question_hint': { readonly text: "Lücken sind in Ordnung."; }; readonly 'codetable.instruction': { readonly text: "Die Zeile, in der KEIN falsches Zeichen steht. Eine Lücke ist in Ordnung. Passen mehrere, die mit den wenigsten Lücken."; }; readonly 'codetable.instruction_none': { readonly text: "Passt keine: {number}."; readonly placeholders: readonly ["number"]; }; readonly 'bluetooth.off': { readonly text: "Bluetooth ist ausgeschaltet. Bitte einschalten und erneut suchen."; readonly only: readonly ["app"]; }; readonly 'bluetooth.permission_missing': { readonly text: "Bitte die Freigabe in den Geräte-Einstellungen erteilen."; readonly only: readonly ["app"]; }; readonly 'bluetooth.search_failed': { readonly text: "Die Suche ist fehlgeschlagen: {reason}"; readonly placeholders: readonly ["reason"]; readonly only: readonly ["app"]; }; readonly 'connect.not_responding': { readonly text: "Kasseneck Connect antwortet nicht – läuft das Programm auf diesem Rechner?"; readonly only: readonly ["web"]; }; readonly 'connect.code_expired': { readonly text: "Der Kopplungs-Code ist abgelaufen – im Agent einen neuen erzeugen („kasseneck-connect pair“)."; readonly only: readonly ["web"]; }; readonly 'connect.too_many_attempts': { readonly text: "Zu viele Fehlversuche – eine Minute warten und noch einmal versuchen."; readonly only: readonly ["web"]; }; readonly 'connect.printer_not_responding': { readonly text: "Der Drucker antwortet nicht – Strom, Netzwerk und IP prüfen."; readonly only: readonly ["web"]; }; readonly 'connect.not_paired': { readonly text: "Diese Kasse ist mit Kasseneck Connect nicht gekoppelt – in den Einstellungen „Koppeln“ drücken."; readonly only: readonly ["web"]; }; readonly 'connect.printer_unknown': { readonly text: "Diesen Drucker kennt Kasseneck Connect nicht (mehr) – bitte neu suchen."; readonly only: readonly ["web"]; }; readonly 'connect.origin_not_allowed': { readonly text: "Kasseneck Connect nimmt von dieser Adresse nichts an (Ursprung nicht freigegeben)."; readonly only: readonly ["web"]; }; readonly 'connect.not_installed': { readonly text: "Kasseneck Connect nicht gefunden – bitte installieren."; readonly only: readonly ["web"]; }; readonly 'connect.unpair_question': { readonly text: "Diesen Browser wirklich von Connect trennen? Der Bondruck geht dann nicht mehr."; readonly only: readonly ["web"]; }; readonly 'settings.load_failed': { readonly text: "Die Einstellungen konnten nicht geladen werden."; }; readonly 'settings.save_failed': { readonly text: "Die Einstellung konnte nicht gespeichert werden."; }; readonly 'settings.not_loaded_yet': { readonly text: "Noch nicht geladen – bitte kurz warten oder neu anmelden."; }; readonly 'settings.ip_invalid': { readonly text: "Keine gültige IP-Adresse (z. B. 192.168.1.50)."; }; readonly 'unpairing.failed': { readonly text: "Entkoppeln fehlgeschlagen."; }; readonly 'logo.upload_failed': { readonly text: "Hochladen fehlgeschlagen."; }; readonly 'logo.remove_failed': { readonly text: "Entfernen fehlgeschlagen."; }; readonly 'stocktake.none_open': { readonly text: "An diesem Standort läuft gerade keine Inventur. Eine Inventur legt der Inhaber im Panel an."; }; readonly 'stocktake.scan_or_search': { readonly text: "Artikel scannen oder suchen."; }; readonly 'stocktake.counted': { readonly text: "{name}: {quantity} gezählt."; readonly placeholders: readonly ["name", "quantity"]; }; readonly 'stocktake.blind_hint': { readonly text: "Blind zählen – die Kasse zeigt keinen Buchbestand. Bitte zählen, was wirklich da ist."; }; readonly 'stocktake.recount_hint': { readonly text: "Bitte die markierten Positionen nachzählen."; }; readonly 'stocktake.unknown_code': { readonly text: "Zu „{code}“ gibt es keinen Artikel. Bitte den Code prüfen oder den Artikel suchen."; readonly placeholders: readonly ["code"]; }; readonly 'stocktake.quantity_invalid': { readonly text: "Bitte eine gültige Menge eingeben – höchstens drei Nachkommastellen, bei Stückware nur ganze Zahlen."; }; readonly 'stocktake.serials_capture': { readonly text: "Bitte für jedes Stück die Seriennummer scannen."; }; readonly 'stocktake.serials_mismatch': { readonly text: "Je Stück genau eine Seriennummer: {count} erfasst, {quantity} gezählt."; readonly placeholders: readonly ["count", "quantity"]; }; readonly 'stocktake.reason_missing': { readonly text: "Bitte einen Grund für das Stornieren eingeben."; }; readonly 'stocktake.outcome_unknown': { readonly text: "Unklar, ob die Zählung angekommen ist. „Erneut senden“ schickt dieselbe Zählung – sie zählt auch dann nur einmal."; }; readonly 'shift.required': { readonly text: "Bitte zuerst die Schicht öffnen."; }; readonly 'shift.required_other': { readonly text: "Die Schicht muss ein berechtigter Mitarbeiter öffnen."; }; readonly 'shift.recount': { readonly text: "Der gezählte Betrag weicht ab – bitte noch einmal zählen."; }; readonly 'shift.comment_required': { readonly text: "Die Abweichung ist größer als erlaubt – bitte kurz begründen."; }; readonly 'shift.closed': { readonly text: "Schicht {number} geschlossen."; readonly placeholders: readonly ["number"]; }; readonly 'shift.long_open': { readonly text: "Die Schicht läuft seit {since}."; readonly placeholders: readonly ["since"]; }; readonly 'shift.already_open': { readonly text: "An dieser Lade läuft schon eine Schicht."; }; readonly 'shift.already_closed': { readonly text: "Diese Schicht ist schon geschlossen."; }; readonly 'shift.recount_exhausted': { readonly text: "Es wurde schon zweimal gezählt. Bitte den Betrag der zweiten Zählung senden oder den Chef rufen."; }; readonly 'shift.mode_off': { readonly text: "An dieser Lade ist der Schichtbetrieb aus. Bitte im Panel einschalten."; }; readonly 'shift.outcome_unknown': { readonly text: "Unklar, ob das angekommen ist. „Erneut senden“ schickt denselben Vorgang – er zählt nur einmal."; }; readonly 'cash_movement.exceeds_balance': { readonly text: "So viel Bargeld ist laut Kassenstand nicht in der Lade."; }; readonly 'cash_movement.note_required': { readonly text: "Bitte einen Grund eingeben."; }; readonly 'cash_movement.booked': { readonly text: "{type} über {amount} gebucht."; readonly placeholders: readonly ["type", "amount"]; }; readonly 'cash_movement.type_invalid': { readonly text: "Diese Art der Kassenbewegung ist hier nicht möglich."; }; readonly 'cash_movement.same_drawer': { readonly text: "Eine Umbuchung in dieselbe Lade geht nicht. Bitte eine andere Lade wählen."; }; readonly 'tip_payout.exceeds_claim': { readonly text: "Mehr als der offene Anspruch kann nicht ausgezahlt werden."; }; readonly 'denominations.invalid': { readonly text: "Scheine und Münzen ergeben nicht den Betrag."; }; readonly 'amount.invalid': { readonly text: "Bitte einen gültigen Betrag eingeben."; }; readonly 'drawer.not_found': { readonly text: "Diese Lade gibt es nicht mehr. Bitte im Panel die Lade dieses Geräts prüfen."; }; readonly 'drawer.inactive': { readonly text: "Diese Lade ist stillgelegt. Bitte im Panel eine andere Lade zuordnen."; }; readonly 'tip_payout.recipient_required': { readonly text: "Bitte einen Mitarbeiter wählen."; }; readonly 'tip_payout.none_open': { readonly text: "In dieser Schicht ist kein Trinkgeld offen."; }; readonly 'shift.pending_hint': { readonly text: "Noch nicht bestätigt. „Erneut senden“ schickt denselben Vorgang – er zählt nur einmal."; }; readonly 'shift.change_float_missing': { readonly text: "Es fehlen {amount} bis zum Wechselgeld von {total}."; readonly placeholders: readonly ["amount", "total"]; }; readonly 'app.not_in_browser': { readonly text: "Die Kassen-App läuft nicht im Browser – dafür gibt es kasse.kasseneck.at."; readonly only: readonly ["app"]; }; readonly 'app.open_in_browser': { readonly text: "Bitte im Browser öffnen: {target}"; readonly placeholders: readonly ["target"]; readonly only: readonly ["app"]; }; }; export type MessageKey = keyof typeof MELDUNGEN_ROH; export declare const MESSAGES: Record; /** * In welcher Reihenfolge ein Fehler eingeordnet wird, auf beiden Seiten * dieselbe. Genau eine Regel je Art (`kind`), mit einem Verhalten * (`behavior`) oder dem Schluessel des Satzes (`key`). Die Arten: * api - HTTP 200, `status:'error'`: der Satz des Backends, woertlich * (`server_text`) * plain_text - schon fuer den Bildschirm geschrieben: sein eigener Text * (`own_text`) * timeout - die Frist lief ab, die Anfrage war draussen * network - keine Verbindung zustande gekommen oder abgerissen * unexpected - der Server hat geantwortet, aber nicht wie zugesagt * (HTML statt JSON, 500, fehlende Huelle); `status` = HTTP-Code * other - alles Uebrige ist technisch: der Ersatzsatz des Vorgangs * (`fallback`) * Unter 0.x hiessen sie `klartext`, `zeitablauf`, `netz`, `unerwartet`, * `sonst` (Tabelle in `fixtures/renames-1.0.json`). * * Seit 1.0.0-rc.5 verfeinern [ERROR_CODE_RULES] und [ERROR_OUTCOME_RULES] * diese Liste; sie stehen bewusst getrennt, damit ein Leser, der nur nach * `kind` sucht, weiter genau den Satz von rc.4 zeigt. [findErrorRule] wendet * alle drei in der richtigen Reihenfolge an. */ export declare const ERROR_RULES: readonly [{ readonly kind: "api"; readonly behavior: "server_text"; }, { readonly kind: "plain_text"; readonly behavior: "own_text"; }, { readonly kind: "timeout"; readonly key: "network.timeout"; }, { readonly kind: "network"; readonly key: "network.no_connection"; }, { readonly kind: "unexpected"; readonly key: "server.unexpected"; }, { readonly kind: "other"; readonly behavior: "fallback"; }]; export type ErrorKind = (typeof ERROR_RULES)[number]['kind']; /** * Regeln je Code (`error.code`), vor der Regel der Art: sie ersetzen den * technischen Satz des Pakets bzw. des Rands durch einen Menschentext. Der * technische Satz bleibt in `error.message` fuers Protokoll. * - `dialect_mismatch`, `response_translation_failed`, `response_unreadable`: * Ausgang unklar, der Vorgang kann gebucht sein; der Satz raet nie zum * Wiederholen, sondern zum Nachsehen. * - `route_missing`, `not_found`, `internal_translation_error`: am Server * geschah nichts, ein neuer Versuch ist sicher (auch auf den Geldwegen: * alle drei stehen in `PAYMENT_CALL_REJECTED_CODES`). */ export declare const ERROR_CODE_RULES: readonly [{ readonly kind: "api"; readonly codes: readonly ["dialect_mismatch", "response_translation_failed", "response_unreadable"]; readonly key: "server.response_unreadable"; }, { readonly kind: "api"; readonly codes: readonly ["route_missing", "not_found", "internal_translation_error"]; readonly key: "server.connection_disturbed"; }, { readonly kind: "api"; readonly codes: readonly ["shift_not_open"]; readonly key: "shift.required"; }, { readonly kind: "api"; readonly codes: readonly ["shift_already_open"]; readonly key: "shift.already_open"; }, { readonly kind: "api"; readonly codes: readonly ["shift_closed"]; readonly key: "shift.already_closed"; }, { readonly kind: "api"; readonly codes: readonly ["comment_required"]; readonly key: "shift.comment_required"; }, { readonly kind: "api"; readonly codes: readonly ["recount_exhausted"]; readonly key: "shift.recount_exhausted"; }, { readonly kind: "api"; readonly codes: readonly ["shift_mode_off"]; readonly key: "shift.mode_off"; }, { readonly kind: "api"; readonly codes: readonly ["cash_movement_exceeds_balance"]; readonly key: "cash_movement.exceeds_balance"; }, { readonly kind: "api"; readonly codes: readonly ["note_required"]; readonly key: "cash_movement.note_required"; }, { readonly kind: "api"; readonly codes: readonly ["invalid_movement_type"]; readonly key: "cash_movement.type_invalid"; }, { readonly kind: "api"; readonly codes: readonly ["transfer_same_drawer"]; readonly key: "cash_movement.same_drawer"; }, { readonly kind: "api"; readonly codes: readonly ["tip_payout_exceeds_claim"]; readonly key: "tip_payout.exceeds_claim"; }, { readonly kind: "api"; readonly codes: readonly ["invalid_denominations"]; readonly key: "denominations.invalid"; }, { readonly kind: "api"; readonly codes: readonly ["invalid_amount"]; readonly key: "amount.invalid"; }, { readonly kind: "api"; readonly codes: readonly ["drawer_not_found"]; readonly key: "drawer.not_found"; }, { readonly kind: "api"; readonly codes: readonly ["drawer_inactive"]; readonly key: "drawer.inactive"; }]; /** * Regeln je Ausgang, nach den Code-Regeln und vor der Regel der Art: eine * Frist oder ein Netzfehler auf einem Aufruf mit Wirkung (Ausgang unklar, * siehe [messageOutcome]) raet nie zum Wiederholen. Ein Netzfehler auf einem * Aufruf ohne Wirkung behaelt den Satz von rc.4 („erneut versuchen“). */ export declare const ERROR_OUTCOME_RULES: readonly [{ readonly kind: "timeout"; readonly outcome: "unknown"; readonly key: "network.outcome_unknown"; }, { readonly kind: "network"; readonly outcome: "unknown"; readonly key: "network.outcome_unknown"; }]; export type ErrorRule = (typeof ERROR_RULES)[number] | (typeof ERROR_CODE_RULES)[number] | (typeof ERROR_OUTCOME_RULES)[number]; /** Was ueber einen Fehler bekannt ist, ausser seiner Art. */ export interface ErrorRuleDetail { /** `error.code` eines `KasseneckApiError`. */ code?: string | null; /** Ausgang fuer den Satz, siehe [messageOutcome]. */ outcome?: ErrorOutcome | null; } /** * Die Regel fuer einen Fehler: zuerst eine Code-Regel mit passender Art und * passendem `code`, dann eine Ausgangs-Regel mit passender Art und * passendem `outcome`, sonst die Regel der Art aus [ERROR_RULES]. Beide * Kassen ordnen so ein. */ export declare function findErrorRule(kind: ErrorKind, detail?: ErrorRuleDetail): ErrorRule; /** * Kassen-Aufrufe mit Wirkung, die sich nach einem Netzfehler nicht gefahrlos * wiederholen lassen: Beleg (auch Null- und Startbeleg ueber * `createReceipt`), Storno, FinanzOnline, die drei Geldwege, der Druckjob * (zweiter Bon) und die Belegmail (zweite Mail). Ob die Anfrage vor dem * Abriss schon draussen war, sieht das Paket nicht (fetch wirft in beiden * Faellen gleich); darum gilt hier immer der vorsichtige Satz, auch fuer * einen Fehler, der vor dem Senden entstand. * * Seit 1.5.1 fuehrt der Transport jeden Aufruf mit Wirkung als unklar * (`UNKNOWN_OUTCOME_CALLS`, eine Obermenge dieser Liste), und * [messageOutcome] folgt zuerst ihm. Die Liste bleibt als Vertrag der * Kassentexte (`callsWithEffect` in `fixtures/pos-texts.json`) unveraendert. */ export declare const CALLS_WITH_EFFECT: readonly ["createReceipt", "cancelReceipt", "financeWebService", "hobexPayApi", "hobexRefundApi", "stripeCaptureIntent", "createPrintJob", "sendReceiptEmail"]; /** * Der Ausgang, nach dem der Satz gewaehlt wird: `'unknown'`, wenn das Paket * ihn als unklar fuehrt ([isOutcomeUnknown]) oder wenn eine Frist bzw. ein * Netzfehler einen Aufruf aus [CALLS_WITH_EFFECT] traf; sonst der Ausgang * des Fehlers (`'rejected'`) bzw. `undefined` fuer fremde Fehler. */ export declare function messageOutcome(error: unknown): ErrorOutcome | undefined; /** * Beleg per E-Mail senden: welcher `code` des Backends welchen Satz bekommt. * * `ERROR_RULES` bleibt davon unberuehrt – das hier ist keine neue Art, einen * Transportfehler einzuordnen, sondern die Verfeinerung EINES Aufrufs * (`sendReceiptEmail`). Die vier Ausgaenge sind fuer den Kassier vier * verschiedene Handlungen: Adresse verbessern, spaeter noch einmal, noch * einmal senden, Beleg suchen. Beide Kassen entscheiden am `code`, nicht am * Satz des Backends — sonst haengt das Wort am Tresen an einer Formulierung, * die sich im Backend jederzeit aendern darf. * * Bewusst ein Objekt und keine Liste in GROSSSCHRIFT: der * Oberflaechen-Vertrag (`fixtures/surface.json`) liest jede exportierte * Liste als Enum der Kasseneinstellungen ein, und der Dart-Zwilling schickt * deren Werte durch `KasseSettings.aus`. Fehlercodes haben dort nichts * verloren; sie stehen in `fixtures/pos-texts.json`. * * Die Codes sind die von `/v3` (`RECEIPT_EMAIL_SEND_ERROR_CODES`; Anmelde- und Rand-Codes fallen auf den Ersatzsatz); unter `/v1` hiessen * sie `adresse_ungueltig`, `zu_oft`, `versand_fehlgeschlagen`, `beleg_nicht_gefunden`. */ export declare const RECEIPT_EMAIL_ERROR_MESSAGES: { readonly invalid_address: "receipt.mail_address_invalid"; readonly too_many_requests: "receipt.mail_too_often"; readonly send_failed: "receipt.mail_failed"; readonly receipt_not_found: "receipt.mail_not_found"; }; export type ReceiptEmailMessageCode = keyof typeof RECEIPT_EMAIL_ERROR_MESSAGES; /** * Der Satz zu einem `code` des Backends. Einen Code, den dieses Paket noch * nicht kennt, faengt der allgemeine Satz auf: das Senden ist gescheitert und * darf wiederholt werden. Ein leerer Schirm waere schlimmer als ein zu * allgemeiner Satz. */ export declare function receiptEmailErrorMessage(code: string | undefined | null): MessageKey; /** * Storno eines Belegs mit mehreren Zahlungen, dazu der offene Ausgang * (`cancellation_outcome_unknown`, gilt fuer jedes Storno): welcher `code` des * Backends unter `/v3` welchen Satz bekommt. Dieselbe Idee wie RECEIPT_EMAIL_ERROR_MESSAGES – beide Kassen * entscheiden am Code, nie am Satz des Backends. Ein Code, der hier fehlt, * geht den allgemeinen Weg der Storno-Fehler (`cancellation.failed`). */ export declare const CANCELLATION_PAYMENT_ERROR_MESSAGES: { readonly cancellation_payments_required: "cancellation.payments_missing"; readonly cancellation_refund_exceeds_payment: "cancellation.refund_too_high"; readonly cancellation_refund_reference_required: "cancellation.refund_without_reference"; readonly cancellation_refund_reference_unknown: "cancellation.refund_reference_unknown"; readonly payments_sum_mismatch: "cancellation.sum_mismatch"; readonly cancellation_outcome_unknown: "cancellation.outcome_unknown"; }; export type CancellationPaymentMessageCode = keyof typeof CANCELLATION_PAYMENT_ERROR_MESSAGES; /** * Der Satz zu einem `code` des Backends beim Storno mit mehreren Zahlungen. * Einen Code, den dieses Paket noch nicht kennt, faengt der allgemeine Satz * `cancellation.failed` auf – wie bei `receiptEmailErrorMessage`. */ export declare function cancellationPaymentErrorMessage(code: string | undefined | null): MessageKey; /** * Gutschein-Fehler (`/v3`): welcher `code` des Backends welchen Satz bekommt. * Wie RECEIPT_EMAIL_ERROR_MESSAGES: beide Kassen entscheiden am Code. Ein * unbekannter Code geht den allgemeinen Weg des Aufrufs. */ export declare const VOUCHER_ERROR_MESSAGES: { readonly voucher_not_found: "voucher_error.not_found"; readonly voucher_invalid: "voucher_error.invalid"; readonly voucher_invalid_code: "voucher_error.invalid_code"; readonly voucher_expired: "voucher_error.expired"; readonly voucher_used_up: "voucher_error.used_up"; readonly voucher_blocked: "voucher_error.blocked"; readonly voucher_cancelled: "voucher_error.cancelled"; readonly voucher_insufficient_balance: "voucher_error.insufficient_balance"; readonly voucher_exceeds_total: "voucher_error.exceeds_total"; readonly voucher_balance_changed: "voucher_error.balance_changed"; readonly voucher_rate_mismatch: "voucher_error.rate_mismatch"; readonly voucher_item_mismatch: "voucher_error.item_mismatch"; readonly voucher_already_used: "voucher_error.already_used"; readonly voucher_partial_cancel: "voucher_error.partial_cancel"; readonly voucher_settings_missing: "voucher_error.settings_missing"; readonly too_many_voucher_checks: "voucher_error.too_many_checks"; }; export type VoucherMessageCode = keyof typeof VOUCHER_ERROR_MESSAGES; /** Der Satz zu einem Gutschein-`code`; `undefined` für jeden anderen Code. */ export declare function voucherErrorMessage(code: string | undefined | null): MessageKey | undefined; /** * Beschriftungen: Knoepfe, Ueberschriften, Zeilennamen – was kein Satz ist. * * Getrennt von MESSAGES, weil dort jeder Eintrag ein Satz ist (gross am * Anfang, Satzzeichen am Schluss) und die Waechter beider Kassen daran * Saetze erkennen. „Rest" oder „÷ {n}" sind keine Saetze, muessen aber in * beiden Kassen gleich heissen. Dieselben Regeln sonst: Schluessel * `bereich.name`, nie umgedeutet, Platzhalter exakt die im Text, `only` nennt * die Seite. * * Die Woerter der Zahlarten folgen dem Bon („Kartenzahlung", „Barzahlung", * „Zahlung {n}", „davon Trinkgeld"). */ declare const BESCHRIFTUNGEN_ROH: { readonly 'common.cancel': { readonly text: "Abbrechen"; }; readonly 'message.dismiss': { readonly text: "Meldung ausblenden: {message}"; readonly placeholders: readonly ["message"]; }; readonly 'message.dismiss_warning': { readonly text: "Verstanden – Warnung ausblenden: {message}"; readonly placeholders: readonly ["message"]; }; readonly 'pairing.pair_again': { readonly text: "Neu koppeln"; }; readonly 'register.device_unnamed': { readonly text: "Kasse"; }; readonly 'login.locked_seconds': { readonly text: "Noch {seconds} s gesperrt"; readonly placeholders: readonly ["seconds"]; }; readonly 'logout.question': { readonly text: "Wirklich abmelden?"; }; readonly 'logout.keep_working': { readonly text: "Weiter arbeiten"; }; readonly 'device.unpair': { readonly text: "Gerät entkoppeln"; }; readonly 'connect.unpair_confirm': { readonly text: "Entkoppeln bestätigen"; readonly only: readonly ["web"]; }; readonly 'checkout.tip': { readonly text: "Trinkgeld"; }; readonly 'checkout.no_tip': { readonly text: "kein"; }; readonly 'checkout.custom_amount': { readonly text: "Eigener Betrag"; }; readonly 'checkout.exact': { readonly text: "passend"; }; readonly 'checkout.clear_tendered': { readonly text: "Gegeben löschen"; }; readonly 'checkout.still_missing': { readonly text: "Es fehlen noch"; }; readonly 'checkout.change': { readonly text: "Rückgeld"; }; readonly 'checkout.tip_kept': { readonly text: "gleich behalten"; }; readonly 'tip.kept_setting': { readonly text: "Bar-Trinkgeld behält der Mitarbeiter gleich"; }; readonly 'card_payment.amount_on_terminal': { readonly text: "Betrag steht am Terminal"; }; readonly 'card_payment.present_card': { readonly text: "Karte vorhalten oder stecken · noch {time}"; readonly placeholders: readonly ["time"]; }; readonly 'completion.receipt_exists': { readonly text: "Beleg ist vorhanden – erledigen"; }; readonly 'completion.resolve': { readonly text: "Erledigen"; }; readonly 'split.button': { readonly text: "Getrennt"; }; readonly 'split.setting': { readonly text: "Getrennt zahlen"; }; readonly 'split.to_pay': { readonly text: "Zu zahlen"; }; readonly 'split.open': { readonly text: "Offen"; }; readonly 'split.payment': { readonly text: "Zahlung {n}"; readonly placeholders: readonly ["n"]; }; readonly 'split.amount': { readonly text: "Betrag"; }; readonly 'split.remaining': { readonly text: "Rest"; }; readonly 'split.remaining_with_rounding': { readonly text: "Rest inkl. Rundung {amount} ({cents} ct)"; readonly placeholders: readonly ["amount", "cents"]; }; readonly 'split.divide': { readonly text: "÷ {n}"; readonly placeholders: readonly ["n"]; }; readonly 'split.tip_basis': { readonly text: "% von diesem Betrag"; }; readonly 'split.of_which_tip': { readonly text: "davon Trinkgeld {amount}"; readonly placeholders: readonly ["amount"]; }; readonly 'split.remove': { readonly text: "Entfernen"; }; readonly 'split.cancel_all': { readonly text: "Alles abbrechen"; }; readonly 'split.continue_checkout': { readonly text: "Weiter kassieren"; }; readonly 'split.reverse_all': { readonly text: "Alles zurückbuchen"; }; readonly 'split.reversed_on_terminal': { readonly text: "Am Terminal zurückgebucht"; }; readonly 'split.reverse_card': { readonly text: "Karte zurückbuchen"; }; readonly 'split.pair_again_anyway': { readonly text: "Trotzdem neu koppeln"; }; readonly 'split.keep_payment': { readonly text: "Zahlung behalten"; }; readonly 'split.clarify': { readonly text: "Klären"; }; readonly 'split.reverse_again': { readonly text: "Erneut zurückbuchen"; }; readonly 'split.was_charged': { readonly text: "Wurde belastet – übernehmen"; }; readonly 'split.not_charged': { readonly text: "Nicht belastet – verwerfen"; }; readonly 'split.continue': { readonly text: "Weiter · {amount} getrennt"; readonly placeholders: readonly ["amount"]; }; readonly 'split.allocation': { readonly text: "Aufteilung"; }; readonly 'split.back_to_payment_method': { readonly text: "Zurück zur Zahlart"; }; readonly 'split.tab_items': { readonly text: "Nach Positionen"; }; readonly 'split.tab_amount': { readonly text: "Betrag"; }; readonly 'split.one_less': { readonly text: "{name}: ein Stück weniger"; readonly placeholders: readonly ["name"]; }; readonly 'split.one_more': { readonly text: "{name}: ein Stück mehr"; readonly placeholders: readonly ["name"]; }; readonly 'split.tendered': { readonly text: "Gegeben (bar)"; }; readonly 'split.tendered_change': { readonly text: "Gegeben {tendered} · Rückgeld {change}"; readonly placeholders: readonly ["tendered", "change"]; }; readonly 'split.payment_method': { readonly text: "Zahlart"; }; readonly 'split.method_cash': { readonly text: "Bar"; }; readonly 'split.method_card': { readonly text: "Karte"; }; readonly 'split.add_payment': { readonly text: "Zahlung hinzufügen · {amount}"; readonly placeholders: readonly ["amount"]; }; readonly 'split.open_items': { readonly text: "Offene Positionen"; }; readonly 'split.pieces_open': { readonly text: "{n} offen"; readonly placeholders: readonly ["n"]; }; readonly 'split.pieces_selected': { readonly text: "{n} von {open}"; readonly placeholders: readonly ["n", "open"]; }; readonly 'split.nothing_selected': { readonly text: "Noch nichts angetippt"; }; readonly 'split.all_paid': { readonly text: "Alles bezahlt"; }; readonly 'payment_method.card': { readonly text: "Kartenzahlung"; }; readonly 'payment_method.cash': { readonly text: "Barzahlung"; }; readonly 'payment_method.multiple': { readonly text: "Mehrere"; }; readonly 'cancellation.title': { readonly text: "Storno zu {receipt}"; readonly placeholders: readonly ["receipt"]; }; readonly 'cancellation.how_to_refund': { readonly text: "Wie zurückgeben?"; }; readonly 'cancellation.as_paid': { readonly text: "wie bezahlt"; }; readonly 'cancellation.cash': { readonly text: "bar"; }; readonly 'cancellation.all_cash': { readonly text: "Alles bar"; }; readonly 'cancellation.payment_remainder': { readonly text: "Rest {amount}"; readonly placeholders: readonly ["amount"]; }; readonly 'cancellation.difference': { readonly text: "Differenz"; }; readonly 'cancellation.tip_refund_question': { readonly text: "Trinkgeld auch zurückgeben?"; }; readonly 'cancellation.tip_refund_yes': { readonly text: "Ja"; }; readonly 'cancellation.tip_refund_no': { readonly text: "Nein"; }; readonly 'cancellation.tip_source_question': { readonly text: "Woher kommt das Trinkgeld zurück?"; }; readonly 'cancellation.tip_source_drawer': { readonly text: "Aus der Lade"; }; readonly 'cancellation.tip_source_employee': { readonly text: "Gibt die Mitarbeiterin direkt"; }; readonly 'cancellation.tip_stays': { readonly text: "bleibt"; }; readonly 'codetable.title': { readonly text: "ZEICHENSATZ-TEST"; }; readonly 'codetable.reference': { readonly text: "So sehen die Zeichen richtig aus"; }; readonly 'codetable.replacement_note': { readonly text: "(Ersatz, passt immer)"; }; readonly 'codetable.missing': { readonly text: "ohne {chars}"; readonly placeholders: readonly ["chars"]; }; readonly 'codetable.print_again': { readonly text: "Nochmal drucken"; }; readonly 'codetable.not_checked': { readonly text: "Umlaute noch nicht geprüft"; }; readonly 'codetable.check': { readonly text: "Umlaute prüfen"; }; readonly 'codetable.current': { readonly text: "Zeichensatz: Nr. {number}"; readonly placeholders: readonly ["number"]; }; readonly 'codetable.instruction_title': { readonly text: "Welche Zeile nehmen?"; }; readonly 'codetable.preview_title': { readonly text: "So steht es dann am Bon:"; }; readonly 'codetable.apply': { readonly text: "Übernehmen"; }; readonly 'codetable.other_row': { readonly text: "Andere Zeile"; }; readonly 'stock.all_articles': { readonly text: "Alle Artikel"; }; readonly 'stock.location': { readonly text: "Lager-Standort"; }; readonly 'stock.default_location': { readonly text: "Standard-Standort"; }; readonly 'stock.resolved': { readonly text: "aufgelöst"; }; readonly 'stock.where_to': { readonly text: "Wohin mit der Ware?"; }; readonly 'stock.available': { readonly text: "verfügbar"; }; readonly 'stock.return_restock': { readonly text: "Zurück ins Lager"; }; readonly 'stock.return_defective': { readonly text: "Defekt"; }; readonly 'stock.return_disposed': { readonly text: "Entsorgt"; }; readonly 'stocktake.title': { readonly text: "Inventur zählen"; }; readonly 'stocktake.quantity': { readonly text: "Menge"; }; readonly 'stocktake.defective': { readonly text: "Defekt"; }; readonly 'stocktake.count_zero': { readonly text: "0 zählen"; }; readonly 'stocktake.next': { readonly text: "Weiter"; }; readonly 'stocktake.void': { readonly text: "Stornieren"; }; readonly 'stocktake.reason': { readonly text: "Grund"; }; readonly 'stocktake.progress': { readonly text: "{counted} von {total} gezählt"; readonly placeholders: readonly ["counted", "total"]; }; readonly 'stocktake.serial_numbers': { readonly text: "Seriennummern erfassen"; }; readonly 'stocktake.recount': { readonly text: "Nachzählen"; }; readonly 'stocktake.resend': { readonly text: "Erneut senden"; }; readonly 'stocktake.my_counts': { readonly text: "Meine Zählungen"; }; readonly 'stocktake.sent': { readonly text: "gesendet"; }; readonly 'stocktake.unconfirmed': { readonly text: "unbestätigt"; }; readonly 'stocktake.voided': { readonly text: "storniert"; }; readonly 'shift.open_title': { readonly text: "Schicht öffnen"; }; readonly 'shift.take_over': { readonly text: "Bestand übernehmen"; }; readonly 'shift.count': { readonly text: "Zählen"; }; readonly 'shift.by_denomination': { readonly text: "Nach Scheinen und Münzen"; }; readonly 'shift.close_title': { readonly text: "Schicht schließen"; }; readonly 'shift.cash_title': { readonly text: "Kassenstand"; }; readonly 'shift.x_report': { readonly text: "Zwischenbericht"; }; readonly 'shift.pay_out_tips': { readonly text: "Trinkgeld auszahlen"; }; readonly 'drawer.reason_title': { readonly text: "Warum öffnen Sie die Lade?"; }; readonly 'drawer.reason_change': { readonly text: "Wechselgeld"; }; readonly 'drawer.reason_check': { readonly text: "Kontrolle"; }; readonly 'drawer.reason_misoperation': { readonly text: "Fehlbedienung"; }; readonly 'drawer.reason_other': { readonly text: "Sonstiges"; }; readonly 'cash_movement.type_change_in': { readonly text: "Wechselgeld"; }; readonly 'cash_movement.type_cash_drop': { readonly text: "Abschöpfung"; }; readonly 'cash_movement.type_owner_deposit': { readonly text: "Privateinlage"; }; readonly 'cash_movement.type_owner_withdrawal': { readonly text: "Privatentnahme"; }; readonly 'cash_movement.type_tip_payout': { readonly text: "Trinkgeld-Auszahlung"; }; readonly 'cash_movement.type_other_in': { readonly text: "Sonstige Einzahlung"; }; readonly 'cash_movement.type_other_out': { readonly text: "Sonstige Auszahlung"; }; readonly 'cash_movement.type_transfer_out': { readonly text: "Umbuchung"; }; readonly 'cash_movement.type_transfer_in': { readonly text: "Umbuchung (Eingang)"; }; readonly 'cash_movement.type_expense': { readonly text: "Barausgabe"; }; readonly 'cash_movement.type_count_difference': { readonly text: "Zähldifferenz"; }; readonly 'cash_movement.type_handover_difference': { readonly text: "Übergabedifferenz"; }; readonly 'shift_receipt.title_close': { readonly text: "Schichtabschluss"; }; readonly 'shift_receipt.title_interim': { readonly text: "Zwischenbericht"; }; readonly 'shift_receipt.title_movement': { readonly text: "Kassenbewegung"; }; readonly 'shift_receipt.cashregister': { readonly text: "Kasse"; }; readonly 'shift_receipt.drawer': { readonly text: "Lade"; }; readonly 'shift_receipt.shift': { readonly text: "Schicht"; }; readonly 'shift_receipt.number': { readonly text: "Nr. {number}"; readonly placeholders: readonly ["number"]; }; readonly 'shift_receipt.opened': { readonly text: "Geöffnet"; }; readonly 'shift_receipt.closed': { readonly text: "Geschlossen"; }; readonly 'shift_receipt.by': { readonly text: "von"; }; readonly 'shift_receipt.opening_float': { readonly text: "Startgeld"; }; readonly 'shift_receipt.opening_float_taken_over': { readonly text: "Startgeld übernommen"; }; readonly 'shift_receipt.cash_sales': { readonly text: "Bar aus Verkäufen"; }; readonly 'shift_receipt.cash_cancellations': { readonly text: "Bar aus Storno"; }; readonly 'shift_receipt.movements': { readonly text: "Bewegungen"; }; readonly 'shift_receipt.expected': { readonly text: "Soll"; }; readonly 'shift_receipt.counted': { readonly text: "Ist"; }; readonly 'shift_receipt.difference': { readonly text: "Differenz"; }; readonly 'shift_receipt.taken_out': { readonly text: "Entnommen"; }; readonly 'shift_receipt.put_in': { readonly text: "Eingelegt"; }; readonly 'shift_receipt.left_in_drawer': { readonly text: "Bleibt in der Kassenlade"; }; readonly 'shift_receipt.comment': { readonly text: "Kommentar"; }; readonly 'shift_receipt.non_cash': { readonly text: "Unbar (nur Information)"; }; readonly 'shift_receipt.receipts': { readonly text: "Belege"; }; readonly 'shift_receipt.cancellations': { readonly text: "Stornos"; }; readonly 'shift_receipt.openings_without_sale': { readonly text: "Öffnungen ohne Verkauf"; }; readonly 'shift_receipt.tips': { readonly text: "Trinkgeld"; }; readonly 'shift_receipt.tip_earned': { readonly text: "verdient"; }; readonly 'shift_receipt.tip_retained': { readonly text: "über Lohn"; }; readonly 'shift_receipt.tip_paid_out': { readonly text: "schon genommen"; }; readonly 'shift_receipt.tip_refunded_by_employee': { readonly text: "selbst zurückgegeben"; }; readonly 'shift_receipt.tip_carried_over': { readonly text: "aus früheren Schichten"; }; readonly 'shift_receipt.tip_open': { readonly text: "offen"; }; readonly 'shift_receipt.movement_number': { readonly text: "Nr."; }; readonly 'shift_receipt.type': { readonly text: "Art"; }; readonly 'shift_receipt.amount': { readonly text: "Betrag"; }; readonly 'shift_receipt.location': { readonly text: "Ort"; }; readonly 'shift_receipt.location_bank': { readonly text: "Bank"; }; readonly 'shift_receipt.location_safe': { readonly text: "Tresor"; }; readonly 'shift_receipt.recipient': { readonly text: "Empfänger"; }; readonly 'shift_receipt.target_drawer': { readonly text: "Ziel-Lade"; }; readonly 'shift_receipt.note': { readonly text: "Grund"; }; readonly 'shift_receipt.operator': { readonly text: "Bediener"; }; readonly 'shift_receipt.time': { readonly text: "Zeit"; }; readonly 'cash_movement.pay_in': { readonly text: "Einzahlung"; }; readonly 'cash_movement.pay_out': { readonly text: "Auszahlung"; }; readonly 'cash_movement.print': { readonly text: "Beleg drucken"; }; readonly 'drawer.recent_openings': { readonly text: "Letzte Öffnungen"; }; readonly 'drawer.reason_sale': { readonly text: "Verkauf"; }; readonly 'drawer.reason_cash_movement': { readonly text: "Kassenbewegung"; }; readonly 'drawer.reason_shift_open': { readonly text: "Schichtbeginn"; }; readonly 'drawer.reason_shift_close': { readonly text: "Schichtabschluss"; }; readonly 'drawer.reason_voucher_payout': { readonly text: "Gutschein-Auszahlung"; }; readonly 'shift.resend': { readonly text: "Erneut senden"; }; readonly 'shift.next': { readonly text: "Weiter"; }; readonly 'shift.print_close': { readonly text: "Schichtabschluss drucken"; }; readonly 'shift.print_again': { readonly text: "Nochmals drucken"; }; readonly 'shift.back_to_register': { readonly text: "Zur Kasse"; }; readonly 'shift.later': { readonly text: "Später senden"; }; readonly 'time.yesterday': { readonly text: "gestern"; }; readonly 'shift.drawer_should_have': { readonly text: "In der Kassenlade sollten sein"; }; readonly 'shift.drawer_named': { readonly text: "Kassenlade: {name}"; readonly placeholders: readonly ["name"]; }; readonly 'shift.running_since': { readonly text: "läuft seit {duration}"; readonly placeholders: readonly ["duration"]; }; readonly 'shift.since': { readonly text: "seit {time}"; readonly placeholders: readonly ["time"]; }; readonly 'shift.collected_outside_drawer': { readonly text: "Kassiert, aber nicht in der Kassenlade"; }; readonly 'shift.non_cash_short': { readonly text: "unbar"; }; readonly 'shift.voucher_redeemed': { readonly text: "Gutschein eingelöst"; }; readonly 'voucher.button': { readonly text: "Gutschein"; }; readonly 'voucher.redeem': { readonly text: "Gutschein einlösen"; }; readonly 'voucher.sell': { readonly text: "Gutschein verkaufen"; }; readonly 'voucher.payout': { readonly text: "Gutschein auszahlen"; }; readonly 'voucher.code': { readonly text: "Code"; }; readonly 'voucher.scan': { readonly text: "Code scannen"; }; readonly 'voucher.check': { readonly text: "Prüfen"; }; readonly 'voucher.amount': { readonly text: "Betrag"; }; readonly 'voucher.balance': { readonly text: "Rest am Gutschein: {amount}"; readonly placeholders: readonly ["amount"]; }; readonly 'voucher.remaining_quantity': { readonly text: "{n} von {total} übrig"; readonly placeholders: readonly ["n", "total"]; }; readonly 'voucher.reason': { readonly text: "Grund"; }; readonly 'voucher.multi_purpose': { readonly text: "Mehrzweckgutschein"; }; readonly 'voucher.single_purpose': { readonly text: "Einzweckgutschein {rate} %"; readonly placeholders: readonly ["rate"]; }; readonly 'voucher.service': { readonly text: "Leistungsgutschein"; }; readonly 'voucher.promotion': { readonly text: "Aktionsgutschein"; }; readonly 'voucher.payment_line': { readonly text: "Gutschein ····-{suffix}"; readonly placeholders: readonly ["suffix"]; }; readonly 'quantity.at_most': { readonly text: "höchstens {count}"; readonly placeholders: readonly ["count"]; }; readonly 'quantity.at_least': { readonly text: "mindestens {count}"; readonly placeholders: readonly ["count"]; }; readonly 'receipts.number_hint': { readonly text: "Nummer"; }; readonly 'receipts.clear_number': { readonly text: "Nummer löschen"; }; readonly 'receipts.open': { readonly text: "Öffnen"; }; readonly 'receipt.creating': { readonly text: "Beleg wird erstellt …"; }; readonly 'receipt_done.sale_title': { readonly text: "Verkauf abgeschlossen"; }; readonly 'receipt_done.paid_by_voucher': { readonly text: "mit Gutschein bezahlt"; }; readonly 'receipt_done.payout_title': { readonly text: "Auszahlung abgeschlossen"; }; readonly 'receipt_done.paid_out': { readonly text: "{method} ausgezahlt"; readonly placeholders: readonly ["method"]; }; readonly 'voucher.code_mask': { readonly text: "····-{suffix}"; readonly placeholders: readonly ["suffix"]; }; readonly 'cart.close': { readonly text: "Warenkorb schließen"; }; readonly 'nav.register': { readonly text: "Kasse"; }; readonly 'nav.receipts': { readonly text: "Belege"; }; readonly 'nav.vouchers': { readonly text: "Gutscheine"; }; readonly 'nav.open_drawer': { readonly text: "Kassenlade öffnen"; }; readonly 'nav.stocktake': { readonly text: "Inventur"; }; readonly 'nav.settings': { readonly text: "Einstellungen"; }; readonly 'nav.settings_locked': { readonly text: "nur mit Chef-Anmeldung"; }; readonly 'nav.logout': { readonly text: "Abmelden"; }; readonly 'nav.logging_out': { readonly text: "Wird abgemeldet …"; }; readonly 'nav.fullscreen': { readonly text: "Vollbild"; }; readonly 'nav.fullscreen_exit': { readonly text: "Vollbild verlassen"; }; readonly 'voucher.covers_items': { readonly text: "Deckt: {items}"; readonly placeholders: readonly ["items"]; }; readonly 'voucher.code_shown_once': { readonly text: "Code nur jetzt sichtbar: {code}"; readonly placeholders: readonly ["code"]; }; readonly 'voucher.not_in_split': { readonly text: "Gutscheine gehen beim getrennten Kassieren nicht."; }; readonly 'voucher.payout_not_possible': { readonly text: "Dieser Gutschein lässt sich nicht auszahlen."; }; readonly 'voucher.add_article': { readonly text: "{article} hinzufügen"; readonly placeholders: readonly ["article"]; }; readonly 'voucher.payout_confirm': { readonly text: "{amount} bar auszahlen?"; readonly placeholders: readonly ["amount"]; }; readonly 'cancellation.voucher_back': { readonly text: "{amount} geht zurück auf den Gutschein"; readonly placeholders: readonly ["amount"]; }; readonly 'voucher.apply': { readonly text: "Übernehmen"; }; readonly 'voucher.redeemable_until': { readonly text: "einlösbar bis {date}"; readonly placeholders: readonly ["date"]; }; readonly 'voucher.remove_line': { readonly text: "{line} entfernen"; readonly placeholders: readonly ["line"]; }; readonly 'voucher.reenter_code': { readonly text: "Code erneut eingeben"; }; readonly 'voucher.refundable_until': { readonly text: "rückzahlbar bis {date}"; readonly placeholders: readonly ["date"]; }; readonly 'voucher.code_done': { readonly text: "Fertig"; }; readonly 'voucher.article': { readonly text: "Artikel"; }; readonly 'voucher.add': { readonly text: "Hinzufügen"; }; readonly 'shift.all_payments': { readonly text: "Alle Zahlungen dieser Schicht (bar + unbar)"; }; readonly 'shift.receipt_count_one': { readonly text: "1 Beleg"; }; readonly 'shift.receipt_count_other': { readonly text: "{count} Belege"; readonly placeholders: readonly ["count"]; }; readonly 'shift.openings_without_sale_count': { readonly text: "{count}× ohne Verkauf geöffnet"; readonly placeholders: readonly ["count"]; }; readonly 'cash_movement.pay_in_short': { readonly text: "Einzahlen"; }; readonly 'cash_movement.pay_out_short': { readonly text: "Auszahlen"; }; readonly 'drawer.recent_openings_full': { readonly text: "Letzte Öffnungen der Kassenlade"; }; readonly 'printer.warn_unreachable': { readonly text: "Drucker nicht erreichbar"; }; readonly 'printer.warn_none': { readonly text: "Kein Drucker eingerichtet"; }; readonly 'printer.check': { readonly text: "Prüfen"; }; readonly 'printer.set_up': { readonly text: "Einrichten"; }; readonly 'duration.days_one': { readonly text: "{days} Tag"; readonly placeholders: readonly ["days"]; }; readonly 'duration.days_other': { readonly text: "{days} Tage"; readonly placeholders: readonly ["days"]; }; readonly 'duration.hours': { readonly text: "{hours} Std."; readonly placeholders: readonly ["hours"]; }; readonly 'duration.minutes': { readonly text: "{minutes} Min."; readonly placeholders: readonly ["minutes"]; }; readonly 'tip_payout.open_amount': { readonly text: "offen {amount}"; readonly placeholders: readonly ["amount"]; }; readonly 'tip_payout.done': { readonly text: "erledigt"; }; readonly 'tip_payout.for_all': { readonly text: "Für alle"; }; readonly 'tip_payout.nothing': { readonly text: "Nichts"; }; readonly 'tip_payout.all_open': { readonly text: "Alles Offene"; }; readonly 'tip_payout.title': { readonly text: "Auszahlung"; }; readonly 'tip_payout.persons_one': { readonly text: "1 Person"; }; readonly 'tip_payout.persons_other': { readonly text: "{count} Personen"; readonly placeholders: readonly ["count"]; }; readonly 'tip_payout.pay_amount': { readonly text: "{amount} auszahlen"; readonly placeholders: readonly ["amount"]; }; readonly 'tip_payout.pay_out': { readonly text: "Auszahlen"; }; readonly 'drawer.change_float': { readonly text: "Wechselgeld in der Lade"; }; readonly 'drawer.change_float_hint': { readonly text: "Bleibt nach jedem Schicht-Abschluss drin. Mehr wird beim Schließen entnommen."; }; readonly 'drawer.change_float_empty_hint': { readonly text: "Leer = alles bleibt in der Lade (wie bisher)."; }; readonly 'shift.step_take_out': { readonly text: "Geld entnehmen"; }; readonly 'shift.left_in_drawer': { readonly text: "Bleibt in der Kassenlade"; }; readonly 'shift.change_float_next_shift': { readonly text: "Wechselgeld für die nächste Schicht"; }; readonly 'shift.take_out': { readonly text: "Entnehmen"; }; readonly 'shift.put_in': { readonly text: "Einlegen"; }; readonly 'shift.take_out_at_most': { readonly text: "höchstens {amount}"; readonly placeholders: readonly ["amount"]; }; readonly 'shift.put_in_hint': { readonly text: "Geld in die Kassenlade legen"; }; readonly 'shift.after_count_tap_hint': { readonly text: "Tippe auf einen Betrag, um ihn zu ändern – der andere rechnet sich selbst."; }; readonly 'shift.take_out_amount': { readonly text: "{amount} entnehmen"; readonly placeholders: readonly ["amount"]; }; readonly 'shift.put_in_amount': { readonly text: "{amount} einlegen"; readonly placeholders: readonly ["amount"]; }; readonly 'shift.continue_without_take_out': { readonly text: "Weiter ohne Entnahme"; }; readonly 'shift.print_envelope_receipt': { readonly text: "Bon fürs Kuvert drucken"; }; readonly 'shift.toggle_take_out_put_in': { readonly text: "Entnehmen oder Einlegen umschalten"; }; readonly 'shift.put_in_change_float': { readonly text: "Wechselgeld einlegen"; }; readonly 'shift.taken_over_from_shift': { readonly text: "von Schicht {number} übernommen"; readonly placeholders: readonly ["number"]; }; readonly 'shift.counted': { readonly text: "Gezählt"; }; readonly 'shift.back': { readonly text: "Zurück"; }; readonly 'shift.done': { readonly text: "Fertig"; }; readonly 'shift.edit_amount': { readonly text: "{title} ändern"; readonly placeholders: readonly ["title"]; }; readonly 'shift.pay_ins': { readonly text: "Einzahlungen"; }; readonly 'shift.pay_outs': { readonly text: "Auszahlungen"; }; readonly 'cash_movement.pay_in_amount': { readonly text: "{amount} einzahlen"; readonly placeholders: readonly ["amount"]; }; readonly 'cash_movement.pay_out_amount': { readonly text: "{amount} auszahlen"; readonly placeholders: readonly ["amount"]; }; readonly 'receipt.outputs_title': { readonly text: "Ausgaben"; }; readonly 'receipt.outputs_count': { readonly text: "{count} Ausgaben"; readonly placeholders: readonly ["count"]; }; readonly 'receipt.output_print': { readonly text: "Erstdruck"; }; readonly 'receipt.output_reprint': { readonly text: "Duplikat"; }; readonly 'receipt.output_email': { readonly text: "E-Mail"; }; readonly 'receipt.output_link_shared': { readonly text: "Link geteilt"; }; readonly 'receipt.output_pdf_shared': { readonly text: "PDF geteilt"; }; readonly 'receipt.output_opened': { readonly text: "Link geöffnet ({count}×)"; readonly placeholders: readonly ["count"]; }; readonly 'receipt.output_failed': { readonly text: "fehlgeschlagen"; }; }; export type LabelKey = keyof typeof BESCHRIFTUNGEN_ROH; export declare const LABELS: Record; /** * Rueckgabe beim Storno (`returnDisposition`): welche Beschriftung jede Wahl * traegt. Ein Objekt wie CANCELLATION_PAYMENT_ERROR_MESSAGES, keine Liste in * GROSSSCHRIFT (der Oberflaechen-Vertrag liest Listen als Enums ein); die * App liest die Zuordnung aus `fixtures/pos-texts.json`. */ export declare const RETURN_DISPOSITION_LABELS: { readonly restock: "stock.return_restock"; readonly defective: "stock.return_defective"; readonly disposed: "stock.return_disposed"; }; /** * Die Beschriftung der Art einer Ausgabe (Belegdetail, Zeile „Ausgaben“), nie * eine Ausnahme: `null` bei einer Art, die dieses Paket nicht kennt (neuerer * Server); `opened` ohne gueltige Anzahl (ganze Zahl ab 1) zaehlt als ein * Abruf. Nur die Art: „fehlgeschlagen“ (`receipt.output_failed`) setzt die * Kasse selbst dazu, wenn `result` `failed` ist. */ export declare function receiptOutputLabel(output: ReceiptOutput): string | null; /** Die Beschriftung zum Schluessel, Platzhalter ersetzt; fehlt ein Wert, wirft es wie `messageText`. */ export declare function labelText(key: LabelKey, values?: Record): string; /** Der Satz zum Schluessel, Platzhalter ersetzt. Fehlt ein Wert, wirft es — ein `{status}` am Tresen waere schlimmer. */ export declare function messageText(key: MessageKey, values?: Record): string; /** Gilt der Satz auf dieser Seite? */ export declare function messageAppliesTo(key: MessageKey, surface: Surface): boolean; export {};