#Requires -RunAsAdministrator <# Gets Windows language and regional settings on Windows 10/11. Constrained Language Mode compatible: - No [PSCustomObject] - No custom classes - No Add-Member - No custom object casting - No registry writes - No Set-* language commands - No Add-WindowsCapability What it checks: - PowerShell language mode - Windows version - Current user's language list - Current user's UI language override - Current user's culture/format - Current user's UI culture - Computer-wide system locale - Home location - Default input method override - Language bar options - Language-list opt-out settings - Language capabilities for selected languages - Registry snapshot of user/system international settings Default languages checked: - English (en-US) - Svenska (sv-SE) - Norsk Bokmål (nb-NO) #> param( [string[]]$LanguageTags = @( "en-US", "sv-SE", "nb-NO" ), [switch]$ShowAllLanguageCapabilities ) $ErrorActionPreference = "Continue" function Write-Section { param( [string]$Title ) Write-Host "" Write-Host "== $Title ==" } function Write-Item { param( [string]$Name, [string]$Value ) if ($null -eq $Value -or $Value -eq "") { $Value = "(empty)" } Write-Host (" - {0}: {1}" -f $Name, $Value) } function Show-RegistryInternationalSettings { param( [string]$Scope, [string]$Path ) Write-Host "" Write-Host $Scope Write-Host $Path try { $item = Get-ItemProperty -Path $Path -ErrorAction Stop Write-Item "LocaleName" $item.LocaleName Write-Item "Locale" $item.Locale Write-Item "Language" $item.sLanguage Write-Item "Country" $item.sCountry Write-Item "ShortDate" $item.sShortDate Write-Item "LongDate" $item.sLongDate Write-Item "TimeFormat" $item.sTimeFormat Write-Item "ShortTime" $item.sShortTime Write-Item "Decimal" $item.sDecimal Write-Item "Thousand" $item.sThousand Write-Item "Currency" $item.sCurrency } catch { Write-Item "Error" $_.Exception.Message } } Write-Host "" Write-Host "Windows language/settings audit" Write-Host "This script only reads settings. It does not change anything." Write-Section "PowerShell mode" try { Write-Item "LanguageMode" $ExecutionContext.SessionState.LanguageMode Write-Item "PowerShellVersion" $PSVersionTable.PSVersion } catch { Write-Item "Error" $_.Exception.Message } Write-Section "Computer info" try { $computerInfo = Get-ComputerInfo -ErrorAction Stop Write-Item "WindowsProductName" $computerInfo.WindowsProductName Write-Item "WindowsVersion" $computerInfo.WindowsVersion Write-Item "OsHardwareAbstractionLayer" $computerInfo.OsHardwareAbstractionLayer Write-Item "OsArchitecture" $computerInfo.OsArchitecture Write-Item "CsName" $computerInfo.CsName } catch { Write-Item "Get-ComputerInfo error" $_.Exception.Message try { $cv = Get-ItemProperty -Path "HKLM:\SOFTWARE\Microsoft\Windows NT\CurrentVersion" -ErrorAction Stop Write-Item "ProductName" $cv.ProductName Write-Item "DisplayVersion" $cv.DisplayVersion Write-Item "CurrentBuild" $cv.CurrentBuild Write-Item "UBR" $cv.UBR } catch { Write-Item "Registry fallback error" $_.Exception.Message } } Write-Section "Current user language list" try { $userLanguageList = Get-WinUserLanguageList -ErrorAction Stop $index = 1 foreach ($language in $userLanguageList) { Write-Host "" Write-Host ("Language #{0}" -f $index) Write-Item "LanguageTag" $language.LanguageTag Write-Item "Autonym" $language.Autonym Write-Item "EnglishName" $language.EnglishName Write-Item "LocalizedName" $language.LocalizedName Write-Item "InputMethodTips" ($language.InputMethodTips -join ", ") Write-Item "Spellchecking" $language.Spellchecking Write-Item "Handwriting" $language.Handwriting $index = $index + 1 } } catch { Write-Item "Error" $_.Exception.Message } Write-Section "Current user UI language override" try { $uiOverride = Get-WinUILanguageOverride -ErrorAction Stop if ($null -eq $uiOverride) { Write-Item "UI language override" "No explicit override set" } else { Write-Item "Name" $uiOverride.Name Write-Item "DisplayName" $uiOverride.DisplayName } } catch { Write-Item "Error" $_.Exception.Message } Write-Section "Current user culture and UI culture" try { $culture = Get-Culture -ErrorAction Stop $uiCulture = Get-UICulture -ErrorAction Stop Write-Item "Culture Name" $culture.Name Write-Item "Culture DisplayName" $culture.DisplayName Write-Item "UI Culture Name" $uiCulture.Name Write-Item "UI Culture DisplayName" $uiCulture.DisplayName } catch { Write-Item "Error" $_.Exception.Message } Write-Section "Computer-wide system locale" try { $systemLocale = Get-WinSystemLocale -ErrorAction Stop Write-Item "Name" $systemLocale.Name Write-Item "DisplayName" $systemLocale.DisplayName } catch { Write-Item "Error" $_.Exception.Message } Write-Section "Home location" try { $homeLocation = Get-WinHomeLocation -ErrorAction Stop Write-Item "GeoId" $homeLocation.GeoId Write-Item "HomeLocation" $homeLocation.HomeLocation } catch { Write-Item "Error" $_.Exception.Message } Write-Section "Default input method override" try { $inputOverride = Get-WinDefaultInputMethodOverride -ErrorAction Stop if ($null -eq $inputOverride -or $inputOverride -eq "") { Write-Item "Default input method override" "No explicit override set" } else { Write-Item "Default input method override" $inputOverride } } catch { Write-Item "Error" $_.Exception.Message } Write-Section "Language bar options" try { $languageBarOptions = Get-WinLanguageBarOption -ErrorAction Stop Write-Item "UseLegacyLanguageBar" $languageBarOptions.UseLegacyLanguageBar Write-Item "UseLegacySwitchMode" $languageBarOptions.UseLegacySwitchMode } catch { Write-Item "Error" $_.Exception.Message } Write-Section "Language-list opt-out settings" try { $cultureOptOut = Get-WinCultureFromLanguageListOptOut -ErrorAction Stop Write-Item "CultureFromLanguageListOptOut" $cultureOptOut } catch { Write-Item "CultureFromLanguageListOptOut error" $_.Exception.Message } try { $acceptLanguageOptOut = Get-WinAcceptLanguageFromLanguageListOptOut -ErrorAction Stop Write-Item "AcceptLanguageFromLanguageListOptOut" $acceptLanguageOptOut } catch { Write-Item "AcceptLanguageFromLanguageListOptOut error" $_.Exception.Message } Write-Section "Language capabilities for selected languages" $capabilityPrefixes = @( "Language.Basic", "Language.OCR", "Language.Speech", "Language.TextToSpeech", "Language.Handwriting" ) try { $allCapabilities = Get-WindowsCapability -Online -ErrorAction Stop foreach ($languageTag in $LanguageTags) { Write-Host "" Write-Host ("Language: {0}" -f $languageTag) foreach ($prefix in $capabilityPrefixes) { $found = $false foreach ($capability in $allCapabilities) { if ($capability.Name -like "$prefix*~~~$languageTag~*") { $found = $true Write-Host (" - {0}: {1}" -f $capability.Name, $capability.State) } } if ($found -eq $false) { Write-Host (" - {0}: not available for {1} on this system" -f $prefix, $languageTag) } } } if ($ShowAllLanguageCapabilities) { Write-Section "All language capabilities" foreach ($capability in $allCapabilities) { if ($capability.Name -like "Language.*") { Write-Host (" - {0}: {1}" -f $capability.Name, $capability.State) } } } } catch { Write-Item "Error" $_.Exception.Message } Write-Section "Registry snapshot: international settings" Show-RegistryInternationalSettings ` -Scope "Current user" ` -Path "HKCU:\Control Panel\International" Show-RegistryInternationalSettings ` -Scope "Welcome screen / system account default hive" ` -Path "Registry::HKEY_USERS\.DEFAULT\Control Panel\International" Write-Section "Summary" try { $summaryLanguageList = Get-WinUserLanguageList -ErrorAction Stop $primaryLanguage = "" foreach ($language in $summaryLanguageList) { if ($primaryLanguage -eq "") { $primaryLanguage = $language.LanguageTag } } if ($primaryLanguage -eq "") { $primaryLanguage = "Unknown" } $summaryCulture = Get-Culture -ErrorAction Stop $summaryUiCulture = Get-UICulture -ErrorAction Stop $summarySystemLocale = Get-WinSystemLocale -ErrorAction Stop $summaryUiOverride = Get-WinUILanguageOverride -ErrorAction Stop Write-Item "CurrentUserPrimaryLanguage" $primaryLanguage if ($null -eq $summaryUiOverride) { Write-Item "UIOverride" "No explicit override set" } else { Write-Item "UIOverride" $summaryUiOverride.Name } Write-Item "Culture" $summaryCulture.Name Write-Item "UICulture" $summaryUiCulture.Name Write-Item "SystemLocale" $summarySystemLocale.Name Write-Item "CheckedLanguageTags" ($LanguageTags -join ", ") } catch { Write-Item "Summary error" $_.Exception.Message } Write-Host "" Write-Host "Done. No settings were changed."