<# Sets Windows language for the current signed-in user only. Menu: 1 = English (en-US) 2 = Svenska (sv-SE) 3 = Norsk Bokmal (nb-NO) What it changes: - Current user's Windows language list - Current user's UI language override - Current user's culture/format - Current user's home location - Current user's default keyboard/input method - Current user's language-list opt-out settings What it does not change: - It does not install language packs. - It does not change system locale. - It does not change welcome screen/system account/new user defaults. Run this in the target user's own logon session. For example, to apply settings to eanet\davidw, sign in as eanet\davidw and run this script from that session. #> param( [string]$Choice ) $ErrorActionPreference = "Stop" function Write-Section { param( [string]$Title ) Write-Host "" Write-Host "== $Title ==" } function Write-Step { param( [string]$Message ) Write-Host (" - {0}" -f $Message) } function Write-WarningStep { param( [string]$Message ) Write-Host (" ! {0}" -f $Message) } function Get-FirstLanguageTag { param( $LanguageList ) foreach ($language in $LanguageList) { return $language.LanguageTag } return $null } function Set-CurrentUserLanguage { param( [string]$Tag, [string]$InputTip, [int]$GeoId ) $currentList = Get-WinUserLanguageList $newList = New-WinUserLanguageList -Language $Tag foreach ($item in $currentList) { if ($item.LanguageTag -ne $Tag) { $newList += $item } } Set-WinUserLanguageList -LanguageList $newList -Force | Out-Null Set-WinUILanguageOverride -Language $Tag Set-Culture -CultureInfo $Tag Set-WinHomeLocation -GeoId $GeoId Set-WinCultureFromLanguageListOptOut -OptOut $False Set-WinAcceptLanguageFromLanguageListOptOut -OptOut $False if ($InputTip) { Set-WinDefaultInputMethodOverride -InputTip $InputTip } } function Test-LanguageResult { param( [string]$Tag ) $problems = 0 Write-Section "Verification before sign out" $verifyList = Get-WinUserLanguageList $primaryLanguage = Get-FirstLanguageTag -LanguageList $verifyList if ($primaryLanguage -eq $Tag) { Write-Step "Primary user language is $Tag" } else { Write-WarningStep "Primary user language is $primaryLanguage, expected $Tag" $problems = $problems + 1 } $uiOverride = Get-WinUILanguageOverride if ($null -ne $uiOverride -and $uiOverride.Name -eq $Tag) { Write-Step "User UI language override is $Tag" } else { Write-WarningStep "User UI language override is not $Tag" $problems = $problems + 1 } $culture = Get-Culture if ($culture.Name -eq $Tag) { Write-Step "User culture is $Tag" } else { Write-WarningStep "User culture is $($culture.Name), expected $Tag" $problems = $problems + 1 } return $problems } if (-not $Choice) { Write-Host "" Write-Host "Choose language:" Write-Host "1 = English" Write-Host "2 = Svenska" Write-Host "3 = Norsk Bokmal" Write-Host "" $Choice = Read-Host "Enter 1, 2, or 3" } switch ($Choice) { '1' { $LanguageTag = 'en-US' $LanguageName = 'English (United States)' $InputTip = '0409:00000409' $GeoId = 244 } '2' { $LanguageTag = 'sv-SE' $LanguageName = 'Svenska (Sverige)' $InputTip = '041D:0000041D' $GeoId = 221 } '3' { $LanguageTag = 'nb-NO' $LanguageName = 'Norsk Bokmal (Norge)' $InputTip = '0414:00000414' $GeoId = 177 } default { Write-Host "Invalid choice: $Choice" Write-Host "Use 1, 2, or 3." exit 1 } } Write-Host "" Write-Host "Selected language: $LanguageName [$LanguageTag]" Write-Section "Execution context" $currentIdentity = whoami.exe Write-Step "User: $currentIdentity" Write-Step "PowerShell language mode: $($ExecutionContext.SessionState.LanguageMode)" if ($currentIdentity -eq "nt authority\system") { Write-WarningStep "Running as SYSTEM. This script must run as the target user, not SYSTEM." exit 1 } Write-Section "Configuring current user" Set-CurrentUserLanguage -Tag $LanguageTag -InputTip $InputTip -GeoId $GeoId Write-Step "User language list, UI override, culture, home location, and default keyboard set" $problemCount = Test-LanguageResult -Tag $LanguageTag Write-Host "" if ($problemCount -gt 0) { Write-Host "Completed with $problemCount verification warning(s)." Write-Host "If these warnings show the old language immediately after running, a policy or missing language pack may be preventing the change." exit 2 } Write-Host "Done." Write-Host "Language set to $LanguageName [$LanguageTag] for the current user." Write-Host "Sign out and back in to fully apply the Windows UI language."