{ "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", "balance": "Balance sheet", "settings": "Settings", "locked": "Locked feature" }, "dashboard": { "title": "Dashboard", "kpiSectionTitle": "Key indicators", "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", "categoriesBanner": { "title": "New category taxonomy available", "description": "Your profile uses the legacy taxonomy. A new standard structure, aligned with Statistics Canada's CPI, is now available. Discover it from Settings.", "cta": "Discover the standard structure", "dismiss": "Dismiss banner" }, "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": [ "The filter bar at the top picks the date range and which import sources to include", "The key indicators (income, expenses, net, savings rate) cover the chosen reference month, with their change vs the previous month and vs last year", "The \"Current net worth\" tile comes from the Balance sheet — it is not filtered by import source", "Rising/falling categories and budget adherence summarize the reference month's changes", "The bar chart ranks your expenses by category; the chart below tracks their trend over time" ] }, "empty": { "title": "Welcome to Simpl'Résultat", "description": "After your first import, this page will show your income, expenses, savings rate and top categories for the selected month.", "cta": "Choose an import folder" } }, "onboarding": { "banner": { "label": "Getting-started path", "progress": "Getting started {{done}}/{{total}}", "next": "Next step:", "showList": "Show the list", "hideList": "Close the list", "complete": "Getting started complete. The user guide takes it from here.", "openGuide": "Open the guide" }, "card": { "stepOf": "Step {{n}} of {{total}}", "skip": "Skip this step", "acknowledge": "Got it", "done": "Done.", "next": "Next step: {{step}} →", "import": { "noFolder": "With the “{{button}}” button, choose the parent folder of your statements. Simpl'Résultat reads one sub-folder per account in it: one for the credit card, one for the chequing account, and so on.", "noSources": "In the “{{folder}}” folder, create one sub-folder per account and drop its CSV statements in it, then click “{{refresh}}”. To try first, “{{sample}}” adds two fictitious accounts.", "sourceList": "Click an account's card. Simpl'Résultat recognises the format of its statements and shows you what it understood.", "sourceConfig": "Check the selected files, then click “{{button}}”.", "filePreview": "Check that dates and amounts are read correctly: an expense must count among the outflows, as a negative amount. If not, click “{{flip}}”. Then click “{{button}}”.", "duplicateCheck": "Choose what to do with transactions already imported, then click “{{button}}”.", "confirm": "Click “{{button}}”: the source is saved and your transactions come in.", "importing": "Importing…", "failed": "The import added no transaction; the report below says why." }, "transactions": { "uncategorized": "Only {{filter, lowercase}} transactions are shown. Right-click one of them, then “{{addKeyword}}”: the keyword categorizes it and the similar transactions in the preview, and will apply to future imports. Keep a word specific to the merchant, not “PAYMENT”, and uncheck the transactions already correctly categorized. You can also click its category and pick one.", "all": "Right-click a transaction, then “{{addKeyword}}”: the keyword categorizes it and the similar transactions in the preview, and will apply to future imports. Keep a word specific to the merchant, not “PAYMENT”, and uncheck the transactions already correctly categorized. You can also click its category and pick one." }, "budget": { "collapsed": "Click “{{expand}}” to show your categories. Only the last-level ones, without a chevron, take an amount: click a month and type it (Enter saves; Tab saves and moves to the next month). An amount typed in the “{{annual}}” column is split evenly over the 12 months and replaces the monthly amounts.", "flat": "Only last-level categories, without a chevron, take an amount: click a month and type it (Enter saves; Tab saves and moves to the next month). An amount typed in the “{{annual}}” column is split evenly over the 12 months and replaces the monthly amounts." }, "categories": "A keyword categorizes, as soon as it is imported, every transaction whose description contains it; when two keywords apply, the one with the higher priority wins. “{{allKeywords}}” lists them all, with their category. In the next step, you will add one from a transaction.", "reports": { "all": "Pick the period at the top of the page: the highlights panel sums up your balance and your biggest moves. Each card below opens a detailed report; start with “{{trends}}”.", "locked": "Pick the period at the top of the page: the highlights panel sums up your balance and your biggest moves. Each card below opens a detailed report; start with “{{trends}}”. Cards with a padlock require the Base edition." } }, "state": { "done": "(done)", "skipped": "(skipped)", "locked": "(locked)", "pending": "(pending)" }, "checklist": { "title": "Getting started", "counter": "{{done}} / {{total}}", "hide": "Hide", "lockedBudget": "Base and up", "skippedBadge": "Skipped", "resume": "Resume", "items": { "profile": "Create a profile", "importFolder": "Choose an import folder", "source": "Set up an import source", "import": "Import a first file", "categories": "Browse categories and keywords", "manualCategory": "Categorize a transaction by hand", "budget": "Enter a first budget", "reports": "Browse the reports" } } }, "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", "sourceNameHint": "A source is named after its subfolder.", "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", "detectionRecognized": "Format recognized — {{read}} of {{total}} rows read", "detectionUncertain": "Uncertain format — only {{read}} of {{total}} rows read", "detectionUncertainHint": "Check the column mapping and the date format, then look at the preview before importing.", "detectionBank": "{{bank}} format recognized — {{read}} of {{total}} rows read" }, "drift": { "title": "This source's format has changed", "intro": "This file's header row no longer matches the one recorded at the last successful import. The stored columns may no longer point at the right data.", "columnMoved": "{{label}}: column {{from}} → {{to}}", "columnAdded": "{{label}}: new column, at position {{to}}", "columnRemoved": "{{label}}: column gone, it was at position {{from}}", "adopt": "Adopt the re-detected format", "adoptHint": "Reads the file the way it looks today. The new configuration is saved at import time.", "adoptUnavailable": "Detection could not read this new shape: fix the mapping at the previous step.", "keep": "Keep the current configuration", "keepHint": "Keeps the stored mapping. Use this when the header changed but the columns did not move." }, "repairPath": { "title": "Repairing an import that was already written wrong", "body": "Do not re-import a file you have already imported in order to correct it: duplicates are matched on the date, the description AND the amount, so a row with a corrected amount does not match the faulty row — it is added next to it. A flipped sign also produces two mirror rows that cancel each other out in every report. Delete the faulty import from the import history first, then replay the file." }, "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)", "outflowCount": "{{count}} outflow(s)", "inflowCount": "{{count}} inflow(s)", "errorRows": "Rows in error", "flipSigns": "Flip the signs", "flipSignsHint": "Corrects the source configuration, not just this preview: the correction is remembered for the next imports." }, "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", "columnUnmapped": "not mapped" }, "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" }, "errors": { "unsupportedAmountMode": "The amount mode saved for this source is not recognized. Reconfigure the source before importing.", "unsupportedSignConvention": "The sign convention saved for this source is not recognized. Reconfigure the source before importing.", "invalidColumnMapping": "The column mapping saved for this source cannot be read. Reconfigure the source before importing.", "absoluteIndicatorFormat": "This file uses positive amounts with a separate column giving the direction (D for debit, C for credit). That format is not supported yet: importing it now would record every deposit as an expense. Export the statement with signed amounts, or with separate debit and credit columns.", "autoDetectFailed": "Auto-detection could not read this file. Configure the format manually." }, "rowErrors": { "invalidDate": "Unreadable date", "invalidAmount": "Unreadable amount", "amountColumnNotMapped": "Amount column not mapped", "parseError": "Unreadable row" }, "help": { "title": "How to import bank statements", "tips": [ "Choose the parent folder of your statements, then create one subfolder per account in it with its CSV files; files placed at its root are ignored", "Click a source to configure column mapping, delimiter, and date format", "Preview your data before importing to catch formatting issues", "In the preview, an expense must count among the outflows, as a negative amount; if not, “Flip the signs” fixes the source for future imports", "Duplicate detection prevents the same transactions from being imported twice" ], "linkLabel": "How do I export a CSV from my bank?" }, "empty": { "noFolder": { "title": "No import folder", "description": "Start by choosing the folder where you will drop your statements", "cta": "Choose a folder" }, "noSources": { "title": "No source found", "description": "Create one subfolder per account in {{folderName}} and drop its CSV files there" }, "createSample": "Create a sample folder", "refresh": "Refresh", "guideLink": "How do I export a CSV from my bank?", "structure": { "title": "Expected structure", "parent": "Parent folder: choose this one", "account1": "Credit card: one source", "file1": "statement-2026-08.csv", "file2": "statement-2026-09.csv", "account2": "Chequing account: another source", "rootNote": "Files placed directly in the parent folder are ignored." }, "sampleCreated": "Two sample folders were created: {{names}}. Click one of them to start the import. Delete them once your real statements are in place." }, "rootFiles": { "message_one": "{{count}} file sits directly in “{{folder}}” and is ignored: {{names}}. Move it into a subfolder per account.", "message_other": "{{count}} files sit directly in “{{folder}}” and are ignored: {{names}}. Move them into a subfolder per account.", "more_one": "and {{count}} more", "more_other": "and {{count}} more" } }, "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", "splitLocked": "Split adjustment — {{tier}} feature", "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" ] }, "transferIcon": { "tooltip": "Linked to a balance account", "ariaLabel": "Transaction linked to a balance account" }, "empty": { "title": "No transactions yet", "description": "Import your bank statements first.", "cta": "Import transactions" } }, "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", "Only last-level categories, without a chevron, take an amount; a row with a chevron adds up its subcategories", "Click on any month cell to edit the planned amount — press Enter to save, Escape to cancel, Tab to move to next month", "An amount typed in the Annual column is split evenly over the 12 months and replaces the monthly amounts; the column then shows their total", "Save your budget as a template and apply it to specific months or all 12 at once" ] }, "empty": { "title": "Your budget is built on your transactions", "description": "Import your bank statements first.", "cta": "Import transactions" } }, "reports": { "title": "Reports", "period": "Period", "byCategory": "Expenses by Category", "overTime": "Category Over Time", "trends": { "subviewGlobal": "Global flow", "subviewByCategory": "By category", "chartBar": "Bars", "chartArea": "Stacked area", "chartTypeAria": "Chart type" }, "budgetVsActual": "Budget vs Actual", "subtotalsOnTop": "Subtotals on top", "subtotalsOnBottom": "Subtotals on bottom", "collapse": { "expandAll": "Expand all", "collapseAll": "Collapse all" }, "detail": { "showAmounts": "Show amounts", "hideAmounts": "Hide amounts" }, "filters": { "title": "Categories", "search": "Search...", "all": "All", "none": "None", "allTypes": "All types", "accounts": { "label": "Import sources", "hint": "No selection = all sources" } }, "bva": { "monthly": "Monthly", "ytd": "Year-to-Date", "dollarVar": "$ Var", "pctVar": "% Var", "noData": "No budget or transaction data for this period." }, "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" }, "compare": { "modeActual": "Actual vs actual", "modeBudget": "Actual vs budget", "subModeMoM": "Previous month", "subModeYoY": "Previous year", "subModeAria": "Comparison period", "referenceMonth": "Reference month", "currentAmount": "Current", "previousAmount": "Previous", "sections": { "expenses": "Expenses", "income": "Income", "transfers": "Transfers" }, "totalExpenses": "Total Expenses", "totalIncome": "Total Income", "totalTransfers": "Total Transfers", "resultBeforeTransfers": "Result before transfers", "resultNet": "Net result" }, "cartes": { "kpiSectionAria": "Key indicators for the reference month", "income": "Income", "expenses": "Expenses", "net": "Net balance", "savingsRate": "Savings rate", "savingsRateTooltip": { "month": "Formula: (income − expenses) ÷ income × 100, computed on the reference month.", "ytd": "Formula: (YTD income − YTD expenses) ÷ YTD income × 100, cumulative from January 1st." }, "periodMode": { "month": "Monthly", "ytd": "YTD", "aria": "Period" }, "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", "searchPlaceholder": "Search 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": [ "The cards at the bottom of the page open the five reports: Highlights, Trends, Compare, Category Analysis and Cards", "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 included in the Base edition.", "downloadLatest": "Download the latest version" }, "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)", "countImportSources": "{{count}} import source(s)", "countImportTemplates": "{{count}} import template(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", "errors": { "unsupportedAmountMode": "This file cannot be imported: the source \"{{name}}\" was saved with an amount mode this version does not support ({{value}}). Nothing has been modified.", "unsupportedSignConvention": "This file cannot be imported: the source \"{{name}}\" was saved with a sign convention this version does not support ({{value}}). Nothing has been modified.", "invalidFormatRow": "This file cannot be imported: the import configuration of \"{{name}}\" is incomplete or damaged. Nothing has been modified." } } }, "userGuide": { "title": "User Guide", "description": "Learn how to use all features of the app" }, "categoriesCard": { "title": "Category management", "description": "Organize your expenses and income the way you want.", "standardGuideTitle": "Standard category structure", "standardGuideDescription": "Browse the CPI taxonomy (read-only)", "migrateTitle": "Migrate to the standard structure", "migrateDescription": "Preview, back up and migrate in 3 steps", "restoreEntry": { "title": "Restore a backup", "description": "Roll back a previous category migration from its automatic backup" }, "restoreBanner": { "title": "Backup available", "description": "Your previous category structure is backed up until {{expiry}}. Restore it if the new structure does not suit you.", "cta": "Restore the backup", "dismiss": "Dismiss" }, "restoreModal": { "title": "Confirm restore", "subtitle": "Backup from {{date}}", "warning": "This action will replace ALL your current data with the backup content. This action is irreversible.", "filePath": "Backup file", "fileMissingTitle": "Backup file not found", "fileMissingHint": "The original backup file is no longer at its recorded location. Pick it manually to continue — it is usually in your Documents folder under Simpl-Resultat/backups/.", "pickFile": "Pick a backup file", "passwordLabel": "Profile PIN", "passwordHelp": "This backup is encrypted. Enter the PIN that was active at the time of the migration to decrypt it.", "cancel": "Cancel", "confirm": "Restore", "close": "Close", "retry": "Try again", "restoring": "Restoring your profile — do not close the application...", "errors": { "file_missing": "The backup file was not found at the recorded location.", "read_failed": "The backup file could not be read.", "parse_failed": "The backup file could not be parsed. It may be corrupted.", "wrong_envelope_type": "This file is not a full pre-migration backup.", "no_recorded_migration": "No migration has been recorded on this profile.", "needs_password": "This backup is encrypted — a PIN is required.", "wrong_password": "Incorrect PIN. The backup could not be decrypted.", "import_failed": "The restore failed while rewriting your profile. Please try again." } } }, "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" ] }, "privacy": { "title": "Privacy", "priceFetchConsent": { "label": "Price fetching via Maximus", "description": "Allow Simpl'Résultat to use the Maximus proxy to fetch asset prices. Privacy: your IP is hidden.", "confirmRevoke": "The fetch button will ask for consent again next time. Continue?", "revokeButton": "Revoke consent", "notPremium": "Premium licenses only" } }, "backToHome": "Back to settings", "home": { "intro": "Configure the app across three sections: users, data and system." }, "users": { "title": "Users", "description": "Accounts, licenses and user guide.", "sections": { "accounts": "Accounts", "licenses": "Licenses", "userGuide": "User guide" }, "onboarding": { "label": "Getting-started path", "show": "Show the getting-started checklist", "confirmation": "The getting-started path reappears at the top of the pages" } }, "data": { "title": "Data", "description": "Categories, backups and privacy.", "sections": { "categories": "Categories", "backup": "Backup", "priceFetch": "Price privacy" } }, "systems": { "title": "System", "description": "Version, updates, logs and history.", "sections": { "version": "Version", "update": "Update", "changelog": "Version history", "logs": "Logs and feedback" } } }, "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", "Guided getting-started path: a banner at the top of every page and, on the page of the step in progress, a card that says what to do" ], "steps": [ "Create a profile — each profile has its own database", "Choose an import folder — the folder where you will drop your statements, one subfolder per bank account", "Set up an import source — opening a subfolder for the first time detects the file format", "Import a first file — after reading the preview and its signed recap", "Browse categories and keywords — what keywords do, before categorizing", "Categorize a transaction by hand — the keyword seed does most of the work, a manual correction refines the rest", "Enter a first budget — Base edition and up; then track your progress through Reports", "Browse the reports — the period, the highlights and the report cards" ], "subsections": [ { "id": "getting-started-path", "title": "The getting-started path", "steps": [ "The getting-started banner shows at the top of every page while the path is not hidden. It shows your progress, for instance \"Getting started 3/8\", and the next step, with a link to the page where it is done. It does not show on the dashboard of a profile without transactions, whose welcome card already holds the list", "\"Show the list\" unfolds the eight steps under the banner and \"Close the list\" folds them; the list also folds when you change pages. Each step still to do leads to the page where it is done", "On the Import, Categories, Transactions, Budget and Reports pages, while the next step is done there, a getting-started card takes the place of the banner. It shows \"Step n of N\", says what to do and puts an outline around the control to use. The outline pulses three times, and not at all if your system asks for reduced motion. When you arrive by a \"Next step\" link, the keyboard focus goes to the card's title. On the Categories and Reports pages, the card ends with \"Got it\", which checks the step; on the Reports page, opening the outlined Trends card checks it too", "The card follows the step without you changing pages. On the Import page, it goes along with the wizard screen by screen. The link of the \"Categorize a transaction by hand\" step opens the Transactions page on the uncategorized transactions whatever their date, or on every transaction when none is left uncategorized. On the Budget page, the card first points at \"Expand all\", then at the current month's cell of the first category you can fill in; it never unfolds the grid for you. On the Transactions page, the card suggests right-clicking and “Add as keyword”; on the Budget page, it recalls that only last-level categories take an amount and what the Annual column does", "As soon as the step is done, the card stays, says \"Done.\" and offers the next step, with a link to its page. On the Import page, it moves from one step to the next without leaving the page and says \"Done.\" once the file is imported; never for an import that added no transaction: the report says why, and the step stays to do", "\"Skip this step\", on the card, marks the step as skipped: it counts towards your progress, and the list shows it with the \"Skipped\" badge and a \"Resume\" link. \"Resume\" puts the step back to do and opens its page", "Once every step is done or skipped, the banner, or the card of the last step, says \"Getting started complete. The user guide takes it from here.\" \"Open the guide\" leads to this Getting Started section, and \"Close\" hides the path", "\"Hide\", in the banner or in the list, hides the banner and the list for this profile only. To bring them back, open Settings → Users and click \"Show the getting-started checklist\": the path reappears at the top of the pages. The button shows as soon as the path is hidden", "A profile that already had transactions before the guided path arrived has it hidden from its first opening, as if you had clicked \"Hide\"; Settings → Users shows it again. An empty or new profile keeps it" ], "note": "Steps tick on their own, from your data and without changing pages: \"Import a first file\" expects a file that added at least one transaction, \"Categorize a transaction by hand\" expects a transaction whose category you picked yourself, and the automatic categorization of the import does not tick it. The two visit steps, \"Browse categories and keywords\" and \"Browse the reports\", are checked with \"Got it\" on their card; a profile that had finished the path before they arrived finds them already done. In the Free edition, the Budget step is locked and does not count: the path ends at 7/7." } ], "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", "When you open a profile created by an earlier version, the app updates its database after keeping a copy in the migration-backups folder, next to the databases (on Linux ~/.config/com.simpl.resultat/, on Windows %APPDATA%\\com.simpl.resultat\\). One copy is kept per profile, the most recent: it is taken again at each database update and deleted with the profile", "On Linux, versions up to 0.17.0 left a deleted profile's database on disk (~/.config/com.simpl.resultat/profile_….db); you can delete that file by hand", "The getting-started path belongs to each profile: its steps tick from the profile's data, and hiding it in one profile does not hide it in the others" ] }, "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", "Welcome card for a profile without transactions, with the getting-started checklist: eight steps that tick themselves from your data, and a \"Hide\" button" ], "steps": [ "In a profile without transactions, the dashboard shows a welcome card and the getting-started checklist: create a profile (already ticked), choose an import folder, set up an import source, import a first file, categorize a transaction by hand, enter a first budget. Each unticked row leads to the page where it is done; the Budget box is marked \"Base and up\" in the Free edition and does not count towards the total", "Once the profile has transactions, the checklist leaves the dashboard: the getting-started banner, at the top of every page, takes over until the end of the path (see Getting Started → The getting-started path)", "\"Hide\" removes the checklist from the welcome card, and the banner from every page, for this profile only; Settings → Users shows them again", "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", "The checklist boxes tick on your data, not on a click: \"Categorize a transaction by hand\" expects a transaction whose category you changed yourself; the automatic categorization of the import does not tick it" ] }, "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": [ "Automatic format detection when you open a source that was never configured: delimiter, encoding, date format, and columns recognised by their header label (French and English)", "Bank layouts recognised by name — Desjardins, RBC, National Bank and Tangerine are read by their documented export format", "A confidence score shown after detection (“147 of 150 rows read”): it tells you what could be read, never whether the meaning is right", "A mandatory preview before every import, with a signed recap: outflows, inflows, totals and rows in error, plus a “Flip the signs” button", "A warning when a file's header no longer matches the one from the last successful import, column by column", "Configurable column mapping; delimiter, encoding and date format editable at any time", "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 one subfolder per account and place its CSV files inside: the credit card and the chequing account of the same bank are two sources, and files placed directly in the parent folder are ignored — while the folder is empty, the \"Create a sample folder\" button writes two fictitious subfolders (\"Exemple Desjardins\", \"Exemple Tangerine\") so you can try the wizard without waiting for your real statements; delete them afterwards", "Click on a source to open the import wizard — the first time, the format is detected automatically and a banner announces the result", "Check the proposed configuration (delimiter, encoding, date format, column mapping) and correct it if the banner reports an uncertain format", "Select which files to import", "Read the preview: the recap tells you how many outflows and inflows the file will produce, and for what amounts; an expense must count among the outflows, as a negative amount", "If inflows and outflows are swapped, click “Flip the signs” — the correction is saved with the source, so the next files from that account read correctly on their own", "Check for duplicates, review the summary, then confirm the import" ], "subsections": [ { "id": "import-export", "title": "Export a CSV from your bank", "steps": [ "Create one subfolder per account in your import folder (one for the chequing account, one for the credit card, and so on)", "On your bank's website, pick the widest date range offered", "Keep the file as is: do not open it or re-save it in a spreadsheet, which would alter the dates and amounts", "Run the export again every month and drop the new file into the same subfolder" ], "note": "The banks below have a detailed procedure. The status line of each one says whether it has been confirmed on a real account." }, { "id": "import-desjardins", "title": "Desjardins", "status": "Procedure reconstructed from third-party guides, to be confirmed on a real account", "steps": [ "Sign in to AccèsD on the Desjardins website (not the mobile app)", "Open Accounts and pick the folio", "Open the Statements tab (or Transactions / History depending on the version)", "Pick the period", "Click Download or Export, then choose the CSV format" ], "note": "The export only covers the folio's recent activity. For a Desjardins credit card, CSV is not guaranteed: some cards only offer PDF." }, { "id": "import-tangerine", "title": "Tangerine", "status": "Steps confirmed by Tangerine's official FAQ", "steps": [ "Sign in at tangerine.ca (not the mobile app)", "Open Transactions", "Click the “Download Transactions” button", "Pick the account and the date range", "Choose the CSV format, then click Download" ], "note": "The available history may be limited to a few months: run the export regularly." }, { "id": "import-rbc", "title": "RBC", "status": "Procedure reconstructed from third-party guides, to be confirmed on a real account", "steps": [ "Sign in to RBC Online Banking", "Open My Accounts and pick the account", "Click the Download button, above the transaction table", "Choose the CSV format, then click Continue", "Save the file into the account's subfolder" ], "note": "Credit cards only offer about three months of history." }, { "id": "import-bnc", "title": "National Bank (NBC)", "status": "No public procedure found for personal accounts", "steps": [ "The app expects a file whose header is Date;Description;Catégorie;Débit;Crédit;Solde", "If your NBC export has a different shape, send us only the header line and one or two lines with made-up values via Settings → System → Send feedback" ], "note": "Never paste an account number, a balance or a real transaction: feedback is a text message sent to a server, the only exception to the app working locally." }, { "id": "import-bmo", "title": "BMO", "status": "Procedure reconstructed from a general description, to be confirmed on a real account; file format not recognised yet", "steps": [ "Sign in to BMO Online Banking at bmo.com (the website, not the app)", "In the summary, click the account you want (chequing, savings or Mastercard)", "Above the transaction list, click “Download” (or “Export”)", "Choose the CSV format — the other options target QuickBooks, Quicken, Simply Accounting or Microsoft Money", "Pick the period, then download the file" ], "note": "The downloadable history is capped at 123 days, and at about three months plus unbilled transactions for a Mastercard: export every month. Loans, mortgages and lines of credit cannot be exported (PDF statements only, kept for 7 years). The columns differ between deposit accounts and the credit card. BMO has no format recognised by the app yet: generic detection reads most exports with signed amounts; if the preview reports swapped inflows and outflows, use “Flip the signs”. If the file is not read, send us only the header line and one or two lines with made-up values via Settings → System → Send feedback. Never paste an account number, a balance or a real transaction: feedback is a text message sent to a server, the only exception to the app working locally." } ], "tips": [ "The preview recap is the only check that sees what the amounts mean: a 100 % score means every row was read, not that your expenses are not being counted as income. Take two seconds to read it.", "Your configuration is stored in full on the source, including the amount mode and the sign convention: a source configured once is never guessed at again on later imports", "If your bank changes its column layout, a panel reports it before the import and offers two choices: adopt the newly detected format, or keep the stored one", "To repair an import that was already written the wrong way round, do not re-import the file on top of it: duplicates are matched on date, description AND amount, so a corrected row is added instead of replacing the faulty one. Delete the faulty import from the history first, then replay the file.", "A statement with positive amounts plus a “D / C” column is refused rather than imported backwards: re-export it from your bank with signed amounts, or with separate debit and credit columns", "Save your configuration as a template so you don't have to reconfigure each time. A template initialises a source; editing it afterwards changes no source you have already configured.", "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", "Your import sources and templates are now part of the encrypted backup: restoring a backup no longer forces you to reconfigure everything", "If CSV files sit directly in the import folder, a warning names them: move them into a subfolder per account", "A source is named after its subfolder" ] }, "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 (Base edition and above)", "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, right-click its row, then “Add as keyword”; on a transaction that already has a category, the tag icon also adds a keyword to that category", "To split a transaction across categories, use the Split button and add amounts per category (Base edition and above; on the Free edition the button shows a lock and opens the unlock screen)" ], "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 whatever the edition; the breakdown opens from the Split button (Base edition and above)" ] }, "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 (type a few letters to filter the parent list)", "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", "Collapse/expand the hierarchy at every level: each parent category has its own chevron, the grid opens fully collapsed, and an \"Expand all / Collapse all\" button opens or closes every level at once — remembered per profile", "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", "Type an amount in the Annual column to split it evenly over the 12 months; it replaces the row's monthly amounts", "Save your budget as a template to reuse it in future years" ], "tips": [ "The Annual column auto-sums all 12 months", "Templates can be applied to specific months or all 12 at once", "Only last-level categories take an amount; parent categories show the subtotals of their children", "Collapsing a category is purely visual: subtotals and annual totals are always computed over all rows, never just the visible ones — no amount you typed is ever lost" ] }, "reports": { "title": "Reports", "overview": "A hub with a live highlights panel plus five dedicated sub-reports (Highlights, Trends, Compare, Category Analysis, Cards). Every page shares a bookmarkable period via the URL query string.", "features": [ "Hub: compact highlights panel + 5 navigation cards", "Highlights: current month and YTD balances with sparklines, top movers vs. last month, top recent transactions (30/60/90 day window)", "Cartes: single-month KPI dashboard (income, expenses, net, savings rate) with a Monthly/YTD toggle, 13-month sparklines, top movers, budget adherence, and seasonality", "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 Analysis: 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", "Collapse the category hierarchy at every level on the Compare reports and the by-category Trends table: a chevron per parent category, opens fully collapsed, an \"Expand all / Collapse all\" button; purely visual (subtotals and results unchanged), remembered per profile" ], "steps": [ "Open /reports to see the highlights panel and five 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", "On /reports/cartes, pick a reference month then toggle Monthly vs. YTD to flip the 4 KPI cards between the month and the year-to-date cumulative view — the choice is persisted", "Toggle chart vs. table on any sub-report — your choice is remembered", "Right-click any transaction row in the category analysis, 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 Analysis is protected against malformed category trees: a parent_id cycle cannot freeze the app", "On /reports/cartes in YTD mode, the MoM delta for January is always \"—\" (no prior YTD window inside the same year), and the savings rate stays \"—\" when YTD income is zero", "Seasonality, top movers, and budget adherence stay monthly even when the toggle is set to YTD — only the 4 KPI numbers change", "Your category collapse choices (Compare, Trends, Budget) are remembered per profile: stored in the profile's own database, they are destroyed with it" ] }, "balance": { "title": "Balance Sheet", "overview": "The Balance Sheet is a net-worth view: you periodically enter a dated snapshot of all your accounts, track their evolution over time, and compute the true return of each investment account by linking transfers (deposits/withdrawals) to the matching accounts. Two independent axes: the asset class (the account's type: Cash, Funds / ETF, Stocks, Crypto, Other) and the fiscal envelope (an optional account attribute: TFSA, RRSP, RRIF, FHSA, RESP, or none). An account is entered either as a single amount (simple account) or security by security (detailed account: each holding with quantity × price and a cost basis, the account value being the sum of its positions).", "features": [ "5 standard types pre-installed, which are asset classes (Cash, Funds / ETF, Stocks, Crypto, Other) — renameable, non-deletable; a type groups accounts of the same nature (distinct from transaction categories). Fiscal envelopes are no longer types", "Custom type creation with simple (direct amount) or priced (quantity × unit price) entry mode", "Detailed accounts (per security): an account can hold several securities — each security has its own row (symbol, quantity, price, value, cost basis, unrealized gain), the account value being the sum of its securities. Security picker with autocomplete and inline creation (symbol + asset class Stock/Crypto)", "Unrealized gain per security and aggregated (by account, by asset class, by envelope): value − cost basis, in $ and %; per-security drill-down in the accounts table; a position without a cost basis shows \"N/A\" and is excluded from the %", "\"Detail into securities\" wizard: switches a simple account to detailed from a pivot date; past aggregated history stays frozen and read-only", "Accounts per type: name, optional fiscal envelope (Non-registered, TFSA, RRSP, RRIF, FHSA, RESP, or none by default), optional symbol (even for priced types — it only drives automatic price fetching), currency (CAD at MVP), notes", "Renaming a type no longer breaks bilingual support: the custom name is stored separately, the original FR/EN translation is preserved", "Dated snapshots with a UNIQUE constraint per date — editing means revisiting the same date, never duplicating; an existing snapshot's date can be moved (lines preserved) when the target date is free", "\"Prefill from previous snapshot\" button: copies simple values, priced quantities, and the securities/quantities/cost bases of detailed accounts (a security at quantity 0 is skipped)", "Linking existing transactions to a balance account (modal with filters and auto-suggested direction)", "Attribution icon in the Transactions page for transactions linked to a transfer", "Evolution chart with line or stacked-area mode, with an axis sub-toggle: by asset class (default) or by envelope + vertical markers for tagged transfers (green = in, red = out)", "Accounts table with 3 Modified Dietz return columns (3M / 1Y / since inception) + side-by-side unadjusted return column, collapsed by default (toggle, choice remembered)", "Warning if the latest snapshot is more than 60 days old", "Soft-delete of accounts (Archive) — hidden from new snapshots, preserved in history", "Snapshot deletion with double-confirmation by retyping the date", "Privacy-first: everything stays local, no outbound calls at MVP" ], "steps": [ "Go to /balance/accounts → Types tab to create an extra asset class if needed, as simple (direct amount) or priced (quantity × unit price)", "Go to the Accounts tab to create each account (Tangerine under Cash, BTC Ledger under Crypto with symbol BTC — optional). Pick the fiscal envelope if the account sits in a TFSA/RRSP/etc., or leave it on \"None\"", "Click \"+ New snapshot\" from /balance to open /balance/snapshot at today's date", "Fill in values per account (grouped by type). For priced accounts, enter quantity and unit price — value is computed", "Save. The chart on /balance refreshes immediately", "To compute the real return of an investment account, open the actions menu → \"Link transfers\" → check the transactions matching deposits/withdrawals — direction (in/out) is auto-proposed", "The accounts table now shows Modified Dietz returns over 3M / 1Y / since inception, side-by-side with the unadjusted return", "To track an account security by security, create it detailed or open its actions menu → \"Detail into securities\"; at later snapshots, add each holding with its quantity, price and cost basis (the account value = the sum of its securities)", "To edit an existing snapshot, click its point on the chart or use the date picker — the page opens in edit mode. You can also fix the date: change it then save, and the snapshot is moved with its lines (a warning shows if the target date is already taken)", "To delete a snapshot, click \"Delete\" in its editor and retype the date to confirm" ], "tips": [ "Take snapshots on a regular cadence (monthly or quarterly) — return quality depends on regularity", "The unadjusted return on the right shows \"account value\" vs \"true performance\": the difference comes from contributions, not from performance", "Vertical chart markers help you read value jumps: a jump followed by a green marker isn't \"performance\", it's a deposit", "If you try to delete a transaction linked to a balance account, the app asks you to unlink it first — this friction preserves the reproducibility of past returns", "The \"balance out of date\" warning appears if your latest snapshot is more than 60 days old", "Unrealized gain ≠ return: the unrealized gain (value − cost basis) measures your gain since purchase, while the Modified Dietz return measures performance accounting for the timing of your contributions — both show on a detailed account. Adjust the cost basis after a buy/sell, otherwise the unrealized gain drifts", "(Coming in Phase 5) Automatic price fetching for Stocks/Crypto via a private proxy (premium-only) that anonymizes your request — manual entry remains always available", "Toggle the stacked chart axis between \"by asset class\" and \"by envelope\" to read both sides of your net worth. Note: a snapshot taken before the class/envelope split shows under \"Other\" on the by-asset-class axis (the former TFSA/RRSP types became envelopes) — this is expected; the by-envelope axis still surfaces your TFSA/RRSP, and your amounts are unchanged" ] }, "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", "Optional feedback submission to feedback.lacompagniemaximus.com (explicit exception to the 100% local operation — prompts for consent)", "Show the getting-started path again (Settings → Users) once it was hidden" ], "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", "Click Send feedback in the Logs section to share a suggestion, comment, or issue — the identify and context/logs checkboxes are unchecked by default", "To see the getting-started path again after hiding it, open Settings → Users and click \"Show the getting-started checklist\": the path reappears at the top of this profile's pages, and a message confirms it. The button shows as soon as the path is hidden, even from the banner of that same page" ], "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", "The app only contacts a server for updates, Maximus sign-in, feedback, the license (activation and check) and market prices. One request goes out on its own, at startup and when a key is entered: the license check, at most once every 24 hours for the same key and only when a key is stored. No telemetry" ] }, "editions": { "title": "Editions", "overview": "Simpl'Résultat comes in three editions — Free, Base and Premium. The edition determines which modules are accessible; it never touches your data, which stays local and complete whatever the active edition.", "features": [ "Free — Dashboard, CSV Import, Transactions (without splits), Categories, the Trends report (and the Reports hub), encrypted export/import and the changelog, with a single profile", "Base — everything in Free, plus Budget, Adjustments, transaction splits, the advanced reports (Highlights, Compare, Category analysis, Cards), multiple profiles and automatic updates", "Premium — everything in Base, plus the full Balance module (net worth, per-security detail, market prices)", "Modules above your edition stay visible but locked: a lock badge shows in the sidebar, on the report tiles and on the Split button of the Transactions page — opening one shows the unlock screen" ], "steps": [ "Look for the lock badge in the sidebar, on the Reports hub tiles or on the Split button of the Transactions page: it marks what is above your edition", "Click a locked module to see which edition it requires", "To buy the Base edition, click \"Get Base\": the product page opens in your browser (Premium isn't sold online yet)", "Once you have a license key, click \"I already have a key\" (or go to Settings → Users) and enter it", "Modules unlock immediately — no reinstall or restart needed" ], "tips": [ "Locking is never destructive: if your edition goes down (expired, invalid, revoked or removed key), the data of locked modules — budgets, adjustments, balance snapshots, profiles — is fully kept and reappears as soon as a valid key is entered", "On the Free edition your active profile always stays accessible — only creating an extra profile and switching to another profile are locked", "On the Free edition, splits made earlier stay in your data: they are still counted in the reports and the dashboard, and still flagged in the transaction list — only opening and editing a split are locked", "The license key applies to the whole machine, not to one profile: it unlocks the modules for every profile on this computer", "On the Free edition automatic updates are locked: the Updates card (Settings → System) offers to download the latest version from the product page, and a manual install stays free", "The License card (Settings → Users) shows your edition and when the key expires; a key valid for more than 50 years shows \"No expiry date\"", "Activating a machine binds it to your key on the license server; it only serves the market prices of the Balance (Premium), and your edition never depends on it. After a reinstall, a new computer, a different key or an expired activation, the card shows \"Not activated\": click \"Activate\". The app also removes an activation that no longer serves, and the card then shows \"Not activated\": when a price fetch is refused because this machine's activation belongs to a revoked license (that of a refunded key, left next to your current key by an earlier version, for example), and when the machine list does not count this machine (deactivated from another computer, for example). Each such removal is written to the logs (Settings → System)", "Activation sends the license server your key, this computer's name and a derived identifier, specific to Simpl'Résultat, in place of the system's machine identifier", "The machine list shows how many machines are activated out of the number your key allows; deactivate one to free a slot", "If the license server reports that your key was revoked, for instance after a refund, the app goes back to the Free edition and stays there from one session to the next: the License card, the locked screens and the Updates card say so. Your data is kept, and another valid key gives its edition back", "When a key is stored, the app asks the license server whether it was revoked: at startup and as soon as you enter a key, at most once every 24 hours for the same key, sending the product and the key, nothing else. The check of an entered key runs in the background: the License card answers right away, and a revoked key shows its edition for a second or two before the app goes back to Free. Without a stored key no request is sent; if the server does not answer, nothing changes. Each check is written to the logs (Settings → System). The check goes on after a revocation, as long as the key stays stored: a correction made by the license server is thus picked up at the next start. To stop this check, remove the key (\"Remove the key\" in the License card); storing another key also stops the previous one from being sent", "\"Remove the key\" (License card) removes your key from this computer, after a confirmation: the modules of your edition lock and your data is kept. If this machine is activated, its slot is freed on the license server first; offline, the app asks whether to remove the key anyway, and the slot then stays occupied until you free it from another computer where the key is stored. A revoked key removed then entered again stays revoked" ] } }, "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", "back": "Back" }, "license": { "title": "License", "currentEdition": "Current edition", "expiresAt": "Expires on", "noExpiry": "No expiry date", "enterKey": "Enter a license key", "keyPlaceholder": "SR-BASE-...", "activate": "Activate", "purchase": "Buy Simpl'Result", "removeKey": { "button": "Remove the key", "removing": "Removing...", "confirmValid": "Remove the license key from this computer?\n\nThe modules of your edition lock and the app goes back to the Free edition. Your data is kept and reappears as soon as a valid key is entered.", "confirmActivated": "Remove the license key from this computer?\n\nThis machine's slot is freed on the license server first. The modules of your edition lock and the app goes back to the Free edition; your data is kept and reappears as soon as a valid key is entered.", "confirmRevoked": "Remove the revoked key from this computer?\n\nThe app stops sending it to the license server to be checked (at most once every 24 hours). Your data is kept.", "confirmWithoutRelease": "This machine's slot could not be freed. {{reason}}\n\nRemove the key anyway? The slot stays occupied on the license server; you can free it from the machine list on another computer where the key is stored.", "failed": "The key was not removed. {{reason}}" }, "editions": { "free": "Free", "base": "Base", "premium": "Premium" }, "machines": { "title": "Machines", "count": "{{count}}/{{limit}} machines activated", "activating": "Activating...", "activated": "Activated", "notActivated": "Not activated", "deactivate": "Deactivate", "deactivating": "Deactivating...", "thisMachine": "This machine", "noMachines": "No machines activated" }, "errors": { "licenseNotFound": "This license key was not found on the license server.", "licenseRevoked": "This license key has been revoked.", "licenseExpired": "This license key has expired.", "machineLimitReached": "This license has reached its maximum number of machines. Deactivate a machine in the list to free a slot.", "noActiveActivation": "This machine is not activated for this license.", "invalidInput": "The request sent to the license server is invalid.", "invalidPrefix": "A license key starts with SR-BASE- or SR-PREMIUM-. Check that it was copied in full.", "invalidSignature": "This license key could not be verified. Check that it was copied in full; if it was, it was not issued by the Simpl'Result license server.", "malformed": "This license key cannot be read. Check that it was copied in full, without spaces or line breaks.", "unknownEdition": "This license key is for an edition this version of the app does not know. Update the app, then enter the key again.", "rateLimit_one": "Too many attempts. Try again in {{count}} second.", "rateLimit_other": "Too many attempts. Try again in {{count}} seconds.", "network": "Cannot reach the license server. Check your internet connection.", "invalidResponse": "The license server returned an unexpected response.", "server": "The license server encountered an error. Try again later.", "noLicenseStored": "No license key is stored on this machine.", "storage": "Cannot read or write the license file.", "internal": "Internal application error.", "unknown": "An unexpected error occurred." } }, "upsell": { "title": "{{tier}} feature", "features": { "budget": "Plan monthly budgets by category and compare them against your actual spending.", "adjustments": "Add manual entries and split transactions across multiple categories.", "reports-advanced": "Explore the advanced reports: Highlights, Compare, Category Analysis and Cards.", "multi-profile": "Create multiple profiles, each with its own local database and PIN protection.", "balance": "Track your net worth: accounts, snapshots, per-security detail and market prices." }, "ctaGet": "Get {{tier}}", "premiumNotForSale": "Premium isn't sold online yet.", "ctaHaveKey": "I already have a key", "revoked": "Your license key was revoked: the Free edition applies." }, "account": { "title": "Maximus Account", "optional": "Optional", "description": "Your account lets you find your licenses on lacompagniemaximus.com and identifies you in the feedback you send. Base and Premium editions come from your license key, not from the account.", "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)." } } }, "feedback": { "button": "Send feedback", "logsHeading": "Recent logs:", "dialog": { "title": "Your feedback", "placeholder": "Describe your suggestion, comment, or issue...", "submit": "Send", "sending": "Sending...", "cancel": "Cancel" }, "checkbox": { "context": "Include navigation context (page, theme, viewport, version)", "logs": "Include recent error logs", "identify": "Identify me with my Maximus account" }, "toast": { "success": "Thank you for your feedback", "error": { "429": "Too many feedbacks sent recently. Try again later.", "400": "Invalid feedback. Check the content.", "generic": "Error while sending. Try again later." } }, "consent": { "title": "Feedback submission", "body": "Your feedback will be sent to feedback.lacompagniemaximus.com so we can improve the app. This requires an internet connection and is an exception to the app's 100% local operation.", "accept": "I agree" } }, "categoriesSeed": { "revenus": { "root": "Income", "emploi": { "root": "Employment", "paie": "Regular paycheque", "primes": "Bonuses & premiums", "autonome": "Self-employment" }, "gouvernemental": { "root": "Government", "remboursementImpot": "Tax refund", "allocations": "Family allowances", "credits": "GST/QST credits", "assuranceEmploi": "Employment insurance / QPIP" }, "placement": { "root": "Investment income", "interets": "Interest & dividends", "capital": "Capital gains", "locatifs": "Rental income" }, "autres": "Other income" }, "alimentation": { "root": "Food", "epicerie": { "root": "Groceries & markets", "reguliere": "Regular groceries", "boucherie": "Butcher & fishmonger", "boulangerie": "Bakery & pastry", "depanneur": "Convenience store", "marche": "Markets & specialty food" }, "restauration": { "root": "Dining out", "restaurant": "Restaurant", "cafe": "Coffee shop & quick bakery", "fastfood": "Fast food", "livraison": "Home delivery", "cantine": "Cafeteria" } }, "logement": { "root": "Housing", "habitation": { "root": "Primary residence", "loyer": "Rent", "hypotheque": "Mortgage", "taxes": "Municipal & school taxes", "copropriete": "Condo fees" }, "services": { "root": "Utilities", "electricite": "Electricity", "gaz": "Natural gas", "chauffage": "Heating (oil, propane)", "eau": "Water & sewer" }, "communications": { "root": "Communications", "internet": "Home internet", "mobile": "Mobile phone", "residentielle": "Landline phone", "streamingTv": "Cable & TV streaming" }, "entretien": { "root": "Maintenance & repairs", "general": "General maintenance", "renovations": "Renovations", "materiaux": "Materials & tools", "paysager": "Landscaping" }, "assurance": "Home insurance" }, "menage": { "root": "Household & furnishings", "ameublement": { "root": "Furnishings", "meubles": "Furniture", "electromenagers": "Appliances", "decoration": "Decoration" }, "fournitures": { "root": "Household supplies", "entretien": "Cleaning supplies", "literie": "Bedding & linens", "vaisselle": "Dishes & utensils" }, "services": { "root": "Domestic services", "nettoyage": "Cleaning services", "buanderie": "Laundry & dry cleaning" } }, "vetements": { "root": "Clothing & footwear", "adultes": "Adult clothing", "enfants": "Children's clothing", "chaussures": "Footwear", "accessoires": "Accessories & jewelry" }, "transport": { "root": "Transportation", "vehicule": { "root": "Personal vehicle", "achat": "Vehicle purchase / lease", "essence": "Gasoline", "entretien": "Auto maintenance & repairs", "immatriculation": "Registration & licence", "stationnement": "Parking & tolls", "assurance": "Auto insurance" }, "public": { "root": "Public transit", "autobus": "Bus & subway", "train": "Commuter train", "taxi": "Taxi & ride-sharing" }, "voyages": { "root": "Long-distance travel", "avion": "Air travel", "trainAutocar": "Train & coach", "hebergement": "Lodging", "location": "Travel car rental" } }, "sante": { "root": "Health & personal care", "medicaux": { "root": "Medical care", "pharmacie": "Pharmacy", "consultations": "Medical consultations", "dentiste": "Dentist & orthodontist", "optometrie": "Optometry & eyewear", "therapies": "Therapies (physio, psych, etc.)", "assurance": "Supplemental health insurance" }, "personnels": { "root": "Personal care", "coiffure": "Haircare & esthetics", "soins": "Personal care products" }, "assuranceVie": "Life & disability insurance" }, "loisirs": { "root": "Leisure, education & reading", "divertissement": { "root": "Entertainment", "cinema": "Cinema & shows", "jeux": "Video games & consoles", "streamingVideo": "Video streaming", "streamingMusique": "Music & audio streaming", "jouets": "Toys & hobbies" }, "sports": { "root": "Sports & outdoors", "abonnements": "Sports memberships", "equipement": "Sports equipment", "parcs": "Parks & outdoor activities" }, "formation": { "root": "Education & training", "scolarite": "Tuition fees", "materiel": "School supplies", "cours": "Courses & certifications", "abonnements": "Professional subscriptions" }, "lecture": { "root": "Reading & media", "livres": "Books", "journaux": "Newspapers & magazines" }, "animaux": { "root": "Pets", "nourriture": "Pet food & supplies", "veterinaire": "Veterinarian" } }, "consommation": { "root": "Beverages, tobacco & cannabis", "alcool": "Alcohol (SAQ, microbreweries)", "cannabis": "Cannabis (SQDC)", "tabac": "Tobacco" }, "finances": { "root": "Finances & obligations", "fraisBancaires": { "root": "Bank fees", "compte": "Account fees", "interets": "Interest & credit fees", "change": "Currency exchange fees" }, "impots": { "root": "Taxes", "federal": "Federal income tax", "provincial": "Provincial income tax", "acomptes": "Instalment payments" }, "dons": { "root": "Donations & dues", "charite": "Charitable donations", "professionnelles": "Professional dues", "syndicales": "Union dues" }, "cadeaux": "Gifts", "cash": "Cash withdrawal", "divers": "Miscellaneous uncategorized purchases" }, "transferts": { "root": "Transfers & investments", "epargne": { "root": "Savings & investments", "reer": "RRSP", "celi": "TFSA", "reee": "RESP", "nonEnregistre": "Non-registered account", "urgence": "Emergency fund" }, "dette": { "root": "Debt repayment", "carteCredit": "Credit card payment", "etudiant": "Student loan repayment", "personnel": "Personal loan repayment" }, "internes": "Internal transfers" }, "guidePage": { "title": "Standard categories guide", "subtitle": "Based on the Statistics Canada CPI classification", "backToSettings": "Back to settings", "intro": { "title": "Why this structure?", "body": "Statistics Canada's official household expenditure classification (CPI basket) identifies the main budget components of a Canadian household. This structure covers the full range of financial flows of a typical Quebec household, makes it easier to benchmark against external references, and produces clearer reports." }, "counter": "{{roots}} root categories · {{subcategories}} subcategories · {{leaves}} leaves · {{total}} categories in total", "searchPlaceholder": "Search a category...", "expandAll": "Expand all", "collapseAll": "Collapse all", "print": "Export as PDF", "printHint": "Use the print dialog to save as PDF.", "noResults": "No category matches your search.", "tooltip": { "key": "i18n key", "type": "Type", "id": "Identifier" }, "type": { "income": "Income", "expense": "Expense", "transfer": "Transfer" }, "legend": { "title": "Legend", "root": "Root category", "subcategory": "Subcategory", "leaf": "Leaf (final category)" } }, "migration": { "customParent": "Custom categories (migration)", "pageTitle": "Migrate to the standard structure", "pageSubtitle": "Three steps: discover, simulate, consent. No data is changed until the final step.", "backToSettings": "Back to settings", "stepper": { "ariaLabel": "Migration progress", "discover": "Discover", "simulate": "Simulate", "consent": "Consent" }, "alreadyMigrated": { "title": "Your profile already uses the standard structure", "body": "No migration needed. If you recently migrated, you can review the backup from Settings." }, "discover": { "title": "Step 1 · Discover the new structure", "subtitle": "Take your time to explore the tree. You can come back later without risk.", "intro": { "title": "Why this structure?", "body": "Statistics Canada's official household expenditure classification (CPI basket) identifies the main budget components of a Canadian household. It covers 100% of the financial flows of a typical Quebec household and produces clearer reports." }, "next": "Continue to migration preview" }, "simulate": { "title": "Step 2 · Migration preview", "subtitle": "Dry-run — no writes. Click a row to see affected transactions and, if needed, pick a different target.", "loadError": "Failed to load profile data: {{error}}", "needsReview": "Needs review", "chooseTarget": "Choose a target...", "editTargetAria": "Change the target for {{category}}", "txCount_one": "{{count}} transaction", "txCount_other": "{{count}} transactions", "unresolvedWarning_one": "You have {{count}} decision to make before you can continue.", "unresolvedWarning_other": "You have {{count}} decisions to make before you can continue.", "header": { "current": "Current category", "match": "Match", "target": "Proposed v1 target" }, "confidence": { "high": "High", "medium": "Medium", "low": "Low", "none": "Needs review" }, "reason": { "keyword": "Keyword-based", "supplier": "Supplier-based", "default": "Default mapping", "review": "Manual review required", "preserved": "Preserved" }, "stats": { "total": "Total" }, "preserved": { "title_one": "{{count}} custom category", "title_other": "{{count}} custom categories", "body": "These categories have no standard equivalent. Pick a target to merge a category: its transactions, budgets, keywords and suppliers are reassigned to it and the category disappears. Leave the field empty to keep it as-is under \"Custom categories (migration)\"." }, "panel": { "title": "Affected transactions", "subtitle_one": "{{count}} transaction attached to this category", "subtitle_other": "{{count}} transactions attached to this category", "close": "Close panel", "noTransactions": "No transaction attached to this category.", "overflow_one": "... and {{count}} more transaction", "overflow_other": "... and {{count}} more transactions", "willMapTo": "Will be reassigned to: {{target}}", "noTarget": "No target chosen — a decision is required." }, "back": "Back to discovery", "next": "All decisions made · Continue" }, "consent": { "title": "Step 3 · Confirmation and backup", "subtitle": "An encrypted copy of your profile will be created BEFORE any change. You can restore it at any time.", "backup": { "title": "Automatic backup before migration", "body": "Simpl'Résultat creates a verified copy of your profile inside your Documents folder. The filename includes the date and time — nothing leaves your device.", "location": "Location: ~/Documents/Simpl-Resultat/backups/" }, "password": { "label": "Profile PIN", "help": "Your PIN is used to encrypt the backup (AES-256-GCM). It never leaves your device." }, "checklist": { "title": "Confirm that:", "item1": "I understand this operation permanently modifies my categories.", "item2": "I confirm a verified backup will be created before any change.", "item3": "I can restore the backup at any time during 90 days." }, "back": "Back", "confirm": "Create backup and migrate" }, "running": { "title": "Migration in progress...", "subtitle": "Do not close the application until the operation finishes.", "step1": "Step 1 · Creating the backup", "step2": "Step 2 · Verifying the backup (SHA-256 checksum)", "step3": "Step 3 · Applying the migration (SQL transaction)", "step4": "Step 4 · Committing and refreshing" }, "success": { "title": "Migration successful", "subtitle": "Your profile now uses the standard structure (Statistics Canada CPI).", "backupLabel": "Your backup is here:", "restoreHint": "You can restore this backup at any time from Settings > Categories for 90 days.", "stats": { "inserted": "Categories added", "transactions": "Transactions migrated", "keywords": "Keywords migrated", "budgets": "Budgets migrated" }, "backToDashboard": "Go to dashboard", "viewCategories": "View my categories" }, "error": { "title": "The migration could not be applied", "subtitle": "No change was saved. Your profile is in the exact same state as before the operation.", "rollbackNote": "If a partial backup was created, it stays available in your Documents folder — you can delete it manually if it is not useful.", "retry": "Back to consent step", "backToSettings": "Back to settings", "backup": { "missing_password": "Missing PIN — backing up a protected profile requires the PIN.", "documents_dir_unavailable": "Unable to locate the Documents folder.", "permission_denied": "Insufficient permissions to write in the backup folder.", "disk_space": "Not enough disk space to create the backup.", "create_dir_failed": "Unable to create the backup folder.", "write_failed": "Failed to write the backup file.", "read_back_failed": "Unable to read the backup file back for verification.", "verification_mismatch": "Backup verification failed (invalid checksum or corrupted file)." } } } }, "balance": { "overview": { "title": "Balance sheet", "latestTotal": "Current net worth", "asOf": "as of {{date}}", "noSnapshots": "No snapshot yet. Create one to start tracking your balance over time.", "vsPrevious": "vs previous", "newSnapshot": "New snapshot", "staleWarning": "The latest snapshot is more than {{days}} days old. Consider updating it to keep your balance accurate.", "latestValue": "Latest value", "periodDelta": "Δ% over period", "noAccounts": "No active accounts. Create a balance account to get started.", "accountsTitle": "Accounts" }, "period": { "legend": "Analysis period", "3M": "3 months", "6M": "6 months", "1A": "1 year", "3A": "3 years", "all": "All" }, "chart": { "empty": "No snapshot for this period.", "modeLegend": "Chart display mode", "axisLegend": "Stacked chart grouping axis", "totalSeriesLabel": "Total", "mode": { "line": "Line", "stacked": "Stacked by type" }, "axis": { "byAssetClass": "By asset class", "byVehicle": "By envelope" } }, "hub": { "getStarted": "Get started", "manage": "Manage", "accounts": { "title": "Manage accounts", "description": "Create, edit, or archive your accounts and asset types." }, "snapshot": { "title": "New snapshot", "description": "Record the balance of each account at a given date." } }, "landing": { "empty": { "title": "Track your net worth", "subtitle": "Start by creating an account: chequing, TFSA, RRSP, stocks, crypto, and so on." }, "noSnapshot": { "title": "Take your first snapshot", "subtitle": "Your accounts are ready. Enter a snapshot to start tracking your net worth over time — or keep managing your accounts." } }, "starters": { "title": "Starter accounts", "description": "Want to add these 4 common accounts? You can rename or archive them at any time.", "cta_add": "Add selected accounts", "cta_later": "Later", "collision_tooltip": "Already exists", "items": { "cash": "Checking account", "tfsa": "TFSA", "rrsp": "RRSP", "other": "Non-registered account" }, "errors": { "insert": "Could not add the accounts. Please try again." } }, "sidebar": "Balance sheet", "accountsPage": { "title": "Balance accounts", "tabs": { "accounts": "Accounts", "categories": "Types" }, "newAccount": "New account", "includeArchived": "Show archived accounts", "empty": "No accounts yet. Click “New account” to start." }, "account": { "fields": { "name": "Name", "category": "Type", "symbol": "Symbol", "currency": "Currency", "status": "Status", "actions": "Actions" }, "status": { "active": "Active", "archived": "Archived" }, "actions": { "archive": "Archive", "unarchive": "Restore" }, "form": { "createTitle": "New account", "editTitle": "Edit account", "category": "Type", "noCategory": "(no type available)", "name": "Account name", "nameRequired": "Name is required.", "symbol": "Symbol", "symbolPricedHint": "optional — only needed for automatic price fetching", "symbolPlaceholderSimple": "Optional", "symbolPlaceholderPriced": "e.g. AAPL, BTC-USD (optional)", "notes": "Notes", "currencyMvpNotice": "At the MVP, all accounts are in CAD. Multi-currency support will land in a later version.", "save": "Save", "create": "Create account", "vehicleType": { "label": "Fiscal envelope", "none": "None", "unregistered": "Non-registered", "tfsa": "TFSA", "rrsp": "RRSP", "rrif": "RRIF", "fhsa": "FHSA", "resp": "RESP", "hint": "Tax shelter for this account (TFSA, RRSP…). Optional — the asset class stays the type." }, "kind": { "label": "Entry mode", "simple": "Single amount", "detailed": "By title (securities)", "hint": "Single amount = one total per snapshot. By title = a breakdown into individual securities (quantity × price).", "detailedCreateHint": "New accounts start as a single amount; convert one to by-title from the accounts list." } } }, "category": { "intro": "The types that ship with the app (TFSA, RRSP, Cash, etc.) cannot be deleted. You can create your own for special cases.", "fields": { "name": "Name", "key": "Key", "kind": "Entry mode", "origin": "Origin", "actions": "Actions" }, "kind": { "simple": "Direct amount", "priced": "Quantity × price" }, "origin": { "seeded": "Standard", "user": "Custom" }, "actions": { "create": "New type", "renamePrompt": "New label for this type", "deleteConfirm": "Delete this type? This cannot be undone.", "deleteSeedHint": "Standard types cannot be deleted.", "deleteHasAccountsHint": "This type has {{count}} linked account(s) — archive or move them first." }, "form": { "createTitle": "New type", "key": "Key", "keyPlaceholder": "e.g. lira, prpp", "label": "Label", "labelPlaceholder": "e.g. LIRA, PRPP", "kindLabel": "Entry mode", "kindHintSimple": "Direct value entry (e.g. checking-account balance).", "kindHintPriced": "Quantity × unit price entry (e.g. stocks, crypto). A symbol is optional for linked accounts (only needed for automatic price fetching).", "simpleOnlyNotice": "Priced types (stocks, crypto) will be available in a future release.", "create": "Create type", "customLabel": "Label", "customLabelPlaceholder": "e.g. My RRIF, Travel savings", "customLabelHint": "Display name for this type. Leave blank to use the default label." }, "assetType": { "label": "Asset type", "stock": "Stock", "crypto": "Crypto", "required": "Select an asset type" }, "error": { "has_accounts": "Cannot delete this type: {{count}} linked account(s) ({{names}}). Archive or move them first." }, "cash": "Cash", "tfsa": "TFSA", "rrsp": "RRSP", "fund": "Funds / ETF", "other": "Other", "stock": "Stock", "crypto": "Crypto" }, "snapshot": { "page": { "newTitle": "New snapshot", "editTitle": "Edit snapshot", "dateLabel": "Snapshot date", "dateMovableHint": "You can change this snapshot's date. Entered values are kept and moved to the new date.", "total": "Entered total", "noAccounts": "To enter a snapshot, first create at least one account. An account = where you keep money (chequing, TFSA, RRSP, stocks, etc.). A snapshot = the picture of how much was in each account on a given date.", "goToAccounts": "Create an account", "prefill": "Prefill from previous", "prefillTooltip": "Copy values from the snapshot dated {{date}}", "prefillNoPrevious": "No earlier snapshot available.", "save": "Save", "create": "Create snapshot", "delete": "Delete this snapshot" }, "editor": { "empty": "No active accounts. Create an account before entering a snapshot." }, "line": { "valuePlaceholder": "0.00", "valueLabel": "Value for {{account}}" }, "priced": { "quantity": "Quantity", "quantityLabel": "Quantity for {{account}}", "quantityPlaceholder": "0", "unitPrice": "Unit price", "unitPriceLabel": "Unit price for {{account}}", "unitPricePlaceholder": "0.00", "computedValue": "Value (computed)", "computedValueLabel": "Computed value for {{account}}", "computedValuePlaceholder": "—", "attributionManual": "Manual", "attributionManualHint": "Value entered manually. Automatic price fetching will land in a later release." }, "detailed": { "badge": "By title", "badgeHint": "This account is broken down into individual securities. Its value is the sum of its positions.", "empty": "No position yet. Add a title to record this account's holdings.", "addTitle": "Add a title", "removeTitle": "Remove this title", "symbolLabel": "Security symbol", "symbolPlaceholder": "Symbol", "bookCostLabel": "Cost basis for {{account}}", "bookCostPlaceholder": "0.00", "latentGainLabel": "Unrealized gain for {{account}}", "latentGainNA": "—", "col": { "title": "Security", "quantity": "Quantity", "unitPrice": "Price", "value": "Value", "bookCost": "Cost basis", "latentGain": "Unrealized gain" }, "picker": { "placeholder": "Symbol (e.g. AAPL, BTC)", "empty": "Type a symbol to create it.", "create": "Create \"{{symbol}}\"", "assetTypeLabel": "Type:", "assetType": { "stock": "Stock", "crypto": "Crypto" } }, "importCsv": { "button": "Import CSV", "title": "Import securities from a CSV", "intro": "Import the positions of \"{{account}}\" from a CSV file (broker statement, export). Columns are detected automatically; adjust them if needed.", "selectFile": "Choose a CSV file", "loading": "Reading file…", "hint": "Accepted formats: .csv, .txt. Delimiter and encoding are detected automatically.", "detectError": "Could not detect columns in this file. Make sure it is a valid securities CSV.", "readError": "Could not read the file.", "retry": "Retry", "symbolColumn": "Symbol column", "quantityColumn": "Quantity column", "priceColumn": "Price column (optional)", "bookCostColumn": "Book cost column (optional)", "noColumn": "— None —", "noPriceNote": "No price column: securities will be imported without a price. You can fetch or type it afterwards.", "summary": "{{count}} security(ies) will be imported.", "import": "Import" } }, "delete": { "title": "Delete this snapshot?", "body": "This permanently deletes the snapshot dated {{date}} and all its lines. To confirm, retype the date below.", "confirmLabel": "Retype the date {{date}} to confirm", "confirm": "Delete permanently" } }, "errors": { "currency_unsupported": "Only CAD is supported at the MVP.", "category_seed_protected": "Standard types cannot be deleted.", "category_has_accounts": "Cannot delete a type with linked accounts. Move or archive linked accounts first.", "category_not_found": "Type not found.", "account_not_found": "Account not found.", "name_required": "Name is required.", "kind_invalid": "Invalid entry mode.", "snapshot_date_required": "A date in YYYY-MM-DD format is required.", "snapshot_date_taken": "A snapshot already exists at that date — edit it instead of creating a new one.", "snapshot_date_exists": "Another snapshot already exists at that date. Pick a free date or edit the existing snapshot.", "snapshot_not_found": "Snapshot not found.", "snapshot_value_invalid": "An entered value is not a valid number.", "snapshot_priced_unsupported": "Priced accounts (stocks/crypto) will be supported in a future release.", "snapshot_priced_quantity_required": "Quantity is required for priced accounts.", "snapshot_priced_unit_price_required": "Unit price is required for priced accounts.", "snapshot_priced_value_mismatch": "The entered value does not match quantity × unit price.", "snapshot_simple_must_be_scalar": "A simple value must not carry quantity or price.", "vehicle_type_invalid": "Invalid fiscal envelope." }, "returns": { "partialTooltip": "Partial return: a snapshot is missing for the selected period.", "noTransfersWarning": "No transfers tagged — performance may be skewed if contributions weren't tagged." }, "accountsTable": { "return3m": "3M", "return3mTooltip": "Modified Dietz return over the last 90 days.", "return1y": "1Y", "return1yTooltip": "Modified Dietz return over the last 365 days.", "sinceCreation": "Since inception", "sinceCreationTooltip": "Modified Dietz return since the first snapshot.", "unadjusted": "Unadjusted", "unadjustedTooltip": "Simple return (V_end − V_start) / V_start, with no contribution weighting.", "toggleReturns": { "show": "Show returns", "hide": "Hide returns" } }, "latentGain": { "column": "Unrealized gain", "tooltip": "Latent gain on a detailed account: current value minus cost basis (book cost), in dollars and percent. Shown “—” when the cost basis is unknown.", "totalLabel": "Unrealized gain", "na": "—", "partial": "Partial: some positions have no recorded cost basis and are excluded from the percentage.", "drilldown": { "expand": "Show securities", "collapse": "Hide securities", "security": "Security", "value": "Value", "gain": "Unrealized gain" }, "summary": { "title": "Unrealized gain breakdown", "byClass": "By asset class", "byVehicle": "By envelope" } }, "vehicle": { "none": "No envelope" }, "detailWizard": { "action": "Detail into securities", "title": "Detail “{{account}}” into securities", "intro": "This account will switch to per-security detailed entry. Securities are entered at the next regular snapshot — this wizard captures none right now.", "pointFrozen": "Past aggregated history stays frozen read-only: older snapshots keep their single total value.", "pointNextSnapshot": "From today on, every new snapshot will require the per-security breakdown (with cost basis).", "pointPivot": "Pivot date: {{date}}.", "irreversible": "One-way action: once securities are entered, this account can no longer return to aggregated entry.", "confirm": "Detail", "confirming": "Switching…", "errors": { "account_kind_detailed_has_holdings": "This account already has securities entered and can no longer return to aggregated entry." } }, "transfers": { "linkAction": "Link transfers", "direction": { "in": "In", "out": "Out" }, "modal": { "title": "Link transfers to {{account}}", "subtitle": "Select transactions to attribute to this balance account. The direction is suggested based on the amount sign.", "from": "From", "to": "To", "category": "Category", "anyCategory": "Any category", "search": "Search", "searchPlaceholder": "Keyword in description…", "loading": "Loading…", "noTransactions": "No transactions match the filters.", "direction": "Direction", "toggleDirection": "Click to flip direction", "summary": "{{selected}} selected of {{total}} shown", "linkSelection": "Link {{count}} transaction(s)", "linking": "Linking…", "partialFailure": "{{linked}}/{{total}} linked successfully" }, "errors": { "transfer_direction_invalid": "Invalid transfer direction (expected in/out).", "transfer_already_linked": "This transaction is already linked to this account.", "transfer_not_linked": "This transaction is not linked to this account.", "transfer_active_profile_unknown": "No active profile — cannot compute return.", "transaction_linked_to_balance_account": "This transaction is linked to balance account {{account}} — unlink it before deleting." } }, "evolution": { "transferIn": "In", "transferOut": "Out" }, "priceFetching": { "button": "Fetch price", "tooltipNotPremium": "Available with premium subscription", "bestEffortNotice": "Source not guaranteed, may be unavailable. Manual input remains primary.", "bestEffortBadge": "best-effort", "attribution": "via Maximus on {{date}}", "consent": { "title": "Price fetching via Maximus", "body": "By clicking Accept, you authorize Simpl'Résultat to query the Maximus proxy to fetch this price. The proxy hides your IP from data providers. No browsing history is stored.", "accept": "Accept", "decline": "Cancel" }, "errors": { "invalidSymbol": "Invalid symbol", "invalidDate": "Invalid date", "missingParam": "Missing parameter", "authFailed": "Authentication failed — activate this machine in Settings → Users", "premiumRequired": "This feature requires a premium subscription", "licenseRevoked": "This machine's activation belongs to a revoked license — activate this machine again in Settings → Users", "symbolNotFound": "Symbol not found", "rateLimit": "Too many requests — retry in {{seconds}}s", "serverUnavailable": "Server unavailable — try again later", "bestEffortDegraded": "Best-effort price source temporarily unavailable — retry in {{minutes}}min or enter manually", "sessionCapReached": "Fetch limit reached for this session. Enter remaining prices manually." } } } }