Private/Resolve-LocalizedMessagesFile.ps1

function Resolve-LocalizedMessageBaseDirectory {
    param(
        [Parameter(Mandatory)]
        [string]$BaseDirectory
    )

    try {
        return (Resolve-Path -LiteralPath $BaseDirectory -ErrorAction Stop).ProviderPath
    }
    catch {
        Write-ModuleTrace ("Resolve-LocalizedMessagesFile base resolution failed for '{0}': {1}" -f $BaseDirectory, $_.Exception.Message)
        return $BaseDirectory
    }
}

function Test-ColorScriptDirectoryExistence {
    param(
        [Parameter(Mandatory)]
        [string]$Path
    )

    try {
        if (Test-Path -LiteralPath $Path -PathType Container) {
            return $true
        }
    }
    catch {
        Write-ModuleTrace ("Directory existence probe failed for '{0}': {1}" -f $Path, $_.Exception.Message)
    }

    return [System.IO.Directory]::Exists($Path)
}

function Add-LocalizedCultureCandidate {
    param(
        [Parameter(Mandatory)]
        [AllowEmptyCollection()]
        [System.Collections.Generic.List[string]]$Destination,

        [AllowNull()]
        [string]$CultureName
    )

    if (-not [string]::IsNullOrWhiteSpace($CultureName) -and -not $Destination.Contains($CultureName)) {
        [void]$Destination.Add($CultureName)
    }
}

function Get-LocalizedCultureCandidate {
    param(
        [AllowNull()]
        [string[]]$CultureFallback
    )

    $candidateCultures = New-Object 'System.Collections.Generic.List[string]'
    if ($CultureFallback -and $CultureFallback.Count -gt 0) {
        foreach ($culture in $CultureFallback) {
            Add-LocalizedCultureCandidate -Destination $candidateCultures -CultureName $culture
        }
        return $candidateCultures.ToArray()
    }

    try {
        $currentCulture = [System.Globalization.CultureInfo]::CurrentUICulture
        Add-LocalizedCultureCandidate -Destination $candidateCultures -CultureName $currentCulture.Name
        Add-LocalizedCultureCandidate -Destination $candidateCultures -CultureName $currentCulture.Parent.Name
    }
    catch {
        Write-ModuleTrace ("Resolve-LocalizedMessagesFile culture discovery failed: {0}" -f $_.Exception.Message)
    }

    return $candidateCultures.ToArray()
}

function Resolve-LocalizedCultureDirectory {
    param(
        [Parameter(Mandatory)]
        [string]$BaseDirectory,

        [Parameter(Mandatory)]
        [string]$CultureName
    )

    $culturePath = Join-Path -Path $BaseDirectory -ChildPath $CultureName
    if (Test-ColorScriptDirectoryExistence -Path $culturePath) {
        return $culturePath
    }

    try {
        foreach ($directory in Get-ChildItem -LiteralPath $BaseDirectory -Directory -ErrorAction Stop) {
            if ([System.String]::Equals($directory.Name, $CultureName, [System.StringComparison]::OrdinalIgnoreCase)) {
                return $directory.FullName
            }
        }
    }
    catch {
        Write-ModuleTrace ("Resolve-LocalizedMessagesFile directory enumeration failed for '{0}': {1}" -f $CultureName, $_.Exception.Message)
    }

    return $null
}

function New-LocalizedMessageFileCandidate {
    param(
        [Parameter(Mandatory)]
        [string]$BaseDirectory,

        [Parameter(Mandatory)]
        [string]$FileName,

        [AllowNull()]
        [string[]]$CultureName
    )

    $candidates = New-Object 'System.Collections.Generic.List[object]'
    foreach ($culture in $CultureName) {
        if ([string]::IsNullOrWhiteSpace($culture)) {
            continue
        }

        $culturePath = Resolve-LocalizedCultureDirectory -BaseDirectory $BaseDirectory -CultureName $culture
        if ($culturePath -and (Test-ColorScriptDirectoryExistence -Path $culturePath)) {
            [void]$candidates.Add([pscustomobject]@{
                    CultureName = $culture
                    FilePath    = Join-Path -Path $culturePath -ChildPath $FileName
                })
        }
    }

    [void]$candidates.Add([pscustomobject]@{
            CultureName = $null
            FilePath    = Join-Path -Path $BaseDirectory -ChildPath $FileName
        })
    return $candidates.ToArray()
}

function Test-ColorScriptFileExistence {
    param(
        [Parameter(Mandatory)]
        [string]$Path
    )

    if (Test-Path -LiteralPath $Path -PathType Leaf) {
        return $true
    }

    try {
        if ([System.IO.File]::Exists($Path)) {
            return $true
        }
    }
    catch {
        Write-ModuleTrace ("File existence probe failed for '{0}': {1}" -f $Path, $_.Exception.Message)
    }

    return Test-Path -LiteralPath $Path -PathType Leaf
}

function Resolve-LocalizedMessageFileCandidate {
    param(
        [Parameter(Mandatory)]
        [object[]]$Candidate
    )

    foreach ($item in $Candidate) {
        if (-not $item.FilePath -or -not (Test-ColorScriptFileExistence -Path $item.FilePath)) {
            continue
        }

        $candidatePath = $item.FilePath
        try {
            $candidatePath = (Resolve-Path -LiteralPath $candidatePath -ErrorAction Stop).ProviderPath
        }
        catch {
            Write-ModuleTrace ("Resolve-LocalizedMessagesFile path resolution failed for '{0}': {1}" -f $item.FilePath, $_.Exception.Message)
        }

        return [pscustomobject]@{
            FilePath    = $candidatePath
            CultureName = $item.CultureName
        }
    }

    return $null
}

function Resolve-LocalizedMessagesFile {
    param(
        [Parameter(Mandatory)]
        [ValidateNotNullOrEmpty()]
        [string]$BaseDirectory,

        [Parameter()]
        [ValidateNotNullOrEmpty()]
        [string]$FileName = 'Messages.psd1',

        [Parameter()]
        [string[]]$CultureFallback
    )

    $resolvedBase = Resolve-LocalizedMessageBaseDirectory -BaseDirectory $BaseDirectory
    if (-not (Test-ColorScriptDirectoryExistence -Path $resolvedBase)) {
        return $null
    }

    $candidateCultures = @(Get-LocalizedCultureCandidate -CultureFallback $CultureFallback)
    $candidates = @(New-LocalizedMessageFileCandidate -BaseDirectory $resolvedBase -FileName $FileName -CultureName $candidateCultures)
    return Resolve-LocalizedMessageFileCandidate -Candidate $candidates
}