Bisher musste die Regel auf BEIDEN Auszügen ein fremdes Gegenkonto liefern. Beim Empfangs-Auszug zeigt sie aber auf das Konto, das gerade importiert wird – damit blieb die Zeile ohne Gegenkonto und wurde still als Einnahme gebucht. - Gegenbuchungen werden über die Konto-Seite bestehender Transfers gesucht, nicht über das Konto-Paar. Der Empfangs-Auszug braucht damit keine Regel mehr; eine Regel auf der abgehenden Seite genügt für beide Dateien. - Trifft eine Transfer-Regel, ohne dass ein Gegenkonto feststeht, wird die Zeile nicht mehr als Einnahme/Ausgabe gebucht, sondern in der Prüfansicht mit „Gegenkonto wählen" markiert – sonst zählt die Bewegung je nach Import- Reihenfolge doppelt. - Tests für beide Reihenfolgen; 86 grün. Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
418 lines
17 KiB
JSON
418 lines
17 KiB
JSON
{
|
||
"common": {
|
||
"save": "Save",
|
||
"cancel": "Cancel",
|
||
"delete": "Delete",
|
||
"create": "Create",
|
||
"edit": "Edit",
|
||
"loading": "Loading…",
|
||
"logout": "Log out",
|
||
"admin": "Administrator",
|
||
"user": "User",
|
||
"close": "Close",
|
||
"retry": "Try again",
|
||
"actions": "Actions"
|
||
},
|
||
"nav": {
|
||
"overview": "Overview",
|
||
"accounts": "Accounts",
|
||
"categories": "Categories",
|
||
"transactions": "Transactions",
|
||
"budget": "Budget",
|
||
"import": "Import",
|
||
"system": "System",
|
||
"users": "Users",
|
||
"settings": "Settings"
|
||
},
|
||
"login": {
|
||
"subtitle": "Please sign in",
|
||
"username": "Username",
|
||
"password": "Password",
|
||
"submit": "Sign in",
|
||
"error": "Wrong username or password",
|
||
"expired": "Your session has expired. Please sign in again."
|
||
},
|
||
"changepw": {
|
||
"title": "Change password",
|
||
"forcedHint": "Please set your own password before continuing.",
|
||
"current": "Current password",
|
||
"new": "New password",
|
||
"repeat": "Repeat new password",
|
||
"submit": "Save password",
|
||
"mismatch": "The new passwords do not match.",
|
||
"saved": "Password changed.",
|
||
"policyHint": "The password policy has changed. Your current password no longer meets it – please choose a new one."
|
||
},
|
||
"users": {
|
||
"title": "Users",
|
||
"new": "New user",
|
||
"username": "Username",
|
||
"displayName": "Display name",
|
||
"password": "Temporary password",
|
||
"passwordHint": "The user will be asked to change it on first login.",
|
||
"role": "Role",
|
||
"status": "Status",
|
||
"active": "Active",
|
||
"inactive": "Disabled",
|
||
"resetPassword": "Reset password",
|
||
"deleteConfirm": "Really delete this user?",
|
||
"created": "User created.",
|
||
"you": "(you)",
|
||
"twoFactor": "Two-factor",
|
||
"resetTwoFactor": "Reset two-factor",
|
||
"resetTwoFactorConfirm": "Turn off two-factor for “{{name}}”? Only needed if both device and recovery codes are lost.",
|
||
"twoFactorReset": "Two-factor reset.",
|
||
"generatePassword": "Generate password"
|
||
},
|
||
"account": {
|
||
"title": "My account",
|
||
"password": "Change password",
|
||
"twoFactor": "Two-factor authentication",
|
||
"manage2fa": "Manage 2FA"
|
||
},
|
||
"settings": {
|
||
"title": "Settings",
|
||
"general": "Appearance & language",
|
||
"baseCurrency": "Base currency",
|
||
"baseCurrencyHint": "Currency for budget totals and dashboard aggregates.",
|
||
"locale": "Language",
|
||
"theme": "Appearance",
|
||
"themeSystem": "Automatic (system)",
|
||
"themeLight": "Light",
|
||
"themeDark": "Dark",
|
||
"budgetStartDay": "Budget month starts on",
|
||
"budgetStartDayHint": "Day your budget month starts (e.g. the 25th).",
|
||
"dateFormat": "Date format",
|
||
"saved": "Saved.",
|
||
"languageDe": "German",
|
||
"languageEn": "English",
|
||
"backup": "Backup & export",
|
||
"exportHint": "For reading and further processing, e.g. in a spreadsheet. These files cannot be restored.",
|
||
"exportTxnCsv": "Transactions (CSV)",
|
||
"exportTxnJson": "Transactions (JSON)",
|
||
"exportAll": "Data overview (JSON)",
|
||
"dbBackup": "Download full DB backup",
|
||
"dbBackupHint": "Complete database of all users (admin only) — keep it for restore.",
|
||
"keywordReview": "Review keywords",
|
||
"keywordReviewHint": "These keywords keep getting corrected away — maybe they no longer fit?",
|
||
"keywordCorrected": "{{overridden}} of {{applied}} transactions corrected",
|
||
"keep": "Keep",
|
||
"remove": "Remove",
|
||
"security": "Security",
|
||
"securityHint": "Two-factor authentication for your own account.",
|
||
"twoFactor": "Manage two-factor",
|
||
"backupHint": "The full backup contains all of your data and can be restored below.",
|
||
"exportBackup": "Full backup (JSON)",
|
||
"systemBackup": "System-wide full backup (JSON)",
|
||
"systemBackupWarning": "The system-wide backup contains password hashes and two-factor secrets of every user. Treat the file like a password."
|
||
},
|
||
"dashboard": {
|
||
"title": "Overview",
|
||
"emptyCards": "No cards. Click “Arrange” and add some.",
|
||
"edit": "Arrange",
|
||
"done": "Done",
|
||
"addCard": "Add card",
|
||
"reset": "Reset",
|
||
"resetConfirm": "Reset the dashboard to the default layout?"
|
||
},
|
||
"cards": {
|
||
"balances": "Account balances",
|
||
"budgetDonut": "Budget",
|
||
"netWorth": "Net worth",
|
||
"budgetProgress": "Budget progress",
|
||
"incomeExpense": "Income & expenses",
|
||
"recent": "Recent transactions",
|
||
"total": "Total",
|
||
"planned": "planned",
|
||
"spent": "spent",
|
||
"assets": "Net worth",
|
||
"income": "Income",
|
||
"expense": "Expenses",
|
||
"net": "Balance",
|
||
"noBudget": "No budget for this month yet.",
|
||
"breakdown": "Breakdown",
|
||
"byGroup": "Groups",
|
||
"byCategory": "Categories"
|
||
},
|
||
"server": {
|
||
"unreachable": "Server unreachable.",
|
||
"sessionKept": "Your session is still valid – once the server responds again, it will continue."
|
||
},
|
||
"accounts": {
|
||
"title": "Accounts",
|
||
"new": "New account",
|
||
"edit": "Edit account",
|
||
"name": "Name",
|
||
"type": "Type",
|
||
"currency": "Currency",
|
||
"icon": "Icon",
|
||
"color": "Color",
|
||
"openingBalance": "Opening balance",
|
||
"openingDate": "As of",
|
||
"identifiers": "Identifiers (IBAN etc.)",
|
||
"addIdentifier": "Add identifier",
|
||
"textIdentPlaceholder": "e.g. Savings, Deposit",
|
||
"identShort": "id(s)",
|
||
"total": "Total",
|
||
"empty": "No accounts yet. Create your first account.",
|
||
"deleteConfirm": "Delete this account and all its transactions?"
|
||
},
|
||
"accountTypes": {
|
||
"girokonto": "Checking",
|
||
"sparkonto": "Savings",
|
||
"bargeld": "Cash",
|
||
"kreditkarte": "Credit card",
|
||
"depot": "Brokerage / Investment",
|
||
"sonstiges": "Other"
|
||
},
|
||
"identifierKinds": {
|
||
"iban": "IBAN",
|
||
"account_no": "Account number",
|
||
"card_no": "Card number",
|
||
"text": "Text (detection)"
|
||
},
|
||
"transferRules": {
|
||
"title": "Transfer detection",
|
||
"hint": "Transactions whose text contains one of these words (e.g. “Revolut”) are set as a transfer. Pick a fixed target account – or let it be guessed automatically from the booking text (via each account's detection texts: edit account, kind “Text”).",
|
||
"wordPlaceholder": "Word (e.g. Transfer)",
|
||
"autoTarget": "automatic",
|
||
"empty": "No transfer keywords yet."
|
||
},
|
||
"categories": {
|
||
"title": "Categories",
|
||
"newGroup": "New group",
|
||
"editGroup": "Edit group",
|
||
"newCategory": "New category",
|
||
"editCategory": "Edit category",
|
||
"name": "Name",
|
||
"kind": "Kind",
|
||
"income": "Income",
|
||
"expense": "Expense",
|
||
"emptyGroup": "No categories in this group.",
|
||
"deleteConfirm": "Delete this category?",
|
||
"deleteGroupConfirm": "Delete this group and all its categories?",
|
||
"keywordsBtn": "Keywords",
|
||
"keywordsCount_one": "{{count}} keyword set",
|
||
"keywordsCount_other": "{{count}} keywords set",
|
||
"keywordsTitle": "Keywords – {{name}}",
|
||
"keywordsHint": "Transactions whose payee or description contains one of these words are automatically assigned to this category on future imports.",
|
||
"keywordAdd": "Type a word and press Enter",
|
||
"keywordAmount": "Amount (optional)",
|
||
"keywordEmpty": "No keywords yet.",
|
||
"keywordAddBtn": "Add",
|
||
"keywordEditHint": "Double-click a keyword to load it, with its amount, into the row above.",
|
||
"keywordEditing": "Editing an existing keyword – press Escape to cancel.",
|
||
"searchPlaceholder": "Search category …"
|
||
},
|
||
"transactions": {
|
||
"title": "Transactions",
|
||
"new": "New transaction",
|
||
"edit": "Edit transaction",
|
||
"expense": "Expense",
|
||
"income": "Income",
|
||
"transfer": "Transfer",
|
||
"date": "Date",
|
||
"account": "Account",
|
||
"fromAccount": "From account",
|
||
"toAccount": "To account",
|
||
"category": "Category",
|
||
"amount": "Amount",
|
||
"toAmount": "Credited",
|
||
"payee": "Payee",
|
||
"description": "Description",
|
||
"uncategorized": "Uncategorized",
|
||
"empty": "No transactions yet.",
|
||
"needAccount": "Create an account first to record transactions.",
|
||
"allAccounts": "All accounts",
|
||
"allTypes": "All types",
|
||
"deleteConfirm": "Delete this transaction?",
|
||
"amountRequired": "Please enter an amount.",
|
||
"accountRequired": "Please choose an account.",
|
||
"budgetAsSavings": "Count as savings in the budget",
|
||
"budgetCategory": "Budget category"
|
||
},
|
||
"budget": {
|
||
"title": "Budget",
|
||
"monthMode": "Month",
|
||
"templateMode": "Standard budget",
|
||
"income": "Income",
|
||
"expenses": "Expenses",
|
||
"planned": "Planned",
|
||
"totalIncome": "Total income",
|
||
"totalExpense": "Total expenses",
|
||
"reset": "Reset to standard",
|
||
"resetTitle": "Reset month",
|
||
"resetConfirm": "Reset this month to the standard budget? This month's adjustments will be lost.",
|
||
"templateHint": "The standard budget applies to every month until you adjust a month individually.",
|
||
"prevMonth": "Previous month",
|
||
"nextMonth": "Next month",
|
||
"monthsShown": "Months:",
|
||
"setAsTemplate": "Set as standard",
|
||
"setAsTemplateConfirm": "Use this month's amounts as the new standard budget? The current template is replaced (planned income stays).",
|
||
"copyFromTemplate": "Apply standard",
|
||
"copyFromTemplateConfirm": "Overwrite this month with the standard budget? This month's adjustments will be lost.",
|
||
"addIncome": "Planned income",
|
||
"editIncome": "Edit income",
|
||
"noIncome": "No planned income yet.",
|
||
"deleteIncomeConfirm": "Delete this planned income?",
|
||
"incomeLabel": "Label",
|
||
"incomeCategory": "Category",
|
||
"targetAccount": "Target account"
|
||
},
|
||
"import": {
|
||
"title": "Import",
|
||
"modeCsv": "CSV",
|
||
"modeDoc": "PDF · Image",
|
||
"readDoc": "Read document",
|
||
"docHint": "PDF/image recognition is best-effort — please check and fix every row.",
|
||
"extractedText": "Extracted text (for reference)",
|
||
"step1": "1 · Account & file",
|
||
"step2": "2 · Format",
|
||
"step3": "3 · Map columns",
|
||
"step4": "4 · Review & import",
|
||
"account": "Target account",
|
||
"file": "File",
|
||
"preset": "Bank preset",
|
||
"template": "My template",
|
||
"templateAny": "Template",
|
||
"presetGroup": "Bank templates",
|
||
"ownGroup": "My templates",
|
||
"templateManual": "Configure manually",
|
||
"overwriteConfirm": "Overwrite template “{{name}}” with the current settings?",
|
||
"autoPreviewNote": "The column preview appears automatically once the file and format are set.",
|
||
"moreColumns": "More columns (optional)",
|
||
"ibanHint": "Counterparty IBAN – only needed if your export has a column with the other account's IBAN; used for automatic transfer detection.",
|
||
"belegPreview": "Document",
|
||
"delimiter": "Delimiter",
|
||
"decimal": "Decimal separator",
|
||
"dateFormat": "Date format",
|
||
"encoding": "Encoding",
|
||
"amountMode": "Amount columns",
|
||
"skipRows": "Skip rows",
|
||
"hasHeader": "First row is a header",
|
||
"modeSigned": "Single amount (signed)",
|
||
"modeDebitCredit": "Separate debit/credit columns",
|
||
"modeAbsExpense": "Single amount (always expense)",
|
||
"readFile": "Read file",
|
||
"makePreview": "Build preview",
|
||
"saveTemplate": "Save as template",
|
||
"templateName": "Template name",
|
||
"colDate": "Date",
|
||
"colAmount": "Amount",
|
||
"colDebit": "Debit (out)",
|
||
"colCredit": "Credit (in)",
|
||
"colPayee": "Payee",
|
||
"colPurpose": "Purpose",
|
||
"colIban": "Counterparty IBAN",
|
||
"makePreviewHint": "Map at least date and amount.",
|
||
"rawHint": "Only the first rows – just for mapping the columns.",
|
||
"makePreviewNote": "“Build preview” then shows ALL transactions to review and import.",
|
||
"summary": "{{total}} rows detected · {{n}} will be imported (duplicates/invalid excluded).",
|
||
"noneValid": "No valid transaction detected. Check date format, decimal separator and column mapping – easiest is to pick the matching bank preset above.",
|
||
"commit": "Import {{n}} transactions",
|
||
"imported": "Imported {{n}} transactions.",
|
||
"importedCount": "{{n}} imported",
|
||
"typeCol": "Type",
|
||
"payeeCol": "Payee / purpose",
|
||
"badDate": "Date?",
|
||
"duplicate": "Duplicate",
|
||
"counterpart": "Counterpart",
|
||
"chooseAccount": "Choose account",
|
||
"history": "Import history",
|
||
"undo": "Undo",
|
||
"undoConfirm": "Remove all transactions from {{file}}?",
|
||
"undone": "undone",
|
||
"needFile": "Please choose a CSV file first.",
|
||
"needFileAccount": "Please choose an account and a file.",
|
||
"colFee": "Fee",
|
||
"colCurrency": "Currency",
|
||
"colState": "State",
|
||
"extraColsHint": "The fee is deducted from the amount. Rows whose state is not COMPLETED (e.g. reverted) and rows in a currency other than the target account are not imported.",
|
||
"skipState": "reverted",
|
||
"skipCurrency": "other currency",
|
||
"colBalance": "Balance (running)",
|
||
"reconOk": "Balance check passes: all {{n}} steps match the file's balance column.",
|
||
"reconDiff": "Balance check failed. Per file: {{file}} · computed: {{app}} · difference: {{diff}}.",
|
||
"reconFirst": "First mismatch on {{date}} at “{{payee}}”: bank {{expected}}, detected {{actual}}.",
|
||
"reconOpening": "Opening balance per file: {{value}} (enter it on the account so the balance matches).",
|
||
"needsTarget": "pick account"
|
||
},
|
||
"password": {
|
||
"show": "Show password",
|
||
"hide": "Hide password",
|
||
"met": "(met)",
|
||
"unmet": "(not met)",
|
||
"ruleLength": "At least {{n}} characters",
|
||
"ruleUpper": "At least one uppercase letter",
|
||
"ruleLower": "At least one lowercase letter",
|
||
"ruleDigit": "At least one digit",
|
||
"ruleSpecial": "At least one special character"
|
||
},
|
||
"twofactor": {
|
||
"title": "Two-factor authentication",
|
||
"intro": "A one-time code from an authenticator app on top of your password. Knowing your password alone is no longer enough.",
|
||
"on": "Active",
|
||
"off": "Not set up",
|
||
"start": "Set up",
|
||
"scan": "Scan the code with your authenticator app (e.g. Aegis, 1Password, Google Authenticator).",
|
||
"qrAlt": "QR code for setting up the authenticator app",
|
||
"manual": "If scanning does not work, enter this key manually:",
|
||
"code": "Code from the app",
|
||
"codeHint": "Enter the six-digit code from your authenticator app.",
|
||
"activate": "Activate",
|
||
"verify": "Confirm",
|
||
"useRecovery": "Use a recovery code",
|
||
"useApp": "Use the app code instead",
|
||
"recoveryCode": "Recovery code",
|
||
"recoveryHint": "Enter one of your recovery codes. Each one works only once.",
|
||
"codesTitle": "Recovery codes",
|
||
"codesHint": "Keep these codes somewhere safe – printed, for example. They are the only way back in if you lose your device. Each code works exactly once and they are shown here only this one time.",
|
||
"codesSaved": "I have saved them",
|
||
"codesLeft": "{{n}} unused recovery codes left.",
|
||
"copy": "Copy",
|
||
"copied": "Copied to clipboard.",
|
||
"download": "Save as file",
|
||
"newCodes": "Generate new codes",
|
||
"newCodesTitle": "New recovery codes",
|
||
"newCodesHint": "The previous codes stop working. Enter your password to confirm.",
|
||
"disable": "Turn off two-factor",
|
||
"disableTitle": "Turn off two-factor",
|
||
"disableHint": "Your password alone will be enough again. Enter your password to confirm.",
|
||
"disabled": "Two-factor turned off.",
|
||
"requiredHint": "The policy requires two-factor. The rest of the application stays locked until you set it up."
|
||
},
|
||
"policy": {
|
||
"title": "Password policy",
|
||
"hint": "Applies to every user of this instance.",
|
||
"minLength": "Minimum length",
|
||
"require_upper": "Require an uppercase letter",
|
||
"require_lower": "Require a lowercase letter",
|
||
"require_digit": "Require a digit",
|
||
"require_special": "Require a special character",
|
||
"mfaRequired": "Require two-factor for everyone",
|
||
"mfaHint": "Users without a second factor must set one up at their next sign-in.",
|
||
"tightenWarning": "Tightening: users whose password no longer meets the policy will have to change it at their next sign-in.",
|
||
"mfaWarning": "Every user without two-factor will be taken to the setup at their next sign-in – including you."
|
||
},
|
||
"restore": {
|
||
"title": "Restore a backup",
|
||
"hint": "Pick a backup file. It is only inspected first; nothing is written until you confirm.",
|
||
"file": "Backup file",
|
||
"empty": "The file contains no data.",
|
||
"scopeUser": "Backup of the data of “{{name}}”.",
|
||
"scopeSystem": "System-wide backup with {{n}} users.",
|
||
"exportedAt": "Created on {{when}}",
|
||
"mode": "How to proceed",
|
||
"modeReplace": "Replace",
|
||
"modeMerge": "Add missing",
|
||
"modeReplaceHint": "Existing data is deleted and replaced by the backup. The server writes a database snapshot beforehand.",
|
||
"modeMergeHint": "Nothing is deleted. Only missing entries are added; budget, rules and settings stay untouched if anything is already there.",
|
||
"start": "Restore",
|
||
"confirmTitle": "Really restore?",
|
||
"confirmReplace": "All your accounts, transactions, categories and settings will be deleted and replaced by the backup.",
|
||
"confirmSystem": "All users and their data will be deleted and replaced by the backup. Every session ends afterwards.",
|
||
"done": "Restore finished.",
|
||
"doneSystem": "Restore finished. Please sign in again."
|
||
}
|
||
}
|