/**
 * English translations. Keys must stay in sync with zh.ts.
 */
export default {
  app: {
    name: 'DriftLedger',
    tagline: 'Floating life\'s daily routine, all clear in one stroke. Simple, offline mobile bookkeeping.',
    statusParsed: 'Ledger loaded. Your transactions are safely stored locally.',
  },
  common: {
    cancel: 'Cancel',
    delete: 'Delete',
    undo: 'Undo',
    confirm: 'OK',
    save: 'Save',
    edit: 'Edit',
    add: 'Add',
    back: 'Back',
    notFound: 'Not Found',
    untitled: 'Untitled',
    clickEditLongDelete: 'Tap to edit · Long-press to delete',
    noData: 'No data',
    discard: 'Discard',
    error: 'Error',
  },
  tab: {
    home: 'Home',
    transactions: 'Txns',
    report: 'Report',
    import: 'Import',
    rules: 'Rules',
    settings: 'Me',
  },
  home: {
    title: 'Ledger Status',
    accounts: '%{count} open accounts · %{total} transactions',
    readonlyHint: 'Ledger is ready. New transactions will be saved automatically.',
    mobileBean: 'Local Records',
    mobileBeanEmpty: 'No transactions yet',
    newTransaction: 'New Transaction',
    netWorthTitle: 'Net Worth',
    assets: 'Assets',
    liabilities: 'Liabilities',
    netWorth: 'Net Worth',
    income: 'Income',
    expense: 'Expense',
    balance: 'Balance',
    monthlyTrend: 'Monthly Trend',
    recentTransactions: 'Recent',
    recentEmpty: 'No transactions yet. Tap + to add one.',
    ocrScan: 'Scan Receipt',
    dueRecurring: 'Due Recurring Bills',
    dueAmount: 'Amount',
    confirmRecurring: 'Confirm',
    recurringSuccess: 'Success',
    recurringSuccessDesc: 'Recurring bill "%{name}" has been recorded and next due date updated.',
    recurringFail: 'Recurring recording failed',
    accountTree: 'Account Balance Tree',
    balanced: '✓ Balanced',
    unbalanced: '✗ Unbalanced',
    greetingMorning: 'Good morning',
    greetingAfternoon: 'Good afternoon',
    greetingEvening: 'Good evening',
    monthExpense: 'Spent this month',
    monthIncome: 'Earned this month',
    budgetRemaining: 'Budget left',
    viewAll: 'View all',
  },
  todo: {
    title: 'To-do',
    dueRecurring: 'Recurring "%{name}" is due',
    creditCardDue: '%{name} payment due %{date}',
    pendingDrafts: '%{count} auto bills to confirm',
    confirm: 'Post',
    view: 'View',
  },
  transaction: {
    newTitle: 'Manual Entry',
    amountPlaceholder: 'Amount, e.g. 24.50',
    accountPlaceholder: 'Expense account',
    submit: 'Save Transaction',
    appended: 'Transaction saved successfully.',
    detailTitle: 'Transaction Detail',
    notFoundTitle: 'Transaction Not Found',
    notFoundDesc: 'Transaction with ID %{id} could not be found. It may have been deleted or not yet loaded.',
    summary: 'Summary',
    noSummary: '(no summary)',
    postings: 'Fund Flow',
    tags: 'Tags',
    links: 'Links',
    metadata: 'Additional Info',
    rawBean: 'Underlying Text',
    source: 'Source',
    directionExpense: 'Expense',
    directionIncome: 'Income',
    directionTransfer: 'Transfer',
    formDate: 'Date',
    formCurrency: 'Currency',
    formNarration: 'Narration',
    formPayee: 'Payee',
    formPayeePlaceholder: 'Counterparty/merchant',
    formSourceAccount: 'Source Account',
    formAvailable: 'Available',
    formCategoryExpense: 'Expense Category',
    formCategoryIncome: 'Income Category',
    formTags: 'Tags (optional)',
    formTagsWillWrite: 'Will write',
    amountRequired: 'Please enter an amount',
    sameAccountError: 'Source and target accounts cannot be the same',
    narrationDefaultExpense: 'Expense',
    narrationDefaultIncome: 'Income',
    narrationDefaultTransfer: 'Transfer',
    advancedMode: 'Advanced Double-Entry Mode',
    atLeast2Postings: 'Double-entry requires at least 2 valid posting lines',
    unbalanced: 'Unbalanced! Sum of postings per currency must equal 0',
    defaultAdvancedNarration: 'Double-entry transaction',
    postingsList: 'Details',
    addPosting: 'Add Detail',
    deleteLastPosting: 'Delete Last',
    targetAccount: 'Target Account',
    unsavedTitle: 'Discard changes?',
    unsavedMessage: 'You have unsaved changes. Are you sure you want to leave?',
    hideDetails: 'Hide details',
    addDetails: 'Add transaction details (date, payee, tags, etc.)',
    extraDetails: 'Extra details',
    invalidAmount: 'Please enter a valid amount value',
    linkTransaction: 'Link Another Transaction',
    linkSuccess: 'Linked',
    linkSuccessDesc: 'Two transactions linked with tag ^%{tag}.',
    linkFail: 'Link failed',
    unlinkSuccess: 'Unlinked',
    unlinkSuccessDesc: 'Removed link tag ^%{tag} from this transaction.',
    unlinkFail: 'Unlink failed',
    relatedTransactions: 'Related Transactions',
    readOnlyLinks: 'Read-only transaction, links cannot be edited.',
    linkMobileTx: 'Select Transaction to Link',
    searchTxPlaceholder: 'Search narration or account...',
    noLinkableTx: 'No linkable mobile transactions',
    edit: 'Edit',
    delete: 'Delete',
    deleteConfirm: 'Delete this transaction? This cannot be undone.',
    deleteTitle: 'Delete Transaction',
    editSuccess: 'Updated',
    deleteSuccess: 'Deleted',
  },
  transactions: {
    searchPlaceholder: 'Search narration / payee',
    filterAll: 'All',
    filterExpense: 'Expense',
    filterIncome: 'Income',
    filterTransfer: 'Transfer',
    countTotal: '%{count} total',
    countFiltered: '%{shown} / %{total}',
    noMatchTitle: 'No Matching Transactions',
    noMatchEmpty: 'No transactions yet.',
    noMatchFiltered: 'No transactions match your search. Try adjusting the filters.',
    advancedFilter: 'Advanced',
    accountFilterPlaceholder: 'Account contains...',
    dateFrom: 'From date',
    dateTo: 'To date',
    filter: 'Filter',
    amountMin: 'Min amount',
    amountMax: 'Max amount',
    today: 'Today',
    yesterday: 'Yesterday',
    daySummary: '%{income} · %{expense}',
    duplicate: 'Duplicate',
    deleteTitle: 'Delete transaction',
    deleteMessage: 'Delete "%{name}"? This also removes it from main.bean.',
    deleted: 'Deleted "%{name}"',
    clearHistory: 'Clear search history',
  },
  filter: {
    title: 'Advanced filters',
    reset: 'Reset',
    apply: 'Done',
  },
  report: {
    title: 'Report',
    empty: 'No transaction data yet. Add transactions to see reports.',
    monthly: 'Monthly Income/Expense',
    categoryPie: 'Expense by Category',
    heatmap: 'This Month Heatmap',
    netWorthTrend: 'Net Worth Trend',
    annual: '%{year} Annual Report',
    shareTitle: 'Share Report',
    exportSuccess: 'Exported',
    exportFail: 'Export failed',
    aiSummary: 'Report Summary',
    trendTitle: 'Income/Expense Trend',
    netWorthTitle: 'Net Worth Trend',
    netWorthCurrent: 'Current Net Worth: %{amount}',
    monthlyTitle: 'Monthly Report',
    categoryTitle: 'Expense by Category',
    annualTitle: '%{year} Annual Report',
    annualIncome: 'Income',
    annualExpense: 'Expense',
    annualNet: 'Net',
    annualStats: '%{count} transactions · Daily avg %{avg}',
    topCategory: 'Top Categories',
    tabWeekly: 'Weekly',
    tabMonthly: 'Monthly',
    tabAnnual: 'Annual',
    weeklyTitle: 'Weekly Report',
    weeklyIncome: 'Weekly Income',
    weeklyExpense: 'Weekly Expense',
    weeklyNet: 'Weekly Net',
    weeklyStats: '%{count} transactions',
    monthlyIncome: 'Monthly Income',
    monthlyExpense: 'Monthly Expense',
    monthlyNet: 'Monthly Net',
    monthlyStats: '%{count} transactions',
    menu: 'More actions',
    exportImage: 'Export image',
    monthlyRhythm: 'Monthly rhythm',
  },
  calendar: {
    title: 'Calendar',
    noDayTx: 'No transactions on this day',
    /** Weekday headers, Sunday first, comma-separated (split in components). */
    weekdays: 'Su,Mo,Tu,We,Th,Fr,Sa',
  },
  category: {
    title: 'Categories',
    expense: 'Expense Categories',
    income: 'Income Categories',
    addExpense: 'Add Expense Category',
    addIncome: 'Add Income Category',
    editTitle: 'Edit Category',
    addTitle: 'Add %{type} Category',
    fieldName: 'Category Name',
    fieldLinkedAccount: 'Linked Beancount Account',
    fieldKeywords: 'Keywords (comma-separated)',
    keywordsLabel: 'Keywords',
    deleteTitle: 'Delete Category',
    deleteConfirm: 'Delete "%{name}"?',
    namePlaceholder: 'e.g. Food',
    accountPlaceholder: 'e.g. Expenses:Food',
    keywordsPlaceholder: 'Match keywords, comma-separated, e.g. food, dinner, coffee',
  },
  tag: {
    title: 'Tags',
    count: 'Tags (%{count})',
    add: 'Add Tag',
    editTitle: 'Edit Tag',
    invalidName: 'Invalid tag name',
    invalidDesc: 'Only letters, digits, underscore, and hyphen are allowed (1-32 chars)',
    selectColor: 'Select Color',
    fieldName: 'Tag name (letters/digits/_/-)',
    empty: 'No tags yet',
    deleteTitle: 'Delete Tag',
    deleteConfirm: 'Delete "#%{name}"?',
  },
  budget: {
    title: 'Budgets',
    add: 'Add Budget',
    editTitle: 'Edit Budget',
    fieldName: 'Budget Name',
    fieldAmount: 'Amount',
    fieldPeriod: 'Period (monthly/weekly/yearly)',
    fieldCategoryAccount: 'Linked Account (blank = total)',
    fieldStartDate: 'Start Date',
    periodMonthly: 'mo',
    periodWeekly: 'wk',
    periodYearly: 'yr',
    yuanPer: 'CNY / %{period}',
    used: 'Used %{spent} (%{pct}%)',
    unnamed: 'Untitled Budget',
    empty: 'No budgets yet. Tap above to add one.',
    deleteTitle: 'Delete Budget',
    deleteConfirm: 'Delete "%{name}"?',
    invalidAmountTitle: 'Invalid Amount',
    invalidAmountDesc: 'Please enter a budget amount greater than 0',
    fieldNamePlaceholder: 'e.g. Food Budget',
    fieldAmountPlaceholder: 'e.g. 2000',
    fieldCategoryPlaceholder: 'e.g. Expenses:Food',
  },
  creditCard: {
    title: 'Credit Cards',
    add: 'Add Credit Card',
    editTitle: 'Edit Credit Card',
    fieldName: 'Card Name',
    fieldBank: 'Bank',
    fieldLastFour: 'Last 4 Digits',
    fieldBillingDay: 'Billing Day (1-28)',
    fieldPaymentDay: 'Payment Day (1-28)',
    fieldLimit: 'Credit Limit',
    fieldCurrency: 'Currency',
    fieldLinkedAccount: 'Linked Credit Account',
    labelBank: 'Bank',
    labelBillingDay: 'Billing Day',
    labelPaymentDay: 'Payment Day',
    labelLimit: 'Limit',
    billingPeriod: 'Current Billing Period',
    dueDate: 'Payment Due Date',
    statementAmount: 'Statement Amount',
    availableCredit: 'Available Credit',
    daySuffix: '',
    unnamed: 'Untitled Card',
    empty: 'No credit cards yet. Tap above to add one.',
    deleteTitle: 'Delete Credit Card',
    deleteConfirm: 'Delete "%{name}"?',
  },
  rules: {
    title: 'Auto-categorization Rules',
    add: 'Add Rule',
    editTitle: 'Edit Rule',
    empty: 'No rules yet',
    fieldPriority: 'Priority (higher = matched first)',
    fieldCounterparty: 'Counterparty contains',
    fieldMemo: 'Memo contains (optional)',
    fieldSourceAccount: 'Source Account',
    fieldCategoryAccount: 'Category Account',
    fieldNarration: 'Narration (optional)',
    fieldTags: 'Tags (comma-separated)',
    condCounterparty: 'payee contains "%{val}"',
    condMemo: 'memo contains "%{val}"',
    condNone: 'no conditions',
    hitsSuffix: '%{count} hits',
    deleteTitle: 'Delete Rule',
    deleteConfirm: 'Delete "%{name}"?',
  },
  importFlow: {
    title: 'Bill Import',
    unknownSource: 'Unknown source',
    hint: 'Flow: Import CSV → Process (transfer→dedup→categorize) → Confirm each.',
    importButton: 'Import demo Alipay CSV',
    processButton: 'Re-analyze (%{count} bills)',
    result: 'Last run: %{drafts} drafts / %{duplicates} dups / %{transfers} transfers',
    processed: 'Done: %{drafts} drafts, %{duplicates} duplicates, %{transfers} transfers.',
    confirm: 'Confirm',
    confirmed: 'Saved locally.',
    transfer: 'Transfer',
    trade: 'Trade',
    fallbackWarn: '⚠ %{reason}',
    selectFile: 'Select local CSV or Excel bill',
    confirmAll: 'Commit all (%{count})',
    duplicatesTitle: 'Suspected duplicates (%{count})',
    collapseList: 'Collapse',
    expandDuplicates: 'Expand suspected duplicates',
    duplicateReason: 'Similar time and matching amount (%{date} · payee: %{payee})',
    noDesc: 'No description',
    duplicateAmount: 'Amount: %{amount} %{currency}',
    unknownPayee: 'Unknown',
    ignored: 'Ignored this duplicate.',
    forcedImport: 'Bill forcibly imported!',
    decodeFail: 'Bill decode failed: %{error}',
    importSuccess: 'Imported %{format} bill: %{name}.',
    formatExcel: 'Excel',
    formatCsv: 'CSV',
    pipelineRunning: 'Automatically categorizing and finding duplicates...',
    pipelineDone: 'Parsed! Converted %{drafts} transactions, detected %{duplicates} suspected duplicates.',
    pipelineFail: 'Analysis failed: %{error}',
    pickFail: 'File selection failed: %{error}',
    importFailTitle: 'Import failed',
    commitFail: 'Commit failed: %{error}',
    commitFailTitle: 'Recording failed',
    batchPreparing: 'Validating and preparing batch commit...',
    autoOpenFail: 'Auto-open failed: %{error}',
    autoOpenFailTitle: 'Open failed',
    batchAllSuccess: 'All committed! Successfully recorded %{count} transactions.',
    batchPartial: 'Partial failure: %{success} succeeded, %{fail} failed.',
    batchResultTitle: 'Batch result',
    batchResultBody: 'Succeeded: %{success}\nFailed: %{fail}\n\nReasons:\n%{reasons}',
    batchNoValid: 'No valid transactions. Reasons:\n%{reasons}',
    batchFail: 'Batch commit failed: %{error}',
    batchErrorTitle: 'Recording error',
    suspectedDuplicate: 'Suspected duplicate',
    skip: 'Skip',
    forceImport: 'Import anyway',
  },
  onboarding: {
    welcome: 'Welcome',
    language: 'Choose Language',
    theme: 'Choose Theme',
    ledger: 'Ledger Import',
    ledgerDesc: 'The app safely stores all new transactions in a separate local file without altering your existing ledger.',
    permissions: 'Feature Setup',
    permissionsDesc: 'OCR, notification listening, and SMS monitoring require manual permission grants in system settings (Accessibility/Notification access/SMS).',
    security: 'Security',
    securityDesc: 'Enable app lock (biometric) and blur private content when switching apps.',
    prev: 'Previous',
    next: 'Next',
    start: 'Get Started',
    enableLock: 'Enable App Lock',
    lockEnabled: '✓ App Lock Enabled',
    permAccessibility: 'Accessibility Service',
    permNotification: 'Notification Listener',
    permSms: 'SMS Permission',
    permStorage: 'Photos & Storage',
    permOverlay: 'Display Overlay',
    permGranted: 'Granted',
    permNotGranted: 'Not Granted',
    permOpenSettings: 'Open Settings',
    permRequest: 'Request',
    permAllDone: 'All Permissions Granted',
  },
  diagnostics: {
    title: 'Read-only Compatibility & Diagnostics',
    syntaxErrors: 'Syntax issues: %{count}',
    unsupported: 'Preserved advanced directives: %{count}',
    balanceAssertions: 'Balance assertions: %{count}',
    options: 'Options: %{count}',
    hint: 'Unrecognized directives are preserved in read-only mode.',
  },
  settings: {
    title: 'Settings',
    appearance: 'Appearance',
    themeMode: 'Theme',
    themeLight: 'Light',
    themeDark: 'Dark',
    themeSystem: 'System',
    language: 'Language',
    langZh: '中文',
    langEn: 'English',
    dataManagement: 'Data Management',
    categories: 'Categories',
    tags: 'Tags',
    budgets: 'Budgets',
    creditCards: 'Credit Cards',
    calendar: 'Calendar View',
    security: 'Security Settings',
    appLock: 'Enable App Lock',
    setPinDesc: 'Set a 4-digit PIN to unlock the app',
    reminderTitle: 'Reminders',
    reminderToggle: 'Daily bookkeeping reminder',
    reminderTime: 'Reminder time',
    syncTitle: 'Sync & Backup',
    webdavConfig: 'WebDAV Sync Settings',
    gitConfig: 'Git Sync Settings',
    iCloudSync: 'Sync with iCloud Now',
    syncNow: 'Sync Now',
    backupNow: 'Database Backup & Maintenance',
    backupBtn: 'Backup Data',
    restoreBtn: 'Restore Data',
    optimizeDb: 'Optimize & Maintain Database',
    dedupLabel: 'Multi-channel De-duplication',
    transferLabel: 'Smart Transfer Recognition',
    syncSuccess: 'Sync successful',
    syncFail: 'Sync failed: %{error}',
    backupSuccess: 'Backup successful: %{path}',
    restoreSuccess: 'Restore successful, ledger refreshed',
    maintenanceSuccess: 'Database maintenance completed',
    algorithmConfig: 'Dedup & Transfer Recognition',
    selectLang: 'Select language',
    preferencesTitle: 'Preferences & Security',
    entryTitle: 'Entry',
    numpadEntry: 'Global entry panel',
    numpadEntryDesc: 'When enabled, the ＋ button opens the entry panel on any screen (beta)',
    recurringTitle: 'Recurring Transactions',
    systemFeaturesTitle: 'Features & System',
    aiSettingsTitle: 'AI & Smart Entry',
    llmTitle: 'LLM Config',
    syncSettingsTitle: 'Cloud Sync & Backup',
    aboutTitle: 'About',
    aboutVersion: 'v0.1.0 (Hermes)',
    enableAiHint: 'Enable AI Vision',
    aiAssistantTitle: 'AI Bill Recognition Assistant',
    aiProvider: 'AI Provider',
    aiConfigBtn: 'Configure API connection',
    aiCurrentModel: 'Current model: %{model} · URL: %{url}',
    aiConfigTitle: 'Configure AI API',
    aiFieldApiKey: 'API Key',
    aiFieldBaseUrl: 'API Base URL',
    aiFieldModel: 'Model name',
    groupAccount: 'Accounts & categories',
    groupAutomation: 'Automation',
    groupData: 'Data',
    groupPreferences: 'Preferences',
    diagnostics: 'Parse diagnostics',
    syncBackup: 'Sync & backup',
    appLogs: 'App Logs',
    preferencesEntry: 'Preferences',
    import: 'Import bills',
  },
  logs: {
    title: 'App Log Center',
    export: 'Export Logs',
    copy: 'Copy Logs',
    clear: 'Clear Logs',
    clearConfirmTitle: 'Confirm Clear Logs',
    clearConfirmDesc: 'Are you sure you want to clear all memory and device log files? This action cannot be undone.',
    clearSuccess: 'Logs cleared successfully',
    exportSuccess: 'Logs exported successfully',
    copySuccess: 'Logs copied to clipboard',
    todayLive: 'Today (Live)',
    filterLevelAll: 'All (%{count})',
    searchPlaceholder: 'Search tag or message...',
    empty: 'No matching log entries found',
    totalEntries: '%{count} log entries',
    fileSize: '%{size} KB',
    expandData: 'Expand extra data',
    collapseData: 'Collapse extra data',
    logFileDate: 'Log file (%{date})',
  },
  numpad: {
    from: 'From',
    to: 'To',
    outFrom: 'From',
    transferTo: 'To',
    swap: 'Swap',
    today: 'Today',
    done: 'Done',
    backspace: 'Backspace',
    close: 'Close',
    more: 'More',
    less: 'Less',
    allAccounts: 'All accounts',
    allCategories: 'All',
    advanced: 'Advanced mode',
    noAccount: 'Create account',
    transferTargetError: 'Transfer accounts must be Assets or Liabilities',
  },
  datepicker: {
    /** Weekday headers, Monday first, comma-separated (split in components). */
    weekdays: 'Mo,Tu,We,Th,Fr,Sa,Su',
  },
  account: {
    title: 'Accounts',
    tabAssets: 'Assets',
    tabLiabilities: 'Liabilities',
    tabExpenses: 'Expense Categories',
    tabIncome: 'Income Categories',
    rootTypes: {
      Assets: 'Savings & Assets',
      Liabilities: 'Credit & Debts',
      Expenses: 'Expense Categories',
      Income: 'Income Categories',
      Equity: 'Equity & Opening Balances',
    },
    rootLabels: {
      Assets: 'Assets',
      Liabilities: 'Liabilities',
      Expenses: 'Expenses',
      Income: 'Income',
      Equity: 'Equity',
    },
    addNew: 'New account',
    fullName: 'Full path',
    currentBalance: 'Current balance',
    adjustBalance: 'Calibrate balance',
    closeAccount: 'Close account',
    empty: 'No accounts in this category. They are auto-created when you record or import transactions.',
    addModalTitle: 'New Account',
    adjustModalTitle: 'Calibrate Account Balance',
    fieldType: 'Account type',
    fieldName: 'Account name (English/Chinese)',
    fieldNamePlaceholder: 'Digits, hyphens, Chinese supported',
    fieldCurrency: 'Currency',
    fieldBalance: 'Target balance',
    fieldBalancePlaceholder: 'e.g. 10000.00',
    fieldDate: 'Effective date',
    confirmClose: 'Confirm Close',
    confirmCloseDesc: 'Close this account?\n\n%{name}\n\nThis account will be closed in your local ledger.',
    btnConfirmClose: 'Close',
    closeSuccess: 'Account closed',
    closeSuccessDesc: 'Account has been closed in the local ledger.',
    closeFail: 'Close failed',
    addFail: 'Add failed',
    addFailEmpty: 'Account type and name are required.',
    invalidRootAccount: 'Account must start with one of the five root account types (Assets, Liabilities, Income, Expenses, Equity)',
    openSuccess: 'Account opened',
    openSuccessDesc: 'Account opened successfully:\n\n%{name}',
    openFail: 'Open failed',
    adjustFail: 'Calibrate failed',
    adjustFailEmpty: 'Balance value cannot be empty.',
    adjustSuccess: 'Balance adjusted',
    adjustSuccessDesc: 'Account %{name} balance calibrated to %{balance} %{currency}.',
    billingPeriod: 'Billing Period',
    dueDate: 'Due Date',
    statementAmount: 'Statement Amount',
    availableCredit: 'Available Credit',
  },
  recurring: {
    title: 'Recurring Transactions',
    add: 'Add recurring bill',
    frequency: 'Frequency',
    freqMonthly: 'Monthly',
    freqWeekly: 'Weekly',
    freqYearly: 'Yearly',
    freqDaily: 'Daily',
    nextDue: 'Next due',
    flow: 'Flow',
    perAmount: 'Per period',
    edit: 'Edit',
    delete: 'Delete',
    empty: 'No recurring bills yet. Tap above to add one.',
    editTitle: 'Edit Recurring Bill',
    addTitle: 'New Recurring Bill',
    fieldName: 'Bill name',
    fieldNamePlaceholder: 'e.g. iCloud subscription',
    fieldFromAccount: 'Source account (Beancount path)',
    fieldToAccount: 'Category account (Beancount path)',
    fieldAmount: 'Amount',
    fieldFrequency: 'Frequency (daily/weekly/monthly/yearly)',
    fieldNextDue: 'Next due date',
    deleteTitle: 'Delete Recurring Bill',
    deleteConfirm: 'Delete "%{name}"?',
    inputError: 'Input error',
    inputErrorDesc: 'All fields are required.',
    addSuccess: 'Added',
    addSuccessDesc: 'Recurring bill "%{name}" created.',
    editSuccess: 'Updated',
    editSuccessDesc: 'Recurring bill "%{name}" updated.',
  },
  sync: {
    title: 'Cloud Sync & Backup',
    cloudTitle: 'Cloud Sync Configuration',
    backupTitle: 'Backup & Maintenance',
    configWebdav: 'Configure WebDAV',
    configGit: 'Configure Git',
    webdavSyncNow: 'WebDAV Sync Now',
    gitSyncNow: 'Git Sync Now',
    iCloudSync: 'iCloud Sync',
    iCloudUnavailable: 'iCloud sync is iOS-only and unavailable on this platform',
    backupNow: 'Backup Now',
    restoreNow: 'Restore from Backup',
    loadLocalLedger: 'Load local .bean ledger',
    maintenance: 'Run maintenance & cleanup',
    webdavUrl: 'WebDAV URL',
    username: 'Username',
    password: 'Password',
    remotePath: 'Remote Path',
    branch: 'Branch',
    passwordToken: 'Password/Token',
    webdavConfigTitle: 'WebDAV Configuration',
    gitConfigTitle: 'Git Repository Configuration',
    hint: 'Hint',
    webdavNotConfigured: 'Please configure WebDAV first',
    syncSuccess: 'Sync successful',
    syncFail: 'Sync failed: %{error}',
    webdvResult: 'Cloud sync complete (WebDAV: %{action})',
    gitResult: 'Cloud sync complete (Git: %{action})',
    gitConflict: 'Sync complete, %{count} conflicts detected — please review manually',
    gitNotConfigured: 'Please configure Git remote URL first',
    maintenanceTitle: 'Deep Maintenance',
    maintenanceConfirm: 'Will scan and clean cache and orphan files. Continue?',
    iCloudResult: 'iCloud sync complete: %{action}',
    demoMode: 'Demo Mode',
    gitDemoDesc: 'Git sync currently uses simulated data. Real implementation requires isomorphic-git (planned). Run demo?',
    iCloudDemoDesc: 'iCloud sync currently uses simulated data. Run demo?',
    backupSuccessFolder: 'Backup file saved successfully to selected folder!',
    restoreSuccessParts: 'Restore successful! Restored: %{parts}',
    restorePartsTx: 'Transactions',
    restorePartsSettings: 'User settings',
    restorePartsMeta: 'Categories/Rules/Budgets',
    maintenanceDemoDesc: 'Maintenance cleanup currently uses simulated data. Run demo?',
    runDemo: 'Run Demo',
    demoSyncSuccess: 'Demo complete',
    gitDemoContent: '2026-07-14 * "Git pull merge"\n  Expenses:Food  15.00 CNY\n  Assets:Alipay  -15.00 CNY',
    iCloudDemoContent: '2026-07-14 * "iCloud pull merge"\n  Expenses:Shopping  88.00 CNY\n  Assets:Alipay  -88.00 CNY',
    backupShareTitle: 'Share ledger backup',
    backupSuccess: 'Backup successful',
    backupSuccessDesc: 'Backup written to: %{path}',
    backupFail: 'Backup failed',
    restoreSuccess: 'Restore successful',
    restoreDesc: 'Ledger restored from %{name}',
    restoreFail: 'Restore failed',
    loadSuccess: 'Loaded successfully',
    loadDesc: 'Loaded local ledger: %{name}',
    loadFail: 'Load failed',
    maintenanceResult: 'Cleaned %{count} orphan files\nFreed %{size} bytes',
    optimizeFail: 'Optimization failed',
    exportTitle: 'Export & Share',
    exportExcel: 'Export to Excel',
    exportRules: 'Export rules',
    importRules: 'Import rules',
    exportSuccess: 'Exported',
    exportFail: 'Export failed',
    importRulesSuccess: 'Imported %{count} new rules',
  },
  errors: {
    ledgerNotLoaded: 'Ledger not loaded, call loadLedger first',
  },
  ocr: {
    scanning: 'Scanning receipt...',
    notReady: 'OCR engine not ready, please try again later',
    success: 'Recognized! Please verify the details',
    failed: 'Could not recognize the receipt, please enter manually',
  },
  ai: {
    chatTitle: 'AI Assistant',
    welcome: 'Hi! I am your AI bookkeeping assistant. Try "spent 35 at Starbucks yesterday" to record a transaction, or just chat with me.',
    inputPlaceholder: 'Type a message or expense description...',
    thinking: 'AI thinking...',
    notConfigured: 'AI is not configured. Go to Settings → AI Settings to enable and configure your API key.',
    error: 'Sorry, something went wrong. Please try again.',
    billDetected: 'Bill detected:',
    tapToRecord: 'Tap to record',
  },
  remark: {
    title: 'Remark Templates',
    add: 'Add Template',
    editTitle: 'Edit Template',
    fieldName: 'Template name',
    fieldTemplate: 'Template (${counterparty} ${time} placeholders)',
    empty: 'No templates',
    deleteTitle: 'Delete Template',
    deleteConfirm: 'Delete "%{name}"?',
  },
  automation: {
    title: 'Auto Bookkeeping',
    detectedEvents: 'Detected Events (%{count})',
    drafts: 'Pending Drafts (%{count})',
    process: 'Process All',
    noEvents: 'No detected events',
    noDrafts: 'No pending drafts',
    confirmDraft: 'Confirm',
    rejectDraft: 'Reject',
    sourceNotification: 'Notification',
    sourceSms: 'SMS',
    sourceScreenshot: 'Screenshot',
    sourceOcr: 'OCR',
    sourceManual: 'Manual',
    channelStats: 'Source Stats',
    confirmed: 'Saved successfully',
    screenshotStart: 'Start Screenshot Monitor',
    screenshotStop: 'Stop Screenshot Monitor',
    screenshotUnavailable: 'Screenshot monitor module unavailable',
    accessibilityTitle: 'Accessibility Bill Recognition',
    serviceRunning: 'Service Enabled',
    serviceStopped: 'Service Not Enabled',
    openSettings: 'Open System Settings',
    openSettingsFail: 'Cannot open system settings',
    rememberPage: 'Remember Current Page',
    rememberPageSuccess: 'Page Remembered',
    rememberPageDesc: 'Will auto-capture and recognize %{pkg} (%{activity}) on content change',
    rememberPageFail: 'Failed to remember page',
    manualOcr: 'Manual OCR',
    manualOcrTriggered: 'Recognition triggered, please wait',
    manualOcrFail: 'Failed to trigger recognition',
    whitelistTitle: 'Payment App Whitelist (for notification filtering and name display)',
    whitelistEmpty: 'No whitelist',
    rememberedPages: 'Remembered Pages (%{count})',
    clearAll: 'Clear All',
    clearPagesTitle: 'Clear Remembered Pages',
    clearPagesConfirm: 'Clear all remembered pages? Auto-recognition will stop.',
    bridgeUnavailable: 'Accessibility bridge unavailable (rebuild APK required)',
    currentApp: 'Current App',
    floatingBall: 'Floating Bill Assistant',
    billDetectedTitle: 'New Bill Detected',
    billDetectedReject: 'Discard',
    billDetectedEdit: 'Edit & Save',
    billDetectedConfirm: 'Confirm',
    billDetectedHeader: 'Parsed Bill',
    billDetectedPrompt: 'Post this transaction?',
    billDetectedLineDate: 'Date',
    billDetectedLineMerchant: 'Merchant',
    billDetectedLineAmount: 'Amount',
    billDetectedLineCategory: 'Category',
    billDetectedLineAccount: 'Account',
    billDetectedLineNarration: 'Narration',
    billDetectedNone: 'None',
    otherPermissions: 'More Permissions',
    notificationTitle: 'Notification Listener',
    notificationEnabled: 'Enabled',
    notificationDisabled: 'Disabled',
    notificationOpenSettings: 'Open Settings',
    smsPermissionTitle: 'SMS Permission',
    smsPermGranted: 'Granted',
    smsPermRequest: 'Request',
    storagePermTitle: 'Storage Permission',
    storagePermGranted: 'Granted',
    storagePermRequest: 'Request',
    overlayPermTitle: 'Display Overlay',
    overlayPermGranted: 'Granted',
    overlayPermNotGranted: 'Not Granted',
    overlayPermOpenSettings: 'Open Settings',
    autoBookkeeping: 'Auto Bookkeeping',
    layer1Rule: 'Rule Matching',
    layer1RuleDesc: 'Fast regex-based bill recognition',
    layer2Ocr: 'OCR Recognition',
    layer2OcrDesc: 'On-device PP-OCRv6 model',
    layer3Ai: 'AI Vision',
    layer3AiDesc: 'Cloud multimodal LLM',
    layer3AiDisabled: 'LLM provider and API key not configured. Go to LLM Config?',
    ocrModelTitle: 'OCR Model',
    ocrModelNotInstalled: 'Not Installed',
    ocrModelInstalled: 'Installed (%{version})',
    ocrModelInstall: 'Install Model',
    ocrModelInstalling: 'Installing...',
    ocrModelCopying: 'Copying model files...',
    aiProviderLabel: 'AI Provider',
    aiConfigTitle: 'AI Configuration',
    ocrModelDownload: 'Download Model',
    ocrModelDownloading: 'Downloading... %{progress}%',
    ocrModelVerifying: 'Verifying files...',
    ocrModelDownloadFail: 'Download failed, check network and retry',
    ocrModelRedownload: 'Redownload',
  },
  floating: {
    billTitle: 'Adjust Draft',
    dirExpense: 'Expense',
    dirIncome: 'Income',
    dirTransfer: 'Transfer',
    amountLabel: 'Amount',
    payeeLabel: 'Payee',
    narrationLabel: 'Narration',
    narrationHint: 'Enter narration',
    categoryExpense: 'Category',
    categoryIncome: 'Income Category',
    transferTarget: 'To Account',
    accountExpense: 'From Account',
    accountIncome: 'To Account',
    accountTransfer: 'From Account',
    openApp: 'Open App',
    dismiss: 'Dismiss',
    confirm: 'Confirm',
    ballOcr: 'Scan Bill',
    ballRemember: 'Remember Page',
    rememberSuccess: 'Page added to recognition whitelist',
    rememberFail: 'Failed to save',
    pageRemembered: 'Page signature saved',
    pageSignatureExists: 'Page signature already exists',
  },
  lockScreen: {
    locked: 'App Locked',
    bioPrompt: 'Please authenticate with biometrics to unlock',
    authFail: 'Authentication failed, please enter passcode',
    authenticating: 'Authenticating...',
    clickUnlock: 'Unlock',
    usePin: 'Use PIN Code',
    enterPin: 'Enter Passcode',
    pinFail: 'Incorrect passcode, try again',
    useBio: 'Use Biometrics',
    clear: 'Clear',
    backspace: 'Backspace',
  },
  error: {
    retry: 'Retry',
    clearCache: 'Clear Cache & Restart',
    exportLogs: 'Export Logs',
    subTitle: 'If the issue persists, please export logs and submit to GitHub Issues',
    noLogs: 'Notice',
    noLogsMsg: 'No crash logs recorded',
    exportFail: 'Export failed',
  },
  speedDial: {
    expandHint: 'Expand quick actions',
  },
};
