/**
 * English translations for Cyber-Assistant
 * ISMS Management Tool compliant with ISO 27001:2022 / ISO 27002:2022 and NIS2
 */
(function() {
  'use strict';

  const translations = {
    // Application
    app: {
      title: 'Cyber-Assistant',
      subtitle: 'Security Management System',
      loading: 'Loading ISMS application...',
      skipLink: 'Skip to main content',
      loadingAria: 'Loading'
    },

    // Header buttons
    header: {
      manual: 'User Guide',
      logout: 'Log out',
      presentation: 'Presentation',
      settings: 'Settings',
      editMode: 'Edit Mode',
      exitEditMode: 'Exit Edit Mode',
      readOnlyMode: 'Read-only Mode',
      editModeSubtitle: 'Edit mode active: you can modify data and publish to the server.',
      readOnlyNotice: 'Read-only mode: enable edit mode to make changes.',
      viewerReadOnly: 'Your role is Viewer — permanent read-only mode.',
      darkMode: 'Dark Mode',
      lightMode: 'Light Mode',
      powderMode: 'Powder Mode',
      authRequired: 'Authentication required',
      editPasswordPrompt: 'Edit password:',
      passwordLabel: 'Password',
      validate: 'Validate',
      auditLog: 'Audit Trail',
      backToDashboard: 'Back to Dashboard',
      themeToggleAria: 'Toggle theme',
      themeToggleTitle: 'Change theme',
      autoSaveTitle: 'Last auto-save',
      connectedUsers: 'Connected users',
      traceability: 'Traceability',
      // Header redesign 2026-07: user menu + sync status dot
      userMenu: 'User menu',
      themeLabel: 'Theme:',
      syncSynced: 'Synced',
      syncSaving: 'Saving…',
      syncError: 'Sync failed',
      syncLocal: 'Auto-save'
    },

    // Mode banner
    mode: {
      readOnly: 'Read-only Mode',
      editing: 'Edit Mode',
      editingSubtitle: 'Changes are saved automatically'
    },

    // Edit mode banner & global server lock coordination
    modeBanner: {
      readOnly: 'Read-only',
      editingByYou: 'Edit mode active',
      editingByOther: 'Being edited by',
      untilExpiry: 'until lock expires',
      // FIX-BANNER-HONESTY (co-edition audit 2026-07-17): active holder = no countdown.
      holderActive: 'currently editing',
      // === CSI-CO === (Lot 4, 2026-07-17) "Request the hand" — courteous ask to the holder.
      requestHand: 'Request the hand',
      requestHandTitle: 'Let the person editing this module know you are waiting',
      requestHandSent: 'Request sent',
      requestHandConfirmed: 'Request sent — {{name}} will be notified that you are waiting for this module.',
      requestHandFailed: 'Request not possible right now — please retry.',
      handRequested: '{{name}} is waiting for module "{{module}}" — navigate to another module or leave edit mode to free it.',
      lockExpiringSoon: 'lock expiring soon',
      lockedShort: 'Locked',
      takeover: 'Take over',
      takeoverTitle: 'Force-release the lock (admin only)',
      takeoverConfirm: 'Force-release the lock held by {{name}}? Their unsaved changes will be lost.',
      takeoverSuccess: 'Lock taken over successfully',
      takeoverFailed: 'Failed to take over the lock',
      takeoverDenied: 'Action restricted to administrators',
      acquireOtherTab: "You are already editing in another window (another tab, browser or device). Leave edit mode there, then try again here.",
      acquireFailed: 'Cannot edit: {{name}} is already editing',
      lockStolen: 'An administrator has taken over the lock. You are now in read-only mode.',
      lockExpired: 'Your edit lock has expired (connection lost). Re-enter edit mode to continue.',
      autoQuitInactivity: 'Edit mode disabled after 5 min of inactivity',
      // FIX-I18N-KEYS (audit 2026-06-10)
      acquireNetworkError: 'Unable to verify the edit lock (network issue). Please try again.',
      // === CSI-CO === cluster-based co-editing (banner is contextual to the displayed module)
      editingModule: 'Module: {{module}}',
      moduleEditedBy: 'Module {{module}} — being edited by',
      clusterBusy: 'Module "{{module}}" is being edited by {{name}} — read-only here.',
      clickToRetry: 'click to retry'
    },

    // === CSI-BUILD === Update banner (tab left open across a server update)
    updateBanner: {
      newVersion: 'A new version of the application is available.',
      reload: 'Update now',
      hardReload: 'The update was not picked up — please force-reload (Ctrl+F5, or Cmd+Shift+R on Mac).',
      dismiss: 'Dismiss'
    },

    // === CSI-UPD === Server update via signed ZIP package (Server edition, admin)
    serverUpdate: {
      adminOnly: 'Restricted to administrators in server mode.',
      unavailable: 'Update service unavailable.',
      timeout: 'Timed out — the update may still be running on the server. Reload this page shortly to check.',
      notDeployed: 'Update module missing on the server.',
      notDeployedHelp: 'This installation does not have the update module (update.php) yet. Deploy it manually once; subsequent updates will run from this screen.',
      cardVersionTitle: 'Installed version',
      cardVersionDesc: 'Installation status and technical prerequisites.',
      installedVersion: 'Version',
      unknownVersion: 'unknown',
      lastUpdate: 'Last update',
      never: 'never from this screen',
      capZip: 'ZIP extension',
      capWrite: 'Write permissions',
      capDisk: 'Free disk space',
      cardUploadTitle: 'Update from a package',
      cardUploadDesc: 'Upload the .zip package provided by the vendor. It is verified (signature and checksums) before anything is modified.',
      chooseFile: 'Choose a package…',
      notAZip: 'The file must be a .zip archive.',
      fileTooBig: 'Package too large for this hosting limits (6.5 MB maximum).',
      readError: 'Could not read the file.',
      checking: 'Verifying the package…',
      planFrom: 'Installed version:',
      planTo: 'Package version:',
      planChanged: 'Files replaced:',
      planAdded: 'Files added:',
      planRemoved: 'Files removed:',
      planUnchanged: 'Files unchanged:',
      applyBtn: 'Apply the update',
      confirmTitle: 'Apply the update?',
      confirmBody: 'A code backup and a data snapshot are created before anything is written. If it fails, the previous version is restored automatically.',
      applying: 'Update in progress — do not close this page…',
      applyOk: 'Update applied.',
      applyPartial: 'Update applied but some files do not match the manifest — check the server.',
      editorsActiveTitle: 'Users are editing right now',
      forceHelp: 'Forcing the update will interrupt their ongoing editing.',
      forceAnyway: 'Force the update',
      reloadNow: 'Reload the application',
      cardRollbackTitle: 'Roll back',
      cardRollbackDesc: 'Restores the code of the previous version. Data is not modified.',
      backupAvailable: 'Backed-up version:',
      noBackup: 'No backup available.',
      rollbackBtn: 'Restore the previous version',
      rollbackConfirmTitle: 'Restore the previous version?',
      rollbackConfirmBody: 'The server code will be replaced by the backed-up version. Data and accounts are not modified.',
      rollbackOk: 'Previous version restored.',
      showcaseTitle: 'Server update',
      showcaseBody: 'On the Server edition, updates are applied from within the application: you drop in the package provided by the vendor and the server takes care of it.',
      showcaseHowTitle: 'How it works',
      showcaseHow1: 'The package is signed by the vendor: a modified package, or one of unknown origin, is refused before anything is written.',
      showcaseHow2: 'Your data, accounts, settings and SSO configuration are never touched — only the application code is replaced.',
      showcaseHow3: 'A backup is created before every update, with one-click rollback.',
      showcaseMeanwhile: 'In the meantime: on this edition, updates are applied by replacing the application files (procedure in the installation guide).',
      errors: {
        signatureInvalid: 'Invalid package signature — this package does not come from the vendor or has been modified.',
        manifestMissing: 'This file is not a Cyber-Assistant update package.',
        manifestNotCanonical: 'Package manifest unreadable or non-compliant.',
        manifestInvalid: 'Invalid package manifest.',
        formatUnsupported: 'Package format not supported by this server version.',
        editionMismatch: 'This package is not meant for the Server edition.',
        migrationsUnsupported: 'This package requires a migration not supported by this server version.',
        pathRejected: 'The package contains an unauthorised file — update refused.',
        undeclaredEntry: 'The package contains an undeclared file — update refused.',
        hashMismatch: 'The package content does not match its manifest (altered file).',
        entryMissing: 'The package is incomplete.',
        downgrade: 'This package is older than the installed version. Use roll back to revert.',
        minVersion: 'This package requires a newer installed version.',
        stagingTampered: 'The pending package was altered — please upload it again.',
        noStaging: 'No pending package — upload a file first.',
        zipUnavailable: 'The PHP "zip" extension is missing on this hosting: package updates are not available here (manual procedure in the server guide).',
        tooLarge: 'Package too large for this hosting limits.',
        tooLargePhp: 'Package too large for the PHP limits of this hosting.',
        badZip: 'The archive is unreadable.',
        badBase64: 'The uploaded file is unreadable.',
        noPackage: 'No package received.',
        backupFailed: 'Backup failed before the update — nothing was modified.',
        rolledBack: 'The update failed — the previous version was restored.',
        noBackup: 'No backup available.',
        backupCorrupt: 'The backup is unreadable.'
      }
    },

    // === CSI-CO === Human labels for co-editing clusters (never say "cluster" on screen)
    clusters: {
      coeur: 'Core ISMS',
      pilotage: 'Governance & documents',
      analyse: 'Risk analyses',
      config: 'Configuration'
    },

    // Navigation
    nav: {
      dashboard: 'Dashboard',
      controlsISO: 'ISO27002 Controls',
      controlsISO27002: 'ISO27002 Controls',
      controlsNIS2: 'NIS2 Controls',
      recyfControls: 'ReCyF Measures',
      soa: 'Statement of Applicability',
      docReview: 'Document Review',
      actions: 'Action Plan',
      risks: 'ISMS Risks',
      threats: 'Threats',
      nonConformities: 'Non-Conformities',
      audits: 'Audits',
      managementReviews: 'Management Reviews',
      stakeholders: 'Stakeholders',
      documents: 'Document Structure',
      kpis: 'KPIs',
      nis2Program: 'Cybersecurity Budget',
      nis2Socle: 'Security Foundation',
      criticalAssets: 'Essential Assets',
      projectRisks: 'Project Risks',
      riskAnalysis: 'Risk Analysis',
      impactMatrices: 'Impact Matrix',
      frameworkMapping: 'Cross-Framework Mapping',
      bar1Title: 'ISMS Foundations',
      bar2Title: 'ISMS Governance',
      bar3Title: 'ISMS Controls',
      bar4Title: 'Project Risk Management',
      bar5Title: 'NIS2 Compliance',
      ariaLabel: 'Main navigation'
    },

    // Dashboard
    dashboard: {
      title: 'ISMS Dashboard',
      subtitle: 'ISO 27001:2022 Conformity Overview',
      conformityRate: 'Overall Conformity',
      implementedControls: 'Implemented Controls',
      totalActions: 'Actions in Progress',
      criticalRisks: 'Critical Risks',
      openNonConformities: 'Non-Conformities',
      projectRiskAnalyses: 'Project Risk Analyses',
      criticalAssets: 'Critical Assets',
      identifiedThreats: 'Identified Threats',
      plannedAudits: 'Planned Audits',
      documentStructure: 'Document Structure',
      riskAnalysesTile: 'Risk analyses',
      managementReviewsTile: 'Management reviews',
      exportPdf: 'Export to PDF',
      alertsTitle: 'Alerts & Priorities',
      alertCriticalRisks: 'critical risk(s) to address',
      alertOverdueActions: 'overdue action(s)',
      alertUpcomingAudits: 'audit(s) within 30 days',
      alertProjectsAtRisk: 'project(s) at high risk',
      noAlerts: 'No active alerts',
      badgeUrgent: 'Urgent',
      badgeOverdue: 'Overdue',
      badgePlanned: 'Planned',
      badgeProjects: 'Projects',
      chartImplemented: 'Implemented',
      chartRemaining: 'Remaining',
      maturityISO: 'ISO27002 Maturity',
      radarNote: 'A value of 0 indicates no associated control.',
      scoreSMSI: 'ISMS Score',
      scoreISO: 'ISO 27001',
      scoreCyFun: 'NIS2',
      scoreRisks: 'Risks managed',
      riskDistribution: 'Risk Distribution',
      maturityCMM: 'CMM Maturity',
      riskMatrix: 'Risk Matrix',
      actionsStatus: 'Actions Status',
      controlsByDomain: 'Controls by Domain',
      projectRisks: 'Project Risks',
      recentActivity: 'Recent Activity',
      iso27001: 'ISO 27001',
      controls: 'Controls',
      actions: 'Actions',
      risks: 'Risks',
      nc: 'NC',
      noActions: 'No actions',
      noProjects: 'No projects',
      cmmLevels: 'Maturity Levels',
      filtersNotImplemented: 'Time filtering coming soon',
      openAuditTrail: 'Open audit trail',
      conformityByCategory: 'Conformity by category',
      actionsByPriority: 'Actions by priority',
      risksByLevel: 'Risks by level',
      actionsEvolution: 'Actions Evolution',
      noRecentActivity: 'No recent activity',
      viewSwitchAria: 'Dashboard view',
      viewLabel: 'View',
      currentPerimeter: 'Current perimeter',
      allEntities: 'All entities',
      consolidatedNote: 'Read-only consolidated view of business items.',
      consolidatedLoadError: 'Consolidated view is unavailable for now.',
      maturityByEntity: 'Maturity by entity',
      maturityByEntityHint: 'Conformity scores remain calculated separately for each entity.',
      referential: 'Framework',
      controlScore: 'Controls',
      iso27001Conformity: 'ISO 27001 conformity',
      iso27002Maturity: 'ISO 27002 maturity',
      // (audit 2026-07-10) libellé neutre : en ReCyF la valeur est un taux de
      // conformité, pas une maturité — « NIS2 score » couvre les deux référentiels.
      nis2MaturityScore: 'NIS2 maturity (assessed)',
      evaluatedControls: 'Evaluated',
      noMaturityData: 'No maturity data entered.',
      alertOverdueAudits: 'overdue audit(s)'
    },

    // Charts
    charts: {
      iso27002Maturity: 'ISO27002 Maturity',
      nis2Maturity: 'NIS2 Maturity',
      riskDistribution: 'Risk Distribution',
      riskDistributionSubtitle: 'Risk classification by severity level: objective assessment on a scale (low to critical) to prioritize resource allocation.',
      controlMaturity: 'Control Maturity',
      controlMaturitySubtitle: 'Distribution by CMM level: mapping of controls across five maturity levels to drive continuous improvement.',
      riskMatrix: 'Risk Matrix',
      riskMatrixSubtitle: 'Impact x Probability: matrix crossing severity and frequency of events to prioritize risks and define mitigation plans.',
      actionsEvolution: 'Actions Evolution',
      actionsEvolutionSubtitle: 'Action plan progression by priority: task prioritization based on urgency and impact, with clear milestones and regular follow-up.',
      noControlNote: 'A value of 0 indicates no associated control.',
      actionCount: 'Number of actions',
      months: 'Months',
      actionsHistoryBuilding: 'History builds up month by month. The evolution curve will appear once at least two months of data have been recorded.'
    },

    // Controls ISO27002
    // Controls table headers (HTML data-i18n)
    controls: {
      ref: 'Ref.',
      clickToExpand: 'Click to expand/collapse',
      control: 'Control',
      attributes: 'Attributes',
      owner: 'Owner',
      status: 'Status',
      maturity: 'Maturity',
      lastEval: 'Last Evaluation',
      evidence: 'Evidence'
    },

    controlsISO: {
      title: 'ISO27002 Controls',
      subtitle: 'ISO 27002:2022 controls by domain, status and maturity level',
      allDomains: 'All domains',
      organizational: 'Organizational',
      human: 'Human',
      physical: 'Physical',
      technological: 'Technological',
      unclassified: 'Unclassified',
      allStatuses: 'All statuses',
      notImplemented: 'Not implemented',
      inProgress: 'In progress',
      implemented: 'Implemented',
      verified: 'Verified',
      allLevels: 'All levels',
      initial: 'Initial',
      repeatable: 'Repeatable',
      defined: 'Defined',
      managed: 'Managed',
      optimized: 'Optimized',
      allCapabilities: 'All capabilities',
      exportExcel: 'Excel Export',
      newControl: 'New Control',
      num: 'Num',
      titleCol: 'Title',
      description: 'Description',
      capability: 'Capability',
      status: 'Status',
      linkedActions: 'Linked Actions',
      cmmLevel: 'CMM Maturity Level',
      notEvaluated: 'Not evaluated'
    },

    // Controls NIS2
    controlsNIS2: {
      title: 'NIS2 Controls',
      allFunctions: 'All functions',
      allCategories: 'All categories',
      function: 'Function',
      category: 'Category',
      justification: 'Justification',
      cmmMaturity: 'CMM Maturity',
      ref: 'Ref.',
      owner: 'Owner',
      reviewer: 'Reviewer',
      reviewFrequency: 'Review frequency',
      lastEvaluation: 'Last evaluation',
      nextReviewDate: 'Next review',
      docMaturity: 'Doc Mat.',
      implMaturity: 'Impl. Mat.',
      status: 'Status',
      avg: 'Average',
      filterFunction: 'Function',
      filterCategory: 'Category',
      filterLevel: 'Level',
      allFunctions: 'Function: all',
      allCategories: 'Category: all',
      allLevels: 'Level: all',
      filterMeasure: 'Measure',
      allMeasures: 'Measures: all',
      keyMeasures: 'Key measures',
      otherMeasures: 'Other measures',
      filterScoring: 'Scoring',
      filterOwner: 'Owner',
      filterReview: 'Review',
      allScoring: 'Scoring: all',
      scored: 'Scored',
      unscored: 'Unscored',
      allOwners: 'Owner: all',
      allReviews: 'Review: all',
      unassignedOwner: 'Unassigned',
      reviewOverdue: 'Review overdue',
      reviewNext30: 'Review in 30 days',
      description: 'Description',
      average: 'Avg.'
    },

    // ReCyF (Cyber France Framework / ANSSI)
    recyfControls: {
      title: 'ReCyF Measures',
      ref: 'Ref.',
      objective: 'Objective',
      theme: 'Theme',
      measure: 'Measure',
      target: 'Target',
      owner: 'Owner',
      reviewer: 'Reviewer',
      reviewFrequency: 'Review frequency',
      lastEvaluation: 'Last evaluation',
      nextReviewDate: 'Next review',
      evidence: 'Evidence / Artefacts',
      evidencePlaceholder: 'Documents, logs, screenshots…',
      conformity: 'Compliance',
      justification: 'Justification',
      justificationPlaceholder: 'Justification, alternative measure implemented, action plan…',
      justificationMissing: 'Missing justification',
      modalTitle: 'ReCyF Measure',
      conformityRate: 'Compliance (assessed measures)',
      evaluatedCount: 'Assessed',
      naCount: 'N/A',
      totalCount: 'Total',
      eiEe: 'Important and Essential Entities',
      eeOnly: 'Essential Entity only',
      editJustification: 'Details / justification',
      filterObjective: 'Objective',
      filterTheme: 'Theme',
      filterTarget: 'Target',
      filterConformity: 'Compliance',
      filterOwner: 'Owner',
      filterReview: 'Review',
      allObjectives: 'Objective: all',
      allThemes: 'Theme: all',
      allTargets: 'Target: all',
      allConformity: 'Compliance: all',
      allOwners: 'Owner: all',
      allReviews: 'Review: all',
      unassignedOwner: 'Unassigned',
      reviewOverdue: 'Review overdue',
      reviewNext30: 'Review in 30 days',
      radarTitle: 'ReCyF compliance by objective'
    },

    // CyFun 2025
    cyfun: {
      levelBasic: 'BASIC',
      levelImportant: 'IMPORTANT',
      levelEssential: 'ESSENTIAL',
      docMaturity: 'Documentation Maturity',
      implMaturity: 'Implementation Maturity',
      keyMeasure: 'Key measure',
      managementLinked: 'Management-linked control',
      scoring: 'NIS2 Scoring',
      threshold: 'Conformity Threshold',
      compliant: 'COMPLIANT',
      nonCompliant: 'NON-COMPLIANT',
      selectLevel: 'Select the NIS2 assurance level',
      evidence: 'Evidence / Artefacts',
      evidencePlaceholder: 'Documents, logs, screenshots...',
      keyMeasureInfo: 'Yes - This measure is critical for compliance',
      mgmtLinkedInfo: 'Yes - Mandatory review at each audit',
      avgScore: 'Average score',
      keyMeasuresScore: 'Key measures score',
      categoryMin: 'Per-category minimum',
      coverage: 'Coverage',
      unevaluatedWarn: 'An unassessed measure counts as 0 for the threshold (CCB method). Unassessed categories: {{n}}.',
      functions: {
        GV: 'Govern',
        ID: 'Identify',
        PR: 'Protect',
        DE: 'Detect',
        RS: 'Respond',
        RC: 'Recover'
      }
    },

    // Statement of Applicability
    soa: {
      controlNotApplicable: 'This control is declared non-applicable',
      justificationLabel: 'Justification',
      seeInDeclaration: 'See in the Statement of Applicability',
      title: 'Statement of Applicability',
      all: 'All',
      applicable: 'Applicable',
      notApplicable: 'Not Applicable',
      reference: 'Reference',
      applicability: 'Applicability',
      subtitle: 'ISO 27001:2022 Conformity — Clause 6.1.3',
      colControl: 'Control',
      colApplicable: 'Applicability',
      colImplementation: 'Implementation',
      colRisks: 'Related risks',
      colDocumentation: 'Documentation',
      colJustification: 'Justification',
      colSource: 'Requirement source',
      colImplStatus: 'Implementation status',
      comments: 'Control comments',
      implDate: 'Implementation date',
      evidenceRef: 'Evidence reference',
      lastReviewDate: 'Last review',
      exclusionReason: 'Exclusion reason',
      pdfPublic: 'PDF Public',
      pdfAudit: 'PDF Audit',
      pdfPublicTitle: 'Simplified public version',
      pdfAuditTitle: 'Full version for audit',
      implemented: 'Implemented',
      declaredNonApplicable: 'Declared non-applicable in the SoA',
      nonApplicable: 'Not applicable',
      viewInSoa: 'View in the Statement of Applicability',
      multiSelectHelp: 'Hold Ctrl (or Cmd) to select multiple risks'
    },

    // Document Review
    docReview: {
      title: '27001 Document Review',
      reviewOverdue: 'Review overdue',
      nextReviewLabel: 'Next',
      subtitle: 'Clauses 4 to 10 — ISMS requirements and conformity evidence',
      requirement: 'Requirement',
      evidence: 'Tool / Evidence',
      colClause: 'Clause',
      colRequirement: 'Requirement',
      colClauseExigence: 'Clause / Requirement',
      colConformite: 'Conformity',
      colStatus: 'Status',
      colOwner: 'Owner',
      colJustification: 'Justification',
      colEvidence: 'Evidence / Document',
      colDocumentation: 'Documentation',
      colLastReview: 'Last review',
      colRevue: 'Review',
      comments: 'Clause comments',
      expandJustification: 'Justification',
      status: 'Conformity Status',
      tool: 'Document / evidence',
      documentLink: 'Document link',
      lastReview: 'Last review',
      nextReview: 'Next review',
      pdfAudit: 'PDF Audit',
      pdfAuditTitle: 'ISO 27001 certification audit pack',
      conforming: 'Conforming',
      partial: 'Partial',
      nonConforming: 'Non-conforming',
      complianceRate: 'Conformity Rate'
    },

    // Actions
    actions: {
      title: 'Action Plan',
      sortPriority: 'Sort: Priority',
      sortId: 'Sort: ID',
      sortLink: 'Sort: Linked element',
      sortDueDate: 'Sort: Due date',
      sortProgress: 'Sort: Progress',
      filterAll: 'Filter: All',
      filterRisk: 'Filter: Risk',
      filterNc: 'Filter: Non-conformity',
      filterAudit: 'Filter: Audit',
      filterThreat: 'Filter: Threat',
      filterOwner: 'Filter: Owner',
      filterContinuous: 'Filter: Continuous improvement',
      newAction: 'New Action',
      id: 'ID',
      action: 'Action',
      link: 'Link',
      criticalAssets: 'Critical Assets',
      priority: 'Priority',
      statusCol: 'Status',
      progress: 'Progress',
      dueDate: 'Due Date',
      owner: 'Owner',
      comments: 'Comments',
      colTitle: 'Title',
      colPriority: 'Priority',
      colStatus: 'Status',
      colDueDate: 'Due date',
      colAssignedTo: 'Assigned to',
      colProgress: 'Progress',
      colId: 'ID',
      colLink: 'Link',
      colAssets: 'Critical assets',
      colComments: 'Comments',
      linkType: 'Link type',
      linkedElement: 'Linked element',
      manageComments: 'Action Comments',
      overdue: 'Overdue'
    },

    // Non-Conformities table columns
    nc: {
      colTitle: 'Title',
      colType: 'Type',
      colStatus: 'Status',
      colOwner: 'Owner',
      colDate: 'Detection date',
      colAudit: 'Related audit',
      colActions: 'Related actions',
      colAssets: 'Critical assets',
      colDescription: 'Description',
      linkedActionsCount: '{n} action(s)',
      newNc: 'New Non-Conformity'
    },

    // Risks
    risks: {
      title: 'ISMS Risks',
      newRisk: 'New Risk',
      importFromAnalysis: 'Import from an analysis',
      importTitle: 'Promote analysis risks to the ISMS register',
      importApply: 'Promote selection',
      importDone: 'Risks promoted: ',
      importNoAnalysis: 'No analysis with risks.',
      alreadyImported: 'already promoted',
      risk: 'Risk',
      impact: 'Impact',
      probability: 'Probability',
      score: 'Score',
      level: 'Level',
      treatment: 'Treatment',
      codirDate: 'Steering Committee Date',
      manageComments: 'Risk Comments',
      columns: {
        risk: 'Risk',
        impact: 'Impact',
        probability: 'Probability',
        level: 'Level',
        linkedActions: 'Linked Actions',
        treatment: 'Treatment',
        codirDate: 'Steering Committee Date'
      }
    },

    // Threats
    threats: {
      title: 'Threats',
      newThreat: 'New Threat',
      proposeFromCatalog: 'Propose from a framework',
      proposeTitle: 'Propose threats from a framework',
      proposeHint: 'Proposed rating (likelihood×impact) to review after insertion.',
      proposeApply: 'Add selection',
      proposeDone: 'Threats added: ',
      alreadyImported: 'already imported',
      columns: {
        title: 'Title',
        description: 'Description',
        impact: 'Impact',
        probability: 'Probability',
        score: 'Score',
        level: 'Level',
        status: 'Status',
        linkedActions: 'Linked Actions',
        criticalAssets: 'Critical Assets',
        links: 'Links'
      },
      linkedActionsCount: '{n} action(s)',
      linkedAssetsCount: '{n} asset(s)'
    },

    // Non-Conformities
    nonConformities: {
      title: 'Non-Conformities',
      sortType: 'Sort: Type',
      sortStatus: 'Sort: Status',
      sortDate: 'Sort: Detection date',
      sortAudit: 'Sort: Linked audit',
      sortOwner: 'Sort: Owner',
      filterAllAudits: 'Filter: All audits',
      filterAllOwners: 'Filter: All owners',
      newNc: 'New Non-Conformity',
      type: 'Type',
      detectionDate: 'Detection Date',
      linkedAudit: 'Linked Audit',
      operations: 'Operations'
    },

    // Audits
    audits: {
      title: 'Audits',
      newAudit: 'New Audit',
      scope: 'Scope',
      plannedDate: 'Planned Date',
      auditor: 'Auditor',
      overdue: 'Audit overdue',
      columns: {
        title: 'Title',
        type: 'Type',
        scope: 'Scope',
        plannedDate: 'Planned Date',
        auditor: 'Auditor',
        status: 'Status',
        linkedActions: 'Linked Actions'
      }
    },

    // Cross-Framework Mapping
    mapping: {
      title: 'Cross-Framework Mapping',
      subtitle: 'Mappings between security frameworks',
      allTypes: 'All types',
      search: 'Search for a control...',
      noMappings: 'No mappings found for these criteria.',
      noLink: 'No link',
      noResults: 'No results for this search.',
      notAvailable: 'Mapping module not available.',
      needTwo: 'Enable at least two frameworks in settings.',
      listView: 'List view',
      heatmapView: 'Heatmap view',
      viewList: 'List view',
      viewHeatmap: 'Matrix view',
      conflict: 'Status conflict detected',
      heatmap: {
        caption: 'Coverage matrix between source and target frameworks',
        avgCoverage: 'avg. coverage',
        relations: 'relations',
        unavailable: 'Matrix view unavailable for this framework. Use the list view.'
      },
      col: {
        ref: 'Ref.',
        title: 'Title',
        status: 'Status',
        mappings: 'Mappings'
      },
      stats: {
        totalMappings: 'Mappings',
        avgCoverage: 'Average coverage',
        mapped: 'Mapped controls',
        covered: 'Coverage'
      },
      status: {
        notImplemented: 'Not implemented',
        inProgress: 'In progress',
        implemented: 'Implemented',
        verified: 'Verified'
      },
      relationship: {
        equivalent: 'Equivalent',
        covers: 'Covers',
        coveredBy: 'Covered by',
        related: 'Related'
      },
      settings: {
        title: 'Security Frameworks',
        description: 'Enable or disable available frameworks.',
        alwaysActive: 'Always active',
        controls: 'controls',
        mappingsLoaded: 'mappings loaded'
      }
    },

    // Top-level status labels (used by framework-mapping-ui)
    status: {
      notImplemented: 'Not impl.',
      inProgress: 'In progress',
      implemented: 'Impl.',
      verified: 'Verified'
    },

    // Management Reviews
    reviews: {
      title: 'Management Reviews',
      newReview: 'New Review',
      date: 'Date',
      participants: 'Participants',
      inputs: 'Inputs',
      decisions: 'Decisions',
      manageComments: 'Review Comments',
      newComment: 'New comment',
      addComment: 'Add comment',
      maxComments: 'Maximum 10 comments reached.',
      commentAdded: 'Comment added.',
      columns: {
        date: 'Date',
        participants: 'Participants',
        inputs: 'Inputs',
        decisions: 'Decisions',
        comments: 'Comments'
      }
    },

    // Stakeholders
    stakeholders: {
      title: 'Stakeholders',
      newStakeholder: 'New Stakeholder',
      name: 'Name',
      role: 'Role',
      contact: 'Contact',
      filterRole: 'Role',
      allRoles: 'Role: all',
      columns: {
        name: 'Name',
        role: 'Role',
        contact: 'Contact',
        comments: 'Comments'
      }
    },

    // Normalized stakeholder roles (Lot 1b)
    stakeholderRoles: {
      internal: 'Internal',
      supplier: 'Supplier',
      client: 'Client',
      authority: 'Authority',
      partner: 'Partner',
      other: 'Other',
      currentValue: '(current value)'
    },

    // Documents
    documents: {
      title: 'Document Structure',
      newDocument: 'New Document',
      levelCol: 'Level',
      typeCol: 'Type',
      tool: 'Tool',
      linkCol: 'Link',
      columns: {
        level: 'Level',
        type: 'Type',
        tool: 'Tool',
        link: 'Link'
      }
    },

    // Document categories
    docCategories: {
      policy: 'Policy',
      process: 'Process',
      procedure: 'Procedure',
      record: 'Record'
    },

    // KPIs
    kpis: {
      title: 'KPIs',
      newKpi: 'New KPI',
      comment: 'Comment',
      progressCol: 'Progress'
    },

    // NIS2 Program
    nis2Program: {
      title: 'Cybersecurity Budget',
      printPdf: 'Print / PDF',
      exportHtml: 'Export HTML',
      newDomain: 'New Domain',
      newAction: 'New Action',
      budgetCategories: 'Budget Categories',
      newBudgetLine: 'New line',
      manageYears: 'Manage years',
      manageYearsTitle: 'Manage budget years',
      totalBudget: 'Total budget',
      lineLabel: 'Item',
      lineOwner: 'Owner',
      lineStatus: 'Status',
      lineCategory: 'Category',
      lineTotal: 'Total',
      lineSingular: 'line',
      linesPlural: 'lines',
      amountForYear: 'Amount',
      grandTotal: 'Grand total',
      subtotal: 'Subtotal',
      rowType: 'Type',
      rowTypeLine: 'Line',
      rowTypeSubtotal: 'Subtotal',
      rowTypeTotal: 'Total',
      noFilterMatch: 'No line matches the selected filters.',
      filteredTotal: 'Total (filtered)',
      untitledLine: 'Untitled',
      noBudgetData: 'No budget data to display',
      budgetEmptyTitle: 'No budget line',
      budgetEmptyHint: 'Add your first cybersecurity budget line using the “New line” button.',
      chartByYear: 'Budget by year',
      chartByYearSubtitle: 'Cybersecurity budget distribution by fiscal year',
      chartByCategory: 'Breakdown by category',
      chartByCategorySubtitle: 'Share of the total budget by spending category',
      filterCategoryLabel: 'Category',
      filterStatusLabel: 'Status',
      allCategories: 'All categories',
      allStatuses: 'All statuses',
      maturity: 'NIS2 Maturity',
      maturitySubtitle: 'Current maturity compared to 2027/2028 targets',
      keyStatuses: 'Key Statuses',
      keyStatusesSubtitle: 'Registration, maturity and regulatory milestones',
      addStatus: 'Add key status',
      nis2Actions: 'NIS2 Actions',
      nis2ActionsSubtitle: 'Distribution of actions by status and overall dynamics',
      actionsByDomain: 'Actions by Domain',
      actionsByDomainSubtitle: 'Distribution of actions by NIS2 plan domain',
      actionPlan: 'NIS2 Action Plan',
      allPhases: 'All phases',
      phase1: 'Phase 1 (2026)',
      phase2: 'Phase 2 (2027)',
      phase3: 'Phase 3 (2028)',
      allPillars: 'All pillars',
      pillar: 'Pillar',
      infoBox: 'Manage your cybersecurity budget line by line: assign each expense a category, an owner, a status (planned, committed, spent) and an amount per year. Add or rename years via “Manage years”.',
      actionsCyFun: 'NIS2 Actions',
      actionsCyFunSubtitle: 'Distribution of actions by status and overall dynamics',
      filterPhaseLabel: 'Phase',
      filterPillarLabel: 'Function',
      infoBoxText: 'This NIS2 action plan is independent from the ISO action plan. Add your domains and actions, filter by phase or pillar, and update statuses to track your 2026-2028 milestones.',
      showLegend: 'Show radar legend',
      manageBudgetCategoriesTitle: 'Manage budget categories',
      addStatusTitle: 'Add key status',
      pillarGV: 'Govern (GV)',
      pillarID: 'Identify (ID)',
      pillarPR: 'Protect (PR)',
      pillarDE: 'Detect (DE)',
      pillarRS: 'Respond (RS)',
      pillarRC: 'Recover (RC)'
    },

    // NIS2 Socle
    nis2Socle: {
      title: 'Security Foundation',
      editPillar: 'Edit pillar', // FIX-I18N-KEYS (audit 2026-06-10)
      subtitle: 'The 5 Foundational Pillars',
      infoBox: 'Prioritized strategic framework based on top 10 major risks, Zero Trust strategy and NIS2 compliance.'
    },

    // Critical Assets
    criticalAssets: {
      title: 'Critical Assets',
      form: {
        priority: 'Priority',
        beneficiary: 'Beneficiary',
        productCode: 'Product (code)',
        productName: 'Product (name)',
        productTags: 'Product tags (comma-separated)',
        availability: 'Availability',
        availabilityNote: 'Availability note',
        confidentiality: 'Confidentiality',
        dacpSensitive: 'DACP sensitive',
        mfaStatus: 'MFA obligation',
        mfaDetail: 'MFA detail'
      },
      subtitle: 'Inventory of critical assets and continuity requirements.',
      rename: 'Rename',
      newAsset: 'New Asset',
      beneficiary: 'Beneficiary',
      availability: 'Availability',
      reset: 'Reset',
      priorityCol: 'Priority',
      product: 'Product',
      rto: 'RTO',
      rpo: 'RPO',
      confidentiality: 'Conf.',
      impactCol: 'Impact',
      dacpSensitive: 'Sensitive DACP',
      mfaObligation: 'MFA Obligation',
      columns: {
        priority: 'Priority',
        beneficiary: 'Beneficiary',
        product: 'Product',
        assetType: 'Type',
        importance: 'Importance',
        rto: 'RTO',
        rpo: 'RPO',
        rtoRpo: 'RTO / RPO',
        availability: 'Availability',
        confidentiality: 'Conf.',
        integrity: 'Integ.',
        impact: 'Impact',
        dacpSensitive: 'Sens. DACP',
        mfaObligation: 'MFA Obligation'
      },
      addBtn: 'Add asset',
      colName: 'Name',
      colType: 'Type',
      colOwner: 'Owner',
      colCriticality: 'Criticality',
      renameBtn: 'Rename',
      filterBeneficiary: 'Beneficiary',
      filterAvailability: 'Availability',
      filterImpact: 'Impact',
      openAsset: 'View asset'
    },

    // Empty States
    emptyStates: {
      noThreats: 'No threats identified. Click "New Threat" to get started.',
      noAudits: 'No audits recorded. Click "New Audit" to schedule an audit.',
      noReviews: 'No management reviews. Click "New Review" to create one.',
      noDocuments: 'No documents recorded. Click "New Document" to get started.',
      noStakeholders: 'No stakeholders. Click "New Stakeholder" to add one.',
      noRisks: 'No risks identified.',
      noComments: 'No comments.',
      noActions: 'No actions in progress',
      noNonconformities: 'No non-conformities',
      noCriticalAssets: 'No critical assets'
    },

    // Generic comment system
    comments: {
      manage: 'Comments',
      new: 'New comment',
      add: 'Add comment',
      max: 'Maximum {n} comments reached.',
      added: 'Comment added.',
      none: 'No comments.',
      deleteConfirm: 'Delete this comment?',
      close: 'Close'
    },

    // Project Risks
    projectRisks: {
      title: 'Project Risks',
      subtitle: 'Tracking of project risk analyses and associated recommendations.',
      newAnalysis: 'New Analysis',
      search: 'Search',
      searchPlaceholder: 'Name, beneficiary, report, description',
      statusFilter: 'Status',
      pendingFilter: 'Unimplemented recommendations',
      projectName: 'Project Name',
      reportNumber: 'Report Number',
      revisionNumber: 'Revision Number',
      projectDescription: 'Project Description',
      riskAnalysisLink: 'Risk Analysis Link',
      completionDate: 'Completion Date',
      kpiAnalyses: 'Completed Analyses',
      kpiRecos: 'Implemented Recommendations',
      priority: 'Priority',
      priorityLabel: 'Priority',
      priorityCritical: 'P0 - Critical', // FIX-I18N-PRIORITY-CRITICAL (audit 2026-06-10)
      priorityHigh: 'P1 - High',
      priorityMedium: 'P2 - Medium',
      priorityLow: 'P3 - Low',
      openAnalysis: 'Open analysis',
      allBeneficiaries: 'All beneficiaries',
      allStatuses: 'All statuses',
      noResults: 'No results.',
      noData: 'No project risk analysis.',
      recoTitle: 'Recommendations',
      recoAdd: 'Add',
      recoTitleLabel: 'Recommendation title',
      recoTextLabel: 'Recommendation',
      recoImplemented: 'Implemented',
      recoRemove: 'Remove',
      recoEmpty: 'No recommendation added.',
      note: 'Note',
      resetFilters: 'Reset',
      beneficiaryLabel: 'Beneficiary',
      statusFilterLabel: 'Status',
      statusCol: 'Status',
      beneficiary: 'Beneficiary',
      sortLabel: 'Sort',
      sortName: 'Project name',
      sortBeneficiary: 'Beneficiary',
      sortStatus: 'Status',
      sortDate: 'Date',
      sortPriority: 'Priority',
      autoSyncBadge: 'Auto',
      autoSyncBanner: 'This entry is automatically synced from the risk analysis "{title}". Some fields are updated automatically.',
      autoSyncReadonly: 'This field is updated automatically.',
      consolidatedAnalysesTitle: 'Completed risk analyses',
      consolidatedAnalysesHint: 'This table lists the project risk portfolio. Detailed risk analyses have their own consolidated view.',
      openConsolidatedAnalyses: 'View all analyses',
      tagPlaceholder: 'Add a tag...'
    },

    // Settings
    settings: {
      title: 'Settings',
      subtitle: 'Configuration, backups and server synchronization.',
      nav: {
        general: 'General',
        security: 'Security',
        data: 'Data',
        storage: 'Storage',
        sync: 'Sync Pro',
        license: 'License',
        advanced: 'Advanced',
        danger: 'Danger zone',
        users: 'Users',
        mcp: 'AI access',
        maintenance: 'Server maintenance'
      },
      users: 'Users',
      general: 'General configuration',
      appTitle: 'Application title',
      theme: 'Theme',
      themeClair: 'Light',
      themeSombre: 'Dark',
      themePoudre: 'Powder',
      isoTarget: 'ISO target',
      isoTargetHelp: 'Target maturity level (1-5).',
      entities: 'Multi-entity',
      nis2Target: 'NIS2 target',
      backup: 'Backup',
      export: 'Export',
      import: 'Import',
      importAnalyse: 'Import analysis',
      advancedExport: 'Advanced export',
      pdfDraftNumber: 'DRAFT (read-only mode)',
      pdfReport: 'PDF report',
      excelExport: 'Excel export',
      serverSync: 'Server synchronization',
      baseUrl: 'Base URL',
      user: 'User',
      password: 'Password',
      quality: 'Quality & history',
      analyze: 'Analyze',
      snapshots: 'Snapshots',
      demoData: 'Demo data',
      loadDemo: 'Load demo',
      tests: 'Tests',
      reset: 'Reset',
      resetData: 'Reset data',
      language: 'Language',
      chooseLanguage: 'Choose your language',
      complete: 'Complete',
      global: 'Global',
      logoTitle: 'Company logo',
      logoDescription: 'Upload the logo for PDF exports.',
      logoUpload: 'Select a file (PNG, JPEG, SVG)',
      logoNone: 'No logo configured',
      logoSave: 'Save logo',
      logoRemove: 'Remove logo',
      logoSaved: 'Logo saved successfully',
      logoRemoved: 'Logo removed',
      logoTooLarge: 'File is too large (max 500 KB)',
      // General settings card (bundle.js)
      generalTitle: 'General configuration',
      generalDesc: 'Customize the title, theme, and maturity targets.',
      appTitleLabel: 'Application title',
      themeLabel: 'Theme',
      theme_clair: 'Light',
      theme_sombre: 'Dark',
      theme_poudre: 'Powder',
      theme_bleu: 'Blue',
      saveBtn: 'Save settings',
      saved: 'Settings saved',
      nis2TargetHelp: 'Target value (1-5) for all categories.',
      cyfunLevel: 'NIS2 assurance level',
      cyfunLevelChanged: 'NIS2 level changed: ',
      cyfunLang: 'CyFun framework language',
      cyfunLangChanged: 'CyFun framework language changed.',
      recyfDegree: 'Entity degree (ReCyF)',
      recyfDegreeChanged: 'ReCyF degree: ',
      nis2Referential: 'Active NIS2 framework',
      nis2RefBE: 'NIS2 Belgium — CyFun 2025 (CCB)',
      nis2RefFR: 'NIS2 France — ReCyF (ANSSI)',
      nis2ReferentialChanged: 'Active NIS2 framework: ',
      nis2ReferentialHint: 'Determines which NIS2 tabs are shown (CyFun Belgium or ReCyF France).',
      nis2RefLocked: 'Framework locked. A reset is required to change it.',
      nis2RefLockedNote: 'Framework locked. To change it, reset the application (all data will be erased).',
      nis2RefLockedToast: 'Framework locked: a reset is required to change it.',
      nis2RefActive: 'Active NIS2 framework',
      nis2RefInactive: 'NIS2 framework — not selected',
      // Display options card
      displayTitle: 'Display options',
      displayDesc: 'Customize the appearance and density of the interface.',
      compactMode: 'Compact mode',
      compactModeHelp: 'Reduces spacing and element sizes to display more information.',
      compactEnabled: 'Compact mode enabled',
      compactDisabled: 'Compact mode disabled',
      // Security card
      editPasswordTitle: 'Edit mode password',
      editPasswordDesc: 'Minimum {{min}} characters, 1 uppercase, 1 lowercase, 1 special character.',
      newPassword: 'New password',
      minCharsPlaceholder: 'Minimum {{min}} characters',
      confirmation: 'Confirmation',
      retypePassword: 'Retype the password',
      customPasswordActive: 'Custom password active.',
      defaultPasswordActive: 'Default password active.',
      updatePassword: 'Update password',
      passwordNonCompliant: 'Password does not meet requirements.',
      changeServerPassword: 'Change my password',
      changeServerPasswordDesc: 'Change your login password.',
      changePasswordBtn: 'Change password',
      // Backup card
      backupTitle: 'Backup',
      backupDesc: 'Export or import your ISMS data.',
      // Snapshot card
      snapshotTitle: 'History & snapshots',
      snapshotDesc: 'Create local save points.',
      snapshotLabel: 'Snapshot name',
      snapshotPlaceholder: 'E.g.: security committee Q2',
      createSnapshot: 'Create',
      manualSnapshot: 'Manual snapshot',
      cleanSnapshots: 'Clean',
      backupBeforeReset: 'Backup before reset',
      backupBeforeRestore: 'Backup before restore',
      backupBeforeImport: 'Backup before import',
      backupBeforeDemo: 'Backup before demo data',
      // Storage card
      storageTitle: 'Storage & health',
      storageDesc: 'Monitor localStorage usage.',
      storageUsage: 'localStorage usage',
      storageTitleServer: 'Local cache',
      storageDescServer: 'In server mode, data is stored on the server. The browser maintains a local cache.',
      storageUsageServer: 'Local cache usage',
      storageServerNote: 'Your data is primarily stored on the server. This local cache allows offline work.',
      dataSize: 'Data size',
      lastAutosave: 'Last autosave',
      storageLow: 'Storage space is low. Export your data.',
      storageFull: 'Storage almost full: export your data or delete snapshots.',
      storageInsufficient: 'Insufficient storage space',
      storageWarning: 'Warning: storage almost full',
      storageExportHint: 'Consider exporting your data.',
      never: 'Never',
      // License settings
      license: {
        statusTitle: 'License status',
        statusDesc: 'Information about your license or trial period.',
        activateTitle: 'Activate a license',
        activateDesc: 'Paste your CSI2-... key to activate or renew your license.'
      },
      // Sync card
      syncTitle: 'Server synchronization',
      syncDesc: 'Share a snapshot via the /data/export and /data/import API.',
      syncUrlLabel: 'Base URL (optional)',
      syncUser: 'User',
      syncPassword: 'Password',
      rememberPassword: 'Remember password',
      test: 'Test',
      openSync: 'Open Sync',
      noTestRun: 'No test executed.',
      testInProgress: 'Test in progress...',
      invalidUrl: 'Invalid URL',
      networkError: 'Network error',
      authDenied: 'Auth denied',
      // Tests card
      testsTitle: 'Tests',
      testsDesc: 'Quick verification of main functions.',
      runTests: 'Run tests',
      // Demo reset card
      demoResetTitle: 'Reset demo data',
      demoResetDesc: 'Reload original demonstration data.',
      demoMode: 'Demo mode',
      demoModeLabel: 'Demonstration mode',
      demoAutoReload: 'Data is automatically reloaded every hour.',
      demoManualReset: 'Use this button to reset manually.',
      demoResetInfo: 'Data is automatically reloaded every hour. Use this button to reset manually.',
      reloadDemoData: 'Reload demo data',
      reloadDemoBtn: 'Reload demo data',
      // Reset card
      resetTitle: 'Reset',
      resetDesc: 'Reset the application to original settings.',
      warning: 'Warning:',
      resetWarningTitle: 'Warning:',
      resetWarningText: 'This action will delete all your data. A safety snapshot is automatically created before reset.',
      resetWarning: 'This will delete all your data.',
      resetWarningDelete: 'This will delete all your data.',
      resetWarningSnapshot: 'A safety snapshot is automatically created before reset.',
      resetSnapshot: 'A safety snapshot is automatically created before reset.',
      resetApp: 'Reset application',
      resetBtn: 'Reset application',
      resetAdminOnly: 'Reset is restricted to an administrator account.',
      confirmReset: 'Confirm reset',
      confirmResetMessage: 'This action will reset the application to its initial state. All your data will be permanently deleted. Are you sure?',
      // FIX-I18N-AUTH (audit 2026-06-10, auth-manager.js:656) : server Settings cards
      storageServerTitle: 'Server storage',
      storageServerDesc: 'Your data is stored and synchronized on the server.',
      storageServerActive: 'The server manages the main storage. All changes are synchronized automatically.',
      serverStorageTitle: 'Server storage',
      serverStorageDesc: 'Data is stored exclusively on the server. No local cache is used.',
      lastServerPull: 'Last pull',
      lastServerPush: 'Last push',
      auditLog: 'Audit log',
      auditLogDesc: 'History of server security events.',
      securityDashboard: 'Security dashboard',
      securityRecommendations: 'Security recommendations',
      securityRecommendationsDesc: 'Contextual advice based on your security posture.',
      ipFiltering: 'IP filtering',
      ipFilteringDesc: 'Restrict access by IP address (CIDR notation supported).',
      passwordPolicy: 'Password policy',
      passwordPolicyDesc: 'Configure password security rules.',
      // FIX-I18N-WIZARD (audit 2026-06-10, bundle.js:2713) : CyFun level lock
      cyfunLevelLocked: 'Level locked for this organization. To unlock, contact the administrator.',
      cyfunLevelLockedNote: 'Level locked for this organization. Editing disabled.',
      cyfunLevelLockedToast: 'Level locked: change refused.'
    },

    // Common
    common: {
      save: 'Save',
      cancel: 'Cancel',
      delete: 'Delete',
      readOnly: 'Read-only',
      edit: 'Edit',
      actions: 'Actions',
      add: 'Add',
      close: 'Close',
      search: 'Search...',
      filter: 'Filter',
      all: 'All',
      none: 'None',
      yes: 'Yes',
      no: 'No',
      loading: 'Loading...',
      saving: 'Saving...',
      saved: 'Saved',
      savedAt: 'Saved at',
      error: 'Error',
      success: 'Success',
      warning: 'Warning',
      info: 'Information',
      confirm: 'Confirm',
      discardConfirm: 'Discard unsaved changes?',
      confirmDelete: 'Are you sure you want to delete this item? This action is irreversible.',
      noData: 'No data available',
      required: 'This field is required',
      invalid: 'Invalid value',
      exportSuccess: 'Export successful',
      exportError: 'Export failed. Please check that data exists.',
      importSuccess: 'Import successful',
      importError: 'Import failed. Please check the file format.',
      saveError: 'Save failed. Your data is preserved locally.',
      syncSuccess: 'Synchronization successful',
      syncError: 'Synchronization failed',
      moveUp: 'Move up',
      moveDown: 'Move down',
      sortBy: 'Sort:',
      refresh: 'Refresh',
      later: 'Later',
      enabled: 'Enabled',
      disabled: 'Disabled',
      requirements: 'requirements',
      measures: 'measures',
      skip: 'Skip',
      new: 'New',
      status: 'Status',
      other: 'Other',
      open: 'Open',
      select: 'Select',
      searchControl: 'Search a control',
      // FIX-I18N-KEYS (audit 2026-06-10)
      retry: 'Retry',
      never: 'Never'
    },

    // Sort labels
    // Toolbar v2 (section-toolbar.js)
    sectionToolbar: {
      reset: 'Reset',
      moreFilters: 'Filters'
    },

    sort: {
      reference: 'Ref.',
      title: 'Title',
      status: 'Status',
      maturity: 'Maturity',
      date: 'Date',
      name: 'Name',
      value: 'Value',
      level: 'Level',
      priority: 'Priority',
      score: 'Score',
      impact: 'Impact',
      probability: 'Probability',
      function: 'Function',
      docMaturity: 'Doc.',
      implMaturity: 'Impl.',
      average: 'Avg.',
      applicability: 'Applicability',
      implementation: 'Implementation',
      clause: 'Clause',
      lastReview: 'Last review',
      id: 'ID',
      dueDate: 'Due date',
      progress: 'Progress',
      link: 'Link',
      type: 'Type',
      audit: 'Audit',
      owner: 'Owner',
      ascending: 'ascending',
      descending: 'descending'
    },

    // Priorities
    priorities: {
      critical: 'Critical',
      high: 'High',
      medium: 'Medium',
      low: 'Low'
    },

    // Statuses
    statuses: {
      notStarted: 'Not started',
      inProgress: 'In progress',
      completed: 'Completed',
      blocked: 'Blocked',
      cancelled: 'Cancelled',
      open: 'Open',
      closed: 'Closed',
      planned: 'Planned',
      realized: 'Completed',
      todo: 'To do',
      suspended: 'Suspended'
    },

    // Generic status labels (used in forms)
    statusLabels: {
      todo: 'To do',
      inProgress: 'In progress',
      suspended: 'Suspended',
      done: 'Completed'
    },

    // SOA source labels (for PDF export)
    soaSourceLabels: {
      risk: 'Identified risk',
      legal: 'Legal requirement',
      contractual: 'Contractual requirement',
      bestPractice: 'Best practice',
      regulatory: 'Regulatory requirement',
      business: 'Business requirement'
    },

    // Months
    months: {
      january: 'January',
      february: 'February',
      march: 'March',
      april: 'April',
      may: 'May',
      june: 'June',
      july: 'July',
      august: 'August',
      september: 'September',
      october: 'October',
      november: 'November',
      december: 'December'
    },

    // Help / User Guide

    // Security Baseline
    securityBaseline: {
      title: 'Security Foundation',
      subtitle: 'The 5 Foundational Pillars',
      infoBoxText: 'Prioritized strategic framework based on top 10 major risks, Zero Trust strategy and NIS2 compliance.'
    },

    // KPI module
    kpi: {
      title: 'KPI',
      newKpi: 'New KPI',
      description: 'Description',
      comment: 'Comment',
      progress: 'Progress'
    },

    // First launch
    firstLaunch: {
      title: 'Welcome to Cyber-Assistant',
      subtitle: 'Please select your preferred language',
      continue: 'Continue',
      changeSettings: 'You can change the language at any time in Settings'
    },

    // Footer
    footer: {
      createdBy: 'Designed by Jean-François Avart',
      contactMe: 'Contact me',
      terms: 'Terms & Conditions',
      onlineManual: 'Online manual'
    },

    // Search
    search: {
      placeholder: 'Search (actions, risks, controls, documents...)',
      noResults: 'No results found',
      results: 'results',
      ariaLabel: 'Global search',
      scopeNote: 'Search limited to scope:'
    },

    // Global search results
    searchResults: {
      action: 'Action',
      risk: 'Risk',
      control: 'Control',
      document: 'Document',
      audit: 'Audit',
      nc: 'Non-conformity',
      threat: 'Threat',
      stakeholder: 'Stakeholder',
      kpi: 'KPI',
      asset: 'Critical asset',
      review: 'Review',
      nis2Control: 'NIS2 control',
      criticalAsset: 'Critical asset',
      projectRisk: 'Project risk',
      // FIX-I18N-KEYS (audit 2026-06-10)
      recyfControl: 'ReCyF measure'
    },

    // Server mode
    serverMode: {
      notAvailable: 'Server mode is not available in this version. Contact the publisher to obtain the synchronization module.'
    },

    // License / Activation
    license: {
      detecting: 'Detecting license...',
      valid: 'License valid',
      notFound: 'No license detected',
      title: 'Activation',
      trialActive: 'Trial period active',
      trialExpired: 'Trial period expired',
      daysLeft: '{days} days remaining',
      pasteKey: 'Paste your activation key',
      pasteHint: 'Paste the CSI2-... key received by email',
      activate: 'Activate license',
      continueTrial: 'Continue trial',
      success: 'License activated successfully',
      error: 'Invalid license key',
      expired: 'License expired',
      organization: 'Organization',
      readOnlyNotice: 'Read-only mode — activate a license to modify data',
      expiresAt: 'Expires on {date}',
      renewNeeded: 'License expired — enter a new key to reactivate',
      validUntil: 'License valid until {date}',
      enterKey: 'Enter a license key',
      trialInfo: 'You have a {days}-day trial period to evaluate the solution.',
      trialBanner: 'Trial: {days} d. remaining',
      trialExpiredBanner: 'Trial expired',
      active: 'License active',
      // FIX-I18N-LICENSE (audit 2026-06-10, bundle.js:5479) : trial banner,
      // license wall and wizard activation step
      wallTitle: 'Trial period ended',
      wallDesc: 'Please enter your CSI2-... license key to continue using the application.',
      trialBannerText: 'Free trial — {days} days remaining out of 14',
      trialDetail: 'Free trial — {days} days remaining out of 14. All features are available.',
      activateBtn: 'Activate',
      activated: 'Activated',
      mustActivate: 'Please activate your license before continuing',
      noLicense: 'No active license',
      noLicenseDetail: 'Activate a license key below.'
    },

    // Authentication
    auth: {
      login: 'Sign in',
      logout: 'Sign out',
      register: 'Register',
      username: 'Username',
      password: 'Password',
      confirmPassword: 'Confirm password',
      setupTitle: 'Initial setup',
      setupPrompt: 'You will be the administrator.',
      createAccount: 'Create account',
      createAdminAccount: 'Create admin account',
      loginRequired: 'Access the Security Management System',
      loginFailed: 'Login failed',
      maxUsersReached: 'Maximum number of users reached',
      userCreated: 'Account created',
      accountCreated: 'Admin account created',
      sessionExpired: 'Session expired',
      passwordPolicy: '18+ characters, uppercase, lowercase, special character',
      passwordMismatch: 'Passwords do not match',
      fieldsRequired: 'All fields are required',
      noAccount: 'No account yet?',
      backToLogin: 'Back to login',
      yourName: 'Your name',
      nameRequired: 'Name is required',
      passwordInvalid: 'Password',
      chars18: '18+ characters',
      uppercase: 'uppercase',
      lowercase: 'lowercase',
      specialChar: 'special character',
      newPassword: 'New password',
      // Password validation (i18n for validatePwd)
      pwdMinChars: '18+ characters',
      pwdUppercase: 'uppercase',
      pwdLowercase: 'lowercase',
      pwdSpecial: 'special character',
      // FIX-I18N-AUTH (audit 2026-06-10, auth-manager.js:656) : server screens
      // (login, setup, password change, errors) — keys were missing from both locales
      adminAccess: 'Administrator access',
      hideAdminAccess: 'Hide',
      ssoLogin: 'Sign in with enterprise SSO',
      serverUnavailable: 'Server temporarily unavailable — login may fail.',
      serverError: 'Server unavailable',
      sessionTimeout: 'Form expired due to inactivity. Please re-enter your credentials.',
      setupAdminNotice: 'The first user created will be an administrator with full management rights.',
      setupFailed: 'Error during setup',
      registrationFailed: 'Error during registration',
      changePassword: 'Change password',
      changePasswordBtn: 'Change',
      changePasswordFailed: 'Error while changing the password',
      mustChangePassword: 'Password change required',
      mustChangePasswordHint: 'Your temporary password must be changed.',
      passwordChanged: 'Password changed',
      currentPassword: 'Current password',
      cooldown: 'Too many attempts. Try again in ',
      lastLogin: 'Last login',
      capsLockOn: 'Caps Lock is on',
      or: 'or',
      attemptWarning: 'Attempt {n}/{max} — lockout after {max} failures',
      httpBlockedTitle: 'Insecure connection',
      httpBlockedMsg: 'Cyber-Assistant transmits sensitive authentication data. Unencrypted HTTP access is blocked in server mode. Use HTTPS to access this application.',
      httpsAccessBtn: 'Access via HTTPS',
      httpBlockedNote: 'If you use a self-signed certificate, accept the security exception in your browser.',
      iframeBlocked: 'The application cannot be displayed in an iframe for security reasons.',
      connEncrypted: 'Encrypted connection',
      connUnencrypted: 'Unencrypted connection',
      useHttpsProd: 'use HTTPS in production',
      httpsProdWarning: 'Data is transmitted in clear text. Enable HTTPS in production.'
    },

    // Tab locking
    locks: {
      lockedBy: 'This tab is being edited by',
      lockAcquired: 'Tab locked',
      lockDenied: 'Tab already locked',
      lockReleased: 'Tab unlocked',
      lockExpired: 'Lock expired. Switch back to edit mode.',
      connectedUsers: 'Connected users',
      readOnlyLocked: 'Read-only — edited by another user',
      readOnlyTab: 'Read only.'
    },

    // User management
    users: {
      title: 'User management',
      addUser: 'Add user',
      name: 'Name',
      role: 'Role',
      admin: 'Administrator',
      editor: 'Editor',
      deleteConfirm: 'Delete this user?',
      resetPassword: 'Reset Pwd',
      resetPasswordFor: 'Reset password for',
      resetSuccess: 'Password reset',
      currentUser: 'You',
      userCount: '{{count}}/{{max}} users',
      description: 'Create, suspend or delete user accounts.',
      noAccess: 'Admin access required.',
      noUsers: 'No users found.',
      count: '{count} / {max} users',
      countFiltered: '{shown} / {count} users (filtered)',
      searchPlaceholder: 'Search (name, email, role)…',
      status: 'Status',
      actions: 'Actions',
      active: 'Active',
      suspended: 'Suspended',
      you: '(you)',
      suspend: 'Suspend',
      reactivate: 'Reactivate',
      newPassword: 'New password (18+ chars)',
      confirmPassword: 'Confirm',
      password: 'Password',
      passwordHelp: 'Minimum 18 characters, 1 uppercase, 1 lowercase, 1 special character.',
      delete: 'Delete',
      confirmDelete: 'Permanently delete this user?',
      confirmDeleteDouble: 'This action is irreversible. Confirm deletion?',
      confirmSuspend: 'Suspend this user?',
      confirmReactivate: 'Reactivate this user?',
      create: 'Create a user',
      createDesc: 'Add a new user account.',
      createBtn: 'Create account',
      createSuccess: 'User created',
      deleteSuccess: 'User deleted',
      suspendSuccess: 'User suspended',
      reactivateSuccess: 'User reactivated',
      loadError: 'Unable to load users.',
      errorNameShort: 'Name must be at least 2 characters.',
      errorPwdShort: 'Password must be at least 18 characters.',
      errorPwdWeak: 'Password must contain uppercase, lowercase and special character.',
      errorPwdMismatch: 'Passwords do not match.',
      accountSuspended: 'Account suspended',
      roleAdmin: 'Admin',
      roleEditor: 'Editor',
      roleViewer: 'Viewer',
      roleLabel: 'Role',
      roleHelp: 'Editor = can edit data. Viewer = read-only access.',
      changeRoleTitle: 'Change role',
      changeRoleConfirm: 'Change role of {name} to {role}?',
      roleChangeSuccess: 'Role changed',
      usernamePlaceholder: 'username',
      pwdMinPlaceholder: '18 characters min.',
      confirmPwdPlaceholder: 'Confirm password',
      deleteTitle: 'Delete user',
      confirmDeleteBtn: 'Delete permanently',
      suspendTitle: 'Suspend',
      reactivateTitle: 'Reactivate',
      usersLabel: 'users',
      // FIX-I18N-AUTH (audit 2026-06-10) : temporary password badge
      tempPassword: 'Temp pwd',
      // FIX-SSO-EMAIL-LINK (audit 2026-06-10, client complement) : email field
      email: 'Email',
      emailOptional: 'Email (optional)',
      emailPlaceholder: 'user@example.com',
      emailHelp: 'Enables account linking with enterprise SSO.',
      editEmail: 'Email',
      editEmailTitle: 'Edit email (SSO linking)',
      emailClearHint: 'Leave empty then save to remove the email.',
      emailUpdateSuccess: 'Email updated',
      // === CSI-ME === multi-entity
      entityMain: 'Main entity',
      entityLabel: 'Entity/entities',
      entityHelp: 'A sub-entity only sees its own records.',
      entityHelpMulti: 'A sub-entity only sees its own records. Multiple selection allowed (Ctrl/Cmd) — "Main entity" cannot be combined.',
      editEntities: 'Entities',
      editEntitiesTitle: 'Edit sub-entity assignment',
      canEditSubEntities: 'Can edit sub-entity data (main perimeter accounts only)',
      editEntitiesHint: 'Multiple selection allowed (Ctrl/Cmd). "Main entity" = no assignment. Removing the last sub-entity suspends the account (fail-closed).',
      entitiesUpdateSuccess: 'Assignment updated',
      lastEntityDetach: 'This account will no longer belong to any sub-entity and would gain main-entity access. Confirm?',
      ssoDefaultEntity: 'Default sub-entity for new SSO users',
      ssoCardTitle: 'SSO authentication (OIDC)',
      ssoLoading: 'Loading SSO configuration…',
      ssoLoadFailed: 'Unable to load the SSO configuration.',
      ssoEnable: 'Enable SSO authentication',
      ssoIssuer: 'Issuer URL',
      ssoClientId: 'Client ID',
      ssoClientSecret: 'Client Secret',
      ssoMode: 'Authentication mode',
      ssoModeOnly: 'SSO only (recommended)',
      ssoModeMixed: 'SSO + password',
      ssoDefaultRole: 'Default role for new SSO users',
      ssoRoleEditor: 'Editor',
      ssoRoleViewer: 'Viewer',
      ssoMaxUsers: 'Max. number of users (all accounts)',
      ssoAllowedDomains: 'Allowed email domains (empty = all)',
      ssoAdvanced: 'Advanced options (local IAM / on-premise)',
      ssoAllowHttp: 'Allow HTTP (local IAM without TLS certificate)',
      ssoCaPath: 'CA certificate path (internal PKI)',
      ssoSkipVerify: 'Disable TLS verification (dev/test only!)',
      ssoSkipVerifyWarn: 'Warning: disabling TLS verification exposes SSO exchanges to man-in-the-middle attacks. Use only in test environments.',
      ssoPasswordNote: 'Password login always remains available for the administrator account, even in SSO-only mode.',
      ssoCallbackUrl: 'Callback URL (to configure in your IdP)',
      ssoTestBtn: 'Test connection',
      ssoTesting: 'Testing…',
      ssoTestFailedPrefix: 'SSO test failed: ',
      ssoIssuerRequired: 'Please provide the Issuer URL.',
      ssoSaveBtn: 'Save',
      ssoSaving: 'Saving…',
      ssoSaved: 'SSO configuration saved.',
      ssoErrorPrefix: 'Error: ',
      ssoRequiredFields: 'Issuer URL, Client ID and Client Secret are required to enable SSO.',
      ssoCaInvalid: 'Invalid CA path. Use an absolute path without ".." (e.g. /etc/ssl/certs/ca.pem)',
      ssoDefaultEntityNone: 'Main entity (none)',
      ssoAllowedDomainsWarn: 'No allowed domain: any account returned by the IdP may gain access. Set your domains, especially with a multi-tenant IdP (Google, Azure "common").',
      ssoMapSection: 'Group mapping (roles & entities)',
      ssoMapInfo: 'Automatically assign a role and/or entity based on the groups sent by the IdP. With no match, the default role/entity applies.',
      ssoMapAddRow: '+ Add a rule',
      ssoGroupClaim: 'Group claim name (e.g. groups, roles)',
      ssoScopes: 'OIDC scopes (empty = openid email profile)',
      ssoGroupToRole: 'Group → role',
      ssoGroupToEntity: 'Group → entity',
      ssoGroupPlaceholder: 'IdP group',
      ssoStrictMapping: 'Reject accounts with no mapped group (strict)',
      ssoReconcile: 'Re-apply mapping on every login',
      ssoSecSection: 'Enhanced security (recommended)',
      ssoVerifySig: 'Verify token signature (JWKS) — recommended',
      ssoRequireEmailVerified: 'Require a verified email to create an account — recommended',
      ssoIdpLogout: 'Also sign out at the identity provider (SSO logout)',

      // === CSI-MCP === MCP interface (read-only AI access)
      mcpCardTitle: 'AI access (MCP)',
      mcpCardDesc: 'Open read-only access to your governance data for an AI assistant, through MCP (Model Context Protocol), the interoperability standard for AI assistants.',
      mcpAskTitle: 'What you will be able to ask your AI',
      mcpAsk1: 'Which critical risks have no action plan?',
      mcpAsk2: 'Where does my NIS2 maturity stand, function by function?',
      mcpAsk3: 'Which actions are overdue, and with whom?',
      mcpAsk4: 'Draft the compliance summary for the management review.',
      mcpAskFoot: 'Your assistant answers on your real, up-to-date data — no copy-paste, no manual export.',
      mcpSharedUs: 'What Cyber-Assistant secures',
      mcpSharedYou: 'What your organisation secures',
      mcpSharedUsList: 'Personal revocable tokens · Read-only · Scope limited to the account · Access log',
      mcpSharedYouList: 'Internal network · VPN · Reverse proxy · IP filtering · mTLS · Identity gateway',
      mcpHowTitle: 'How it works',
      mcpHow1: 'Cyber-Assistant exposes a standard MCP interface: any compatible assistant connects with a token you generate here.',
      mcpHow2: 'Access is read-only — no assistant can modify your data.',
      mcpHow3: 'Every token is personal: it inherits the entity scope of the account it is linked to, every access is logged, and you revoke it in one click.',
      mcpSharedTitle: 'Shared responsibility model',
      mcpSharedApp: 'Cyber-Assistant secures application access: personal revocable tokens, read-only, data scope limited to the account, access log.',
      mcpSharedOrg: 'Your organisation secures the exposure of this interface, according to its policy and architecture: internal network, VPN, reverse proxy, IP filtering, mTLS or identity gateway.',
      mcpSharedReco: 'Recommendation: only expose this interface within your trusted network.',
      mcpChoiceTitle: 'Choosing your AI assistant',
      mcpChoiceBody: 'The data read leaves the application towards the assistant you connect, and is processed under its provider\'s terms. Prefer an AI running on your own infrastructure or provided by a sovereign vendor, and check its alignment with your policy: data location, no reuse for training, GDPR and NIS2 compliance.',
      mcpEnableLabel: 'Enable AI access (MCP)',
      mcpEndpointLabel: 'MCP interface address',
      mcpEndpointHint: 'Paste this address into your AI client, with the Authorization: Bearer <token> header.',
      mcpBanner: 'AI access is active. Data read is sent to the connected assistants. Review the token list regularly and prefer a local or sovereign AI compliant with your policy.',
      mcpTokensTitle: 'Access tokens',
      mcpTokensEmpty: 'No token yet.',
      mcpTokenLabel: 'Label',
      mcpTokenAccount: 'Linked account',
      mcpTokenNoAccount: 'No eligible account: create an active account before generating a token.',
      mcpTokenUsersFailed: 'Account list unavailable — check the server connection, then reopen this window.',
      mcpTokenCreated: 'Created',
      mcpTokenExpires: 'Expires',
      mcpTokenLastUsed: 'Last used',
      mcpTokenNever: 'Never',
      mcpTokenRevoked: 'Revoked',
      mcpTokenCreate: 'Generate a token',
      mcpTokenRevoke: 'Revoke',
      mcpTokenRevokeConfirm: 'Revoke this token? The AI client using it will lose access immediately.',
      mcpTokenOnce: 'Copy this token now: it will never be shown again.',
      mcpTokenCreatedOk: 'Token created.',
      mcpTokenRevokedOk: 'Token revoked.',
      mcpTest: 'Test',
      mcpTestOk: 'MCP interface reachable and operational.',
      mcpTestFail: 'Test failed.',
      mcpTestPartial: 'Endpoint reachable, but some items still need fixing.',
      mcpTokensLoadFailed: 'Unable to read the token list.',
      mcpDisabledTokensHint: 'The feature is disabled: the endpoint no longer responds. These tokens are NOT deleted — they will become valid again if you re-enable it. Revoke any that should no longer be used.',
      mcpCheckEnabled: 'Feature enabled',
      mcpCheckLicense: 'Valid licence',
      mcpCheckHtaccess: 'Data files protected (.htaccess)',
      mcpCheckUserIni: 'PHP hardening present (.user.ini)',
      mcpSaved: 'Configuration saved.',
      mcpSaveFailed: 'Could not save.',
      mcpLoadFailed: 'Could not load the MCP configuration.',
      mcpNotDeployed: 'mcp.php is not deployed on the server — upload the file then reload the page.',
      mcpModalTitle: 'Enable AI access (MCP)?',
      mcpModalIntro: 'You are about to open read-only access to your governance data — compliance, risks, assets, action plan — for the AI assistants you authorise by token.',
      mcpModalControl: 'What stays under your control: read-only, one token per user limited to its entity scope, a log of every access, immediate revocation and a global off switch at any time.',
      mcpModalArchi: 'What belongs to your architecture: the exposure of this interface (internal network, VPN, reverse proxy, IP filtering, identity gateway). We recommend keeping it inside your trusted network.',
      mcpModalGov: 'What engages your governance: the data read is sent to the connected AI assistant. Prefer a local or sovereign AI and check its compliance with your policy (data location, no training on your content, GDPR/NIS2).',
      mcpModalCheck: 'I have read the above and I confirm opening MCP access.',
      mcpModalConfirm: 'Enable',
      mcpModalCancel: 'Cancel',
      mcpShowcaseTitle: 'AI access (MCP)',
      mcpShowcaseBadge: 'Server edition',
      mcpShowcaseBadgeShort: 'Server',
      mcpShowcaseBody: 'Connect an AI assistant to your ISMS so it answers on your compliance data, read-only and under personal revocable access.',
      mcpShowcaseAvail: 'Available in the Server edition.',
      mcpShowcaseMeanwhile: 'In the meantime: you can export your data as JSON and attach it to a conversation with your AI assistant — bearing in mind its sensitivity and your confidentiality policy.',
      entShowcaseTitle: 'Multi-entity',
      entShowcaseBody: 'Manage up to 50 entities from a single installation: consolidated group dashboard, strict data separation per site, per-entity import/export.',
      entShowcaseAvail: 'Available in the Server edition.',
      entShowcaseWhoTitle: 'Who is it for?',
      entShowcaseWho1: 'Multi-site group: each site encodes, management consolidates.',
      entShowcaseWho2: 'Entities with separate ISMS: partitioned data, shared method.',
      entShowcaseWho3: 'Service provider (MSSP): one sealed space per client, a single installation.',
      entShowcaseFeat1: 'Up to 50 entities',
      entShowcaseFeat1d: 'A single installation, one scope per site, entity or client.',
      entShowcaseFeat2: 'Consolidated dashboard',
      entShowcaseFeat2d: 'Risks, actions, non-conformities and assets across all entities, in one screen.',
      entShowcaseFeat3: 'Strict partitioning',
      entShowcaseFeat3d: 'Server-side data separation; a site account never sees the others.',
      entShowcaseFeat4: 'Rights per section',
      entShowcaseFeat4d: 'None / Read / Write for each section, per entity. A new entity starts with no rights.',
      entShowcaseFeat5: 'Per-entity import/export',
      entShowcaseFeat5d: 'Every export is stamped; the server refuses a re-import into the wrong scope.',
      entShowcaseFeat6: 'Navigation without confusion',
      entShowcaseFeat6d: 'Scope selector, permanent banner, badged tab title and favicon.',
      mcpShowcaseHowTitle: 'How it will work',
      mcpShowcaseHow1: 'A personal token you generate, revocable in one click.',
      mcpShowcaseHow2: 'Read-only: no assistant can modify your data.',
      mcpShowcaseHow3: 'Works with mainstream assistants as well as an AI hosted on your own infrastructure.'
    },

    entities: {
      // === CSI-ME === libellés de la feature multi-entités (entity-ui.js)
      cardTitle: 'Multi-entity',
      cardDesc: 'Partition sub-entities (departments, sites, branches…) that only access their own records.',
      notInLicense: 'This feature is not included in your current license.',
      loadConfigFailed: 'Unable to load the multi-entity configuration.',
      opsTitle: 'Multi-entity — operations',
      opsDesc: 'Backup and restore of ALL partitions (main entity + sub-entities).',
      backupBtn: 'Download full backup',
      restoreBtn: 'Restore a full backup…',
      opsHint: 'Restore replaces each partition (automatic snapshot before overwrite, 20-file rotation). If a partition is being edited, restore is refused — you may then take over the locks.',
      perimeter: 'Scope',
      allEntities: 'All entities',
      allEntitiesTitle: 'Read-only consolidated view (all entities combined)',
      consolidatedHint: 'read-only',
      truncatedTitle: 'Display limited to keep things responsive.',
      truncatedHint: 'Partial list — refine by search or entity.',
      mainEntity: 'Main entity',
      archivedTag: '(archived)',
      backupFailedPrefix: 'Backup failed: ',
      confirmScopeEdit: 'You are on the "{{name}}" scope.\n\nEnable edit mode on THIS scope?',
      crossImportConfirm: 'This file comes from another scope ({{origin}}).\n\nImporting it here will REPLACE the current scope data ({{target}}). Confirm?',
      prefillTitle: 'Copy the main entity safe defaults (scales, framework, target) — never business data',
      restoreErrorPrefix: 'Restore: ',
      restoreTakeoverConfirm: 'Take over the locks and restore anyway?',
      sections: {
        'risks': 'Risks', 'threats-section': 'Threats', 'actions': 'Actions',
        'nonconformities': 'Non-conformities', 'critical-assets': 'Critical assets',
        'audits': 'Audits', 'documents': 'Documents', 'stakeholders': 'Stakeholders',
        'kpis': 'KPIs', 'managementReviews': 'Management reviews',
        'project-risks': 'Project risks', 'risk-analysis': 'Risk analyses',
        'nis2-program': 'Budget / Programme', 'docReview': 'Document review',
        'nis2-socle': 'NIS2 baseline', 'app-config': 'Configuration (language, framework)'
      },
      cols: {
        title: 'Title', category: 'Category', likelihoodShort: 'L', impactShort: 'I',
        status: 'Status', threat: 'Threat', type: 'Type', priority: 'Priority',
        dueDate: 'Due date', assignee: 'Assignee', severity: 'Severity', name: 'Name',
        importance: 'Importance', date: 'Date', version: 'Version', role: 'Role',
        indicator: 'Indicator', value: 'Value', target: 'Target', item: 'Item'
      },
      moveTargetAria: 'Target scope for the move',
      actionsCol: 'Actions',
      shownCountSingular: '{{n}} item shown',
      shownCountPlural: '{{n}} items shown',
      shownTotal: '{{total}} in total (1000 max loaded)',
      selectionCol: 'Selection',
      selectItemAria: 'Select: {{title}} ({{entity}})',
      switchFailed: 'Switch to "{{name}}" failed (server unreachable) — scope unchanged.',
      switchDirtyConfirm: 'Some changes have not been saved to the server yet:\n\n{{list}}\n\nSwitching perimeter will discard them (a backup copy will be downloaded).\n\nContinue anyway?',
      switchDirtyBackedUp: 'Backup copy of your unsaved changes: {{n}} file(s).',
      switchRenderFailed: 'Perimeter changed, but a screen could not render correctly — reload the page if the display looks inconsistent.',
      switchFlushPending: 'Changes are still being sent — try again in a moment.',
      readonlySectionNote: 'Read-only section for your scope — changes will not be saved here.',
      readonlyNav: 'Read-only (scope rights)',
      myEntity: 'My entity',
      consoleTitle: 'Consolidated view — all entities',
      consoleHint: 'Read-only. Each row carries its source entity. Editing is done within the relevant scope.',
      sectionLabel: 'Section',
      refresh: 'Refresh',
      loading: 'Loading…',
      loadFailed: 'Loading failed',
      networkError: 'Network error',
      noItems: 'No items.',
      entityCol: 'Entity',
      readOnly: 'Read-only',
      sectionViewAria: 'Section view',
      entityFilterAll: 'All entities',
      sectionSearchPlaceholder: 'Search in the consolidated view…',
      openInEntity: 'Open in entity',
      openedInEntity: 'Source scope opened. The item remains read-only.',
      exportGroupTag: 'main-entity',
      selectedN: '{{n}} selected',
      moveTo: '→ move to',
      move: 'Move',
      scopeBanner: 'Scope: {{name}} — you are viewing/editing a sub-entity',
      spaceLabel: '{{name}} workspace',
      spaceGeneric: 'Sub-entity workspace',
      groupDataBtn: 'Group data (read-only)',
      groupConsoleTitle: 'Main entity data — read-only',
      groupConsoleHint: 'Sections shared read-only by the main entity. To link one of these items to your records, create a local declination in your workspace.',
      noSharedSection: 'No shared section.',
      noSharedItems: 'No shared items in this section (or data not synced yet).',
      tileTitle: 'Group view — sub-entity activity',
      subEntitiesN: '{{n}} sub-entity(ies)',
      tileEmpty: 'No sub-entity configured. Add some in Settings ▸ Multi-entity.',
      colSubEntity: 'Sub-entity',
      colLastActivity: 'Last activity',
      colBy: 'By',
      colSections: 'Sections',
      colState: 'State',
      archivedTag: '(archived)',
      disabledTag: '(disabled)',
      inEdition: 'Editing · {{name}}',
      free: 'Free',
      consult: 'View',
      noActivity: 'no activity',
      justNow: 'just now',
      minsAgo: '{{n}}m ago',
      hoursAgo: '{{n}}h ago',
      daysAgo: '{{n}}d ago',
      activateHint: 'Enable the mode to create sub-entities. Enabling writes no data: your current records become the main entity.',
      activated: 'Multi-entity mode enabled',
      deactivated: 'Mode disabled',
      addPlaceholder: 'Sub-entity name',
      capReached: 'License cap reached ({{max}}).',
      clusterKeys: 'risks, threats, actions, SoA, controls, audits, NCs, assets',
      clusterName: 'Core ISMS block',
      configChangedReload: 'Configuration changed elsewhere — reloading',
      configInvalid: 'Invalid configuration',
      countMax: '{{count}} / {{max}} sub-entities',
      created: 'Sub-entity created (rights closed — open them via the profile and assign accounts)',
      deactivateConfirm: 'Disable multi-entity mode?\n\nThe {{n}} sub-entity(ies) and their data will be KEPT but hidden until re-enabled. Assigned accounts will be blocked.',
      deleteConfirm: 'Delete sub-entity "{{name}}"?',
      deleteConfirmStrong: 'Permanently DELETE "{{name}}"?\n\n• Its data will become INACCESSIBLE (audit evidence included).\n• The name "{{name}}" will stay RESERVED and cannot be recreated without server intervention.\n\nPrefer "Archive" (reversible, no loss). A safety export will be downloaded before deletion.\n\nConfirm deletion?',
      deleteFailed: 'Failed (accounts still assigned?)',
      archive: 'Archive',
      unarchive: 'Unarchive',
      archiveTitle: 'Hide and exclude from the license quota — reversible, no data lost',
      archived: 'Sub-entity archived (reversible)',
      unarchived: 'Sub-entity unarchived',
      deleted: 'Sub-entity deleted',
      invalidBackup: 'Invalid file: a full backup was expected (csi-backup-all-v1).',
      modeActivate: 'Enable multi-entity mode',
      modeOn: 'Mode enabled',
      modifiedReload: 'Modified elsewhere — reloading',
      moveConfirm: 'Move {{n}} item(s) to "{{name}}"?\n\nItems are copied then verified before removal from the source (no loss). Editing remains possible in the target scope afterwards.\n\n⚠ Only this section\'s items are moved — LINKED objects (actions, controls, attached assets…) stay in the source scope. Move them separately if needed, or re-link them locally in the target scope.',
      moveDone: '{{n}} item(s) moved',
      moveErrors: '{{n}} failure(s)',
      moveSkipped: '{{n}} skipped (already present)',
      moveTargetSame: 'The selected items are already in the target scope.',
      nameInvalid: 'Invalid name',
      nameRequired: 'Name required',
      newEntityHint: 'A new sub-entity starts EMPTY with no rights (fail-closed). Open its sections via the profile, then assign accounts in "Users".',
      prefill: 'Pre-fill',
      prefillConfirm: 'Pre-fill "{{name}}" with the main entity defaults (impact scales, framework, maturity target)?\n\nNo business data (risks, actions…) is copied.',
      prefilled: 'Defaults copied to "{{name}}"',
      profileTitle: '"Standard sub-entity" profile — rights per section',
      restoreConfirm: 'FULL RESTORE\n\nThis will REPLACE the data of the main entity and {{n}} sub-entity(ies) with the backup content{{when}}.\n\nA snapshot of the current state is taken automatically before overwriting. Continue?',
      rightNone: 'None',
      rightRead: 'Read',
      rightWrite: 'Write',
      rightsUpdated: 'Rights updated',
      saveFailed: 'Failed',
      scalesImposed: 'imposed by the main entity',
      scalesLocked: 'Read (locked)',
      scalesName: 'Scales & framework',
      subEntitiesLabel: 'Sub-entities',
      // === CSI-ME === (per-entity import/export, 2026-07-09)
      impexpTitle: 'Multi-entity — per-entity export / import',
      impexpDesc: 'Export a single entity (re-importable in the local edition), the whole group, or import a file to add it as a new entity or overwrite an existing one.',
      exportEntityLabel: 'Export a single entity:',
      exportEntityBtn: 'Export this entity',
      exportGroupLabel: 'Export the whole group:',
      exportBundleBtn: 'Single bundle (all)',
      exportPerFileBtn: 'One file per entity',
      exportPerFileDone: 'Per-file export complete ({{n}} file(s))',
      exportFailedPrefix: 'Export failed: ',
      importLabel: 'Import an entity file or a full backup:',
      importEntityBtn: 'Import an entity…',
      importTitle: 'Import an entity',
      importIntro: 'Import an entity export (single file) or a full backup. You can add it as a NEW entity, or OVERWRITE an existing one.',
      chooseFile: 'Choose a file…',
      fileReadError: 'Could not read the file.',
      invalidFile: 'Invalid JSON file.',
      importedEntity: 'Imported entity',
      noDataInFile: 'This file contains no usable entity (no data).',
      bundleDetected: 'Full backup detected ({{n}} entity/entities with data). Choose the source to import, or add them all as new entities.',
      importAllAsNew: 'Add ALL as new entities',
      modeConsolidate: 'Consolidate — add as a NEW entity',
      modeOverwrite: 'Overwrite an EXISTING entity',
      newEntityNamePh: 'New entity name',
      newEntityNameLabel: 'New entity name:',
      overwriteTargetLabel: 'Entity to overwrite:',
      overwriteWarn: '⚠ The chosen entity\'s content will be REPLACED. A snapshot is taken automatically before overwriting.',
      importConfirmBtn: 'Import',
      importInProgress: 'Import in progress…',
      importCancelled: 'Import cancelled.',
      importErrorPrefix: 'Import: ',
      importLockConfirm: 'The target partition is being edited by {{who}}. Take over the lock and import anyway?',
      overwriteConfirm: 'OVERWRITE entity "{{name}}" with this data?\n\nAll its current data will be replaced. A snapshot is taken before overwriting.',
      overwriteGroupConfirm: 'OVERWRITE the MAIN ENTITY with this data?\n\nThe group\'s imposed scales are preserved, but all other main-entity data will be replaced. A snapshot is taken before overwriting.',
      createdOk: 'Entity created: {{name}} (id {{id}}).',
      overwrittenOk: 'Entity overwritten: {{id}}.',
      lockStolen: '(lock taken over from {{who}})',
      bundleImportDone: 'Done: {{ok}} created, {{fail}} failure(s).',
      pickEntityToLoadTitle: 'Load an entity',
      pickEntityToLoad: 'Which entity to load into this workspace?'
    },

    // Operational capabilities (spider/radar chart)
    capabilities: {
      gouvernance: 'Governance',
      gestionActifs: 'Asset Management',
      protectionInformations: 'Information Protection',
      securiteRH: 'Human Resources Security',
      securitePhysique: 'Physical Security',
      securiteSystemeReseau: 'System and Network Security',
      securiteApplications: 'Application Security',
      configurationSecurisee: 'Secure Configuration',
      gestionIdentitesAcces: 'Identity and Access Management',
      gestionMenacesVulnerabilites: 'Threat and Vulnerability Management',
      continuite: 'Continuity',
      securiteRelationsFournisseurs: 'Supplier Relationship Security',
      reglementationConformite: 'Regulation and Compliance',
      gestionEvenementsSI: 'Information Security Event Management',
      assuranceSI: 'Information Security Assurance'
    },

    // Chart labels
    chartLabels: {
      target: 'Target',
      averageCMM: 'CMM Average',
      globalTarget: 'Global Target',
      averageMaturity: 'Average Maturity',
      docMaturity: 'Documentation',
      implMaturity: 'Implementation'
    },

    // Control status options
    controlStatuses: {
      nonImplemente: 'Not Implemented',
      enCours: 'In Progress',
      implemente: 'Implemented',
      verifie: 'Verified'
    },

    // Domain options
    domains: {
      organisationnel: 'Organizational',
      humain: 'Human',
      physique: 'Physical',
      technologique: 'Technological',
      nonClasse: 'Unclassified'
    },

    // CMM levels
    cmmLevels: {
      initial: 'Initial',
      repetable: 'Repeatable',
      defini: 'Defined',
      gere: 'Managed',
      optimise: 'Optimized'
    },

    // Risk levels (from calculateRiskLevel)
    riskLevels: {
      critical: 'Critical',
      high: 'Severe',
      medium: 'Significant',
      low: 'Minor',
      negligible: 'Negligible'
    },

    // Treatment options
    treatments: {
      reduction: 'Reduction',
      acceptation: 'Acceptance',
      transfert: 'Transfer',
      evitement: 'Avoidance'
    },

    // Action priority options
    actionPriorities: {
      critical: 'Critical',
      high: 'High',
      medium: 'Medium',
      low: 'Low'
    },

    // Action link types (PDF reports)
    actionLinkTypes: {
      control: 'Control',
      risk: 'Risk',
      nc: 'Non-conformity',
      audit: 'Audit',
      threat: 'Threat',
      continuous: 'Continuous improvement'
    },

    // Action status options
    actionStatuses: {
      planifie: 'Planned',
      enCours: 'In Progress',
      termine: 'Completed',
      annule: 'Cancelled'
    },

    // NC status options
    ncStatuses: {
      detection: 'Detection',
      analyse: 'Analysis',
      action: 'Action',
      cloture: 'Closure'
    },

    // NC type options
    ncTypes: {
      majeure: 'Major',
      mineure: 'Minor'
    },

    // Audit options
    auditStatuses: {
      planifie: 'Planned',
      realise: 'Completed',
      enCours: 'In Progress',
      annule: 'Cancelled'
    },
    auditTypes: {
      interne: 'Internal Audit',
      externe: 'External Audit',
      certification: 'Certification',
      surveillance: 'Surveillance'
    },

    // Threat statuses
    threatStatuses: {
      reduction: 'Reduction',
      acceptation: 'Acceptance',
      transfert: 'Transfer',
      evitement: 'Avoidance'
    },

    // SOA source options
    soaSources: {
      select: '— Select —',
      risk: 'Identified Risk',
      legal: 'Legal Requirement',
      contractual: 'Contractual Requirement',
      bestPractice: 'Best Practice',
      regulatory: 'Regulatory Requirement',
      business: 'Business Requirement'
    },

    // SOA implementation status
    soaImplStatuses: {
      select: '— Status —',
      notStarted: 'Not Started',
      planned: 'Planned',
      inProgress: 'In Progress',
      implemented: 'Implemented',
      verified: 'Verified'
    },

    // Document review statuses
    docReviewStatuses: {
      select: '— Status —',
      conforme: 'Conforming',
      partiel: 'Partially Conforming',
      nonConforme: 'Non-Conforming',
      na: 'Not Applicable'
    },

    // Critical asset options
    assetAvailability: {
      level1: 'Level 1 - High Availability',
      level2: 'Level 2 - Fast Recovery',
      level3: 'Level 3 - Standard Recovery',
      level4: 'Level 4 - Extended Recovery'
    },
    assetConfidentiality: {
      sensible: 'Sensitive',
      tresSensible: 'Highly Sensitive',
      restreint: 'Restricted',
      public: 'Public'
    },
    assetIntegrity: {
      faible: 'Low',
      moderee: 'Moderate',
      elevee: 'High',
      critique: 'Critical'
    },
    assetType: {
      hardware: 'Hardware',
      software: 'Software',
      sourceCode: 'Source code',
      network: 'Network',
      service: 'Service',
      document: 'Document',
      employee: 'Employee',
      site: 'Premises',
      organization: 'Organization'
    },
    assetImportance: {
      normal: 'Normal',
      important: 'Important',
      critique: 'Critical'
    },
    assetImpact: {
      societal: 'Societal',
      operationnel: 'Operational',
      financier: 'Financial',
      reputation: 'Reputational',
      reglementaire: 'Regulatory'
    },
    assetMfa: {
      nonImplemente: 'Not Implemented',
      partiel: 'Partial',
      implemente: 'Implemented',
      externe: 'External'
    },
    assetDacp: {
      oui: 'Yes',
      non: 'No'
    },

    // Project risk statuses
    projectRiskStatuses: {
      red: 'Red',
      yellow: 'Yellow',
      green: 'Green',
      todo: 'To Do',
      suspended: 'Suspended'
    },

    // NIS2 statuses
    nis2Statuses: {
      todo: 'To Do',
      inProgress: 'In Progress',
      suspended: 'Suspended',
      done: 'Completed'
    },
    nis2Urgency: {
      high: 'High Urgency',
      medium: 'Medium Priority',
      standard: 'Standard Priority'
    },
    nis2ActionTypes: {
      service: 'Service',
      projet: 'Project',
      initiative: 'Initiative',
      programme: 'Program'
    },
    nis2Phases: {
      outOfPhase: 'Out of Phase',
      phase1: 'Phase 1 (2026)',
      phase2: 'Phase 2 (2027)',
      phase3: 'Phase 3 (2028)'
    },

    // Toast messages
    toasts: {
      demoDataReloaded: 'Demo data automatically reloaded.',
      recyfConfigured: 'NIS2 framework: France (ReCyF) — {{deg}}',
      tooManyActions: 'Too many actions in a short time. Please wait a few seconds.',
      noInconsistency: 'No inconsistencies detected',
      snapshotSaved: 'Snapshot saved',
      snapshotError: 'Unable to create snapshot: {{message}}',
      snapshotRestored: 'Snapshot restored, reloading...',
      snapshotHistoryCleared: 'Snapshot history cleared',
      snapshotHistoryError: 'Unable to delete history',
      chartLibUnavailable: 'Error: Chart library not available',
      enterPassword: 'Please enter a password.',
      requiredFields: 'Please fill in the required fields.',
      passwordMismatch: 'Passwords do not match.',
      passwordSaved: 'Password saved',
      readOnlyStart: 'The application starts in read-only mode. Click the lock to switch to edit mode.',
      wrongPassword: 'Incorrect password',
      serverModeActivated: 'Server mode activated! The feature is now available.',
      syncPanelLoading: 'Synchronization panel loading...',
      itemDeleted: 'Item deleted',
      dataRefreshed: 'Data updated (changed by another user)',
      budgetLineSaved: 'Budget line saved',
      budgetLineDeleted: 'Budget line deleted',
      budgetLineLabelRequired: 'An item label is required',
      budgetYearsUpdated: 'Budget years updated',
      budgetYearMin: 'At least one year is required',
      noDataToExport: 'No data to export',
      excelExportSuccess: 'Excel export successful',
      excelExportError: 'Unable to export. Please check that data exists.',
      exportTableNotFound: 'Export table not found',
      exportNotSupported: 'Excel export not supported for this section',
      selectAtLeastOneSection: 'Select at least one section.',
      exportSuccess: 'Export successful',
      exportError: 'Unable to export data.',
      importNis2Success: 'Import successful - NIS2 Plan initialized (old format)',
      importNis2Hint: 'Find your budgets in the Cybersecurity Budget tab (Governance)',
      importSuccess: 'Import successful',
      importError: 'Unable to import file. Please check its format.',
      testsRunning: 'Running tests...',
      settingsSaved: 'Settings saved',
      passwordUpdated: 'Password updated',
      passwordSaveError: 'Unable to save password',
      pdfUnavailable: 'PDF generation unavailable.',
      syncConfigSaved: 'Sync configuration saved',
      syncConfigError: 'Unable to save configuration',
      syncPanelUnavailable: 'Server Sync panel unavailable',
      demoDataLoaded: 'Demo data loaded',
      demoDataLoadError: 'Unable to load data.',
      resetDone: 'Reset complete',
      resetServerFailed: 'Local reset done, but the server could not be updated. Take over the lock (edit mode) and try again, otherwise the previous data will reappear on reload.',
      resetError: 'Unable to reset data.',
      quotaExceeded: 'localStorage quota exceeded. Your data has been downloaded as backup.',
      saveError: 'Save failed. Your data is preserved locally.',
      noRisksDefined: 'No risks defined. First create risks in the ISMS Risks module.',
      soaRisksUpdated: 'Associated risks updated',
      addNis2DomainFirst: 'Add a NIS2 domain first before creating an action.',
      filterApplied: 'Filter applied: {{filter}}',
      activityRefreshed: 'Activity refreshed',
      preparingPdf: 'Preparing PDF...',
      dashboardExported: 'Dashboard exported',
      useSaveAsPdf: 'Use "Save as PDF" in the dialog box',
      popupBlocked: 'Please allow popups to export as PDF.',
      soaPdfReady: 'SOA ready — Use "Save as PDF"',
      auditPackReady: 'Audit Doc Review Pack ready — Use "Save as PDF"',
      dataSaved: 'Data saved',
      appLoaded: 'Application loaded successfully',
      appLoadError: 'Error during loading: {{message}}',
      demoBlocked: 'This feature is disabled in demo mode.',
      editModeEnabled: 'Edit mode enabled',
      editModeDisabled: 'Read-only mode enabled',
      justNow: 'Just now',
      riskAnalysisModuleNotLoaded: 'Risk analysis module not loaded.',
      duplicateControlRef: 'A control with this reference already exists.',
      factoryPasswordWarning: 'You are using the default password. Please change it in the security settings.',
      fileTooLarge: 'The file is too large (max 10 MB).',
      importIntegrityWarnings: 'Import completed with integrity warnings',
      invalidFileType: 'Invalid file format. Please select a .json or .smsi file.',
      budgetCatMin: 'At least one category is required',
      budgetCatUpdated: 'Budget categories updated',
      saveFailed: 'Save error — imported data was not persisted. Please try again.',
      importSyncFailed: 'Import applied in memory but NOT saved to the server: {{msg}}. Take over (edit mode) and re-import; do not close the tab.',
      importEpochConflict: 'The data was reloaded after another user\'s import, restore or configuration change. A copy of your unsaved changes has been saved.',
      entityContextChanged: 'Your entity assignment has changed — the application will reload to apply your new scope. A copy of your unsaved changes has been downloaded.',
      importIgnoredSections: 'Read-only sections for your scope, not modified by the import: {{list}}',
      bundleNoData: 'The backup contains no usable entity.',
      sectionReadonly: 'This section is READ-ONLY for your scope — your changes were not saved.',
      pushEntityUnknown: 'Your perimeter is no longer available (it has just been archived or deleted). Your changes can no longer be saved — contact an administrator before closing the tab.',
      pushEntityArchived: 'This perimeter is ARCHIVED and therefore read-only. An administrator must reactivate it in Settings ▸ Multi-entity to allow changes.',
      pushCrossEdit: 'Your account is not allowed to modify sub-entity data. An administrator can grant it in Settings ▸ Users ▸ Entities.',
      pushKeysOutOfSection: 'Application anomaly: the server rejected this section\'s content. Your changes were not saved — please report it to support with the screen name.',
      pushForbidden: 'Write refused by the server (insufficient rights) — changes not saved.',
      syncGenericError: 'synchronization failure',
      syncFailed: 'Server synchronization failed — data is saved locally.',
      lockExpired: 'The lock on this tab has expired. Your changes will not be synchronized.',
      lockConflict: 'Another user holds the lock. Your local changes were not sent.',
      nis2Migration: 'Migration to NIS2 completed. Please verify your scores.',
      nis2LevelConfigured: 'NIS2 level configured: {{level}} ({{lang}})',
      // FIX-I18N-KEYS (audit 2026-06-10) : critical toasts previously hardcoded or keyless
      dataCorrupted: 'Local data corrupted or unreadable: a backup copy (smsi_backup_corrupted.json) has been downloaded. The application started empty — do not save before securing this copy.',
      editLockPushRefused: 'Edit lock not held — your changes stay in memory and are not saved to the server. Take over the lock (edit mode) to save them; do not close the tab first.',
      // FIX-TOAST-423-CLUSTER (co-edition audit 2026-07-17): edit-mode variants — name the
      // refused module instead of the "take over" advice (absurd while already editing).
      editLockPushRefusedCluster: 'Module "{{module}}" not held — your changes stay in memory. Open a screen of that module to save them.',
      editLockPushRefusedClusterBusy: 'Module "{{module}}" in use by {{name}} — your changes stay in memory and will be saved via a screen of that module once it is free.',
      // FIX-OPTIMISTIC-REV (2026-06-11) : parachute (anti-overwrite) messages
      pushConflict: 'This data was modified by another user. Your changes were NOT overwritten: they were downloaded as a backup file, and the screen now shows the server version.',
      pushConflictRetry: 'This data was modified by another user — retrying to save your version…',
      pushConflictRetryBackup: 'This data was modified by another user — your version will be saved; a copy of the remote version has been set aside (file "smsi_conflit_serveur_…").',
      dirtyBackedUpBeforeRepull: '{{n}} unsaved change(s) were saved to a backup file before reloading the server state.',
      multiTabConflict: 'Data was modified in another tab. Reload this page to avoid overwriting your work.',
      restoreNeedsLock: 'Restore not applied to the server: enter edit mode (or take over the lock) and try again.',
      restoreSyncFailed: 'Restore sync failed — not applied to the server. Please retry.',
      configNotPersisted: 'Configuration not saved to the server (another user is editing) — it will apply next time you enter edit mode.',
      // FIX-CONFIG-LOCK-EDITING (adversarial review 2026-07-17): non-lock failure.
      configPersistFailed: 'Configuration not saved to the server (network or server error) — it will be retried at the next synchronization.',
      serverConflict: 'Server conflict — your data is kept in memory.',
      licenseExpired: 'License expired — read-only mode.',
      syncFailedRetry: 'Server synchronization failed — your data is kept in memory. Do not close the browser.',
      syncFailedReload: 'Synchronization failed — reloading',
      nis2LegacyMigrated: 'NIS2 controls migrated from the legacy format (23 controls). Please verify the scores.',
      restoreFailed: 'Unable to restore the snapshot',
      testsCompleted: 'Tests completed: {passed}/{total} passed',
      testsCompletedFailed: 'Tests completed: {passed}/{total} passed, {failed} failed',
      crossImportCancelled: 'Cross-scope import cancelled — data unchanged.'
    },

    // Validation messages
    validation: {
      blocked: 'Save blocked: ',
      warnings: 'Data saved with warnings'
    },

    // Legacy import module
    legacyImport: {
      modalTitle: 'Import file analysis',
      versionDetected: 'Detected version',
      confidence: 'Confidence',
      fieldMapping: 'Field mapping',
      matched: 'Matched',
      missing: 'Missing (defaults used)',
      migrated: 'Migrated',
      ignored: 'Ignored',
      migrations: 'Migrations to apply',
      warnings: 'Warnings',
      crossRefIssues: 'Cross-reference issues',
      sizeEstimate: 'Size estimate',
      canImport: 'Import possible',
      cannotImport: 'Import not possible',
      importWithMigrations: 'Import with migrations',
      importBtn: 'Import',
      cancelBtn: 'Cancel',
      postImportOk: 'Import validated — no integrity issues detected',
      postImportWarnings: 'Import completed with integrity warnings',
      detectedVersion: 'Detected version',
      dataSummary: 'Data summary',
      section: 'Section',
      elements: 'Elements',
      missingFields: 'Missing fields (default values):',
      field: 'Field',
      defaultValue: 'Default value',
      unknownFields: 'Unknown fields (ignored):',
      crossReferences: 'Cross-references',
      // FIX-I18N-KEYS (audit 2026-06-10) : missing keys of the legacy import modal
      andMoreIssues: '... and',
      moreItems: 'more',
      autoMigrations: 'Automatic migrations',
      importBlocked: 'Import blocked',
      quotaRisk: 'Quota risk'
    },

    // Import
    import: {
      oldFormatDetected: 'Old format detected: NIS2 plan and budgets',
      willBeInitialized: 'will be initialized with default values.',
      warningOverwrite: 'Warning: this operation will overwrite local data.',
      file: 'File',
      importedFile: 'Imported file',
      summaryBeforeImport: 'Summary before import',
      importBtn: 'Import'
    },

    // Sync Manager
    sync: {
      syncing: 'Synchronizing',
      synced: 'Synchronized with server',
      retrying: 'Retrying synchronization',
      authError: 'Authentication error - check password',
      licenseExpired: 'License or trial expired — read-only mode',
      syncError: 'Synchronization error',
      licenseLabel: 'License',
      editLocked: 'Sync deferred — edit lock not held'
    },

    // Server Setup
    serverSetup: {
      configureTitle: 'Configure server',
      configureSub: 'Choose a password to protect your data.',
      connectionTitle: 'Connect to server',
      connectionSub: 'Enter the server password to sign in.',
      serverPassword: 'Server password',
      connect: 'Connect',
      configure: 'Configure',
      configuring: 'Configuring...',
      configSuccess: 'Server configured successfully!',
      passwordInvalid: 'Password does not meet the requirements.',
      passwordMismatch: 'Passwords do not match.',
      configError: 'Configuration error',
      syncEnabled: 'Synchronization enabled',
      passwordRequired: 'Password required',
      requirements: 'Requirements:',
      reqLength: '18 characters minimum',
      reqUpper: '1 uppercase letter',
      reqLower: '1 lowercase letter',
      reqSpecial: '1 special character',
      minChars: 'minimum {{min}} characters',
      confirmation: 'Confirmation'
    },

    // Modal titles
    modals: {
      dataQuality: 'Data Quality',
      setPassword: 'Set Password',
      editKpi: 'Edit KPI',
      addKpi: 'Add KPI',
      globalExcelExport: 'Global Excel Export',
      confirmImport: 'Confirm Import',
      nis2ControlTracking: 'NIS2 Control Tracking',
      controlTracking: 'Control Tracking',
      addControl: 'Add Control',
      editAction: 'Edit Action',
      addAction: 'Add Action',
      renameSection: 'Rename Section',
      editRisk: 'Edit Risk',
      addRisk: 'Add Risk',
      editNc: 'Edit Non-Conformity',
      addNc: 'Add Non-Conformity',
      editAudit: 'Edit Audit',
      addAudit: 'Add Audit',
      addReview: 'Add Management Review',
      editReview: 'Edit Management Review',
      addStakeholder: 'Add Stakeholder',
      editStakeholder: 'Edit Stakeholder',
      addDocument: 'Add Document',
      editDocument: 'Edit Document',
      editCriticalAsset: 'Edit Critical Asset',
      addCriticalAsset: 'New Critical Asset',
      addNis2Domain: 'New NIS2 Domain',
      editNis2Domain: 'Edit NIS2 Domain',
      addNis2Action: 'New NIS2 Action',
      editNis2Action: 'Edit NIS2 Action',
      addNis2Status: 'New Key Status',
      editNis2Status: 'Edit Key Status',
      addThreat: 'Add Threat',
      editThreat: 'Edit Threat',
      addProjectRisk: 'New project risk analysis',
      editProjectRisk: 'Edit project risk analysis',
      viewProjectRisk: 'View project risk analysis',
      budgetCategories: 'Budget Categories',
      associatedRisks: 'Associated Risks',
      editSoaControl: 'Edit SoA control',
      editDocReview: 'Edit clause',
      editPillar: 'Edit Pillar',
      nis2Block: 'NIS2 Block',
      budgetBlock: 'Budget Block',
      addBudgetLine: 'New budget line',
      editBudgetLine: 'Edit budget line',
      manageYears: 'Manage budget years',
      controlDetails: 'Control Details',
      riskDetails: 'Risk Details',
      threatDetails: 'Threat Details'
    },

    // Form field labels
    fields: {
      title: 'Title',
      budgetYearsList: 'One year per line (min. 1)',
      budgetYearsHelp: 'Add, remove or rename years (one per line). Amounts stay tied to each year label; renaming in place keeps the value.',
      auditTitle: 'Audit title',
      description: 'Description',
      status: 'Status',
      type: 'Type',
      priority: 'Priority',
      owner: 'Owner',
      dueDate: 'Due Date',
      progress: 'Progress',
      comments: 'Comments',
      existingComments: 'Existing Comments',
      newComment: 'New Comment',
      impact: 'Impact',
      probability: 'Probability',
      level: 'Level',
      treatment: 'Treatment',
      criticalAssets: 'Critical Assets',
      detectionDate: 'Detection Date',
      scope: 'Scope',
      plannedDate: 'Planned Date',
      auditor: 'Auditor',
      date: 'Date',
      participants: 'Participants',
      inputElements: 'Input Elements',
      decisions: 'Decisions',
      name: 'Name',
      role: 'Role',
      contact: 'Contact',
      documentLevel: 'Level',
      documentType: 'Type',
      tool: 'Tool',
      link: 'Link',
      target: 'Target',
      current: 'Current',
      comment: 'Comment',
      beneficiary: 'Beneficiary',
      productCode: 'Product (code)',
      productName: 'Product (name)',
      productTags: 'Product tags (comma-separated)',
      rto: 'RTO',
      rpo: 'RPO',
      availability: 'Availability',
      confidentiality: 'Confidentiality',
      integrity: 'Integrity',
      assetType: 'Asset type',
      importance: 'Importance',
      mfaStatus: 'MFA Status',
      dacpSensitive: 'Sensitive DACP',
      context: 'Context',
      likelihood: 'Likelihood',
      linkedAudit: 'Linked Audit',
      correctiveAction: 'Corrective Action',
      linkType: 'Link Type',
      linkedElement: 'Linked Element',
      password: 'Password',
      confirmPassword: 'Confirm Password',
      sectionName: 'Section Name',
      domainTitle: 'Domain Title',
      objective: 'Objective',
      pillar: 'Pillar',
      urgencyHigh: 'High Urgency',
      urgencyMedium: 'Medium Priority',
      urgencyStandard: 'Standard Priority',
      domain: 'Domain',
      actionDescription: 'Action Description',
      phase: 'Phase',
      workType: 'Type (Service / Project / Initiative / Program)',
      actionOwner: 'Action Owner',
      budget2026: 'Budget 2026',
      budget2027: 'Budget 2027',
      budget2028: 'Budget 2028',
      budgetGlobal: 'Global Budget (optional)',
      budgetCategory: 'Budget Category',
      reference: 'Reference',
      measure: 'Measure',
      recommendations: 'Recommendations',
      category: 'Category',
      cmm: 'CMM Level',
      linkedActions: 'Linked actions',
      justification: 'Justification',
      score: 'Score',
      operations: 'Operations',
      executionDate: 'Execution date',
      findings: 'Findings',
      reviewInputs: 'Review inputs',
      reviewDecisions: 'Decisions and actions',
      budgetCategoriesList: 'One category per line (min. 1)',
      deliverableType: 'Deliverable type',
      toolUsed: 'Tool used',
      accessLink: 'Access link',
      numbering: 'Numbering',
      cmmLevel: 'CMM Maturity Level',
      controlOwner: 'Control Owner',
      ownerPlaceholder: 'Name of responsible person',
      ownerOrStakeholderPlaceholder: 'Free name or stakeholder',
      ownerOrStakeholderHelp: 'Enter a free name or choose an existing stakeholder.',
      riskOwner: 'Risk owner',
      // FIX-I18N-NIS2-PLAN (audit 2026-07-10) : modale pilier du socle
      subtitle: 'Subtitle',
      keyItems: 'Key items (one per line)',
      projectLead: 'Project lead',
      reviewer: 'Reviewer',
      lastEvaluation: 'Last Evaluation',
      nextReviewDate: 'Next Review',
      reviewFrequency: 'Review Frequency',
      effectiveness: 'Measured Effectiveness',
      evidence: 'Evidence / Artefacts',
      evidencePlaceholder: 'Documents, logs, screenshots...',
      kpiRef: 'Associated KPI',
      kpiPlaceholder: 'KPI reference measuring effectiveness',
      select: 'Select' // FIX-I18N-KEYS (audit 2026-06-10)
    },

    // Control type labels
    controlType: {
      preventive: 'Preventive',
      detective: 'Detective',
      corrective: 'Corrective',
      undefined: 'Undefined'
    },

    // Effectiveness labels
    effectiveness: {
      effective: 'Effective',
      partial: 'Partial',
      partiallyEffective: 'Partially effective',
      ineffective: 'Ineffective',
      notTested: 'Not tested',
      notEvaluated: 'Not evaluated'
    },

    // Confirm dialog messages
    confirms: {
      deleteRisk: 'Delete this risk?',
      deleteThreat: 'Delete this threat?',
      deleteNc: 'Delete this non-conformity?',
      deleteAudit: 'Delete this audit?',
      deleteReview: 'Delete this review?',
      deleteStakeholder: 'Delete this stakeholder?',
      deleteDocument: 'Delete this document?',
      deleteAction: 'Delete this action?',
      deleteKpi: 'Delete this KPI?',
      deleteAsset: 'Delete this critical asset?',
      resetData: 'Do you really want to reset all data? This action is irreversible.',
      loadDemoData: 'Load demo data? Current data will be overwritten.',
      deleteSnapshot: 'Delete this snapshot?',
      clearSnapshots: 'Delete all snapshot history?',
      restoreSnapshot: 'Restore this snapshot? Current data will be replaced.',
      deleteProjectRisk: 'Delete this project risk analysis?',
      deleteControl: 'Delete this control?',
      deleteDomain: 'Delete this domain and its actions?',
      deletePhase: 'Delete this phase? Actions will be moved to the fallback phase.',
      deleteKeyStatus: 'Delete this key status?',
      budgetCategoriesList: 'One category per line (min. 1)',
      deleteTitle: 'Delete?',
      deleteComment: 'Delete this comment?',
      deleteBudgetLine: 'Delete this budget line?'
    },

    // Budget categories
    budgetCategories: {
      infra: 'Infrastructure',
      cyber: 'Cybersecurity',
      divers: 'Other',
      cyberBudget3y: 'Cybersecurity Budget 3 years'
    },

    // Budget line statuses
    budgetStatus: {
      planifie: 'Planned',
      engage: 'Committed',
      realise: 'Spent'
    },

    // Edit mode actions
    editMode: {
      manageBudgetCategories: 'manage budget categories',
      editBudgetLine: 'edit a budget line',
      deleteBudgetLine: 'delete a budget line',
      manageBudgetYears: 'manage budget years'
    },

    // Common labels
    labels: {
      none: 'None',
      noAsset: 'None',
      all: 'All',
      notApplicable: 'N/A',
      pillar: 'Pillar {{number}}',
      phase: 'Phase {{number}}',
      completed: 'completed',
      todo: 'to do',
      noneM: 'None',
      openAction: 'Open action',
      select: 'Select',
      atRisk: 'at risk' // FIX-I18N-KEYS (audit 2026-06-10)
    },

    // Impact and probability levels
    impactLevels: {
      1: 'Negligible',
      2: 'Minor',
      3: 'Moderate',
      4: 'Major',
      5: 'Severe'
    },
    probabilityLevels: {
      1: 'Very unlikely',
      2: 'Unlikely',
      3: 'Possible',
      4: 'Likely',
      5: 'Very likely'
    },

    // PDF Report
    pdfReportLabels: {
      coverTitle: 'ISMS Report',
      coverSubtitle: 'Information Security Management System',
      generatedOn: 'Report generated on',
      confidential: 'Confidential document',
      conformityISO: 'ISO 27002 Conformity',
      implementedControls: 'Implemented controls',
      actionsInProgress: 'Actions in progress',
      criticalRisks: 'Critical risks',
      tableOfContents: 'Table of Contents',
      dashboardAndIndicators: 'Dashboard and indicators',
      dashboardTitle: 'ISMS Dashboard',
      conformity: 'Conformity',
      controls: 'Controls',
      actions: 'Actions',
      maturityISO: 'ISO27002 Maturity',
      maturityNIS2: 'NIS2 Maturity',
      riskDistribution: 'Risk distribution',
      riskMatrix: 'Risk matrix',
      maturityCMM: 'CMM Maturity',
      probability: 'Probability',
      impact: 'Impact',
      pageOf: 'Page {{current}} of {{total}}',
      page: 'Page {{current}}',
      continued: '(continued)',
      elements: 'element',
      elementsPlural: 'elements',
      noData: 'No data',
      sectionsTitle: 'PDF report sections',
      selectAtLeastOne: 'Select at least one section',
      pdfGeneratedSuccess: 'PDF report generated successfully',
      pdfExportDisabled: 'PDF export is disabled in demonstration mode.'
    },

    // Report sections
    reportSections: {
      controls: 'ISO27002 Controls',
      soa: 'Statement of Applicability',
      nis2Controls: 'NIS2 Controls',
      nis2Program: 'Cybersecurity Budget',
      nis2Socle: 'Security Foundation',
      actions: 'Action Plan',
      risks: 'ISMS Risks',
      threats: 'Threats',
      nonconformities: 'Non-Conformities',
      audits: 'Audits',
      managementReviews: 'Management Reviews',
      docReview: 'ISO27001 Document Review',
      documents: 'Document Structure',
      stakeholders: 'Stakeholders',
      kpis: 'KPIs',
      criticalAssets: 'Critical Assets',
      projectRisks: 'Project Risks'
    },

    // PDF table headers
    pdfTableHeaders: {
      hash: '#',
      num: 'Num',
      title: 'Title',
      status: 'Status',
      cmm: 'CMM',
      reference: 'Reference',
      applicable: 'Applicable',
      justification: 'Justification',
      function: 'Function',
      category: 'Category',
      domain: 'Domain',
      action: 'Action',
      phase: 'Phase',
      progression: 'Progress',
      link: 'Link',
      dueDate: 'Due date',
      owner: 'Owner',
      risk: 'Risk',
      impact: 'Impact',
      prob: 'Prob.',
      score: 'Score',
      level: 'Level',
      treatment: 'Treatment',
      threat: 'Threat',
      type: 'Type',
      detectionDate: 'Detection date',
      date: 'Date',
      participants: 'Participants',
      decisions: 'Decisions',
      exigence: 'Requirement',
      tool: 'Tool / evidence',
      docLevel: 'Level',
      docType: 'Type',
      docTool: 'Tool',
      docLink: 'Link',
      name: 'Name',
      role: 'Role',
      contact: 'Contact',
      description: 'Description',
      beneficiary: 'Beneficiary',
      product: 'Product',
      rto: 'RTO',
      rpo: 'RPO',
      availability: 'Availability',
      project: 'Project',
      recommendations: 'Recommendations',
      pillar: 'Pillar',
      element: 'Element',
      subtitle: 'Subtitle',
      auditor: 'Auditor',
      scope: 'Scope',
      plannedDate: 'Planned date',
      yes: 'Yes',
      no: 'No',
      noAction: 'No action',
      noAsset: 'None',
      pending: 'pending',
      outOfPhase: 'Out of phase',
      priority: 'Priority',
      detailedRecommendations: 'Detailed Recommendations',
      autoSyncNote: '* Risk synced from risk analysis',
      auditExecutionDate: 'Execution date',
      auditFindings: 'Findings',
      auditRecommendations: 'Recommendations'
    },

    // SoA PDF export labels
    pdfSoa: {
      title: 'Statement of Applicability (SoA)',
      subtitle: 'ISO 27001:2022 - Clause 6.1.3 - Annex A',
      fullAuditVersion: 'FULL AUDIT DOCUMENT',
      publicVersion: 'PUBLIC VERSION',
      issueDate: 'Issue date:',
      docRef: 'Document reference',
      scope: 'Scope',
      refStandard: 'Reference standard',
      classification: 'Classification',
      confidential: 'Confidential',
      internal: 'Internal',
      execSummary: 'Executive Summary',
      applicableControls: 'Applicable controls',
      implRate: 'Implementation rate',
      verifiedControls: 'Verified controls',
      notApplicable: 'Not applicable',
      docQuality: 'Documentation quality',
      withOwner: 'with owner',
      withEvidence: 'with evidence',
      linkedToRisks: 'linked to risks',
      reviewedLast6m: 'reviewed <6 months',
      selectionSources: 'Selection sources',
      domainCoverage: 'Domain coverage ISO 27002:2022',
      domain: 'Domain',
      total: 'Total',
      applicable: 'Applicable',
      implemented: 'Implemented',
      verified: 'Verified',
      progression: 'Progress',
      controlDetails: 'ISO 27002:2022 control details',
      ref: 'Ref.',
      control: 'Control',
      applic: 'Applic.',
      source: 'Source',
      state: 'State',
      owner: 'Owner',
      evidence: 'Evidence',
      risks: 'Risks',
      justification: 'Justification',
      excluded: 'Excluded:',
      approvals: 'Approvals and signatures',
      ismsManager: 'ISMS Manager',
      generalManagement: 'General Management',
      securityOfficer: 'Security Officer',
      nameField: 'Name: ________________________________',
      dateField: 'Date: ________________________________',
      signatureField: 'Signature:',
      versionHistory: 'Version history',
      version: 'Version',
      date: 'Date',
      author: 'Author',
      changes: 'Changes',
      currentVersionAuto: 'Current version - Auto-generated',
      initialRevision: 'Initial revision',
      footerRef: 'Reference:',
      footerGenerated: 'Document generated by Cyber-Assistant | ISO 27001:2022 Clause 6.1.3 compliant',
      footerConfidential: 'CONFIDENTIAL DOCUMENT - RESTRICTED DISTRIBUTION - AUDIT USE ONLY'
    },

    // Doc Review PDF export labels
    pdfDocReview: {
      title: 'ISMS Document Review',
      subtitle: 'ISO 27001:2022 - Clauses 4 to 10',
      generatedOn: 'Generated on',
      auditLabel: 'CERTIFICATION AUDIT PACK',
      conforming: 'Conforming',
      partial: 'Partial',
      nonConforming: 'Non-conforming',
      conformityRate: 'Conformity rate',
      clause: 'Clause',
      requirement: 'Requirement',
      status: 'Status',
      responsible: 'Responsible',
      justificationEvidence: 'Justification / Evidence',
      review: 'Review',
      toEvaluate: 'To evaluate',
      evidence: 'Evidence:',
      document: 'Document',
      comments: 'comment(s)',
      lastReview: 'Last:',
      nextReview: 'Next:',
      checklistTitle: 'ISO 27001:2022 Audit Preparation Checklist',
      checklistSubtitle: 'Checkpoints for external auditor',
      documented: 'Documented',
      footerTitle: 'ISO 27001:2022 Certification Audit Pack',
      footerRef: 'Reference:',
      footerGenerated: 'Document generated by Cyber-Assistant',
      footerConfidential: 'CONFIDENTIAL DOCUMENT - AUDIT PREPARATION',
      // Checklist sections
      checkContext: 'Organisation context',
      checkContextItems: 'Internal/external issues documented|Interested parties identified|ISMS scope defined',
      checkLeadership: 'Leadership',
      checkLeadershipItems: 'Information security policy signed and communicated|Roles and responsibilities assigned|Management commitment documented',
      checkPlanning: 'Planning',
      checkPlanningItems: 'Risk assessment process|Risk treatment plan|Statement of Applicability (SoA)|Measurable security objectives',
      checkSupport: 'Support',
      checkSupportItems: 'Resources allocated|Competences documented|Awareness programme|Communication plan|Document control',
      checkOperation: 'Operation',
      checkOperationItems: 'Operational processes documented|Risk assessments up to date|Risk treatment in progress',
      checkPerformance: 'Performance evaluation',
      checkPerformanceItems: 'Internal audit programme|Performance indicators (KPI)|Management review planned|Review minutes',
      checkImprovement: 'Improvement',
      checkImprovementItems: 'Continual improvement process|Nonconformity management|Corrective actions tracked'
    },

    // Excel export headers
    excelHeaders: {
      controlNum: 'Num',
      controlTitle: 'Title',
      controlDescription: 'Description',
      controlCapability: 'Capability',
      controlStatus: 'Status',
      controlLinkedActions: 'Linked actions',
      controlCmm: 'CMM maturity level',
      nis2Function: 'Function',
      nis2Category: 'Category',
      nis2Description: 'Description',
      nis2Status: 'Status',
      nis2Cmm: 'Maturity (derived)',
      nis2Justification: 'Justification',
      soaReference: 'Reference',
      soaTitle: 'Title',
      soaApplicability: 'Applicability',
      soaJustification: 'Justification',
      soaApplicable: 'Applicable',
      soaNonApplicable: 'Not applicable',
      docReference: 'Reference',
      docExigence: 'Requirement',
      docJustification: 'Justification',
      docTool: 'Tool / evidence',
      actionId: 'ID',
      actionTitle: 'Action',
      actionLink: 'Link',
      actionAssets: 'Critical assets',
      actionPriority: 'Priority',
      actionProgress: 'Progress',
      actionDueDate: 'Due date',
      actionOwner: 'Owner',
      actionStatus: 'Status',
      actionComments: 'Comments',
      riskId: 'ID',
      riskTitle: 'Risk',
      riskDescription: 'Description',
      riskImpact: 'Impact',
      riskProbability: 'Probability',
      riskScore: 'Score',
      riskLevel: 'Level',
      riskLinkedActions: 'Linked actions',
      riskAssets: 'Critical assets',
      riskTreatment: 'Treatment',
      riskOwner: 'Owner',
      riskCodirDate: 'Steering committee date',
      riskComments: 'Comments',
      threatTitle: 'Title',
      threatDescription: 'Description',
      threatImpact: 'Impact',
      threatProbability: 'Probability',
      threatScore: 'Score',
      threatLevel: 'Level',
      threatStatus: 'Status',
      threatLinkedActions: 'Linked actions',
      threatAssets: 'Critical assets',
      ncTitle: 'Title',
      ncType: 'Type',
      ncStatus: 'Status',
      ncDetectionDate: 'Detection date',
      ncOwner: 'Owner',
      ncLinkedAudit: 'Linked audit',
      ncLinkedActions: 'Linked actions',
      ncAssets: 'Critical assets',
      ncOperations: 'Operations',
      auditTitle: 'Title',
      auditType: 'Type',
      auditScope: 'Scope',
      auditPlannedDate: 'Planned date',
      auditAuditor: 'Auditor',
      auditStatus: 'Status',
      auditLinkedActions: 'Linked actions',
      auditExecutionDate: 'Execution date',
      auditFindings: 'Findings',
      auditRecommendations: 'Recommendations',
      reviewDate: 'Date',
      reviewParticipants: 'Participants',
      reviewInputs: 'Inputs',
      reviewDecisions: 'Decisions',
      reviewComments: 'Comments',
      stakeholderName: 'Name',
      stakeholderRole: 'Role',
      stakeholderContact: 'Contact',
      stakeholderComments: 'Comments',
      documentLevel: 'Level',
      documentType: 'Type',
      documentTool: 'Tool',
      documentLink: 'Link',
      kpiTitle: 'Title',
      kpiDescription: 'Description',
      kpiComment: 'Comment',
      kpiProgress: 'Progress',
      nis2Domain: 'Domain',
      nis2Pillar: 'Pillar',
      nis2Urgency: 'Urgency',
      nis2Objective: 'Objective',
      nis2Action: 'Action',
      nis2Type: 'Type',
      nis2Phase: 'Phase',
      nis2ProgramStatus: 'Status',
      nis2Owner: 'Owner',
      nis2Progression: 'Progress (%)',
      nis2Budget2026: 'Budget 2026',
      nis2Budget2027: 'Budget 2027',
      nis2Budget2028: 'Budget 2028',
      nis2BudgetTotal: 'Total budget',
      nis2BudgetCategory: 'Budget category',
      soclePillar: 'Pillar',
      socleTitle: 'Title',
      socleSubtitle: 'Subtitle',
      socleElement: 'Element',
      socleOwner: 'Owner',
      assetPriority: 'Priority',
      assetBeneficiary: 'Beneficiary',
      assetProduct: 'Product',
      assetType: 'Type',
      assetImportance: 'Importance',
      assetRto: 'RTO',
      assetRpo: 'RPO',
      assetAvailability: 'Availability',
      assetConfidentiality: 'Conf.',
      assetIntegrity: 'Integrity',
      assetImpact: 'Impact',
      assetDacp: 'DACP sens.',
      assetMfa: 'MFA requirement',
      projectName: 'Project name',
      projectBeneficiary: 'Beneficiary',
      projectReportNum: 'Report number',
      projectRevision: 'Revision number',
      projectDescription: 'Project description',
      projectAnalysisLink: 'Risk analysis link',
      projectCompletionDate: 'Completion date',
      projectStatus: 'Status',
      none: 'None',
      noAsset: 'None',
      na: 'N/A',
      continuousImprovement: 'Continuous improvement',
      projectPriority: 'Priority'
    },

    // Export modal labels
    exportLabels: {
      exportExcelBtn: 'Export Excel',
      cancelBtn: 'Cancel',
      selectSections: 'Select sections to export. Each section will be an Excel tab.',
      selectAll: 'Select all',
      deselectAll: 'Deselect all',
      selectAtLeastOne: 'Select at least one section.',
      exportNotSupported: 'Excel export not supported for this section',
      htmlExportDisabled: 'HTML export is disabled in demonstration mode.',
      pdfExportNis2Disabled: 'PDF export is disabled in demonstration mode.',
      printDisabledDemo: 'Printing is disabled in demonstration mode.',
      preparingExport: 'Preparing export...',
      loadingDependencies: 'Loading dependencies...',
      preparingContent: 'Preparing content...',
      capturingScreen: 'Capturing screen...',
      creatingPdf: 'Creating PDF...',
      downloadingPdf: 'Downloading PDF...',
      pdfSuccess: 'PDF generated successfully!',
      htmlExportSuccess: 'HTML export successful!',
      nis2ModuleNotFound: 'NIS2 module not found',
      nis2NotFound: 'NIS2 module not found.',
      popupBlocked: 'Popup blocked',
      printError: 'NIS2 print failed. Try again after reloading the page.',
      preparingPdf: 'Preparing PDF...',
      pdfUnavailable: 'PDF generation unavailable.',
      generation: 'Generating...',
      programNIS2: 'Cybersecurity Budget',
      exportedOn: 'Exported on:',
      normReference: 'Cyber-Assistant - ISO27001 & 27002:2022 Standard',
      htmlStandaloneExport: 'Standalone HTML export - Created with Cyber-Assistant',
      htmlNis2Content: 'This file contains all styles and data for the Cybersecurity Budget section'
    },

    // Default templates and reference data
    templates: {
      outOfPhase: 'Unplanned',
      chapter4: '4 - Context of the organisation',
      chapter5: '5 - Leadership',
      chapter6: '6 - Planning',
      chapter7: '7 - Support',
      chapter8: '8 - Operation',
      chapter9: '9 - Performance evaluation',
      chapter10: '10 - Improvement',
      pillar1Title: 'Govern (GV)',
      pillar1Subtitle: 'Governance and cyber policy',
      pillar2Title: 'Identify (ID)',
      pillar2Subtitle: 'Assets, risks and improvement',
      pillar3Title: 'Protect (PR)',
      pillar3Subtitle: 'Access, data and infrastructure',
      pillar4Title: 'Detect (DE)',
      pillar4Subtitle: 'Monitoring and analysis',
      pillar5Title: 'Respond (RS)',
      pillar5Subtitle: 'Incident management and communication',
      pillar6Title: 'Recover (RC)',
      pillar6Subtitle: 'Recovery and crisis communication',
      defaultOwner: 'Project manager: to be assigned',
      domainGovernance: 'Governance & accountability',
      domainRiskMgmt: 'Risk management (ISMS)',
      domainIncident: 'Incident management & notification',
      domainBcpDrp: 'Business continuity & crisis management (BCP/DRP)',
      domainSupplyChain: 'Supply chain security',
      domainDevSec: 'Security in acquisition, development & maintenance',
      domainTraceability: 'Traceability and auditability',
      domainVulnerability: 'Vulnerability management',
      domainAwareness: 'Awareness & training',
      domainCryptography: 'Cryptography',
      domainPhysical: 'Physical security',
      domainAccessMgmt: 'Information systems access management',
      budgetTotal: 'Total compliance budget',
      budget2026: 'Budget 2026',
      budget2027: 'Budget 2027',
      budget2028: 'Budget 2028',
      budgetInfra: 'Infrastructure budget',
      budgetSSI: 'Cybersecurity budget',
      budgetEngaged: 'Committed budget',
      globalProgress: 'Overall progress',
      completedActions: 'Completed actions',
      maturityAssetMgmt: 'Asset management',
      maturityOpEnv: 'Business environment',
      maturityGovernance: 'Governance',
      maturityRiskEval: 'Risk assessment',
      maturityRiskStrategy: 'Risk management strategy',
      maturitySupplyChain: 'Supply chain risk management',
      maturityIAM: 'Identity management, authentication, access control',
      maturityAwareness: 'Awareness and training',
      maturityDataSec: 'Data security',
      maturityInfoProtection: 'Information protection processes and procedures',
      maturityMaintenance: 'Maintenance',
      maturityProtectionTech: 'Protective technology',
      maturityAnomalies: 'Anomalies and events',
      maturityMonitoring: 'Security continuous monitoring',
      maturityDetection: 'Detection processes',
      maturityResponsePlan: 'Response planning',
      maturityComms: 'Communications',
      maturityAnalysis: 'Analysis',
      maturityMitigation: 'Mitigation',
      maturityImprovements: 'Improvements',
      maturityRecoveryPlan: 'Recovery planning',
      domainAssetRisk: 'Assets and risk assessment',
      domainDataInfra: 'Data and infrastructure security'
    },


    // Setup wizard (non-demo first launch)
    setup: {
      langHint: 'You can change this choice in settings.',
      welcomeTitle: 'Welcome to Cyber-Assistant',
      welcomeSubtitle: 'Your ISMS management tool compliant with ISO 27001:2022 and NIS2',
      featureCompliance: 'Manage your compliance in a single tool',
      featureDashboards: 'Dashboards',
      featureDashboardsDesc: 'Track your indicators and maturity level',
      featureExports: 'Exports & reports',
      featureExportsDesc: 'Generate PDF, Excel and JSON in one click',
      importTitle: 'Import data',
      importSubtitle: 'You can import a previously exported JSON file.',
      importYes: 'Import a JSON file',
      importYesDesc: 'Restore data from a backup',
      importNo: 'Start without data',
      importNoDesc: 'The 93 ISO 27002 controls will be pre-loaded',
      importHint: 'You can import or export data at any time via Settings.',
      importSuccess: 'File imported successfully',
      importError: 'Error: invalid JSON file or unrecognized format.',
      frameworksTitle: 'Security frameworks',
      frameworksSubtitle: 'Choose which frameworks to enable',
      frameworksHint: 'Change in Settings > Frameworks',
      frameworksLocked: 'Required',
      frameworksControls: 'controls',
      btnPrevious: 'Previous',
      btnNext: 'Next',
      btnStart: 'Start'
    },

    // Risk Analysis Module
    riskAnalysis: {
      title: 'Security Risk Analysis',
      subtitle: 'Perform a pragmatic risk analysis aligned with ISO 27005.',
      importAnalyse: 'Import Analysis',
      perimeterRequired: 'The perimeter is required.',
      newAnalysis: 'New analysis',
      statusDraft: 'Draft',
      statusComplete: 'Complete',
      noAnalyses: 'No risk analyses.',
      noAnalysesHint: 'Create your first analysis to assess and manage your risks.',
      createFirst: 'Create an analysis',
      confirmDelete: 'Delete this risk analysis?',
      duplicated: 'Analysis duplicated.',
      deleted: 'Analysis deleted.',
      saved: 'Analysis saved.',
      listColumns: {
        title: 'Title',
        created: 'Created',
        status: 'Status',
        score: 'Score',
        light: 'Verdict',
        actions: 'Actions'
      },
      moreActions: 'More actions',
      steps: {
        context: 'Context',
        cia: 'CIA',
        continuity: 'Continuity',
        architecture: 'Documentation',
        controls: 'Controls',
        risks: 'Risks',
        mesures: 'Measures & Review',
        results: 'Results',
        exportPdf: 'PDF Export',
        preview: 'Preview'
      },
      mesures: {
        subtitle: 'Define your key recommendations and schedule the next review.'
      },
      nav: {
        previous: 'Previous',
        next: 'Next',
        finish: 'Finish',
        backToList: 'Back to list'
      },
      context: {
        titleField: 'Analysis title',
        perimeter: 'Scope',
        perimeterHint: 'Describe the scope covered by this analysis.',
        description: 'Description',
        stakeholders: 'Stakeholders',
        stakeholdersHint: 'Separate with commas.',
        sourceFramework: 'Risk catalog',
        sourceFrameworkNone: '— Not specified —',
        sourceFrameworkHint: 'Feeds the risks proposed at the Risks step. “Built-in catalog” = entries provided; otherwise the method is simply cited in the report.',
        analysisMethod: 'Analysis method',
        analysisMethodHint: 'Preselects the matching impact matrix; the matrix choice remains editable.',
        methodDefault: 'Cyber-Assistant pragmatic approach',
        methodEbios: 'EBIOS RM (ISO 27005 compatible)',
        methodNist: 'NIST SP 800-30',
        catalogBuiltin: 'Cyber-Assistant generic catalog',
        catalogIntegrated: 'built-in catalog',
        catalogLegacy: 'cited in the report',
        ebiosCouples: 'Risk source × targeted objective pairs (EBIOS RM, workshop 2)',
        ebiosCouplesHint: 'Recommended selection: 3 to 6 pairs (ANSSI guide v1.5). Included in the preview and the report, with no effect on scoring.',
        ebiosCouplesShort: 'Risk sources (EBIOS RM)',
        personalData: 'Personal data processed',
        dataSensitivity: 'Data sensitivity',
        sensitivityLow: 'Low',
        sensitivityMedium: 'Medium',
        sensitivityHigh: 'High',
        subtitle: 'Describe the context and scope of the analysis.',
        perimeterPlaceholder: 'E.g.: Stock management web app, associated servers and databases.',
        descriptionPlaceholder: 'E.g.: Analysis conducted as part of ISO 27001 compliance.'
      },
      identity: {
        sectionTitle: 'Project identity',
        encoder: 'Prepared by (Last name - First name)',
        validator: 'Approved by (Last name - First name)',
        controlBody: 'Oversight body name',
        beneficiary: 'Beneficiary/client name',
        projectManager: 'Project manager name'
      },
      cia: {
        title: 'CIA Classification',
        subtitle: 'Assess Confidentiality, Integrity and Availability requirements.',
        confidentiality: 'Confidentiality',
        integrity: 'Integrity',
        availability: 'Availability',
        justification: 'Justification',
        justificationHint: 'Explain the classification choices.',
        level1: 'Low',
        level2: 'Medium',
        level3: 'High',
        level1Desc: 'Limited impact in case of compromise.',
        level2Desc: 'Significant impact on operations.',
        level3Desc: 'Critical impact, severe consequences.'
      },
      gdpr: {
        title: 'GDPR — Data Protection',
        subtitle: 'Assess implications for personal data protection.',
        personalData: 'Presence of personal data',
        personalDataExplain: 'Any information relating to an identified or identifiable natural person (name, email, IP address, social security number, etc.) within the meaning of Article 4 of the GDPR.',
        sensitiveData: 'Presence of sensitive data',
        sensitiveDataExplain: 'Data revealing racial/ethnic origin, political opinions, religious beliefs, trade union membership, genetic/biometric data, health data, sex life (GDPR Article 9). Processing is prohibited except in specific cases.',
        processingRegistry: 'Processing registry completed for this project?',
        processingRegistryExplain: 'The record of processing activities (GDPR Article 30) is mandatory for organisations with more than 250 employees, or in case of regular processing of sensitive data.',
        registryYes: 'Yes',
        registryNo: 'No',
        registryPlanned: 'Planned'
      },
      continuity: {
        title: 'Continuity (RTO/RPO)',
        subtitle: 'Define recovery and tolerable data loss objectives.',
        rtoLabel: 'RTO (hours)',
        rtoHint: '≤4h = very strict, 8h = strict, 24h = standard, 72h = flexible',
        rpoLabel: 'RPO (hours)',
        rpoHint: '≤1h = very strict, 6h = strict, 24h = standard, 72h = flexible',
        strict: 'Very strict',
        moderate: 'Strict',
        standard: 'Standard',
        relaxed: 'Flexible',
        commentLabel: 'Continuity comment',
        commentPlaceholder: 'Justification of RTO/RPO targets, business constraints...'
      },
      architecture: {
        title: 'Documentation',
        subtitle: 'Technical documentation and identity management.',
        techArchTitle: 'Technical architecture',
        hosting: 'Hosting',
        hostingOnprem: 'On-premise',
        hostingCloud: 'Cloud',
        hostingHybrid: 'Hybrid',
        internetExposed: 'Internet exposed',
        iamTitle: 'Identity management (IAM)',
        sso: 'SSO (Single Sign-On)',
        mfa: 'MFA (Multi-factor authentication)',
        adminSeparation: 'Administrator account separation',
        architectureDocTitle: 'Architecture',
        architectureDoc: 'Architecture document completed'
      },
      controls: {
        title: 'Controls Questionnaire',
        subtitle: 'Assess the maturity of your controls across 8 operational domains.',
        implemented: 'Implemented',
        partial: 'Partial',
        planned: 'Planned',
        toVerify: 'To verify',
        plannedAutoComment: '[Planned] Implementation scheduled — justification: ',
        plannedBanner: '{count} control(s) marked as "Planned" — The current score is conditional on their effective implementation.',
        plannedBadge: 'incl. planned',
        plannedControlsTitle: 'Planned controls (conditional)',
        plannedDisclaimer: 'The maturity scores above include {count} control(s) marked as "Planned". The final score is conditional on their effective implementation. A reassessment is recommended after their deployment.',
        plannedAssumption: 'Note: {count} control(s) are marked as "Planned". Maturity scores include these controls conditionally. The actual risk level will depend on their effective implementation within the planned timeframe.',
        importAnalyse: 'Import',
        exportAnalyseFile: 'Export .analyse',
        importAnalyseSuccess: 'Analysis imported successfully.',
        importAnalyseError: 'Invalid .analyse file.',
        importAnalyseSummary: 'Summary of the analysis to import:',
        importConfirm: 'Import this analysis?',
        importSource: 'Source',
        imported: 'imported',
        analyseExported: '.analyse file exported.',
        no: 'No',
        na: 'N/A',
        comment: 'Comment',
        answeredOf: 'of',
        statusLabel: 'Status',
        warningTitle: 'Warning — Planned Controls',
        improvedWarning: 'The risk analysis results are contingent on the planned measures and controls being correctly implemented — it will be essential to perform a risk analysis prior to launching the project in production.',
        pdfControls: 'Measures & Controls'
      },
      risks: {
        title: 'Risks',
        subtitle: 'Select and assess applicable risks.',
        selectFromCatalog: 'Select risks from the catalog',
        addCustom: 'Add custom risk',
        customTitle: 'Custom risk',
        customTitlePlaceholder: 'Risk name',
        deleteCustom: 'Delete this risk',
        confirmDeleteCustom: 'Delete this custom risk?',
        customScenario: 'Describe the risk scenario',
        likelihood: 'Likelihood',
        impact: 'Impact',
        inherentScore: 'Inherent score',
        residualScore: 'Residual score',
        treatment: 'Treatment',
        treatReduce: 'Reduce',
        treatAccept: 'Accept',
        treatTransfer: 'Transfer',
        treatAvoid: 'Avoid',
        treatNa: 'Not applicable (excluded from scoring)',
        naJustification: 'Non-applicability justification',
        naJustifPlaceholder: 'Why this risk does not apply (ISO 27001 trace, printed in the report)',
        naMissing: 'Missing justification — required by ISO 27001 §6.1.3.d',
        notes: 'Notes',
        likelihoodLevels: {
          1: 'Unknown',
          2: 'Very low',
          3: 'Low',
          4: 'Medium',
          5: 'High'
        },
        impactLevels: {
          1: 'Insignificant',
          2: 'Minor',
          3: 'Significant',
          4: 'Serious',
          5: 'Critical'
        },
        owner: 'Risk Owner',
        ownerPlaceholder: 'Name of responsible person'
      },
      results: {
        title: 'Results & Recommendations',
        subtitle: 'Automatic summary of your risk analysis.',
        globalLight: 'Overall verdict',
        globalScore: 'Global score',
        posture: 'Control posture',
        keyPoints: 'Key points',
        domainSynthesis: 'Domain summary',
        riskRegister: 'Risk register',
        recommendations: 'Recommendations',
        maturity: 'Maturity',
        computing: 'Calculating...',
        noRisks: 'No risks selected.',
        scoreLabels: {
          1: 'Very good',
          2: 'Good',
          3: 'Acceptable',
          4: 'Concerning',
          5: 'Critical'
        },
        riskLevel: 'Level',
        tabSynthese: 'Summary',
        tabRisques: 'Risks',
        tabRecommandations: 'Recommendations',
        tabMesures: 'Measures & Review'
      },
      filters: {
        search: 'Search...',
        status: 'Status',
        statusAll: 'All statuses',
        statusDraft: 'Draft',
        statusComplete: 'Complete',
        sortDateDesc: 'Most recent',
        sortDateAsc: 'Oldest',
        sortTitle: 'Title A-Z',
        sortScore: 'Score ↓'
      },
      reviewDate: {
        title: 'Next Review',
        enable: 'Enable next review date',
        overdue: 'Overdue',
        upcoming: 'Upcoming',
        column: 'Review'
      },
      exportPdf: {
        title: 'PDF Export',
        subtitle: 'Generate the risk analysis report in PDF format.',
        generatePdf: 'Generate PDF',
        generating: 'Generating...',
        sections: 'The report will contain:',
        sectionList: {
          cover: 'Cover page',
          executive: 'Executive summary',
          context: 'Context & scope',
          cia: 'CIA Classification & RTO/RPO',
          architecture: 'Documentation',
          controls: 'Measures & Controls',
          domains: 'Domain summary',
          risks: 'Risk register',
          recommendations: 'Recommendations',
          assumptions: 'Assumptions & limitations',
          spot: 'Security analysis',
          keyRecommendations: 'Priority mitigation measures',
          methodology: 'Methodological Framework'
        },
        analyseTitle: 'Export .analyse',
        analyseDesc: 'Exports the complete analysis in reimportable JSON format. Includes linked impact matrix and risk thresholds.'
      },
      priority: { P1: 'P1 - Critical', P2: 'P2 - Important', P3: 'P3 - Recommended' },
      effort: { S: 'Small', M: 'Medium', L: 'Large' },
      light: { green: 'Green', yellow: 'Yellow', red: 'Red' },
      domains: {
        IAM: 'Identity & Access',
        SDLC: 'Secure Development',
        VULN: 'Vulnerabilities',
        LOG: 'Logs & Detection',
        DATA: 'Data Protection',
        INFRA: 'Infrastructure',
        NETCRYPTO: 'Network & Crypto',
        BCP: 'Continuity'
      },
      spot: {
        title: 'Security Assessment Results',
        inherentCriticality: 'Asset criticality (inherent risk)',
        measuresPercent: 'Measures implementation level',
        residualScore: 'Residual risk level',
        residualPlusOpen: 'Residual risk + open risk',
        inherentCriticalityHint: 'Evaluates the intrinsic exposure level of the asset, based on the CIA classification, Internet exposure and data sensitivity.',
        measuresPercentHint: 'Average implementation percentage of security controls across all 8 evaluated domains.',
        residualScoreHint: 'Risk level after applying security measures. Based on the worst residual score among identified risks.',
        residualPlusOpenHint: 'Residual score increased by open risks not yet addressed (known vulnerabilities, pending actions).',
        openRiskAdj: 'Open risk adjustment',
        openRiskHint: 'Add a point if known risks are not yet addressed (e.g. identified vulnerabilities, pending actions). This increases the final residual score.',
        openRiskNone: '0 - No open risks',
        openRiskModerate: '1 - Some open risks',
        openRiskSignificant: '2 - Significant open risks',
        avisCommentLabel: 'Assessor comments',
        avisCommentHint: 'Add your observations or nuances about the assessment result (e.g. specific context, areas of concern).',
        avisOverrideLabel: 'Manual verdict override',
        avisOverrideHint: 'If the automatically calculated verdict does not reflect reality (e.g. external factors), you can override it manually. Leave "—" to keep the automatic calculation.',
        avisOverrideActive: 'The automatic verdict was: ',
        avisOverrideJustifLabel: 'Verdict override justification',
        avisOverrideJustifHint: 'Explain why you are overriding the calculated verdict (required if an override is applied).',
        residualOverrideLabel: 'Manual residual score override',
        residualOverrideHint: 'If the automatically calculated residual score does not reflect reality, you can replace it manually. Leave "—" to keep the automatic calculation.',
        residualOverrideAuto: 'automatic calculation',
        residualOverrideJustifLabel: 'Override justification',
        residualOverrideJustifHint: 'Explain why you are overriding the calculated score (required if an override is applied).',
        residualCorrectedLabel: 'Residual risk comment',
        residualCorrectedHint: 'Free comment on the residual risk level after security measures are taken into account.',
        avisLabels: {
          green: 'Favorable assessment',
          yellow: 'Conditional approval — pending key recommendations',
          red: 'Unfavorable assessment'
        }
      },
      finalRecs: {
        title: 'Key recommendations',
        mitigationTitle: 'Priority mitigation measures',
        mitigationSubtitle: 'Priority actions identified to reduce risk level',
        add: 'Add a key recommendation',
        titlePlaceholder: 'Recommendation title',
        detailsPlaceholder: 'Details, actions, context...',
        statusTodo: 'To do',
        statusDone: 'Done'
      },
      preview: {
        reportTitle: 'Information Security Risk Analysis - Cybersecurity',
        reportNumber: 'Report number',
        reportDate: 'Report date',
        treatmentDistribution: 'Treatment distribution',
        riskLevel: 'Risk level',
        riskMatrix: 'Risk matrix',
        infoText: 'Report preview. Review the information before exporting to PDF.',
        toc: 'Contents',
        assumptions: 'Assumptions'
      },
      impactMatrix: {
        selectMatrix: 'Impact matrix',
        selectHint: 'Choose a matrix to assess each risk\'s impact across multiple dimensions (e.g. financial, reputation, legal…). If none is selected, impact will be rated on a simple 1-5 scale.',
        noMatrix: 'None (manual assessment 1-5)',
        evaluateVia: 'Evaluate via matrix',
        evaluateHint: 'Use the impact matrix to assess this risk across multiple dimensions',
        modalTitle: 'Impact assessment',
        modalHint: 'For each dimension, select the impact level that best fits this risk. The descriptive text helps you choose the right level. The overall impact is calculated automatically (maximum of selected levels).',
        computedImpact: 'Overall impact',
        computedMethod: 'Calculation method',
        aggregationMax: 'the maximum level among evaluated dimensions',
        apply: 'Apply',
        cancel: 'Cancel',
        evaluated: 'dim. evaluated',
        matrixNotFound: 'Matrix not found',
        matrixUsed: 'Impact matrix used',
        configureHint: 'You can configure impact matrices in the dedicated section to evaluate risks across multiple dimensions.'
      },
      pdfTitle: 'Information Security Risk Analysis',
      pdfSubject: 'Risk analysis report',
      pdfUntitled: 'Untitled',
      pdfReport: 'Report',
      pdfDate: 'Date',
      pdfStatus: 'Status',
      pdfComplete: 'Complete',
      pdfDraft: 'Draft',
      pdfGlobalScore: 'Global score',
      pdfControlPosture: 'Control posture',
      pdfRiskCount: 'Identified risks',
      pdfConfidential: 'Confidential document',
      pdfGeneratedBy: 'Generated by Cyber-Assistant',
      pdfTOC: 'Table of Contents',
      pdfSecurityResults: 'Security Assessment Results',
      pdfInherentCriticality: 'Asset criticality (inherent risk)',
      pdfMeasuresImpl: 'Measures implementation level',
      pdfResidualLevel: 'Residual risk level',
      pdfResidualPlusOpen: 'Residual + open risk',
      pdfSecurityComment: 'Security assessment comment',
      pdfResidualComment: 'Adjusted residual risk comment',
      pdfExecSummary: 'Executive Summary',
      pdfGlobalLight: 'Overall verdict',
      pdfContext: 'Context & Scope',
      pdfPerimeter: 'Scope',
      pdfDescription: 'Description',
      pdfStakeholders: 'Stakeholders',
      pdfSourceFramework: 'Source framework',
      pdfPersonalData: 'Personal data',
      pdfSensitivity: 'Sensitivity',
      pdfImpactMatrix: 'Impact matrix',
      pdfCIA: 'CIA Classification & Continuity',
      pdfConfidentiality: 'Confidentiality',
      pdfIntegrity: 'Integrity',
      pdfAvailability: 'Availability',
      pdfJustification: 'Justification',
      pdfArchitecture: 'Documentation',
      pdfHosting: 'Hosting',
      pdfInternetExposed: 'Internet exposed',
      pdfAdminSep: 'Admin separation',
      pdfDomainSynthesis: 'Domain Synthesis',
      pdfDomain: 'Domain',
      pdfMaturity: 'Maturity',
      pdfLight: 'Verdict',
      pdfRiskRegister: 'Risk Register',
      pdfRisk: 'Risk',
      pdfThreat: 'Threat',
      pdfScenario: 'Scenario',
      pdfMethodTitle: 'Scoring method',
      pdfMethodInherent: 'Inherent risk = likelihood (1-5) × impact (1-5), i.e. 1 to 25.',
      pdfMethodResidual: 'Residual risk = inherent reduced by up to 40% based on the average maturity of the control domains linked to the risk, then increased (+1) by: Internet exposure (adversarial events only), high C/I/A classification, RTO ≤ 8h or RPO ≤ 6h.',
      pdfMethodNa: 'Risks marked “not applicable” remain listed with their justification but are excluded from scores and the global light; a control domain that is entirely N/A is excluded from averages.',
      pdfMethodThresholds: 'Levels (lights) come from the active risk scale, viewable and editable under “Risk thresholds” in the Risk Analysis module.',
      pdfInherent: 'Inh.',
      pdfResidual: 'Res.',
      pdfTreatment: 'Treatment',
      pdfImpactDetail: 'Impact assessment detail',
      pdfMatrix: 'matrix',
      pdfKeyRecs: 'Key Recommendations',
      pdfDone: 'Done',
      pdfTodo: 'To do',
      pdfRecTitle: 'Title',
      pdfRecDetails: 'Details',
      pdfRecStatus: 'Status',
      pdfRecommendations: 'Recommendations',
      pdfPriority: 'Priority',
      pdfRecommendation: 'Recommendation',
      pdfEffort: 'Effort',
      pdfRationale: 'Rationale',
      pdfAssumptions: 'Assumptions & Limitations',
      pdfAssumptionsText1: 'This analysis reflects the posture at the date of completion. Scores are indicative and do not replace a formal audit.',
      pdfAssumptionsText2: 'Recommendations are automatically generated based on the answers provided.',
      pdfEncoder: 'Prepared by',
      pdfValidator: 'Approved by',
      pdfControlBody: 'Oversight body',
      pdfBeneficiary: 'Beneficiary/Client',
      pdfProjectManager: 'Project manager',
      pdfArchitectureDoc: 'Architecture document',
      pdfGenerated: 'PDF generated',
      syncToProject: 'Sync to Project Risks',
      syncSuccess: 'Project risk created successfully.',
      syncAlreadySynced: 'Project risk updated.',
      syncDuplicateTitle: 'Duplicate detected',
      syncDuplicateMsg: 'A project risk with the same name already exists. What would you like to do?',
      syncOptionNew: 'Create new',
      syncOptionOverwrite: 'Overwrite existing',
      syncOptionCancel: 'Cancel',
      thresholds: {
        title: 'Risk Thresholds',
        subtitle: 'Probability × Severity matrix with risk levels',
        new: 'New',
        newName: 'New threshold',
        duplicate: 'Duplicate',
        delete: 'Delete',
        activate: 'Activate',
        active: 'Active',
        editName: 'Name',
        editDescription: 'Description',
        riskLevels: 'Risk levels',
        matrix: 'Probability × Severity Matrix',
        matrixTitle: 'Risk Matrix',
        probability: 'Probability',
        gravity: 'Severity',
        clickToChange: 'Click a cell to change its level',
        confirmDelete: 'Delete this risk threshold?',
        levels: {
          minimum: 'Minimum',
          faible: 'Low',
          modere: 'Moderate',
          eleve: 'High',
          tresEleve: 'Very High'
        }
      },
      methodology: {
        title: 'Methodological Framework',
        objective: 'Objective',
        objectiveText: 'This analysis aims to identify, assess and treat information security risks in alignment with the guidance of ISO/IEC 27005:2022.',
        normativeRef: 'Normative Reference',
        normativeRefText: 'ISO/IEC 27005:2022 — Information technology — Information security risk management. This standard provides guidelines for the information security risk management process within an ISMS (ISO/IEC 27001).',
        processTitle: '8-Step Analysis Process',
        step1: 'Context & scope — Definition of scope, stakeholders and evaluation criteria',
        step2: 'CIA & GDPR Classification — Assessment of confidentiality, integrity, availability and GDPR impact',
        step3: 'Business continuity — RTO/RPO objectives and business constraints',
        step4: 'Documentation — Technical architecture, identity management, documentation',
        step5: 'Measures & Controls — Assessment of 24 security measures across 8 domains',
        step6: 'Risk identification — Selection and assessment of risk scenarios',
        step7: 'Results & evaluation — Automated synthesis, scoring, recommendations',
        step8: 'Risk treatment — Treatment decisions (reduce, accept, transfer, avoid)',
        scoringTitle: 'Scoring Formula',
        scoringFormula: 'Residual Risk = Likelihood × Impact × (1 − Controls Maturity × 0.40)',
        scoringAdjust: 'Contextual adjustments: +1 if Internet exposed, +1 if high CIA, +1 if strict RTO/RPO.',
        scaleTitle: 'Risk Scale',
        pdcaTitle: 'PDCA Cycle',
        pdcaPlan: 'Establish context, identify risks',
        pdcaDo: 'Implement treatment measures',
        pdcaCheck: 'Monitor, control, reassess',
        pdcaAct: 'Improve, update analysis'
      }
    },

    // Impact Matrices
    impactMatrices: {
      title: 'Impact Matrices',
      subtitle: 'Define and customise your impact matrices for risk analysis.',
      listTitle: 'Matrices',
      newMatrix: 'New',
      newMatrixName: 'New matrix',
      active: 'Active',
      activate: 'Activate',
      duplicate: 'Duplicate',
      delete: 'Delete',
      copy: 'copy',
      selectOrCreate: 'Select or create a matrix',
      generalInfo: 'General information',
      matrixName: 'Name',
      matrixDescription: 'Description',
      levelsTitle: 'Severity levels',
      addLevel: 'Add',
      levelLabel: 'Label',
      levelBand: 'Band',
      levelPriority: 'Priority',
      levelCapability: 'Response capability',
      newLevelLabel: 'Level',
      maxLevels: 'Maximum 5 levels (aligned with the 1-5 risk scoring scale).',
      dimensionsTitle: 'Dimensions',
      addDimension: 'Add',
      newDimensionLabel: 'Dimension',
      gridTitle: 'Impact grid',
      cardLevels: 'levels',
      cardDimensions: 'dimensions',
      dimension: 'Dimension',
      aggregationTitle: 'Aggregation method',
      aggregationMethod: 'Global impact calculation',
      aggregationNotes: 'Notes',
      confirmDelete: 'Delete this matrix?',
      toastCreated: 'Matrix created',
      toastDuplicated: 'Matrix duplicated',
      toastDeleted: 'Matrix deleted',
      toastActivated: 'Matrix activated',
      toastCannotDeleteLast: 'Cannot delete the last matrix'
    },

    audit: {
      title: 'Audit Trail',
      localUser: 'Local user',
      actionAdd: 'Added',
      actionEdit: 'Modified',
      actionDelete: 'Deleted',
      actionImport: 'Import',
      actionExport: 'Export',
      actionConfig: 'Configuration',
      columnDate: 'Date / Time',
      columnUser: 'User',
      columnAction: 'Action',
      columnCategory: 'Category',
      columnTarget: 'Element',
      columnDetails: 'Details',
      emptyState: 'No recorded actions',
      clearHistory: 'Clear history',
      clearConfirm: 'Delete all audit trail history?',
      activityTitle: 'Recent activity',
      noActivity: 'No recent activity',
      catControls: 'Controls',
      catActions: 'Actions',
      catRisks: 'Risks',
      catAudits: 'Audits',
      catNc: 'Non-conformities',
      catReviews: 'Reviews',
      catKpis: 'KPIs',
      catDocuments: 'Documents',
      catStakeholders: 'Stakeholders',
      catThreats: 'Threats',
      catRiskAnalysis: 'Risk analysis',
      catProjectRisks: 'Project risks',
      catCriticalAssets: 'Critical assets',
      catImpactMatrices: 'Matrices',
      catNis2: 'NIS2',
      catSoa: 'SOA',
      catSettings: 'Settings',
      catSystem: 'System',
      filterAll: 'All',
      clearTitle: 'Clear log',
      importFile: 'File import',
      logoRemoved: 'Logo removed',
      logoUploaded: 'Logo uploaded',
      passwordChanged: 'Password changed'
    },

    // Wizard
    wizard: {
      serverCheck: 'Server check',
      serverCheckSub: 'Checking service availability',
      serverReady: 'Server ready',
      serverError: 'Issue detected',
      checkSync: 'Sync endpoint',
      checkUsers: 'Users endpoint',
      checkSysInfo: 'System information',
      checkLicense: 'License status',
      checkServer: 'Server configuration',
      recheck: 'Re-check',
      noWriteAccess: 'No write access',
      lowDiskSpace: 'Insufficient disk space',
      sysInfoUnavailable: 'System info unavailable',
      freeSpace: 'free',
      // Runtime detection
      checkRuntime: 'Backend runtime',
      runtimeNode: 'Node.js',
      runtimePHP: 'Apache/PHP',
      runtimeDetected: 'Detected: {runtime}',
      // Network security slide
      networkSecTitle: 'Network security',
      networkSecSub: 'Important information',
      networkSecWarning: 'This application is designed for local network (LAN/intranet) use only.',
      networkSecExplain: 'Cyber-Assistant includes authentication and access controls, but is not designed for exposure on the public internet. If the application is hosted on a local network, it is essential to restrict access at the network level (firewall, VLAN, VPN) as it does not have sufficient protections against attacks from the internet.',
      networkSecRecTitle: 'Recommended precautions:',
      networkSecRec1: 'Deploy behind a corporate firewall or VPN',
      networkSecRec2: 'Restrict access to your internal network only',
      networkSecRec3: 'Use HTTPS with a valid TLS certificate',
      networkSecRec4: 'Never expose the application to the public internet',
      networkSecRec5: 'Regularly update the server environment',
      networkSecRec6: 'Restrict application access to authorized users only',
      networkSecRec7: 'Do not leave the application openly accessible on the network without authentication',
      networkSecAck: 'I commit to restricting access to this application to authorized users only and to not exposing it openly on the network',
      adminSetup: 'Administrator account',
      trialExplain: '14-day free trial to test server mode.',
      trialExpiry: 'Changes will be blocked after expiration.',
      // Local password step
      localPwdTitle: 'Password protection',
      localPwdSub: 'Optional but recommended',
      localPwdExplain: 'Set a password to protect access to edit mode. This password prevents accidental changes to your data.',
      localPwdLabel: 'Password',
      localPwdPlaceholder: 'Minimum 18 characters',
      localPwdConfirmLabel: 'Confirm password',
      localPwdConfirmPlaceholder: 'Repeat the password',
      localPwdHint: 'You can skip this step and set up a password later in Settings.',
      localPwdWeak: 'The password does not meet the required criteria.',
      localPwdMismatch: 'Passwords do not match.',
      // Transversality slide
      transTitle: 'Cross-framework mapping',
      transSub: 'One effort, multiple compliances',
      transTimeSave: 'Time savings',
      transTimeSaveDesc: 'Document an ISO 27002 control: it automatically covers corresponding NIS2, CyFun, and NIST CSF requirements.',
      transConsistency: 'Guaranteed consistency',
      transConsistencyDesc: 'Automatic mappings between frameworks ensure end-to-end consistency, with no re-entry or omissions.',
      transVisibility: 'Unified visibility',
      transVisibilityDesc: 'A single dashboard reflects your compliance across all enabled frameworks.',
      // Server promo slide (local only)
      serverPromoTitle: 'Server version available',
      serverPromoSub: 'Collaborate as a team on your ISMS',
      serverPromoCoEdit: 'Real-time co-editing',
      serverPromoCoEditDesc: 'Work simultaneously with your team on the same ISMS with intelligent locking.',
      serverPromoUsers: 'User management',
      serverPromoUsersDesc: 'Administrator and editor roles, up to 100 users with secure authentication.',
      serverPromoSync: 'Automatic synchronization',
      serverPromoSyncDesc: 'Centralized data on the server, accessible from any connected workstation.',
      serverPromoLink: 'Learn more at cyber-assistant.com',
      // NIS2 assurance level step
      nis2LevelTitle: 'NIS2 assurance level',
      nis2LevelSub: 'Set the CyFun level for your organisation',
      nis2LevelAdviceLabel: 'Tip:',
      nis2LevelAdvice: 'Before choosing, we recommend using the self-identification tool from the',
      nis2LevelAdvice2: 'to determine your NIS2 assurance level.',
      nis2LevelAdvice3: 'This choice sets the number of requirements to assess and the compliance thresholds.',
      nis2LevelSelect: 'Select the NIS2 assurance level for your organisation:',
      nis2Requirements: 'requirements',
      nis2KeyMeasures: 'key measures',
      nis2LevelBasicDesc: 'For organisations starting their NIS2 journey. Compliance threshold: 2.5/5.',
      nis2LevelImportantDesc: 'For important entities under NIS2. Compliance threshold: 3/5.',
      nis2LevelEssentialDesc: 'For essential entities under NIS2. Compliance threshold: 3.5/5 + per-category minimum.',
      nis2Lang: 'Controls language:',
      nis2LangHint: 'The language of NIS2 requirement titles and descriptions.',
      // ReCyF / NIS2 referential (combined step)
      nis2SetupTitle: 'NIS2 framework',
      nis2SetupSub: 'Choose the framework and level matching your organisation',
      nis2RefSelect: 'Which NIS2 framework do you want to use?',
      nis2RefBEDesc: 'Belgian framework (CCB) based on NIST CSF 2.0. Basic / Important / Essential levels, maturity-based assessment.',
      nis2RefFRDesc: 'Cyber France Framework (ANSSI). 20 security objectives, Important / Essential Entity degrees, acceptable means of compliance.',
      recyfAdvice: 'The degree depends on your entity\'s NIS2 qualification: Important Entity (IE) or Essential Entity (EE).',
      recyfObj115: 'objectives 1 to 15',
      recyfObj120: 'objectives 1 to 20',
      recyfDegreeSelect: 'Select your entity degree (ReCyF):',
      recyfEIDesc: 'For important entities under NIS2.',
      recyfEEDesc: 'For essential entities (incl. risk approach, audit, supervision).',
      // Server capabilities slide (server only)
      serverCapTitle: 'Server features',
      serverCapSub: 'This server version enables\u2026',
      serverCapCoEdit: 'Co-editing',
      serverCapCoEditDesc: 'Work simultaneously with automatic per-section locking.',
      serverCapUsers: 'User management',
      serverCapUsersDesc: 'Admin and editor roles, up to 100 users with secure sessions.',
      serverCapSync: 'Synchronization',
      serverCapSyncDesc: 'Centralized data automatically synchronized across all workstations.',
      serverCapLock: 'Locking',
      serverCapLockDesc: 'Heartbeat system preventing editing conflicts between collaborators.',
      // === CSI-MCP === added server capabilities + local-edition showcase slide
      serverCapEntities: 'Multi-entity',
      serverCapEntitiesDesc: 'Manage up to 50 entities: consolidated group dashboard, strict data separation per site.',
      serverCapMcp: 'AI access (MCP)',
      serverCapMcpDesc: 'Connect your AI assistant to your ISMS through the MCP standard — read-only and under your control. Ideally an AI hosted on your own infrastructure or sovereign.',
      mcpSlideTitle: 'Go further with the Server edition',
      mcpSlideSubtitle: 'Two capabilities that change the game',
      mcpSlideHead: 'Your ISMS, queryable by your AI',
      mcpSlideBody: 'The Server edition exposes a standard <strong>MCP</strong> interface: your AI assistant answers directly on your compliance data, read-only, with personal revocable access. Compatible with mainstream assistants as well as an AI hosted on your own infrastructure.',
      mcpSlideEntHead: 'Manage several entities',
      mcpSlideEntBody: 'Up to 50 entities in a single installation: consolidated group view, strict per-site isolation, per-entity import/export.',
      mcpSlideAvail: 'Available in the Server edition.',
      mcpSlideServerOk: 'Your Server edition includes multi-entity and AI access (MCP).',
      multiEntTitle: 'Multi-entity',
      multiEntSub: 'One ISMS, several partitioned scopes',
      multiEntIsolation: 'Partitioning',
      multiEntIsolationDesc: "Several entities or sites in a single installation — each scope's data (risks, actions, controls…) is strictly separated.",
      multiEntAccounts: 'Assigned accounts',
      multiEntAccountsDesc: 'Each assigned account only sees its own scope, with per-section rights (read / write). Multi-membership supported.',
      multiEntGroup: 'Consolidated group view',
      multiEntGroupDesc: 'The "All entities" dashboard and read-only consolidated sections, with badges, entity chips and source-scope opening for edits.',
      multiEntTransfer: 'Controlled distribution',
      multiEntTransferDesc: 'Cross-scope move assistant, per-entity export file names and a cross-import guard.',
      multiEntAvailServer: 'Feature activatable in Settings > Multi-entity (multi-entity license option).',
      multiEntAvailLocal: 'Available in server mode (license option).',
      // Wizard status labels
      alreadyConfigured: 'The server is already configured.',
      configured: 'Configured',
      firstSetup: 'First start',
      loginHint: 'Sign in after the wizard to access edit mode.',
      serverUnavailable: 'Server unavailable',
      syncMissing: 'Not deployed',
      trialBadge: 'Free trial — {days} days remaining out of 14',
      usersMissing: 'Not deployed',
      // FIX-I18N-WIZARD (audit 2026-06-10, bundle.js:2713) : keys moved from
      // snapshots.* where they were misplaced (never resolved by t())
      disclaimerTitle: 'Security frameworks',
      disclaimerSubtitle: 'Important information',
      disclaimerInfoTitle: 'Open frameworks',
      disclaimerInfoBody: 'This edition uses the open frameworks "Open Security Controls" and "Open Security Management Framework", original reformulations inspired by the security objectives of the ISO/IEC 27002:2022 and ISO/IEC 27001:2022 standards.',
      disclaimerWarningTitle: 'Disclaimer',
      disclaimerWarningBody: 'These frameworks are not official ISO standards and do not substitute for acquiring the original documents from ISO. For certifiable compliance, please obtain the official standards from iso.org.',
      corporateUpsellSlideTitle: 'Corporate Edition',
      corporateUpsellSlideSubtitle: 'Go further',
      corporateUpsellTitle: 'Want to go further?',
      corporateUpsellBody: 'The <strong>Corporate edition</strong> includes the official <strong>ISO/IEC 27001:2022</strong> and <strong>ISO/IEC 27002:2022</strong> standards — perfect if you\'re aiming for certification or a formal audit.',
      corporateFeatureCollab: 'Real-time multi-user co-editing',
      corporateFeatureServer: 'Centralized server mode with synchronization',
      corporateFeatureISO: 'Official ISO/IEC 27001 & 27002 standards included',
      corporateFeatureLang: 'Advanced native English (professional translations)',
      corporateUpsellContact: 'Get in touch to learn more: <a href="mailto:info@cyber-assistant.com" style="color:var(--color-info,#3b82f6);text-decoration:underline;">info@cyber-assistant.com</a>',
      transMeasures: 'measures'
    },

    // User manual

    // Password policy (edit mode password, user creation)
    passwordPolicy: {
      title: 'Password requirements:',
      minLength: 'At least {{min}} characters',
      uppercase: 'At least one uppercase letter',
      lowercase: 'At least one lowercase letter',
      special: 'At least one special character',
      ok: 'OK',
      missing: 'Missing',
      missingRequirements: 'Missing requirements'
    },

    // Review frequency options
    reviewFreq: {
      monthly: 'Monthly',
      quarterly: 'Quarterly',
      biannual: 'Biannual',
      annual: 'Annual',
      onChange: 'On change'
    },

    // Test results
    tests: {
      passed: 'Tests completed: {{passed}}/{{total}} passed',
      failed: 'Tests completed: {{passed}}/{{total}} passed, {{failed}} failed'
    },

    // Snapshots
    snapshots: {
      empty: 'No snapshot recorded',
      historyEmpty: 'History empty.',
      kept: 'Snapshots kept: {{count}}/{{limit}}',
      displayed: 'Displayed: {{count}}',
      latest: 'Latest snapshot: {{date}}',
      totalSize: 'Total size: {{size}}',
      noMatch: 'No snapshot matches the filters.',
      tagAuto: 'Auto',
      tagManual: 'Manual',
      restore: 'Restore',
      export: 'Export',
      // FIX-I18N-KEYS (audit 2026-06-10) : automatic snapshot labels
      backupBeforeRestore: 'Backup before restore',
      backupBeforeImport: 'Backup before import',
      backupBeforeReset: 'Backup before reset',
      backupBeforeDemo: 'Backup before demo data'
    },

    // NIS2 Plan
    nis2Plan: {
      planPhases: 'Plan phases',
      addPhase: 'Add phase',
      editPhase: 'Edit phase',
      deletePhase: 'Delete phase',
      editAction: 'Edit action',
      deleteAction: 'Delete action',
      noActionsForDomain: 'No actions for this domain.',
      noActionsMatchFilters: 'No actions match your current filters.',
      actionsFiltered: 'actions (filter applied)',
      completed: 'completed',
      inProgressTodo: 'in progress / to do',
      avgProgress: 'Average progress',
      cumulativeBudget: 'Cumulative budget',
      budget: 'Budget',
      // FIX-I18N-KEYS (audit 2026-06-10)
      editDomain: 'Edit domain',
      editKeyStatus: 'Edit key status',
      // FIX-I18N-NIS2-PLAN (audit 2026-07-10) : en-têtes et libellés du plan
      colAction: 'Action',
      colBudgetTotal: 'Total budget',
      colOwner: 'Owner',
      colPhase: 'Phase',
      colProgress: 'Progress',
      colStatus: 'Status',
      colActions: 'Actions',
      pillar: 'Pillar',
      domain: 'Domain',
      delivered: 'delivered',
      addAction: 'Add an action'
    },

    // Demo mode
    demo: {
      thisFeature: 'This feature',
      disabledInDemo: 'is disabled in demo mode.',
      limitReached: 'Limit reached',
      maxInDemo: 'max in demo',
      storageLimitReached: 'Storage limit reached in demo',
      banner: {
        text: 'Demo version',
        backWebsite: 'Back to website',
        download: 'Download the application',
        contact: 'Contact us'
      }
    },

    // Warnings
    warnings: {
      missingSubcategory: 'Missing subcategory for {{count}} control(s)'
    },

    // FIX-I18N-AUTH (audit 2026-06-10) : "server unreachable" boot screen
    errors: {
      serverUnreachable: 'Server unreachable',
      serverUnreachableDesc: 'Unable to load data from the server. Check your network connection and make sure the server is running.'
    },

    // I18N-ADMINUI (2026-07-10): server/security admin panel strings (bundle.js)
    adminUi: {
      checkWebCrypto: 'Web Crypto API available',
      checkEditPassword: 'Edit password set',
      checkHashAlgo: 'Hashing algorithm (PBKDF2 600k)',
      checkRandomUuid: 'crypto.randomUUID() supported',
      checkSecureProtocol: 'Secure protocol (file:// or https://)',
      checksOkSuffix: 'checks OK',
      serverStats: 'Server statistics',
      recoEditPassword: 'Set a strong edit password to protect your data.',
      recoExportBackup: 'Export your data regularly as a backup.',
      recoModernBrowser: 'Use a modern browser with Web Crypto API support.',
      recoHttps: 'Enable HTTPS for encrypted communications.',
      recoCors: 'Configure a specific CORS origin rather than * (wildcard).',
      recoUpdates: 'Update the server and its dependencies regularly.',
      recoBackups: 'Enable automatic backups on the server.',
      recoAuditLogs: 'Review the audit logs regularly.',
      filterByType: 'Filter by type:',
      allEvents: 'All events',
      colDate: 'Date',
      colEvent: 'Event',
      colUser: 'User',
      colIp: 'IP',
      colDetails: 'Details',
      auditLoadError: 'Error loading the log.',
      loadMore: 'Load more',
      ipModeDisabled: 'Disabled',
      ipModeAllowlist: 'Allowlist',
      ipModeDenylist: 'Denylist',
      ipAddressesLabel: 'IP addresses (one per line, CIDR notation supported):',
      save: 'Save',
      saving: 'Saving...',
      serverRefusedConfig: 'The server rejected the configuration.',
      ipFilterErrorPrefix: 'IP filtering error: ',
      ipFilterSaved: 'IP filtering configuration saved.',
      ipFilterSaveError: 'Error saving the IP filtering configuration.',
      currentPolicy: 'Current policy:',
      policyRules: 'At least 18 characters, 1 uppercase letter, 1 lowercase letter and 1 special character required.',
      passwordExpiration: 'Password expiration:',
      expirationDisabled: 'Disabled (no expiration)',
      days30: '30 days',
      days60: '60 days',
      days90: '90 days',
      policyErrorPrefix: 'Password policy error: ',
      policySaved: 'Password policy saved.',
      policySaveError: 'Error saving the policy.',
      ssoCardDesc: 'Connect an identity provider (Azure AD, Google Workspace, Okta\u2026) for single sign-on.',
      ssoTestRefused: 'The server rejected the SSO test.',
      ssoTestOk: 'SSO connection OK: the provider responded.',
      ssoCertAutoFetched: 'TLS certificate fetched automatically',
      ssoUnreachable: 'Unable to reach the SSO provider. Check the URL and network connectivity.',
      demoDataUnavailable: 'Demo data not available',
      userPlaceholder: 'user',
      loadedSuffix: 'loaded'
    },

    // FIX-I18N-AUTOSAVE (audit 2026-06-10, bundle.js:12866) : auto-save indicator
    autoSave: {
      saving: 'Saving...',
      savedToServer: 'Saved to server',
      syncFailed: 'Sync failed',
      saved: 'Saved'
    }
  };

  // Load translations into i18n module
  if (window.CSI_i18n) {
    window.CSI_i18n.loadTranslations('en', translations);
  } else {
    // Store for later loading
    window._pendingTranslations = window._pendingTranslations || {};
    window._pendingTranslations.en = translations;
  }

})();
