#Requires -RunAsAdministrator <# Sets Windows language system-wide on Windows 11. Menu: 1 = English (en-US) 2 = Svenska (sv-SE) 3 = Norsk Bokmål (nb-NO) What it does: - Installs language capabilities if available - Sets current user's language list - Sets current user's UI language override - Sets current user's culture/format - Sets computer system locale - Copies current user's international settings to: - Welcome screen and system accounts - New user accounts Notes: - Requires internet access to Windows Update (or internal FoD / WSUS source) - Requires Administrator - Restart is recommended after completion - Designed to avoid collection method calls such as .Insert(), .RemoveAt(), .IndexOf() #> param( [string]$Choice ) $ErrorActionPreference = "Stop" if (-not $Choice) { Write-Host "" Write-Host "Choose language:" Write-Host "1 = English" Write-Host "2 = Svenska" Write-Host "3 = Norsk Bokmål" Write-Host "" $Choice = Read-Host "Enter 1, 2, or 3" } switch ($Choice) { '1' { $LanguageTag = 'en-US' $LanguageName = 'English (United States)' } '2' { $LanguageTag = 'sv-SE' $LanguageName = 'Svenska (Sverige)' } '3' { $LanguageTag = 'nb-NO' $LanguageName = 'Norsk Bokmål (Norge)' } default { Write-Host "Invalid choice: $Choice" Write-Host "Use 1, 2, or 3." exit 1 } } Write-Host "" Write-Host "Selected language: $LanguageName [$LanguageTag]" Write-Host "" Write-Host "== Installing language capabilities for $LanguageTag ==" $capabilityPrefixes = @( "Language.Basic", "Language.OCR", "Language.Speech", "Language.TextToSpeech", "Language.Handwriting" ) $allCaps = Get-WindowsCapability -Online foreach ($prefix in $capabilityPrefixes) { $caps = $allCaps | Where-Object { $_.Name -like "$prefix*~~~$LanguageTag~*" } if (-not $caps) { Write-Host " - ${prefix}: not available for $LanguageTag on this system (skipping)" continue } foreach ($cap in $caps) { if ($cap.State -eq "Installed") { Write-Host " - $($cap.Name): already installed" } else { Write-Host " - Installing: $($cap.Name)" Add-WindowsCapability -Online -Name $cap.Name | Out-Null } } } Write-Host "" Write-Host "== Configuring current user ==" # Build new user language list with selected language first $currentList = Get-WinUserLanguageList $newList = New-WinUserLanguageList -Language $LanguageTag foreach ($item in $currentList) { if ($item.LanguageTag -ne $LanguageTag) { $newList += $item } } Set-WinUserLanguageList -LanguageList $newList -Force | Out-Null Set-WinUILanguageOverride -Language $LanguageTag Set-Culture -CultureInfo $LanguageTag Write-Host " - User language list set" Write-Host " - UI language override set" Write-Host " - User culture set" Write-Host "" Write-Host "== Configuring computer-wide settings ==" # Computer-wide system locale (mainly for legacy/non-Unicode apps) Set-WinSystemLocale -SystemLocale $LanguageTag Write-Host " - System locale set" # Windows 11+: copy current user's display/input/region settings # to welcome screen, system accounts, and new users Copy-UserInternationalSettingsToSystem -WelcomeScreen $True -NewUser $True Write-Host " - Copied settings to Welcome screen, system accounts, and new users" Write-Host "" Write-Host "Done." Write-Host "Language set to $LanguageName [$LanguageTag] system-wide." Write-Host "Restart the computer to fully apply the change."