Ein Screenshot von einer Website ist selten schon das Logo – da ist Rand drumherum oder drei Marken nebeneinander. Nach dem Waehlen kommt deshalb ein Rahmen: ziehen zum Verschieben, Regler zum Zoomen. Der Rahmen IST der Ausschnitt. Deshalb nichts abgedunkelt und keine Hilfslinien darin – man soll das Ergebnis sehen und nicht eine Vorschau davon, die man erst uebersetzen muss. Zu Beginn steht das GANZE Bild im Rahmen. Wer nicht zuschneiden will, drueckt Uebernehmen und bekommt, was er hochgeladen hat; Zuschneiden ist ein Zoom, kein Zwang. Verschieben geht nur, solange das Bild den Rahmen ueberragt – sonst schoebe man ein kleines Bild aus seinem eigenen Ausschnitt heraus. Geschnitten wird im Browser, hochgeladen nur noch der Ausschnitt: Der Server bekommt kein Bild, das er gar nicht behalten soll. Der durchsichtige Grund bleibt durchsichtig – ein weisser Kasten fiele auf dunklem Hintergrund sofort auf. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
798 lines
42 KiB
JSON
798 lines
42 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",
|
||
"todo": "To do",
|
||
"abos": "Subscriptions"
|
||
},
|
||
"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.",
|
||
"activeCurrencies": "Offered currencies",
|
||
"activeCurrenciesHint": "Only these appear in the currency pickers for accounts and contracts. All others stay valid – if one is already in use, it still shows up there.",
|
||
"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.",
|
||
"sections": "Sections"
|
||
},
|
||
"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",
|
||
"expenseShare": "Expense share",
|
||
"noExpenses": "No expenses this month yet.",
|
||
"display": "Display",
|
||
"asList": "List",
|
||
"asPie": "Pie",
|
||
"range": "Range",
|
||
"days30": "30 d",
|
||
"days90": "90 d",
|
||
"days180": "6 m",
|
||
"days365": "1 y"
|
||
},
|
||
"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",
|
||
"total": "Total",
|
||
"empty": "No accounts yet. Create your first account.",
|
||
"deleteConfirm": "Delete this account and all its transactions?",
|
||
"openingDateHint": "Balance at the end of that day. Bookings up to then don't count toward the balance but stay in the list and reports. Without a date, everything counts.",
|
||
"savingsCategory": "Count savings towards",
|
||
"savingsCategoryNone": "Not a savings account",
|
||
"savingsCategoryHint": "Transfers into this account count as savings against this category in the budget – including those that arrive from the bank as two linked transactions. Individual transactions can be excluded.",
|
||
"savingsCategoryNeutral": "This category is marked “exclude from reports”. The category's setting wins: while it is set, savings will not show up in the budget or the dashboard.",
|
||
"shortIdentWarning": "Short match texts hit unrelated bookings: “Euro” also occurs in “Europa-Park” or “PayPal Europe”, turning those into transfers by mistake. Prefer something unique such as the IBAN.",
|
||
"moveUp": "Move up",
|
||
"moveDown": "Move down",
|
||
"bankBalanceMatches": "Balance matches the bank",
|
||
"bankBalanceDiffers": "Bank: {{bank}} · Certain differs by {{diff}}",
|
||
"adoptBankBalance": "Adopt the bank's balance",
|
||
"adoptConfirm": "The balance of {{bank}} is taken as correct. The difference of {{diff}} moves into the opening balance – it stands for movements Certain never saw. Your transactions stay unchanged.",
|
||
"adopted": "Balance adopted.",
|
||
"identShort_one": "{{count}} identifier",
|
||
"identShort_other": "{{count}} identifiers",
|
||
"bankBalanceAvailable": "The bank reports {{bank}} as the available balance – it includes pending items and cannot be compared.",
|
||
"adoptConfirmAvailable": "Careful: {{bank}} is the AVAILABLE balance – it includes pending items that will still arrive as bookings. If you align now, your account will be off by exactly those once they are booked. The difference of {{diff}} moves into the opening balance; your transactions stay unchanged.",
|
||
"breakdown": "What is this made of?",
|
||
"part": {
|
||
"anfangsbestand": "Opening balance",
|
||
"einnahmen": "Income",
|
||
"ausgaben": "Expenses",
|
||
"uebertraege_raus": "Transfers out",
|
||
"uebertraege_rein": "Transfers in",
|
||
"saldo": "makes",
|
||
"bankGebucht": "Bank (booked)",
|
||
"bankVerfuegbar": "Bank (available)",
|
||
"legs": "This account's transfers",
|
||
"beforeCutoff": "before ({{n}} up to {{datum}}, already in the opening balance)"
|
||
}
|
||
},
|
||
"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 …",
|
||
"excludedFromStats": "Exclude from reports",
|
||
"excludedHint": "For transfers between your own accounts: the balance still changes, but budget, dashboard and statistics leave these out – the money was not spent.",
|
||
"spendingIsGood": "This spending is not a loss",
|
||
"spendingIsGoodHint": "For savings and reserves: the amount still counts towards the budget – the money is committed this month – but it is shown neutrally instead of red, and putting aside more than planned is not treated as overspending.",
|
||
"excludedShort": "neutral",
|
||
"applyRules": "Apply rules to existing transactions",
|
||
"applyRulesHint": "Rules apply on import. Anything that came in earlier – or before the rule existed – still sits there without a category. This catches up.",
|
||
"applyPreview": "{{kategorien}} would get a category, {{uebertraege}} would become transfers. Apply now?",
|
||
"applyNothing": "No uncategorised transaction matches a rule.",
|
||
"applyDone": "{{kategorien}} categorised, {{uebertraege}} booked as transfers.",
|
||
"applySkipped": "Skipped because unclear"
|
||
},
|
||
"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",
|
||
"subject": "Subject",
|
||
"budgetPeriod": "Budget period",
|
||
"budgetPeriodAuto": "from the date",
|
||
"budgetPeriodManual": "set by hand",
|
||
"budgetPeriodReset": "back to the date",
|
||
"budgetPeriodBack": "One month back",
|
||
"budgetPeriodForward": "One month forward",
|
||
"budgetPeriodHint": "For exceptions only: a payment that visibly falls in one month but belongs to another. It then counts there alone – no longer in its own month.",
|
||
"budgetPeriodChange": "change"
|
||
},
|
||
"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"
|
||
},
|
||
"abos": {
|
||
"title": "Subscriptions & contracts",
|
||
"new": "New contract",
|
||
"edit": "Edit contract",
|
||
"delete": "Delete",
|
||
"deleteConfirm": "Really delete “{{name}}”? The contract and its details are gone. If it merely ended, mark it cancelled instead — then it stays for reference.",
|
||
"monthlyTotal": "Per month",
|
||
"yearlyTotal": "Per year",
|
||
"activeCount": "Active contracts",
|
||
"dueSoon": "Due soon",
|
||
"all": "All contracts",
|
||
"cancelled": "Cancelled",
|
||
"cancelledHint": "No longer counted in the total. They stay so you can look back at what you had.",
|
||
"empty": "No contracts yet. Add what goes out regularly — streaming, phone, insurance, travel pass.",
|
||
"noRate": "No exchange rate for {{waehrungen}}. Those contracts are missing from the total.",
|
||
"name": "Name",
|
||
"amount": "Amount per billing",
|
||
"currency": "Currency",
|
||
"interval": "Billed",
|
||
"every": {
|
||
"1": "monthly",
|
||
"2": "every 2 months",
|
||
"3": "quarterly",
|
||
"6": "twice a year",
|
||
"12": "yearly"
|
||
},
|
||
"perMonth": "{{betrag}} per month",
|
||
"paidFrom": "Paid from",
|
||
"accountNone": "No account chosen",
|
||
"category": "Category",
|
||
"categoryNone": "No category",
|
||
"nextDue": "Next due",
|
||
"dueIn": "in {{tage}} days",
|
||
"dueToday": "due today",
|
||
"overdue": "{{tage}} days overdue",
|
||
"savingsAccount": "I set aside monthly into",
|
||
"savingsNone": "Do not set aside",
|
||
"savingsHint": "At this interval that would be {{betrag}} per month. Pick the account you set aside into — then the bill does not blow up a single month.",
|
||
"savingInto": "saving into {{name}}",
|
||
"pattern": "Match text",
|
||
"patternHint": "How the charge appears on the statement — rarely the name you know it by. Not used yet; it arrives with automatic matching.",
|
||
"cancelledFlag": "Cancelled",
|
||
"cancelledFlagHint": "Stops counting towards the monthly total but stays in the list.",
|
||
"notes": "Note",
|
||
"logo": "Logo",
|
||
"logoUpload": "Choose image",
|
||
"logoRemove": "Remove",
|
||
"logoHint": "PNG, JPEG, WEBP or GIF. It is scaled down for you – upload the large one. While there is no logo, the icon below is used.",
|
||
"logoAfterSave": "A logo can be attached once the contract is saved. Until then the icon below is used.",
|
||
"cropTitle": "Choose the crop",
|
||
"cropApply": "Use this",
|
||
"cropHint": "Zoom in to pick a section. What you see here is what gets saved.",
|
||
"cropHintMove": "Drag to move. What you see here is what gets saved.",
|
||
"cropUnreadable": "That is not a readable image. PNG, JPEG, WEBP or GIF work.",
|
||
"cropFailed": "The crop could not be created."
|
||
},
|
||
"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": "The balance doesn't add up. The file ends at {{file}}, but the rows add up to {{app}} – {{diff}} missing or too much.",
|
||
"reconFirst": "They start to diverge on {{date}} at “{{payee}}”: the file's balance column moves by {{expected}}, while the row itself states {{actual}}.",
|
||
"reconOpening": "Before the first row the file stood at {{value}}. Enter that as the account's opening balance, dated the day before.",
|
||
"needsTarget": "pick account",
|
||
"filterColumn": "Only rows from column",
|
||
"filterValue": "with value",
|
||
"filterValuePlaceholder": "e.g. Current",
|
||
"filterNone": "— no filter —",
|
||
"filterHint": "Revolut puts every product (current, savings, investment …) into ONE file, each with its own balance. Pick one here and import the others separately into their own accounts – otherwise the movements count twice.",
|
||
"removeEntry": "Remove entry",
|
||
"removeEntryConfirm": "Remove the history entry “{{file}}”? Its transactions have already been undone.",
|
||
"reconMixedHint": "Does the file hold several accounts or products? Revolut puts current, savings and investment into ONE file, each with its own balance column. The check only works once you set the row filter above (e.g. Product = Current) and import the other products separately.",
|
||
"filterTitle": "This file holds several accounts",
|
||
"filterValueOption": "{{value}} ({{count}} rows)",
|
||
"removeAllUndone": "Remove undone entries",
|
||
"removeAllUndoneConfirm": "Remove {{n}} undone entries from the history? The bookings are already gone; only the entry disappears.",
|
||
"dupInbox": "already captured",
|
||
"dupInboxHint": "You recorded this payment on the go via shortcut – same amount, nearby date. It is already booked, so it is skipped. If these really are two separate payments, tick the row by hand.",
|
||
"fromPhone": "Received from your phone",
|
||
"fromPhoneHint": "You sent these via shortcut. Nothing is booked yet – take one over and it runs through the normal preview with balance check.",
|
||
"usePhoneFile": "Take over",
|
||
"phoneFileLoaded": "“{{name}}” loaded – check the format and build the preview.",
|
||
"discardPhoneFile": "Discard file",
|
||
"discardPhoneFileConfirm": "Discard “{{name}}”? The file is deleted; nothing was booked anyway.",
|
||
"detectedBank": "Format detected: {{name}}",
|
||
"detectedGeneric": "Format derived from the file",
|
||
"detectFailed": "Format not recognised",
|
||
"detectUncertain": "Not everything was clear – check the column mapping below before building the preview."
|
||
},
|
||
"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."
|
||
},
|
||
"open": {
|
||
"title": "Bookings without a category",
|
||
"subtitle": "{{n}} left to sort – oldest first.",
|
||
"allDone": "Everything sorted.",
|
||
"choose": "Pick a category …",
|
||
"noText": "No text",
|
||
"rememberKeyword": "Remember the text as a keyword so the next matching booking is categorised on import",
|
||
"copy": "Copy text",
|
||
"copied": "Copied",
|
||
"copyFailed": "Copying failed – but the text can be selected now."
|
||
},
|
||
"tokens": {
|
||
"title": "Quick capture via shortcut",
|
||
"intro": "A device key is a long password for your phone only – not your login password. It lets an iOS shortcut send payments to Certain and nothing else: no reading bookings, no changes, no exports. If the phone is lost, revoke the key here.",
|
||
"name": "What is the key for?",
|
||
"namePlaceholder": "e.g. iPhone",
|
||
"defaultAccount": "Default account",
|
||
"create": "Create token",
|
||
"onceOnly": "This is your device key. It is shown only NOW – copy it into the shortcut. Certain does not store it in clear text and cannot show it again later.",
|
||
"copy": "Copy",
|
||
"copied": "Copied",
|
||
"copyFailed": "Copying failed – but the text can be selected.",
|
||
"hide": "Done, hide",
|
||
"guideTitle": "How to build the shortcut",
|
||
"guideNoDownload": "I cannot offer it as a download: since iOS 15 shortcut files must be signed, and only a Mac with an Apple account can sign them. Rebuilding it takes two minutes. Tip: action names change between iOS versions – search the action field for the word in bold and you will find them.",
|
||
"step1": "Search for “Input” → action “Ask for Input”. Prompt: Amount, input type Number",
|
||
"step2": "“Ask for Input” again. Prompt: What for?",
|
||
"step3": "Optional: search for “List” → “Choose from List” for the account. Without this step the token’s default account is used",
|
||
"step4": "Search for “URL” → “Get Contents of URL”. Method POST, add the header line below, request body JSON with the fields amount (Number) and payee (Text):",
|
||
"step5": "Search for “Dictionary” → “Get Dictionary Value”, key: message. Then “Show Notification” – the alert then reads “12.50 CHF on …” instead of the raw reply",
|
||
"guideHomeScreen": "Then use Share → “Add to Home Screen” so it is a single tap.",
|
||
"guideAutomation": "If your Shortcuts app offers the “Transaction” automation, you can attach the same shortcut to it: steps 1 and 2 fall away, amount and merchant come from there instead.",
|
||
"revoke": "Revoke",
|
||
"revokeConfirm": "Revoke token “{{name}}”? The shortcut on that device will stop working. Bookings already recorded stay.",
|
||
"noDefault": "no default account",
|
||
"lastUsed": "used before",
|
||
"neverUsed": "never used",
|
||
"fileGuideTitle": "Import a statement from your phone",
|
||
"fileGuideIntro": "Revolut and Raiffeisen let you export the CSV on the phone too. A second shortcut takes it from the share sheet. Prerequisite: you have imported for this account on a computer once – Certain then reuses that column mapping.",
|
||
"fileStep1": "New shortcut → tap its name → enable “Show in Share Sheet”, input type: Files",
|
||
"fileStep2": "No account needed: Certain works it out from the file (Raiffeisen carries its own IBAN, Revolut the currency). Only add account_id when that is ambiguous – the numbers are below.",
|
||
"fileStep3": "Search for “URL” → “Get Contents of URL”. Method POST, header X-Certain-Token = your device key, request body “Form” with a single field: file = Shortcut Input.",
|
||
"fileStep4": "“Show Notification” – you then see “14 booked · 512 already present”",
|
||
"fileGuideNote": "It books straight away because a statement has hundreds of rows. That is safe: existing bookings are recognised and skipped, and the whole batch can be undone with one click in the import history.",
|
||
"accountIds": "Account numbers – only needed when detection is ambiguous"
|
||
},
|
||
"inbox": {
|
||
"title": "Captured",
|
||
"intro": "Payments you recorded on the go. They are already booked – assign a category here at your leisure. The entries stay so the later statement recognises them and nothing gets booked twice.",
|
||
"empty": "Nothing captured. Set up a device token under “My account” to record payments from your phone via shortcut.",
|
||
"noText": "no text",
|
||
"viaShortcut": "via shortcut",
|
||
"discard": "Discard",
|
||
"discardConfirm": "Discard this capture? The booking is deleted. The entry stays marked as discarded so the statement still recognises the payment later.",
|
||
"book": "Book",
|
||
"bookAll": "Book all",
|
||
"bookedN": "{{n}} booked.",
|
||
"booked": "booked",
|
||
"unclear": "unclear – please review",
|
||
"viaMail": "from an email",
|
||
"asTransfer": "Book as transfer",
|
||
"transferTitle": "Account transfer",
|
||
"transferIntro": "No money spent, only moved. This creates one transaction that changes both balances and counts in no evaluation.",
|
||
"transferTargetOut": "Where did the money go?",
|
||
"transferTargetIn": "Where did the money come from?",
|
||
"transferBooked": "Booked as a transfer."
|
||
},
|
||
"mailbox": {
|
||
"title": "Mail import",
|
||
"intro": "Raiffeisen and Revolut send an email for transfers. Certain fetches them and puts them into the inbox as suggestions – only what you approve gets booked. Card payments in a shop are not emailed by the banks; use the shortcut capture under “My account” for those.",
|
||
"add": "Add mailbox",
|
||
"name": "Label",
|
||
"namePlaceholder": "e.g. Receipts",
|
||
"host": "IMAP server",
|
||
"port": "Port",
|
||
"username": "Username",
|
||
"password": "Password",
|
||
"passwordKeep": "Password (leave empty to keep)",
|
||
"passwordHint": "Stored encrypted. The key derives from the server secret: if that is replaced, you must enter the password again. Prefer an app password over your real one.",
|
||
"folder": "Folder",
|
||
"folderHint": "After a connection test you can pick from the real folders here.",
|
||
"doneFolder": "Move to after processing",
|
||
"doneFolderPlaceholder": "empty = do not move",
|
||
"pollMinutes": "Fetch every … minutes",
|
||
"test": "Test connection",
|
||
"testOk": "Connection works – {{n}} folders found.",
|
||
"fetchNow": "Fetch now",
|
||
"fetched": "{{gefunden}} mails checked · {{neu}} new · {{bekannt}} already known · {{unklar}} unclear.",
|
||
"lastPoll": "last fetched",
|
||
"neverPolled": "never fetched",
|
||
"lastError": "Error",
|
||
"delete": "Remove mailbox",
|
||
"deleteConfirm": "Remove mailbox “{{name}}”? Payments already captured stay.",
|
||
"noSenders": "No sender mapped yet – without a mapping nothing is taken over.",
|
||
"noAccount": "no account",
|
||
"fromPlaceholder": "Match text, e.g. raiffeisen",
|
||
"security": "Encryption",
|
||
"secSsl": "SSL/TLS (usual, port 993)",
|
||
"secStarttls": "STARTTLS (port 143)",
|
||
"secNone": "none",
|
||
"secNoneWarn": "Without encryption the username and password travel in clear text. Only sensible when the mail server runs on the same machine.",
|
||
"addSender": "Map sender",
|
||
"edit": "Edit mailbox",
|
||
"skippedTitle": "These emails were skipped",
|
||
"skippedHint": "No sender mapping matched them. Enter part of the address or the subject below and they will be picked up on the next fetch.",
|
||
"fetchedNone": "No mail found since {{seit}}. If the mails are older, use “Catch up on older” – or check the folder.",
|
||
"senderHint": "Searched in sender, subject and the start of the body – that also works for forwarded emails. The currency is optional: Revolut sends the same email for euros and francs, and only it tells which account is meant. Mappings with a currency take precedence over general ones.",
|
||
"deleteSender": "Remove mapping",
|
||
"deleteSenderConfirm": "Remove mapping “{{text}}”? Payments already captured stay.",
|
||
"anyCurrency": "any currency",
|
||
"fetchOlder": "Catch up on older",
|
||
"every": "every {{n}} minutes",
|
||
"manualOnly": "only on demand",
|
||
"lastPollAt": "last fetched: {{when}}",
|
||
"unclearTitle": "These mails matched but could not be read fully",
|
||
"unclearHint": "They are waiting in the to-do list – add what is missing there."
|
||
},
|
||
"bank": {
|
||
"title": "Bank account connection",
|
||
"intro": "Under PSD2, EU banks must offer an interface – but only to licensed services. Enable Banking holds that licence and passes it on, so N26 and Revolut can be read directly, without CSV. Switzerland is not covered by PSD2; Raiffeisen stays on file import.",
|
||
"setupTitle": "One-time setup",
|
||
"setupHint": "You need your own Enable Banking application. It cannot ship with Certain – the key is bound to your registration.",
|
||
"setupStep1": "Sign in at enablebanking.com (the account is created on first sign-in).",
|
||
"setupStep2": "Create an application and be sure to choose PRODUCTION, not Sandbox – the sandbox knows neither N26 nor Revolut. Then download the key file (.pem).",
|
||
"setupStep3": "Enter this address there as the redirect URL:",
|
||
"setupStart": "Enter credentials",
|
||
"appTitle": "Enable Banking credentials",
|
||
"appReady": "Application configured",
|
||
"appSaved": "Saved.",
|
||
"applicationId": "Application ID",
|
||
"privateKey": "Private key – the entire .pem file",
|
||
"privateKeyKeep": "Private key (leave empty to keep)",
|
||
"privateKeyHint": "Open the file and paste everything, INCLUDING the “-----BEGIN PRIVATE KEY-----” and “-----END PRIVATE KEY-----” lines – without them it is not valid PEM. Stored encrypted, never leaves the server; every request to the bank is signed with it.",
|
||
"baseUrl": "Public address of this installation",
|
||
"baseUrlHint": "Must start with https:// and be reachable from outside – banks do not redirect to an unencrypted address. This address plus /bank/rueckkehr is what you register with Enable Banking.",
|
||
"country": "Country of the bank",
|
||
"findBanks": "Find banks",
|
||
"noBanks": "No matches. Try a shorter term, or leave the country empty.",
|
||
"pickBank": "{{n}} of {{gesamt}} loaded banks – pick yours:",
|
||
"connect": "Connect",
|
||
"notMapped": "not mapped to an account yet",
|
||
"mapHint": "Without a mapping nothing is fetched from this account.",
|
||
"noAccountsFound": "No accounts were returned. In restricted mode the bank only releases what you linked at Enable Banking under “Activate by linking accounts” – add this bank there and reconnect here.",
|
||
"synced": "{{gebucht}} transactions booked (from {{ab}}).",
|
||
"noMapping": "No account mapped – map one above first, then it will fetch.",
|
||
"lastSync": "last {{when}}",
|
||
"neverSynced": "never fetched",
|
||
"lastError": "Error",
|
||
"validUntil": "Consent valid until {{datum}}",
|
||
"expiresSoon": "Consent expires on {{datum}} – you will need to authorise again.",
|
||
"disconnect": "Disconnect",
|
||
"disconnectConfirm": "Disconnect from “{{name}}”? The account mappings are lost. You do NOT need to disconnect to refresh – just search the bank and connect again, the mappings are kept.",
|
||
"search": "Search for a bank",
|
||
"searchPlaceholder": "e.g. revolut or n26",
|
||
"searchHint": "Without a country it searches everywhere, which is usually right: a bank's home country is not in the IBAN – Revolut issues German IBANs but is based in Lithuania.",
|
||
"allCountries": "all countries",
|
||
"noMatch": "{{gesamt}} banks loaded, but none matches. Try something shorter – some are listed under a different name than the one you know.",
|
||
"noneLoaded": "The interface returned no banks at all. That is not the search term: check whether your Enable Banking application is active yet – it only becomes active once you have linked your own accounts there.",
|
||
"sampleTitle": "Examples from across the loaded list:",
|
||
"sandboxHint": "If your bank is missing, check the “Environment” line under “API applications” in the Control Panel. If it says SANDBOX, that is the cause: the sandbox list contains real bank names such as “Aachener Bank” or “Nordea”, but neither N26 nor Revolut. You need a PRODUCTION application for those.",
|
||
"range": "The list runs from “{{von}}” to “{{bis}}”.",
|
||
"letters": "Initial letters present",
|
||
"truncatedHint": "If whole letters are missing, the list is incomplete. If only your bank is missing, check below what is listed under the same initial letter.",
|
||
"sameLetter": "Everything in the list starting with “{{buchstabe}}”:",
|
||
"pickBankMore": "The best {{n}} of {{treffer}} matches – search more precisely if yours is not among them:",
|
||
"noAccountForCurrency": "No {{currency}} account yet. Create one first, then this bank account can be mapped.",
|
||
"rawFields": "What the bank sent",
|
||
"bankBalance": "Balance per bank",
|
||
"balanceMatches": "matches Certain",
|
||
"balanceDiffers": "Certain differs by {{diff}}",
|
||
"fetchBalances": "Fetch balances",
|
||
"balancesFetched": "{{n}} balances updated.",
|
||
"syncedPending": "{{n}} pending – they arrive once the bank books them.",
|
||
"syncedTransfers": "{{n}} connected as transfers.",
|
||
"syncHint": "Transactions from connected accounts are booked directly – the balance then matches by itself. What remains is assigning a category.",
|
||
"syncAll": "Fetch all accounts",
|
||
"syncOne": "Fetch transactions",
|
||
"poll": "Fetch automatically",
|
||
"pollUnit": "minutes",
|
||
"pollHint": "Certain then fetches and books transactions on its own. 0 turns this off. At least 360 minutes: banks only have to allow four unattended fetches per account per day – more often they refuse. Fetching by hand is unlimited.",
|
||
"pollSaved": "Interval saved.",
|
||
"syncOlder": "Catch up on older",
|
||
"syncedDuplicate": "{{n}} were already there (from a file or entered by hand) and were skipped.",
|
||
"addTitle": "Connect another bank",
|
||
"balanceAvailable": "available balance, not comparable"
|
||
},
|
||
"bankReturn": {
|
||
"title": "Back from your bank",
|
||
"working": "Completing the authorisation …",
|
||
"ok": "Connected. {{n}} accounts found.",
|
||
"next": "Map them to your Certain accounts in the settings – then you can fetch transactions.",
|
||
"failed": "That did not work",
|
||
"failedHint": "The code from the bank is single-use and short-lived. Start the connection again in the settings.",
|
||
"missing": "The bank did not return a code.",
|
||
"toSettings": "Go to settings",
|
||
"noAccounts": "Connected, but the bank returned no account",
|
||
"noAccountsHint": "In restricted mode the bank only releases accounts you linked at Enable Banking yourself. Open your application there, press “Activate by linking accounts” and pick this bank – then connect again here.",
|
||
"noAccountsDropped": "The bank sent {{n}} entries but without an identifier, so nothing can be fetched. That is one for Enable Banking support; send me the message and I will draft the question.",
|
||
"uebermittelt": "The bank sent {{n}} accounts.",
|
||
"skipped": "{{n}} accounts could not be taken over",
|
||
"skippedHint": "They lack the identifier used to fetch balances and transactions. Below is what arrived, unchanged."
|
||
},
|
||
"transfers": {
|
||
"title": "Possible transfers",
|
||
"intro": "Money out here, money in there – probably the same money. Connecting changes no transaction: both stay put and simply stop counting as expense and income. Releasing restores everything.",
|
||
"search": "Search again",
|
||
"searched": "{{verknuepft}} connected, {{offen}} to review.",
|
||
"connect": "Connect",
|
||
"ignore": "Ignore",
|
||
"hasCategory": "One of them has a category – connecting takes it out of the evaluation.",
|
||
"linked": "Transfer",
|
||
"release": "Release link",
|
||
"releaseConfirm": "Both transactions stay exactly as they are and count as expense and income again afterwards.",
|
||
"question": "Transfer from/to {{konto}}?"
|
||
},
|
||
"todo": {
|
||
"title": "To do",
|
||
"subtitle": "{{n}} open",
|
||
"allDone": "Nothing open – everything categorised and booked.",
|
||
"from": {
|
||
"bank": "Bank",
|
||
"mail": "Mail",
|
||
"shortcut": "Shortcut",
|
||
"transfer": "Transfer",
|
||
"csv": "File import",
|
||
"manuell": "manual"
|
||
}
|
||
},
|
||
"dupes": {
|
||
"title": "Transactions that look alike ({{n}})",
|
||
"intro": "These rows look like the same payment – same account, same day, same amount, same text. You decide: if they all carry the same bank reference it is certainly the same payment. Different references mean the bank reported them as different.",
|
||
"count": "{{n}} times",
|
||
"delete": "Delete transaction",
|
||
"deleteConfirm": "This transaction will be deleted. If it came from the bank, no later fetch will bring it back – it counts as handled.",
|
||
"noRef": "no reference"
|
||
}
|
||
}
|