Private/Strings/en-US.psd1

@{
    # ── Common ─────────────────────────────────────────────────────────────────
    'Error_dbatoolsNotFound'        = 'dbatools module not found.'
    'Error_Generic'                 = 'Error in {0}: {1}'

    # ── Get-sqmWaitStatistics ──────────────────────────────────────────────────
    'WaitStats_Starting'            = 'Starting {0} on {1} (TopN={2}, IncludeIdle={3})'
    'WaitStats_NoData'              = 'No wait statistics returned.'
    'WaitStats_SnapshotCreated'     = 'Snapshot created: {0} wait types.'
    'WaitStats_Saved'               = 'Wait statistics saved: {0}'
    'WaitStats_Completed'           = '{0} completed: {1} wait types, total {2} sec.'

    'WaitRec_PAGEIOLATCH_SH'        = 'Disk I/O bottleneck - check storage performance and missing indexes.'
    'WaitRec_PAGEIOLATCH_EX'        = 'Disk I/O bottleneck on writes - check storage performance and index fragmentation.'
    'WaitRec_PAGEIOLATCH_UP'        = 'Disk I/O on updates - check storage performance.'
    'WaitRec_WRITELOG'              = 'Log I/O bottleneck - use faster storage for log files, avoid RAID5.'
    'WaitRec_IO_COMPLETION'         = 'General I/O delays - check storage performance.'
    'WaitRec_ASYNC_IO_COMPLETION'   = 'Async I/O delay - Backup/Restore/DBCC running on slow storage.'
    'WaitRec_LCK_M_X'              = 'Exclusive lock waits - review transaction design, index coverage and isolation level.'
    'WaitRec_LCK_M_S'              = 'Shared lock waits - consider enabling Read Committed Snapshot Isolation (RCSI).'
    'WaitRec_LCK_M_U'              = 'Update lock waits - optimize queries and improve index coverage.'
    'WaitRec_LCK_M_IX'             = 'Intent exclusive lock waits - analyze blocking chains and optimize indexes.'
    'WaitRec_LCK_M_IS'             = 'Intent shared lock waits - reduce transaction duration.'
    'WaitRec_CXPACKET'             = 'Parallelism waits - tune MAXDOP and Cost Threshold for Parallelism.'
    'WaitRec_CXCONSUMER'           = 'Parallel consumer waits - review MAXDOP setting.'
    'WaitRec_RESOURCE_SEMAPHORE'   = 'Memory grant waits - queries with excessive memory grants or index fragmentation.'
    'WaitRec_RES_SEM_COMPILE'      = 'Compilation memory shortage - too many concurrent compilations.'
    'WaitRec_CMEMTHREAD'           = 'Memory contention - possible NUMA imbalance or max server memory too low.'
    'WaitRec_SOS_SCHEDULER_YIELD'  = 'CPU pressure - optimize long-running queries or increase CPU resources.'
    'WaitRec_THREADPOOL'           = 'Worker thread shortage - check max worker threads or hardware capacity.'
    'WaitRec_PAGELATCH_EX'         = 'Page latch contention - often a tempdb bottleneck or hot pages (GUID-based indexes).'
    'WaitRec_PAGELATCH_SH'         = 'Shared page latch contention - increase tempdb files (8 recommended).'
    'WaitRec_PAGELATCH_UP'         = 'Update page latch - last page insert contention, avoid sequential keys.'
    'WaitRec_LATCH_EX'             = 'Internal latch contention - use Get-DbaLatch for detailed analysis.'
    'WaitRec_LATCH_SH'             = 'Internal shared latch - statistics and plan cache may be affected.'
    'WaitRec_DBMIRROR_EVENTS_QUEUE'= 'Database mirroring queue - check network latency between partners.'
    'WaitRec_DBMIRRORING_CMD'      = 'Mirroring synchronization - check network throughput.'
    'WaitRec_ASYNC_NETWORK_IO'     = 'Client processing data too slowly - reduce result set size, consider pagination.'

    # ── Get-sqmPerfCounters ────────────────────────────────────────────────────
    'PerfCounters_Starting'         = 'Starting {0} on {1}'
    'PerfCounters_Completed'        = '{0}: {1} counters read, {2} warnings.'
    'PerfCounters_Saved'            = 'Counter report saved: {0}'
    'PerfInterp_PLE_Critical'       = 'CRITICAL: PLE < 300 sec - memory shortage or cache churn'
    'PerfInterp_PLE_Warning'        = 'WARNING: PLE < 600 sec - monitor memory pressure'
    'PerfInterp_MemGrants'          = 'WARNING: Queries waiting for memory grants - index/query optimization required'
    'PerfInterp_Blocking_Critical'  = 'CRITICAL: Blocking active'
    'PerfInterp_Blocking_Warning'   = 'WARNING: Blocking active'
    'PerfInterp_Deadlocks'          = 'WARNING: Deadlocks detected - review Extended Events deadlock trace'
    'PerfInterp_LazyWrites'         = 'WARNING: High lazy write rate - check memory configuration'
    'PerfInterp_ReCompilations'     = 'WARNING: High re-compilation rate - check SET options and schema changes'

    # ── Invoke-sqmPatchAnalysis ────────────────────────────────────────────────
    'PatchAnalysis_Starting'        = 'Starting {0} for {1} instance(s)'
    'PatchAnalysis_InstanceResult'  = '[{0}] {1} {2} - {3} ({4} builds behind)'
    'PatchAnalysis_Saved'           = 'Patch analysis saved: {0}'
    'PatchAnalysis_Completed'       = '{0} completed: {1} instance(s), {2} critical, {3} to update.'
    'PatchAnalysis_InstanceError'   = '[{0}] Error: {1}'
    'PatchRec_UpToDate'             = 'Up to date - no patch required.'
    'PatchRec_Outdated'             = "{0} build(s) behind current release. Next update: {1}. Recommendation: upgrade to {2} ({3})."
    'PatchRec_UnknownVersion'       = 'No reference data available for major version {0}.'

    # ── Invoke-sqmFailover ─────────────────────────────────────────────────────
    'Failover_Starting'             = "Starting {0}: AG='{1}', Primary='{2}', Target='{3}'"
    'Failover_AgNotFound'           = "AG '{0}' not found or instance '{1}' is not a member."
    'Failover_NotPrimary'           = "Instance '{0}' is not Primary (current role: {1}). Failover must be initiated from the Primary."
    'Failover_NoSecondaries'        = "No secondary replicas found for AG '{0}'."
    'Failover_TargetNotFound'       = "Target replica '{0}' not found or not secondary."
    'Failover_NoSuitableTarget'     = 'No suitable target replica found (SYNCHRONIZED required).'
    'Failover_RedoQueueLimit'       = "Redo queue on '{0}' is {1} MB (limit: {2} MB). Failover aborted."
    'Failover_PreCheckPassed'       = "Pre-checks passed. Target: '{0}', SyncState: {1}, Redo-Queue: {2} MB"
    'Failover_WhatIf'               = "WhatIf: Failover would be executed to '{0}'."
    'Failover_Executing'            = "Executing failover to '{0}'..."
    'Failover_Waiting'              = 'Failover command executed. Waiting {0} sec...'
    'Failover_Success'              = "Failover successful. '{0}' is now Primary. SyncHealth: {1}"
    'Failover_PostCheckFailed'      = 'Failover executed, but post-check could not confirm the new Primary role. Please verify manually.'
    'Failover_PostCheckError'       = 'Failover executed, post-check failed: {0}'
    'Failover_Completed'            = '{0} completed in {1} sec.'

    # ── Get-sqmConnectionStats ────────────────────────────────────────────────
    'ConnStats_Starting'            = 'Starting {0} on {1} (GroupBy={2})'
    'ConnStats_Summary'             = '{0}: {1} connections ({2}% of max {3}), {4} active, {5} blocked.'
    'ConnStats_Saved'               = 'Connection report saved: {0}'

    # ── Get-sqmOrphanedFiles ──────────────────────────────────────────────────
    'Orphaned_RemoteWarning'        = 'Remote instance detected. Filesystem access is performed from this computer. Specify SearchPath as UNC path if paths are not directly accessible.'
    'Orphaned_Starting'             = 'Starting {0} on {1}'
    'Orphaned_DirectoriesCount'     = '{0} director(y/ies) to be scanned.'
    'Orphaned_DirNotReachable'      = 'Directory not reachable: {0}'
    'Orphaned_Completed'            = '{0}: {1} files scanned, {2} orphaned files found.'
    'Orphaned_NoneFound'            = 'No orphaned database files found.'

    # ── Invoke-sqmPerfBaseline ────────────────────────────────────────────────
    'Baseline_Starting'             = 'Starting {0} on {1}, Action={2}'
    'Baseline_NoFiles'              = 'No baseline files found in: {0}'
    'Baseline_Saved'                = 'Baseline saved: {0} ({1} waits, {2} counters)'
    'Baseline_NotEnoughFiles'       = 'Not enough baseline files for comparison. At least 2 baselines required.'
    'Baseline_Comparing'            = "Comparing: '{0}' vs '{1}'"
}