private/select/Select-OSDWSWinPELanguage.ps1

function Select-OSDWSWinPELanguage {
    <#
    .SYNOPSIS
        Selects languages for WinPE build.
 
    .DESCRIPTION
        This function displays available WinPE languages in an Out-GridView and returns the selected languages.
        The function provides all supported Windows ADK languages for WinPE builds.
 
    .INPUTS
        None.
 
        You cannot pipe input to this cmdlet.
 
    .OUTPUTS
        System.String[]
 
        This function returns the selected languages as a string array.
 
    .EXAMPLE
        Select-OSDWSWinPELanguage
        Will display all available languages and return the selected languages.
 
    .NOTES
        David Segura
    #>

    [CmdletBinding()]
    [OutputType([System.String[]])]
    param ()
    #=================================================
    $Error.Clear()
    Write-Verbose "[$(Get-Date -format G)] [$($MyInvocation.MyCommand.Name)] Start"
    #=================================================
    
    # Define supported languages with friendly names
    $LanguageOptions = @(
        [PSCustomObject]@{ Code = 'en-us'; Name = 'English (United States)'; Selected = $true }
        [PSCustomObject]@{ Code = 'ar-sa'; Name = 'Arabic (Saudi Arabia)'; Selected = $false }
        [PSCustomObject]@{ Code = 'bg-bg'; Name = 'Bulgarian (Bulgaria)'; Selected = $false }
        [PSCustomObject]@{ Code = 'cs-cz'; Name = 'Czech (Czech Republic)'; Selected = $false }
        [PSCustomObject]@{ Code = 'da-dk'; Name = 'Danish (Denmark)'; Selected = $false }
        [PSCustomObject]@{ Code = 'de-de'; Name = 'German (Germany)'; Selected = $false }
        [PSCustomObject]@{ Code = 'el-gr'; Name = 'Greek (Greece)'; Selected = $false }
        [PSCustomObject]@{ Code = 'en-gb'; Name = 'English (United Kingdom)'; Selected = $false }
        [PSCustomObject]@{ Code = 'es-es'; Name = 'Spanish (Spain)'; Selected = $false }
        [PSCustomObject]@{ Code = 'es-mx'; Name = 'Spanish (Mexico)'; Selected = $false }
        [PSCustomObject]@{ Code = 'et-ee'; Name = 'Estonian (Estonia)'; Selected = $false }
        [PSCustomObject]@{ Code = 'fi-fi'; Name = 'Finnish (Finland)'; Selected = $false }
        [PSCustomObject]@{ Code = 'fr-ca'; Name = 'French (Canada)'; Selected = $false }
        [PSCustomObject]@{ Code = 'fr-fr'; Name = 'French (France)'; Selected = $false }
        [PSCustomObject]@{ Code = 'he-il'; Name = 'Hebrew (Israel)'; Selected = $false }
        [PSCustomObject]@{ Code = 'hr-hr'; Name = 'Croatian (Croatia)'; Selected = $false }
        [PSCustomObject]@{ Code = 'hu-hu'; Name = 'Hungarian (Hungary)'; Selected = $false }
        [PSCustomObject]@{ Code = 'it-it'; Name = 'Italian (Italy)'; Selected = $false }
        [PSCustomObject]@{ Code = 'ja-jp'; Name = 'Japanese (Japan)'; Selected = $false }
        [PSCustomObject]@{ Code = 'ko-kr'; Name = 'Korean (Korea)'; Selected = $false }
        [PSCustomObject]@{ Code = 'lt-lt'; Name = 'Lithuanian (Lithuania)'; Selected = $false }
        [PSCustomObject]@{ Code = 'lv-lv'; Name = 'Latvian (Latvia)'; Selected = $false }
        [PSCustomObject]@{ Code = 'nb-no'; Name = 'Norwegian Bokmål (Norway)'; Selected = $false }
        [PSCustomObject]@{ Code = 'nl-nl'; Name = 'Dutch (Netherlands)'; Selected = $false }
        [PSCustomObject]@{ Code = 'pl-pl'; Name = 'Polish (Poland)'; Selected = $false }
        [PSCustomObject]@{ Code = 'pt-br'; Name = 'Portuguese (Brazil)'; Selected = $false }
        [PSCustomObject]@{ Code = 'pt-pt'; Name = 'Portuguese (Portugal)'; Selected = $false }
        [PSCustomObject]@{ Code = 'ro-ro'; Name = 'Romanian (Romania)'; Selected = $false }
        [PSCustomObject]@{ Code = 'ru-ru'; Name = 'Russian (Russia)'; Selected = $false }
        [PSCustomObject]@{ Code = 'sk-sk'; Name = 'Slovak (Slovakia)'; Selected = $false }
        [PSCustomObject]@{ Code = 'sl-si'; Name = 'Slovenian (Slovenia)'; Selected = $false }
        [PSCustomObject]@{ Code = 'sr-latn-rs'; Name = 'Serbian Latin (Serbia)'; Selected = $false }
        [PSCustomObject]@{ Code = 'sv-se'; Name = 'Swedish (Sweden)'; Selected = $false }
        [PSCustomObject]@{ Code = 'th-th'; Name = 'Thai (Thailand)'; Selected = $false }
        [PSCustomObject]@{ Code = 'tr-tr'; Name = 'Turkish (Turkey)'; Selected = $false }
        [PSCustomObject]@{ Code = 'uk-ua'; Name = 'Ukrainian (Ukraine)'; Selected = $false }
        [PSCustomObject]@{ Code = 'zh-cn'; Name = 'Chinese Simplified (China)'; Selected = $false }
        [PSCustomObject]@{ Code = 'zh-tw'; Name = 'Chinese Traditional (Taiwan)'; Selected = $false }
    )

    Write-Host -ForegroundColor DarkGray "[$(Get-Date -format G)] [$($MyInvocation.MyCommand.Name)] Select languages to add to WinPE (Cancel to use default en-us)"
    $SelectedLanguages = $LanguageOptions | Out-GridView -Title 'Select languages to add to WinPE (Cancel to use default en-us)' -OutputMode Multiple

    if ($SelectedLanguages) {
        $result = $SelectedLanguages | Select-Object -ExpandProperty Code
        Write-Host -ForegroundColor DarkGray "[$(Get-Date -format G)] [$($MyInvocation.MyCommand.Name)] Selected languages: $($result -join ', ')"
        return $result
    }
    else {
        Write-Host -ForegroundColor DarkGray "[$(Get-Date -format G)] [$($MyInvocation.MyCommand.Name)] No languages selected, using default: en-us"
        return @('en-us')
    }

    #=================================================
    Write-Verbose "[$(Get-Date -format G)] [$($MyInvocation.MyCommand.Name)] End"
    #=================================================
}