Files
certain/ios/Texte/en.lproj/Localizable.strings
T
GuidoandClaude Opus 5 9edf610d59 feat: Vierte Stufe der iOS-App - die Arbeitsliste
Ein neuer Reiter "Eingang" mit allem, worueber jemand entscheiden muss. Vier
Abschnitte, jeweils mit Anzahl im Kopf:

- Zu buchen: offene Eingangseintraege aus Kurzbefehl, Postfach oder Bank.
  Buchen, als Uebertrag buchen, verwerfen - oder alle auf einmal, bei denen
  das Konto feststeht. Unklare tragen einen Hinweis ueber den Knoepfen, nicht
  darunter: Man soll sie ansehen, nicht wegbuchen.
- Koennten Uebertraege sein: zwei getrennte Buchungen, die zusammengehoeren
  koennten. Verbinden oder ablehnen. Hat eine der beiden eine Kategorie,
  steht dabei, dass sie durchs Verbinden aus dem Budget faellt.
- Ohne Kategorie: gebuchtes Geld, das in keiner Budget-Zeile mitzaehlt. Ein
  Tipp, eine Kategorie - kein Formular mit zwoelf Feldern davor.
- Sieht doppelt aus: gleiches Konto, gleicher Tag, gleicher Betrag. Mit der
  Kennung der Bank je Zeile, denn verschiedene Kennungen heissen, dass die
  Bank sie als verschiedene Zahlungen gemeldet hat.

Alles in einem Abruf. Vier getrennte Zwischenspeicher koennten offline aus
vier verschiedenen Momenten stammen und sich widersprechen.

Hier sitzt der einzige 409-Fall der App: Beim Buchen als Uebertrag kann das
Backend Bedenken haben. Das ist eine Frage, kein Fehler - die App zeigt den
Hinweis und wiederholt den Aufruf auf Wunsch mit trotzdem=true. Ihn zu
verschlucken waere falsch, ihn als blossen Fehler zu zeigen auch.

Zwei Dinge, die die Tests festhalten: Ohne Konto laesst sich nichts buchen
(das Backend lehnt mit 400 ab, der Knopf bleibt also grau - und die Zeile sagt
auch warum). Und ein Uebertrag braucht keine Kategorie, sonst fragte die Liste
ewig nach einer, die es nie geben wird.

Die Pruefdatei deckt jetzt auch Eingang, Dubletten und Uebertragsvorschlaege
ab. Die aelteren Pruefungen zaehlten exakt und wurden dadurch rot - sie
pruefen jetzt Eigenschaften statt Mengen, damit sie das naechste Wachstum
ueberleben. 54 Tests gruen.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
2026-10-21 21:28:00 +02:00

