{
  "version": 2,
  "cases": [
    { "name": "api: der Satz des Backends, woertlich",
      "error": { "kind": "api", "serverMessage": "Kopplungs-Code ist abgelaufen." },
      "fallback": "Ersatz.", "expected": "Kopplungs-Code ist abgelaufen." },
    { "name": "api: auch ein Satz, der wie ein Ersatz aussieht, bleibt der des Backends",
      "error": { "kind": "api", "serverMessage": "PIN falsch, noch 2 Versuche." },
      "fallback": "Die Anmeldung ist fehlgeschlagen. Bitte erneut versuchen.", "expected": "PIN falsch, noch 2 Versuche." },
    { "name": "api: ein fachlicher Code geht mit dem Satz des Backends durch",
      "error": { "kind": "api", "code": "session_expired", "serverMessage": "Sitzung abgelaufen. Bitte erneut anmelden." },
      "fallback": "Ersatz.", "expected": "Sitzung abgelaufen. Bitte erneut anmelden." },
    { "name": "api route_missing: HTML statt Backend, Menschentext statt Satz des Pakets",
      "error": { "kind": "api", "code": "route_missing", "serverMessage": "Route fehlt: die Antwort ist eine HTML-Seite statt des Backends" },
      "fallback": "Ersatz.", "expected": { "key": "server.connection_disturbed" } },
    { "name": "api dialect_mismatch: Server spricht nicht /v3, Ausgang unklar, erst nachsehen",
      "error": { "kind": "api", "code": "dialect_mismatch", "serverMessage": "Server spricht nicht /v3 (Kennzeichen Kasseneck-Api-Version fehlt); Antwort verworfen" },
      "fallback": "Ersatz.", "expected": { "key": "server.response_unreadable" } },
    { "name": "api not_found: der Rand kennt den Endpunkt nicht",
      "error": { "kind": "api", "code": "not_found", "serverMessage": "Unknown endpoint" },
      "fallback": "Ersatz.", "expected": { "key": "server.connection_disturbed" } },
    { "name": "api internal_translation_error: der Rand konnte die Anfrage nicht uebersetzen",
      "error": { "kind": "api", "code": "internal_translation_error", "serverMessage": "Internal translation error" },
      "fallback": "Ersatz.", "expected": { "key": "server.connection_disturbed" } },
    { "name": "api response_translation_failed: der Rand konnte die Antwort nicht uebersetzen, Ausgang unklar",
      "error": { "kind": "api", "code": "response_translation_failed", "serverMessage": "Response translation failed" },
      "fallback": "Ersatz.", "expected": { "key": "server.response_unreadable" } },
    { "name": "api response_unreadable: Erfolg gemeldet, Antwort unlesbar, Ausgang unklar",
      "error": { "kind": "api", "code": "response_unreadable", "serverMessage": "Erfolg gemeldet, Antwort aber unlesbar (Antwort nicht lesbar). Der Vorgang kann ausgefuehrt sein: nicht wiederholen, sondern nachlesen." },
      "fallback": "Ersatz.", "expected": { "key": "server.response_unreadable" } },
    { "name": "api shift_not_open: Schicht und Kassenstand, der Satz der Kasse statt des Backends",
      "error": { "kind": "api", "code": "shift_not_open", "serverMessage": "Keine offene Schicht gefunden." },
      "fallback": "Ersatz.", "expected": { "key": "shift.required" } },
    { "name": "api shift_already_open: Schicht und Kassenstand, der Satz der Kasse statt des Backends",
      "error": { "kind": "api", "code": "shift_already_open", "serverMessage": "Für diese Lade ist bereits eine Schicht offen." },
      "fallback": "Ersatz.", "expected": { "key": "shift.already_open" } },
    { "name": "api shift_closed: Schicht und Kassenstand, der Satz der Kasse statt des Backends",
      "error": { "kind": "api", "code": "shift_closed", "serverMessage": "Die Schicht ist bereits geschlossen." },
      "fallback": "Ersatz.", "expected": { "key": "shift.already_closed" } },
    { "name": "api comment_required: Schicht und Kassenstand, der Satz der Kasse statt des Backends",
      "error": { "kind": "api", "code": "comment_required", "serverMessage": "Die Differenz ist größer als die Schwelle. Bitte einen Kommentar angeben." },
      "fallback": "Ersatz.", "expected": { "key": "shift.comment_required" } },
    { "name": "api recount_exhausted: Schicht und Kassenstand, der Satz der Kasse statt des Backends",
      "error": { "kind": "api", "code": "recount_exhausted", "serverMessage": "Es wurde bereits zweimal gezählt. Abschließen nur mit dem Betrag der zweiten Zählung." },
      "fallback": "Ersatz.", "expected": { "key": "shift.recount_exhausted" } },
    { "name": "api shift_mode_off: Schicht und Kassenstand, der Satz der Kasse statt des Backends",
      "error": { "kind": "api", "code": "shift_mode_off", "serverMessage": "Für diese Lade ist der Schichtbetrieb ausgeschaltet." },
      "fallback": "Ersatz.", "expected": { "key": "shift.mode_off" } },
    { "name": "api cash_movement_exceeds_balance: Schicht und Kassenstand, der Satz der Kasse statt des Backends",
      "error": { "kind": "api", "code": "cash_movement_exceeds_balance", "serverMessage": "Die Auszahlung ist höher als der Kassenstand." },
      "fallback": "Ersatz.", "expected": { "key": "cash_movement.exceeds_balance" } },
    { "name": "api note_required: Schicht und Kassenstand, der Satz der Kasse statt des Backends",
      "error": { "kind": "api", "code": "note_required", "serverMessage": "Bitte einen Text angeben." },
      "fallback": "Ersatz.", "expected": { "key": "cash_movement.note_required" } },
    { "name": "api invalid_movement_type: Schicht und Kassenstand, der Satz der Kasse statt des Backends",
      "error": { "kind": "api", "code": "invalid_movement_type", "serverMessage": "Diese Art der Kassenbewegung ist hier nicht möglich." },
      "fallback": "Ersatz.", "expected": { "key": "cash_movement.type_invalid" } },
    { "name": "api transfer_same_drawer: Schicht und Kassenstand, der Satz der Kasse statt des Backends",
      "error": { "kind": "api", "code": "transfer_same_drawer", "serverMessage": "Eine Umbuchung in dieselbe Lade ist nicht möglich." },
      "fallback": "Ersatz.", "expected": { "key": "cash_movement.same_drawer" } },
    { "name": "api tip_payout_exceeds_claim: Schicht und Kassenstand, der Satz der Kasse statt des Backends",
      "error": { "kind": "api", "code": "tip_payout_exceeds_claim", "serverMessage": "Die Trinkgeld-Auszahlung ist höher als der offene Anspruch." },
      "fallback": "Ersatz.", "expected": { "key": "tip_payout.exceeds_claim" } },
    { "name": "api invalid_denominations: Schicht und Kassenstand, der Satz der Kasse statt des Backends",
      "error": { "kind": "api", "code": "invalid_denominations", "serverMessage": "Die Stückelung passt nicht zum Betrag." },
      "fallback": "Ersatz.", "expected": { "key": "denominations.invalid" } },
    { "name": "api invalid_amount: Schicht und Kassenstand, der Satz der Kasse statt des Backends",
      "error": { "kind": "api", "code": "invalid_amount", "serverMessage": "Der Betrag ist ungültig." },
      "fallback": "Ersatz.", "expected": { "key": "amount.invalid" } },
    { "name": "api drawer_not_found: Schicht und Kassenstand, der Satz der Kasse statt des Backends",
      "error": { "kind": "api", "code": "drawer_not_found", "serverMessage": "Lade nicht gefunden." },
      "fallback": "Ersatz.", "expected": { "key": "drawer.not_found" } },
    { "name": "api drawer_inactive: Schicht und Kassenstand, der Satz der Kasse statt des Backends",
      "error": { "kind": "api", "code": "drawer_inactive", "serverMessage": "Die Lade ist stillgelegt." },
      "fallback": "Ersatz.", "expected": { "key": "drawer.inactive" } },
    { "name": "plain_text: sein eigener Text",
      "error": { "kind": "plain_text", "text": "Eigener Satz fuer den Schirm." },
      "fallback": "Ersatz.", "expected": "Eigener Satz fuer den Schirm." },
    { "name": "timeout: der Server antwortet nicht",
      "error": { "kind": "timeout" },
      "fallback": "Ersatz.", "expected": { "key": "network.timeout" } },
    { "name": "network: keine Verbindung",
      "error": { "kind": "network" },
      "fallback": "Ersatz.", "expected": { "key": "network.no_connection" } },
    { "name": "timeout auf einem Aufruf mit Wirkung: Ausgang unklar, erst nachsehen",
      "error": { "kind": "timeout", "outcome": "unknown" },
      "fallback": "Ersatz.", "expected": { "key": "network.outcome_unknown" } },
    { "name": "network auf einem Aufruf mit Wirkung: Ausgang unklar, erst nachsehen",
      "error": { "kind": "network", "outcome": "unknown" },
      "fallback": "Ersatz.", "expected": { "key": "network.outcome_unknown" } },
    { "name": "network ohne Wirkung: abgelehnt, der Satz von rc.4",
      "error": { "kind": "network", "outcome": "rejected" },
      "fallback": "Ersatz.", "expected": { "key": "network.no_connection" } },
    { "name": "unexpected: HTML statt JSON (fehlender Rewrite)",
      "error": { "kind": "unexpected", "status": 404 },
      "fallback": "Ersatz.", "expected": { "key": "server.unexpected", "values": { "status": 404 } } },
    { "name": "unexpected: 500er",
      "error": { "kind": "unexpected", "status": 500 },
      "fallback": "Ersatz.", "expected": { "key": "server.unexpected", "values": { "status": 500 } } },
    { "name": "unexpected: HTTP 200 ohne Huelle",
      "error": { "kind": "unexpected", "status": 200 },
      "fallback": "Ersatz.", "expected": { "key": "server.unexpected", "values": { "status": 200 } } },
    { "name": "other: Technisches bleibt beim Ersatz",
      "error": { "kind": "other" },
      "fallback": "Die Kopplung ist fehlgeschlagen. Bitte erneut versuchen.", "expected": "Die Kopplung ist fehlgeschlagen. Bitte erneut versuchen." }
  ]
}
