New /reports/cartes page surfaces a dashboard-style snapshot of the reference month: - 4 KPI cards (income / expenses / net / savings rate) showing MoM and YoY deltas simultaneously, each with a 13-month sparkline highlighting the reference month - 12-month income vs expenses overlay chart (bars + net balance line) - Top 5 category increases + top 5 decreases MoM, clickable through to the category zoom report - Budget adherence card: on-target count + 3 worst overruns with progress bars - Seasonality card: reference month vs same calendar month averaged over the two previous years, with deviation indicator All data is fetched in a single getCartesSnapshot() service call that runs four queries concurrently (25-month flow, MoM category deltas, budget-vs-actual, seasonality). Missing months are filled with zeroes in the sparklines but preserved as null in the MoM/YoY deltas so the UI can distinguish "no data" from "zero spend". - Exported pure helpers: shiftMonth, defaultCartesReferencePeriod - 13 vitest cases covering zero data, MoM/YoY computation, January wrap-around, missing-month handling, division by zero for the savings rate, seasonality with and without history, top mover sign splitting and 5-cap Note: src/components/reports/CompareReferenceMonthPicker.tsx is a temporary duplicate — the canonical copy lives on the issue-96 branch (refactor: compare report). Once both branches merge the content is identical and git will dedupe. Keeping the local copy here means the Cartes branch builds cleanly on main without depending on #96. Closes #97 Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
955 lines
39 KiB
JSON
955 lines
39 KiB
JSON
{
|
||
"app": {
|
||
"name": "Simpl'Result"
|
||
},
|
||
"changelog": {
|
||
"title": "Version History",
|
||
"description": "View what's new and fixed in each version",
|
||
"empty": "No entries available"
|
||
},
|
||
"nav": {
|
||
"dashboard": "Dashboard",
|
||
"import": "Import",
|
||
"transactions": "Transactions",
|
||
"categories": "Categories",
|
||
"adjustments": "Adjustments",
|
||
"budget": "Budget",
|
||
"reports": "Reports",
|
||
"settings": "Settings"
|
||
},
|
||
"dashboard": {
|
||
"title": "Dashboard",
|
||
"balance": "Balance",
|
||
"income": "Income",
|
||
"expenses": "Expenses",
|
||
"net": "Net",
|
||
"noData": "No data available. Start by importing your bank statements.",
|
||
"expensesByCategory": "Expenses by Category",
|
||
"recentTransactions": "Recent Transactions",
|
||
"budgetVsActual": "Budget vs Actual",
|
||
"expensesOverTime": "Expenses Over Time",
|
||
"period": {
|
||
"month": "This month",
|
||
"3months": "3 months",
|
||
"6months": "6 months",
|
||
"12months": "12 months",
|
||
"year": "This year",
|
||
"all": "All",
|
||
"custom": "Custom"
|
||
},
|
||
"dateFrom": "From",
|
||
"dateTo": "To",
|
||
"apply": "Apply",
|
||
"help": {
|
||
"title": "How to use the Dashboard",
|
||
"tips": [
|
||
"Use the period selector (top right) to view different time ranges",
|
||
"Summary cards show your balance, income, and expenses for the selected period",
|
||
"The pie chart breaks down your expenses by category",
|
||
"Recent transactions are listed at the bottom"
|
||
]
|
||
}
|
||
},
|
||
"import": {
|
||
"title": "Import Statements",
|
||
"dropzone": "Drag your CSV files here or click to select",
|
||
"source": "Source",
|
||
"file": "File",
|
||
"status": "Status",
|
||
"date": "Date",
|
||
"folder": {
|
||
"label": "Import folder",
|
||
"notConfigured": "No folder configured",
|
||
"browse": "Browse",
|
||
"refresh": "Refresh"
|
||
},
|
||
"sources": {
|
||
"title": "Import Sources",
|
||
"empty": "No sources found. Create subfolders in your import folder with CSV files.",
|
||
"new": "new",
|
||
"fileCount_one": "{{count}} file",
|
||
"fileCount_other": "{{count}} files",
|
||
"fileCount": "{{count}} file(s)"
|
||
},
|
||
"config": {
|
||
"title": "Source Configuration",
|
||
"sourceName": "Source name",
|
||
"delimiter": "Delimiter",
|
||
"semicolon": "Semicolon",
|
||
"comma": "Comma",
|
||
"tab": "Tab",
|
||
"encoding": "Encoding",
|
||
"dateFormat": "Date format",
|
||
"skipLines": "Lines to skip",
|
||
"hasHeader": "First row contains headers",
|
||
"signConvention": "Sign convention",
|
||
"negativeExpense": "Negative expenses",
|
||
"positiveExpense": "Positive expenses",
|
||
"columnMapping": "Column mapping",
|
||
"dateColumn": "Date column",
|
||
"descriptionColumn": "Description column",
|
||
"amountColumn": "Amount column",
|
||
"amountMode": "Amount mode",
|
||
"singleAmount": "Single amount",
|
||
"debitCredit": "Separate debit / credit",
|
||
"debitColumn": "Debit column",
|
||
"creditColumn": "Credit column",
|
||
"selectFiles": "Files to import",
|
||
"selectAll": "Select all",
|
||
"alreadyImported": "Imported",
|
||
"autoDetect": "Auto-detect",
|
||
"saveAsTemplate": "Save as template",
|
||
"loadTemplate": "Load template",
|
||
"templateName": "Template name",
|
||
"templateSaved": "Template saved",
|
||
"deleteTemplate": "Delete template",
|
||
"noTemplates": "No templates saved",
|
||
"updateTemplate": "Update template"
|
||
},
|
||
"preview": {
|
||
"title": "Data Preview",
|
||
"noData": "No data to display",
|
||
"rowCount": "{{count}} row(s)",
|
||
"errorCount": "{{count}} error(s)",
|
||
"date": "Date",
|
||
"description": "Description",
|
||
"amount": "Amount",
|
||
"raw": "Raw data",
|
||
"moreRows": "... and {{count}} more row(s)"
|
||
},
|
||
"duplicates": {
|
||
"title": "Duplicate Detection",
|
||
"fileAlreadyImported": "This file has already been imported",
|
||
"fileAlreadyImportedDesc": "A file with the same content already exists in the database.",
|
||
"rowsFound": "{{count}} duplicate(s) found",
|
||
"rowsFoundDesc": "These rows match existing transactions.",
|
||
"noneFound": "No duplicates found",
|
||
"skip": "Skip duplicates",
|
||
"includeAll": "Import all",
|
||
"summary": "Total: {{total}} rows — {{new}} new — {{duplicates}} duplicate(s)",
|
||
"withinBatch": "Duplicate within imported files",
|
||
"sourceDb": "Existing",
|
||
"sourceBatch": "Within batch"
|
||
},
|
||
"confirm": {
|
||
"title": "Import Confirmation",
|
||
"source": "Source",
|
||
"files": "Files",
|
||
"settings": "Settings",
|
||
"rowsToImport": "Rows to import",
|
||
"rowsSummary": "{{count}} row(s) to import, {{skipped}} duplicate(s) skipped"
|
||
},
|
||
"progress": {
|
||
"title": "Import in Progress",
|
||
"importing": "Importing...",
|
||
"rows": "rows"
|
||
},
|
||
"report": {
|
||
"title": "Import Report",
|
||
"totalRows": "Total rows",
|
||
"imported": "Imported",
|
||
"skippedDuplicates": "Skipped duplicates",
|
||
"errors": "Errors",
|
||
"categorized": "Categorized",
|
||
"uncategorized": "Uncategorized",
|
||
"errorDetails": "Error details",
|
||
"row": "Row",
|
||
"errorMessage": "Error message",
|
||
"done": "Done"
|
||
},
|
||
"history": {
|
||
"title": "Import History",
|
||
"empty": "No imports yet.",
|
||
"deleteAll": "Delete All",
|
||
"deleteConfirm": "Delete this import and its {{count}} transaction(s)?",
|
||
"deleteAllConfirm": "Delete ALL imports and their transactions? This cannot be undone.",
|
||
"source": "Source",
|
||
"filename": "File",
|
||
"date": "Date",
|
||
"rows": "Rows",
|
||
"status": "Status"
|
||
},
|
||
"wizard": {
|
||
"back": "Back",
|
||
"next": "Next",
|
||
"preview": "Preview",
|
||
"checkDuplicates": "Check duplicates",
|
||
"confirm": "Confirm",
|
||
"import": "Import"
|
||
},
|
||
"help": {
|
||
"title": "How to import bank statements",
|
||
"tips": [
|
||
"Set your import folder, then create one subfolder per bank/source with CSV files inside",
|
||
"Click a source to configure column mapping, delimiter, and date format",
|
||
"Preview your data before importing to catch formatting issues",
|
||
"Duplicate detection prevents the same transactions from being imported twice"
|
||
]
|
||
}
|
||
},
|
||
"transactions": {
|
||
"title": "Transactions",
|
||
"date": "Date",
|
||
"description": "Description",
|
||
"amount": "Amount",
|
||
"category": "Category",
|
||
"supplier": "Supplier",
|
||
"noTransactions": "No transactions found.",
|
||
"filters": {
|
||
"search": "Search",
|
||
"searchPlaceholder": "Search by description...",
|
||
"allCategories": "All categories",
|
||
"allSources": "All sources",
|
||
"uncategorized": "Uncategorized",
|
||
"dateFrom": "From",
|
||
"dateTo": "To"
|
||
},
|
||
"summary": {
|
||
"count": "Transactions",
|
||
"income": "Income",
|
||
"expenses": "Expenses",
|
||
"balance": "Balance"
|
||
},
|
||
"table": {
|
||
"noCategory": "— No category —"
|
||
},
|
||
"pagination": {
|
||
"showing": "Showing",
|
||
"of": "of",
|
||
"previous": "Previous",
|
||
"next": "Next"
|
||
},
|
||
"notes": {
|
||
"placeholder": "Add a note..."
|
||
},
|
||
"autoCategorize": "Auto-categorize",
|
||
"autoCategorizeResult": "{{count}} transaction(s) categorized",
|
||
"autoCategorizeNone": "No new matches found",
|
||
"addKeyword": "Add keyword",
|
||
"keywordAdded": "Keyword added",
|
||
"keywordPlaceholder": "Keyword to match...",
|
||
"splitAdjustment": "Split adjustment",
|
||
"splitBase": "Base",
|
||
"splitAdjusted": "Adjusted",
|
||
"splitCategory": "Category",
|
||
"splitAmount": "Amount",
|
||
"splitDescription": "Description",
|
||
"splitAddRow": "Add split",
|
||
"splitRemove": "Remove split",
|
||
"splitTotal": "Total must equal original amount",
|
||
"splitDeleteConfirm": "Remove this split adjustment?",
|
||
"help": {
|
||
"title": "How to use Transactions",
|
||
"tips": [
|
||
"Use the filters to search by description, category, source, or date range",
|
||
"Click a column header to sort transactions",
|
||
"Assign categories by clicking the category dropdown on each row",
|
||
"Auto-categorize uses your keyword rules to categorize transactions in bulk"
|
||
]
|
||
}
|
||
},
|
||
"categories": {
|
||
"title": "Categories",
|
||
"name": "Name",
|
||
"type": "Type",
|
||
"parent": "Parent Category",
|
||
"color": "Color",
|
||
"expense": "Expense",
|
||
"income": "Income",
|
||
"transfer": "Transfer",
|
||
"keywords": "Keywords",
|
||
"addCategory": "Add Category",
|
||
"editCategory": "Edit Category",
|
||
"deleteCategory": "Delete Category",
|
||
"deleteConfirm": "Are you sure you want to delete this category? Its children will be promoted to top-level.",
|
||
"deleteBlocked": "Cannot delete: this category or its children are used by {{count}} transaction(s).",
|
||
"reinitialize": "Re-initialize",
|
||
"reinitializeConfirm": "Reset all categories and keywords to their default values? Transaction categories will be unlinked. This cannot be undone.",
|
||
"noParent": "No parent (top-level)",
|
||
"isInputable": "Allow input",
|
||
"isInputableHint": "Uncheck to hide from budget and transaction dropdowns",
|
||
"dragToReorder": "Drag to reorder or change parent",
|
||
"selectCategory": "Select a category to view details",
|
||
"keywordCount": "Keywords",
|
||
"keywordText": "Keyword...",
|
||
"priority": "Priority",
|
||
"customColor": "Custom color",
|
||
"allKeywords": "All Keywords",
|
||
"allKeywordsEmpty": "No keywords yet",
|
||
"help": {
|
||
"title": "How to manage Categories",
|
||
"tips": [
|
||
"Create top-level categories and subcategories to organize your expenses and income",
|
||
"Add keywords to a category so transactions matching those words are auto-categorized",
|
||
"Set a priority on keywords to resolve conflicts when multiple categories match",
|
||
"Click a category in the tree to view its details, edit it, or manage keywords"
|
||
]
|
||
}
|
||
},
|
||
"adjustments": {
|
||
"title": "Adjustments",
|
||
"name": "Name",
|
||
"date": "Date",
|
||
"description": "Description",
|
||
"amount": "Amount",
|
||
"recurring": "Recurring",
|
||
"entries": "Entries",
|
||
"addEntry": "Add entry",
|
||
"newAdjustment": "New adjustment",
|
||
"editAdjustment": "Edit adjustment",
|
||
"deleteConfirm": "Delete this adjustment?",
|
||
"total": "Total",
|
||
"selectAdjustment": "Select an adjustment",
|
||
"category": "Category",
|
||
"noEntries": "No entries yet",
|
||
"splitTransactions": "Transaction splits",
|
||
"help": {
|
||
"title": "How to use Adjustments",
|
||
"tips": [
|
||
"Adjustments let you add manual entries that don't come from bank imports",
|
||
"Use them for expected expenses or income not yet reflected in your statements",
|
||
"Recurring adjustments repeat automatically each period"
|
||
]
|
||
}
|
||
},
|
||
"budget": {
|
||
"title": "Budget",
|
||
"category": "Category",
|
||
"planned": "Planned",
|
||
"actual": "Actual",
|
||
"difference": "Difference",
|
||
"annual": "Annual",
|
||
"previousYear": "Prev. Year",
|
||
"splitEvenly": "Split evenly across 12 months",
|
||
"annualMismatch": "Annual total does not match the sum of monthly amounts",
|
||
"clickToEdit": "Click to edit",
|
||
"applyToMonth": "Apply to month",
|
||
"allMonths": "All 12 months",
|
||
"expenses": "Expenses",
|
||
"income": "Income",
|
||
"transfers": "Transfers",
|
||
"totalExpenses": "Total Expenses",
|
||
"totalIncome": "Total Income",
|
||
"totalTransfers": "Total Transfers",
|
||
"totalPlanned": "Total Planned",
|
||
"totalActual": "Total Actual",
|
||
"totalDifference": "Difference",
|
||
"noCategories": "No categories found. Create categories first to set up your budget.",
|
||
"saveAsTemplate": "Save as template",
|
||
"applyTemplate": "Apply template",
|
||
"noTemplates": "No templates saved yet.",
|
||
"templateName": "Template name",
|
||
"templateDescription": "Description (optional)",
|
||
"directSuffix": "(direct)",
|
||
"deleteTemplateConfirm": "Delete this template?",
|
||
"help": {
|
||
"title": "How to use Budget",
|
||
"tips": [
|
||
"Use the year navigator to switch between years",
|
||
"Click on any month cell to edit the planned amount — press Enter to save, Escape to cancel, Tab to move to next month",
|
||
"The Annual column shows the total of all 12 months",
|
||
"Use the split button to distribute the annual total evenly across all months",
|
||
"Save your budget as a template and apply it to specific months or all 12 at once"
|
||
]
|
||
}
|
||
},
|
||
"reports": {
|
||
"title": "Reports",
|
||
"period": "Period",
|
||
"byCategory": "Expenses by Category",
|
||
"overTime": "Category Over Time",
|
||
"trends": "Monthly Trends",
|
||
"budgetVsActual": "Budget vs Actual",
|
||
"subtotalsOnTop": "Subtotals on top",
|
||
"subtotalsOnBottom": "Subtotals on bottom",
|
||
"detail": {
|
||
"showAmounts": "Show amounts",
|
||
"hideAmounts": "Hide amounts"
|
||
},
|
||
"filters": {
|
||
"title": "Categories",
|
||
"search": "Search...",
|
||
"all": "All",
|
||
"none": "None",
|
||
"allTypes": "All types"
|
||
},
|
||
"bva": {
|
||
"monthly": "Monthly",
|
||
"ytd": "Year-to-Date",
|
||
"dollarVar": "$ Var",
|
||
"pctVar": "% Var",
|
||
"noData": "No budget or transaction data for this period.",
|
||
"titlePrefix": "Budget vs Actual for"
|
||
},
|
||
"export": "Export",
|
||
"month": "Month",
|
||
"viewMode": {
|
||
"chart": "Chart",
|
||
"table": "Table"
|
||
},
|
||
"hub": {
|
||
"title": "Reports",
|
||
"explore": "Explore",
|
||
"highlights": "Highlights",
|
||
"highlightsDescription": "What moved this month",
|
||
"trends": "Trends",
|
||
"trendsDescription": "Where you're heading over 12 months",
|
||
"compare": "Compare",
|
||
"compareDescription": "Compare a reference month against previous month, previous year, or budget",
|
||
"categoryZoom": "Category Analysis",
|
||
"categoryZoomDescription": "Zoom in on a single category",
|
||
"cartes": "Cards",
|
||
"cartesDescription": "KPI dashboard with sparklines, top movers, budget adherence, and seasonality"
|
||
},
|
||
"trends": {
|
||
"subviewGlobal": "Global flow",
|
||
"subviewByCategory": "By category"
|
||
},
|
||
"compare": {
|
||
"modeActual": "Actual vs actual",
|
||
"modeBudget": "Actual vs budget",
|
||
"subModeMoM": "Previous month",
|
||
"subModeYoY": "Previous year",
|
||
"subModeAria": "Comparison period",
|
||
"referenceMonth": "Reference month"
|
||
},
|
||
"cartes": {
|
||
"kpiSectionAria": "Key indicators for the reference month",
|
||
"income": "Income",
|
||
"expenses": "Expenses",
|
||
"net": "Net balance",
|
||
"savingsRate": "Savings rate",
|
||
"deltaMoMLabel": "vs last month",
|
||
"deltaYoYLabel": "vs last year",
|
||
"flowChartTitle": "Income vs expenses — last 12 months",
|
||
"topMoversUp": "Biggest increases",
|
||
"topMoversDown": "Biggest decreases",
|
||
"budgetAdherenceTitle": "Budget adherence",
|
||
"budgetAdherenceSubtitle": "{{score}} of budgeted categories on target",
|
||
"budgetAdherenceEmpty": "No budgeted categories this month",
|
||
"budgetAdherenceWorst": "Worst overruns",
|
||
"seasonalityTitle": "Seasonality",
|
||
"seasonalityEmpty": "Not enough history for this month",
|
||
"seasonalityAverage": "Average",
|
||
"seasonalityDeviation": "{{pct}} vs average"
|
||
},
|
||
"category": {
|
||
"selectCategory": "Select a category",
|
||
"includeSubcategories": "Include subcategories",
|
||
"directOnly": "Direct only",
|
||
"breakdown": "Total",
|
||
"evolution": "Evolution",
|
||
"transactions": "Transactions"
|
||
},
|
||
"keyword": {
|
||
"addFromTransaction": "Add as keyword",
|
||
"dialogTitle": "New keyword",
|
||
"willMatch": "Will also match",
|
||
"nMatches_one": "{{count}} transaction matched",
|
||
"nMatches_other": "{{count}} transactions matched",
|
||
"applyAndRecategorize": "Apply and recategorize",
|
||
"applyToHidden": "Also apply to {{count}} non-displayed transactions",
|
||
"tooShort": "Minimum {{min}} characters",
|
||
"tooLong": "Maximum {{max}} characters",
|
||
"alreadyExists": "This keyword already exists for another category. Reassign?"
|
||
},
|
||
"highlights": {
|
||
"balances": "Balances",
|
||
"netBalanceCurrent": "This month",
|
||
"netBalanceYtd": "Year to date",
|
||
"topMovers": "Top movers",
|
||
"topTransactions": "Top recent transactions",
|
||
"category": "Category",
|
||
"previousAmount": "Previous",
|
||
"currentAmount": "Current",
|
||
"variationAbs": "Delta ($)",
|
||
"variationPct": "Delta (%)",
|
||
"vsLastMonth": "vs. last month",
|
||
"windowDays30": "30 days",
|
||
"windowDays60": "60 days",
|
||
"windowDays90": "90 days"
|
||
},
|
||
"empty": {
|
||
"noData": "No data for this period",
|
||
"importCta": "Import a statement"
|
||
},
|
||
"help": {
|
||
"title": "How to use Reports",
|
||
"tips": [
|
||
"Switch between Trends, By Category, and Over Time views using the tabs",
|
||
"Use the period selector to adjust the time range for all charts",
|
||
"Monthly Trends shows your income and expenses over time",
|
||
"Category Over Time tracks how spending in each category evolves"
|
||
]
|
||
}
|
||
},
|
||
"settings": {
|
||
"title": "Settings",
|
||
"version": "Version {{version}}",
|
||
"updates": {
|
||
"title": "Updates",
|
||
"checkButton": "Check for updates",
|
||
"checking": "Checking for updates...",
|
||
"upToDate": "App is up to date",
|
||
"available": "Version {{version}} available",
|
||
"downloadButton": "Download and install",
|
||
"downloading": "Downloading...",
|
||
"readyToInstall": "Update ready to install",
|
||
"installButton": "Install and restart",
|
||
"installing": "Installing...",
|
||
"error": "Update failed",
|
||
"retryButton": "Retry",
|
||
"releaseNotes": "What's New",
|
||
"notEntitled": "Automatic updates are available with the Base edition. Activate a license to enable them."
|
||
},
|
||
"dataManagement": {
|
||
"title": "Data Management",
|
||
"export": {
|
||
"title": "Export",
|
||
"modeLabel": "What to export",
|
||
"modeTransactionsWithCategories": "Transactions with categories",
|
||
"modeTransactionsOnly": "Transactions only",
|
||
"modeCategoriesOnly": "Categories only",
|
||
"formatLabel": "Format",
|
||
"csvDisabledNote": "transactions only",
|
||
"encryptLabel": "Encrypt with password",
|
||
"passwordPlaceholder": "Password (min 8 characters)",
|
||
"passwordConfirmPlaceholder": "Confirm password",
|
||
"passwordTooShort": "Password must be at least 8 characters",
|
||
"passwordMismatch": "Passwords do not match",
|
||
"button": "Export",
|
||
"success": "Export completed successfully"
|
||
},
|
||
"import": {
|
||
"title": "Import",
|
||
"description": "Import data from a previously exported file. This will replace existing data.",
|
||
"button": "Import from file",
|
||
"passwordRequired": "This file is encrypted. Enter the password to decrypt it.",
|
||
"passwordPlaceholder": "Password",
|
||
"decrypt": "Decrypt",
|
||
"confirmTitle": "Replace Data",
|
||
"willDeleteLabel": "The following data will be deleted:",
|
||
"willDeleteCategories": "All categories, suppliers, and keywords",
|
||
"willDeleteTransactions": "All transactions and import history",
|
||
"willDeleteAll": "All transactions, categories, suppliers, keywords, and import history",
|
||
"willImportLabel": "The following data will be imported:",
|
||
"countCategories": "{{count}} category(ies)",
|
||
"countSuppliers": "{{count}} supplier(s)",
|
||
"countKeywords": "{{count}} keyword(s)",
|
||
"countTransactions": "{{count}} transaction(s)",
|
||
"irreversibleWarning": "This action is irreversible. All existing data of the selected type will be permanently deleted and replaced.",
|
||
"typeToConfirm": "Type \"{{word}}\" to confirm:",
|
||
"confirmWord": "REPLACE",
|
||
"replaceButton": "Replace Data",
|
||
"success": "Import completed successfully",
|
||
"tryAgain": "Try again"
|
||
}
|
||
},
|
||
"userGuide": {
|
||
"title": "User Guide",
|
||
"description": "Learn how to use all features of the app"
|
||
},
|
||
"logs": {
|
||
"title": "Logs",
|
||
"clear": "Clear",
|
||
"copy": "Copy",
|
||
"copied": "Copied!",
|
||
"empty": "No logs",
|
||
"filterAll": "All"
|
||
},
|
||
"dataSafeNotice": "Your data is safe — only the app binary is replaced, your database is not modified.",
|
||
"help": {
|
||
"title": "About Settings",
|
||
"tips": [
|
||
"Check for app updates and install them directly from this page",
|
||
"Your data is stored locally and is never affected by updates",
|
||
"Change the app language using the language selector in the sidebar"
|
||
]
|
||
}
|
||
},
|
||
"charts": {
|
||
"hideCategory": "Hide category",
|
||
"viewTransactions": "View transactions",
|
||
"hiddenCategories": "Hidden",
|
||
"showAll": "Show all",
|
||
"total": "Total",
|
||
"transactions": "transactions",
|
||
"clickToShow": "Click to show"
|
||
},
|
||
"months": {
|
||
"jan": "Jan",
|
||
"feb": "Feb",
|
||
"mar": "Mar",
|
||
"apr": "Apr",
|
||
"may": "May",
|
||
"jun": "Jun",
|
||
"jul": "Jul",
|
||
"aug": "Aug",
|
||
"sep": "Sep",
|
||
"oct": "Oct",
|
||
"nov": "Nov",
|
||
"dec": "Dec"
|
||
},
|
||
"docs": {
|
||
"title": "User Guide",
|
||
"backToSettings": "Back to Settings",
|
||
"print": "Print",
|
||
"features": "Features",
|
||
"howTo": "How To",
|
||
"quickStart": "Quick Start",
|
||
"tipsHeader": "Tips",
|
||
"gettingStarted": {
|
||
"title": "Getting Started",
|
||
"overview": "Simpl'Result helps you track your personal finances by importing bank statements, categorizing transactions, setting budgets, and generating reports. The app is available on Windows and Linux.",
|
||
"features": [
|
||
"Import CSV bank statements from multiple sources",
|
||
"Automatic and manual transaction categorization",
|
||
"Split a transaction across multiple categories",
|
||
"Budget planning with monthly and annual views",
|
||
"Visual reports and interactive charts with context menu",
|
||
"Multiple profiles with separate databases and optional PIN",
|
||
"Dark mode with warm gray palette",
|
||
"Data export and import with optional AES-256 encryption"
|
||
],
|
||
"steps": [
|
||
"On first launch, choose or create a profile — each profile has its own database",
|
||
"Go to Settings and set your import folder — create one subfolder per bank account",
|
||
"Place your CSV bank statements in the corresponding subfolder",
|
||
"Open the Import page and configure your source (column mapping, delimiter, date format)",
|
||
"Import your transactions, then head to Categories to set up keyword rules",
|
||
"Use Auto-categorize on the Transactions page to apply your rules in bulk",
|
||
"Set up your Budget and track progress via Reports"
|
||
],
|
||
"tips": [
|
||
"You can switch between English and French using the language selector in the sidebar",
|
||
"Toggle dark mode using the button in the sidebar",
|
||
"Each page has a help icon (?) in the header with quick tips",
|
||
"Your data is stored locally on your computer — nothing is sent to the cloud"
|
||
]
|
||
},
|
||
"profiles": {
|
||
"title": "Profiles",
|
||
"overview": "Manage multiple independent profiles, each with its own database. Ideal for separating personal and business finances, or for multiple users on the same computer.",
|
||
"features": [
|
||
"Create multiple profiles with custom names and colors",
|
||
"Each profile has its own separate database",
|
||
"Optional PIN protection (numeric code)",
|
||
"Quick profile switching from the sidebar",
|
||
"Delete a profile along with all its data"
|
||
],
|
||
"steps": [
|
||
"Click the profile selector in the sidebar to see available profiles",
|
||
"Click Manage Profiles to create, edit, or delete profiles",
|
||
"Create a new profile by choosing a name, color, and optional PIN",
|
||
"Switch between profiles by clicking the one you want in the selector"
|
||
],
|
||
"tips": [
|
||
"A default profile is automatically created on first launch",
|
||
"The PIN is requested each time you access a protected profile",
|
||
"Deleting a profile permanently removes all its data — this action cannot be undone"
|
||
]
|
||
},
|
||
"dashboard": {
|
||
"title": "Dashboard",
|
||
"overview": "The Dashboard gives you an at-a-glance summary of your financial situation for a selected time period.",
|
||
"features": [
|
||
"Balance, income, and expense summary cards",
|
||
"Expense breakdown by category (pie chart with SVG patterns)",
|
||
"Budget vs Actual table for the current month (variance in $ and %)",
|
||
"Stacked bar chart of expenses by category and month",
|
||
"Adjustable time period selector (default: year to date)",
|
||
"Context menu (right-click) to hide a category or view its transactions"
|
||
],
|
||
"steps": [
|
||
"Use the period selector in the top-right to choose a time range (month, 3 months, year, etc.)",
|
||
"Review the summary cards for your balance, total income, and total expenses",
|
||
"Check the pie chart to see how your spending is distributed across categories",
|
||
"Review the Budget vs Actual table to compare your spending against your plan for the current month",
|
||
"Analyze the stacked bar chart at the bottom to see expense trends by category over time",
|
||
"Right-click a category in a chart to hide it or view its transaction details"
|
||
],
|
||
"tips": [
|
||
"The default period is year to date for an annual overview when you open the app",
|
||
"The balance is calculated as income minus expenses for the selected period",
|
||
"Hidden categories appear as dismissible chips above the chart — click Show All to restore them",
|
||
"SVG patterns (lines, dots, crosshatch) help distinguish categories beyond just color"
|
||
]
|
||
},
|
||
"import": {
|
||
"title": "Import",
|
||
"overview": "Import bank statements from CSV files using a step-by-step wizard. Each bank account is represented as a source folder.",
|
||
"features": [
|
||
"Multi-step import wizard with data preview",
|
||
"Configurable column mapping, delimiter, and date format",
|
||
"Automatic duplicate detection (within batch and against existing data)",
|
||
"Import templates to save and reuse source configurations",
|
||
"Import history with the ability to delete past imports"
|
||
],
|
||
"steps": [
|
||
"Set your import folder via the folder picker at the top of the page",
|
||
"Create a subfolder for each bank/source and place CSV files inside",
|
||
"Click on a source to open the import wizard",
|
||
"Configure the delimiter, encoding, date format, and column mapping",
|
||
"Select which files to import and preview the parsed data",
|
||
"Check for duplicates, review the summary, then confirm the import"
|
||
],
|
||
"tips": [
|
||
"Save your configuration as a template so you don't have to reconfigure each time",
|
||
"Files already imported are marked with a badge — re-importing them will trigger duplicate detection",
|
||
"You can delete an import from the history to remove all its transactions"
|
||
]
|
||
},
|
||
"transactions": {
|
||
"title": "Transactions",
|
||
"overview": "Browse, filter, sort, and categorize all your imported transactions. This is where you organize your financial data.",
|
||
"features": [
|
||
"Search and filter by description, category, source, or date range",
|
||
"Quick period selectors (this month, last month, this year, etc.)",
|
||
"Sortable columns (date, description, amount, category)",
|
||
"Inline category assignment via dropdown",
|
||
"Auto-categorize based on keyword rules",
|
||
"Add keywords directly from a transaction",
|
||
"Split a transaction across multiple categories",
|
||
"Transaction notes"
|
||
],
|
||
"steps": [
|
||
"Use the filter bar to narrow down transactions by text, category, source, or date",
|
||
"Click a column header to sort ascending or descending",
|
||
"To categorize a transaction, click its category dropdown and select a category",
|
||
"To auto-categorize all uncategorized transactions, click the Auto-categorize button",
|
||
"To add a keyword rule from a transaction, click the + icon and enter the keyword",
|
||
"To split a transaction across categories, use the Split button and add amounts per category"
|
||
],
|
||
"tips": [
|
||
"Use the quick period buttons (This month, Last month, etc.) for fast date filtering",
|
||
"Auto-categorize only affects uncategorized transactions — it won't overwrite manual assignments",
|
||
"Adding a keyword from a transaction pre-fills the category so you can quickly build rules",
|
||
"Split transactions display a visual indicator and show the breakdown details"
|
||
]
|
||
},
|
||
"categories": {
|
||
"title": "Categories",
|
||
"overview": "Manage your category tree with subcategories, keyword rules for auto-categorization, and custom colors.",
|
||
"features": [
|
||
"Hierarchical categories with parent/child relationships",
|
||
"Three category types: Expense, Income, Transfer",
|
||
"Keyword rules with priority levels for auto-categorization",
|
||
"Custom colors for chart display",
|
||
"Drag-and-drop to reorder categories or change their parent",
|
||
"Toggle categories as inputable or non-inputable",
|
||
"All Keywords view to see all rules at a glance",
|
||
"Re-initialize categories to defaults"
|
||
],
|
||
"steps": [
|
||
"Click Add Category to create a new category — choose a name, type, and optional parent",
|
||
"Select a category in the tree to view its details and keyword list",
|
||
"Drag and drop a category in the tree to reorder it or move it under a different parent",
|
||
"Add keywords that match transaction descriptions for auto-categorization",
|
||
"Set keyword priority to resolve conflicts when multiple categories match",
|
||
"Use the color picker to assign a custom color for charts"
|
||
],
|
||
"tips": [
|
||
"Non-inputable categories are hidden from budget and transaction dropdowns but still visible in reports",
|
||
"Higher priority keywords win when multiple categories match the same transaction",
|
||
"Use the All Keywords view to get a global overview of your categorization rules",
|
||
"Use Re-initialize to reset categories to defaults — this will unlink all transaction categories"
|
||
]
|
||
},
|
||
"adjustments": {
|
||
"title": "Adjustments",
|
||
"overview": "Add manual entries that don't come from bank imports, and view transaction splits created from the Transactions page.",
|
||
"features": [
|
||
"Create named adjustment groups with multiple entries",
|
||
"Assign a category to each entry",
|
||
"Mark adjustments as recurring",
|
||
"View transaction splits in a dedicated section"
|
||
],
|
||
"steps": [
|
||
"Click New Adjustment to create an adjustment group",
|
||
"Add entries with a description, amount, date, and category",
|
||
"Toggle the recurring flag if the adjustment should repeat each period",
|
||
"View the Transaction Splits section to see splits created from the Transactions page"
|
||
],
|
||
"tips": [
|
||
"Adjustments appear in your budget actuals alongside imported transactions",
|
||
"Use adjustments for planned expenses that haven't hit your bank account yet",
|
||
"Transaction splits are created from the Transactions page and appear here automatically"
|
||
]
|
||
},
|
||
"budget": {
|
||
"title": "Budget",
|
||
"overview": "Plan your monthly budget for each category and track planned vs. actual spending throughout the year.",
|
||
"features": [
|
||
"Monthly budget grid for all categories",
|
||
"Annual column with automatic totals",
|
||
"Split annual amount evenly across 12 months",
|
||
"Budget templates to save and apply configurations",
|
||
"Parent category subtotals",
|
||
"Column headers stay fixed when scrolling vertically"
|
||
],
|
||
"steps": [
|
||
"Use the year navigator to select the budget year",
|
||
"Click on any month cell to enter a planned amount",
|
||
"Press Enter to save, Escape to cancel, or Tab to move to the next month",
|
||
"Use the split button (on the Annual column) to distribute evenly across all months",
|
||
"Save your budget as a template to reuse it in future years"
|
||
],
|
||
"tips": [
|
||
"The Annual column auto-sums all 12 months — a warning appears if monthly totals don't match",
|
||
"Templates can be applied to specific months or all 12 at once",
|
||
"Parent categories show subtotals aggregated from their children"
|
||
]
|
||
},
|
||
"reports": {
|
||
"title": "Reports",
|
||
"overview": "A hub with a live highlights panel plus four dedicated sub-reports (Highlights, Trends, Compare, Category Zoom). Every page shares a bookmarkable period via the URL query string.",
|
||
"features": [
|
||
"Hub: compact highlights panel + 4 navigation cards",
|
||
"Highlights: current month and YTD balances with sparklines, top movers vs. last month, top recent transactions (30/60/90 day window)",
|
||
"Trends: global flow (income vs. expenses) and by-category evolution with a chart/table toggle",
|
||
"Compare: Month vs. Previous Month, Year vs. Previous Year, and Actual vs. Budget",
|
||
"Category Zoom: single-category drill-down with donut, monthly evolution, and filterable transaction table; auto-rollup of subcategories",
|
||
"Contextual keyword editing: right-click a transaction row to add its description as a keyword with a live preview of the matches",
|
||
"SVG patterns (lines, dots, crosshatch) to distinguish categories",
|
||
"View mode preference (chart vs. table) persisted per report section"
|
||
],
|
||
"steps": [
|
||
"Open /reports to see the highlights panel and four navigation cards",
|
||
"Adjust the period with the period selector — it is mirrored in the URL and shared with every sub-report",
|
||
"Click a card or a sub-route link to open the corresponding report",
|
||
"Toggle chart vs. table on any sub-report — your choice is remembered",
|
||
"Right-click any transaction row in the category zoom, highlights list, or transactions page to add a keyword",
|
||
"In the keyword dialog, review the preview of matching transactions and confirm to apply"
|
||
],
|
||
"tips": [
|
||
"Copy the URL to share a specific period + report state",
|
||
"Keywords must be 2–64 characters long",
|
||
"The Category Zoom is protected against malformed category trees: a parent_id cycle cannot freeze the app"
|
||
]
|
||
},
|
||
"settings": {
|
||
"title": "Settings",
|
||
"overview": "Configure app preferences, check for updates, access the user guide, and manage your data with export/import tools.",
|
||
"features": [
|
||
"App version display",
|
||
"Complete user guide accessible directly from settings",
|
||
"Automatic update checker with one-click install",
|
||
"Application logs viewable with level filters, copy, and clear",
|
||
"Data export (transactions, categories, or both) in JSON or CSV format",
|
||
"Data import from a previously exported file",
|
||
"Optional AES-256-GCM encryption for exported files"
|
||
],
|
||
"steps": [
|
||
"Click User Guide to access the full documentation",
|
||
"Click Check for Updates to see if a new version is available",
|
||
"View the Logs section to see application logs — filter by level (All, Error, Warn, Info), copy or clear",
|
||
"Use the Data Management section to export or import your data",
|
||
"When exporting, choose what to include and optionally set a password for encryption",
|
||
"When importing, select a previously exported file — encrypted files will prompt for the password"
|
||
],
|
||
"tips": [
|
||
"Updates only replace the app binary — your database is never modified",
|
||
"Change the app language using the language selector in the sidebar",
|
||
"Export regularly to keep a backup of your data",
|
||
"The user guide can be printed or exported to PDF via the Print button",
|
||
"Logs persist for the session — they survive a page refresh",
|
||
"If you encounter an issue, copy the logs and attach them to your report"
|
||
]
|
||
}
|
||
},
|
||
"profile": {
|
||
"title": "Profiles",
|
||
"select": "Select a profile",
|
||
"create": "Create Profile",
|
||
"edit": "Edit Profile",
|
||
"delete": "Delete Profile",
|
||
"deleteConfirm": "Delete this profile and all its data? This cannot be undone.",
|
||
"name": "Profile Name",
|
||
"namePlaceholder": "Enter a name...",
|
||
"color": "Color",
|
||
"pin": "PIN",
|
||
"pinSet": "PIN set",
|
||
"pinNotSet": "No PIN",
|
||
"setPin": "Set PIN",
|
||
"removePin": "Remove PIN",
|
||
"enterPin": "Enter your PIN",
|
||
"wrongPin": "Wrong PIN. Try again.",
|
||
"switchProfile": "Switch Profile",
|
||
"manageProfiles": "Manage Profiles",
|
||
"default": "Default"
|
||
},
|
||
"error": {
|
||
"title": "An error occurred",
|
||
"startupTimeout": "Database connection timed out",
|
||
"unexpectedError": "An unexpected error occurred",
|
||
"showDetails": "Show details",
|
||
"hideDetails": "Hide details",
|
||
"refresh": "Refresh",
|
||
"checkUpdate": "Check for updates",
|
||
"updateAvailable": "Update available: v{{version}}",
|
||
"upToDate": "The application is up to date",
|
||
"updateNotEntitled": "Automatic updates are available with the Base edition.",
|
||
"contactUs": "Contact us",
|
||
"contactEmail": "Send an email to",
|
||
"reportIssue": "Report an issue"
|
||
},
|
||
"common": {
|
||
"save": "Save",
|
||
"cancel": "Cancel",
|
||
"delete": "Delete",
|
||
"edit": "Edit",
|
||
"add": "Add",
|
||
"search": "Search",
|
||
"filter": "Filter",
|
||
"loading": "Loading...",
|
||
"noResults": "No results",
|
||
"confirm": "Confirm",
|
||
"language": "Language",
|
||
"total": "Total",
|
||
"darkMode": "Dark mode",
|
||
"lightMode": "Light mode",
|
||
"close": "Close",
|
||
"underConstruction": "Under construction"
|
||
},
|
||
"license": {
|
||
"title": "License",
|
||
"currentEdition": "Current edition",
|
||
"expiresAt": "Expires on",
|
||
"enterKey": "Enter a license key",
|
||
"keyPlaceholder": "SR-BASE-...",
|
||
"activate": "Activate",
|
||
"purchase": "Buy Simpl'Result",
|
||
"editions": {
|
||
"free": "Free",
|
||
"base": "Base",
|
||
"premium": "Premium"
|
||
},
|
||
"removeLicense": "Remove license",
|
||
"machines": {
|
||
"title": "Machines",
|
||
"count": "{{count}}/{{limit}} machines activated",
|
||
"activating": "Activating...",
|
||
"activated": "Activated",
|
||
"notActivated": "Not activated",
|
||
"deactivate": "Deactivate",
|
||
"deactivating": "Deactivating...",
|
||
"activateError": "Activation failed",
|
||
"thisMachine": "This machine",
|
||
"noMachines": "No machines activated"
|
||
}
|
||
},
|
||
"account": {
|
||
"title": "Maximus Account",
|
||
"optional": "Optional",
|
||
"description": "Sign in to access Premium features (web version, sync). The account is only required for Premium features.",
|
||
"signIn": "Sign in",
|
||
"signOut": "Sign out",
|
||
"connected": "Connected",
|
||
"tokenStore": {
|
||
"fallback": {
|
||
"title": "Tokens stored in plaintext fallback",
|
||
"description": "Your authentication tokens are currently stored in a local file protected by filesystem permissions. For stronger protection via the OS keychain, make sure a keyring service is running (GNOME Keyring, KWallet, or equivalent)."
|
||
}
|
||
}
|
||
}
|
||
}
|