274 lines
12 KiB
Plaintext
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
/* Certain for iOS – English
Keys mirror de.lproj line for line. Keep them that way: in the web app
de.json and en.json are the same length, and that is why nothing is ever
missing there. */
/* --- General --- */
"allgemein.nochmal" = "Try again";
"allgemein.abbrechen" = "Cancel";
"allgemein.abmelden" = "Sign out";
"allgemein.unbekannt" = "Unknown";
"allgemein.sichern" = "Save";
"allgemein.ok" = "OK";
/* --- Tabs --- */
"reiter.dashboard" = "Overview";
"reiter.budget" = "Budget";
"reiter.buchungen" = "Transactions";
"reiter.abos" = "Subscriptions";
"reiter.arbeitsliste" = "Inbox";
"reiter.konten" = "Accounts";
"reiter.einstellungen" = "Settings";
/* --- Errors --- */
"fehler.titel" = "That did not work";
"fehler.unbekannt" = "Unknown error.";
"fehler.keineVerbindung" = "Cannot reach the server: %@";
"fehler.keinCertainServer" = "Something answers at this address, but it is not Certain.";
"fehler.nichtAngemeldet" = "This device is no longer signed in. It was probably revoked on the desktop.";
"fehler.passwortWechseln" = "The password has to be changed before anything else.";
"fehler.zweiterFaktor" = "This account needs a second factor.";
"fehler.nichtGefunden" = "Does not exist.";
"fehler.server" = "The server reports an error (%d).";
"fehler.antwortUnlesbar" = "The server's answer does not match what the app expects: %@";
/* --- Offline --- */
"stand.hinweis" = "As of %@ – the server cannot be reached right now.";
/* --- Server address --- */
"server.titel" = "Connect to Certain";
"server.ueberschrift" = "Address";
"server.platzhalter" = "budget.example.com";
"server.erklaerung" = "The same address you open Certain with in your browser. Leaving off https is fine.";
"server.verbinden" = "Connect";
"server.keineAdresse" = "That does not look like an address.";
/* --- Sign in --- */
"anmeldung.titel" = "Sign in";
"anmeldung.benutzer" = "Username";
"anmeldung.passwort" = "Password";
"anmeldung.anmelden" = "Sign in";
"anmeldung.erklaerung" = "Just this once. Afterwards the device keeps a key of its own, and your password is stored nowhere.";
"anmeldung.andererServer" = "Choose a different server";
"anmeldung.aktuellerServer" = "Connected to %@";
"anmeldung.markeOhneSchluessel" = "The server returned no key. Please try again.";
/* --- Second factor --- */
"zweifaktor.titel" = "Second factor";
"zweifaktor.ueberschrift" = "Code";
"zweifaktor.platzhalterCode" = "123456";
"zweifaktor.platzhalterWiederherstellung" = "ABCDE-FGHIJ";
"zweifaktor.erklaerungCode" = "The six digits from your authenticator app.";
"zweifaktor.erklaerungWiederherstellung" = "One of the codes you got when setting this up. Each works once.";
"zweifaktor.bestaetigen" = "Confirm";
"zweifaktor.dochWiederherstellung" = "Use a recovery code instead";
"zweifaktor.dochCode" = "Use the code from the app instead";
"zweifaktor.abbrechen" = "Cancel sign-in";
"zweifaktor.verbraucht" = "Too many wrong attempts. Please start over.";
/* --- Second factor missing --- */
"zweifaktorEinrichten.titel" = "Second factor required";
"zweifaktorEinrichten.erklaerung" = "The policy requires a second factor for this account. Setting one up still only works in the browser; the app will get it later.";
"zweifaktorEinrichten.imBrowser" = "Open in browser";
/* --- Password change --- */
"passwort.titel" = "Change password";
"passwort.bisher" = "Current password";
"passwort.neu" = "New password";
"passwort.wiederholen" = "Once more";
"passwort.erklaerung" = "This account has to change its password. The server allows nothing else until then.";
"passwort.stimmtNichtUeberein" = "These two do not match.";
"passwort.speichern" = "Change password";
/* --- Accounts --- */
"konten.titel" = "Accounts";
"konten.leerTitel" = "No accounts yet";
"konten.leerErklaerung" = "Create your first account in the browser; the app will get this in a later stage.";
"konten.archivierteZeigen" = "Show archived";
"konten.archiviert" = "archived";
"konten.gebunden" = "Money set aside";
"konten.gebundenSumme" = "Of which set aside";
"konten.verfuegbar" = "Available";
"konten.bankWeichtAb" = "The bank reports a different balance";
/* --- Account types --- */
"kontoart.girokonto" = "Current account";
"kontoart.sparkonto" = "Savings account";
"kontoart.bargeld" = "Cash";
"kontoart.kreditkarte" = "Credit card";
"kontoart.depot" = "Securities account";
"kontoart.sonstiges" = "Other";
/* --- Settings --- */
"einstellungen.zugang" = "Access";
"einstellungen.angemeldetAls" = "Signed in as";
"einstellungen.server" = "Server";
"einstellungen.markeErklaerung" = "This device holds a key of its own. You can revoke it any time on the desktop under Settings → Device keys; the app signs out immediately.";
"einstellungen.ausDemServer" = "From the server";
"einstellungen.hauptwaehrung" = "Main currency";
"einstellungen.budgetStarttag" = "Budget starts on";
"einstellungen.abmeldenFrage" = "Sign out on this device?";
"einstellungen.abmeldenErklaerung" = "Signing out also removes this device's key on the server.";
/* --- Dashboard --- */
"dashboard.bilanz" = "This month";
"dashboard.einnahmen" = "Income";
"dashboard.ausgaben" = "Expenses";
"dashboard.budgetfortschritt" = "Budget";
"dashboard.keinBudget" = "Nothing planned for this month yet.";
"dashboard.kontostaende" = "Accounts";
"dashboard.letzteBuchungen" = "Recent";
/* --- Budget --- */
"budget.einnahmen" = "Planned income";
"budget.uebrig" = "left";
"budget.vonGeplant" = "%1$@ of %2$@ spent";
"budget.vonBetrag" = "of %@";
"budget.angepasst" = "adjusted";
"budget.vorigerMonat" = "Previous month";
"budget.naechsterMonat" = "Next month";
"budget.ausVertraegenHinweis" = "%1$d subscriptions: %2$@";
"budget.ausVertraegenBerechnet" = "Calculated from %1$d subscriptions: %2$@";
"budget.vertraegeOhneKategorie" = "%1$d subscriptions without a category (%2$@) are missing from these totals.";
"budget.ohneKurs" = "No exchange rate for %@ – those amounts are missing from the totals.";
/* --- Transactions --- */
"buchungen.suchen" = "Payee, description, note";
"buchungen.konto" = "Account";
"buchungen.alleKonten" = "All accounts";
"buchungen.art" = "Type";
"buchungen.alleArten" = "All types";
"buchungen.leerTitel" = "No transactions";
"buchungen.leerErklaerung" = "Once something is booked, it shows up here.";
"buchungen.leerGefiltert" = "Nothing matches this search. Try different filters?";
"buchung.ohneBezeichnung" = "Untitled";
"buchung.ohneKategorie" = "No category";
"buchung.uebertrag" = "Transfer";
/* --- Transaction types --- */
"buchungsart.ausgabe" = "Expense";
"buchungsart.einnahme" = "Income";
"buchungsart.uebertrag" = "Transfer";
/* --- Subscriptions --- */
"abos.leerTitel" = "No subscriptions";
"abos.leerErklaerung" = "Subscriptions and contracts show up here once you add them.";
"abos.beendeteZeigen" = "Show cancelled";
"abos.beendet" = "cancelled";
"abos.jaehrlichUndAnzahl" = "%1$@ per year · %2$d active";
"abos.ohneKurs" = "No exchange rate for %@ – those subscriptions are missing from the total.";
"abo.monatlich" = "monthly";
"abo.vierteljaehrlich" = "quarterly";
"abo.halbjaehrlich" = "twice a year";
"abo.jaehrlich" = "yearly";
"abo.alleNMonate" = "every %d months";
"abo.proMonat" = "%@ per month";
"abo.naechste" = "next on %@";
"abo.inTagen" = "due in %d days";
/* --- Edit transaction --- */
"buchung.neu" = "New transaction";
"buchung.aendern" = "Edit transaction";
"buchung.datum" = "Date";
"buchung.betrag" = "Amount";
"buchung.konto" = "Account";
"buchung.konto.keines" = "No account";
"buchung.zielkonto" = "To account";
"buchung.kategorie" = "Category";
"buchung.empfaenger" = "Payee";
"buchung.verwendungszweck" = "Description";
"buchung.notiz" = "Note";
"buchung.schlagwoerter" = "Tags";
"buchung.keineSchlagwoerter" = "No tags yet. You can add them on the desktop.";
"buchung.uebertragErklaerung" = "A transfer moves money between your own accounts. It counts in no report and therefore needs no category.";
"buchung.loeschen" = "Delete transaction";
"buchung.loeschenFrage" = "Delete this transaction?";
/* --- Edit budget --- */
"budget.geplant" = "Planned";
"budget.zuschlag" = "Extra";
"budget.ausVertraegen" = "From subscriptions";
"budget.ergibt" = "Totals";
"budget.monatSetzen" = "This month only";
"budget.vorlageSetzen" = "Default budget";
"budget.vorlage" = "Template";
"budget.ausVertraegenRechnen" = "Calculate from subscriptions";
"budget.berechnetErklaerung" = "The planned amount comes from this category's subscriptions plus the extra. Change a subscription and the budget follows.";
"budget.festErklaerung" = "A fixed amount you set yourself.";
"budget.vorlageHolen" = "Load template into this month";
"budget.alsVorlageSetzen" = "Make this month the default";
"budget.zuruecksetzen" = "Reset month";
"budget.zuruecksetzenFrage" = "Reset this month?";
"budget.zuruecksetzenErklaerung" = "All adjustments to this month are dropped. The default budget applies again.";
/* --- Edit subscription --- */
"abo.neu" = "New subscription";
"abo.aendern" = "Edit subscription";
"abo.name" = "Name";
"abo.betrag" = "Amount per payment";
"abo.rhythmus" = "Billed";
"abo.konto" = "Charged to";
"abo.kategorieErklaerung" = "The category decides which budget line this subscription counts towards.";
"abo.faelligkeitKennen" = "Next payment known";
"abo.naechsteZahlung" = "Next payment";
"abo.erkennungstext" = "Match text";
"abo.erkennungErklaerung" = "How the matcher recognises this subscription in a transaction - usually part of the payee name.";
"abo.laeuftNoch" = "Still running";
"abo.beendenStattLoeschen" = "Cancelling keeps the record of what it cost. Deleting removes it entirely.";
"abo.loeschen" = "Delete subscription";
"abo.loeschenFrage" = "Delete this subscription?";
"abo.loeschenErklaerung" = "The linked transactions stay; they only lose the label.";
/* --- Edit account --- */
"konto.neu" = "New account";
"konto.aendern" = "Edit account";
"konto.name" = "Name";
"konto.art" = "Type";
"konto.waehrung" = "Currency";
"konto.anfangssaldo" = "Opening balance";
"konto.stichtagKennen" = "Set an opening date";
"konto.stichtag" = "Opening date";
"konto.anfangssaldoErklaerung" = "The balance to start from. Without a date it applies from the beginning; with one, only transactions from that day count on top.";
"konto.kreditrahmenKennen" = "Set a credit limit";
"konto.kreditrahmen" = "Credit limit";
"konto.kreditrahmenErklaerung" = "What the card may spend - not a balance.";
"konto.gebunden" = "Locked money";
"konto.gebundenErklaerung" = "Money you cannot reach, such as a pension account. It does not count as available.";
"konto.archiviert" = "Archived";
"konto.archivierenStattLoeschen" = "Archiving hides the account and keeps its transactions. Deleting only works while none are attached.";
"konto.loeschen" = "Delete account";
"konto.loeschenFrage" = "Delete this account?";
"konto.loeschenErklaerung" = "Only possible while no transaction is attached. Archive it otherwise.";
/* --- Inbox / work list --- */
"arbeit.leerTitel" = "Nothing to do";
"arbeit.leerErklaerung" = "No pending entries, no transfer suggestions, no duplicates. Just as it should be.";
"arbeit.eingang" = "To book";
"arbeit.uebertraege" = "Might be transfers";
"arbeit.ohneKategorie" = "Without a category";
"arbeit.dubletten" = "Looks duplicated";
"arbeit.dublettenErklaerung" = "Same account, same day, same amount. Only you know whether it really is the same payment - different reference numbers mean the bank reported them as separate.";
"arbeit.buchen" = "Book";
"arbeit.alleBuchen" = "Book all that have an account";
"arbeit.alsUebertrag" = "Transfer";
"arbeit.verwerfen" = "Discard";
"arbeit.verbinden" = "Link";
"arbeit.keinUebertrag" = "Not a transfer";
"arbeit.istRichtigSo" = "That is correct";
"arbeit.unklarHinweis" = "The matcher was unsure - have a look first.";
"arbeit.hatKategorie" = "One of the two has a category. Linking takes it out of the budget.";
"arbeit.ohneKonto" = "no account";
"arbeit.rueckfrage" = "Are you sure?";
"arbeit.trotzdem" = "Do it anyway";
"arbeit.zielkontoErklaerung" = "This creates one transaction moving the money from one account to the other. It counts in both balances and in no report.";
/* --- Inbox: source and status --- */
"eingang.quelle.kurzbefehl" = "Shortcut";
"eingang.quelle.postfach" = "Mailbox";
"eingang.quelle.bank" = "Bank";
"eingang.stand.gebucht" = "booked";
"eingang.stand.offen" = "pending";
"eingang.stand.unklar" = "unclear";
"eingang.stand.verworfen" = "discarded";