Link to home
Start Free TrialLog in
Avatar of viki2000
viki2000Flag for Germany

asked on

Win10 – Language change Arabic to English

I just bought a 2nd hand laptop by occasion and it has only one problem: the Windows 10 was installed in Arabic language and I need it in English. I do not read/speak Arabic language.
I looked over many YouTube videos in Arabic and English language about how to change the language in Win10. Unfortunately my screens that I see in Arabic language do not match the screens seen in Arabic on YouTube videos/tutorials, so I cannot do a blind click-click and by chance to change it into English.
I can make print screens and then put them in USB stick and upload them here on EE from another PC – that I figure it out.
I do not want to reinstall Win10 from scratch, but of course that is the last option.
Below are the first steps which leaded me to, I hope, Language and Regional Settings in Win10, but where to click further and what to choose?
I really need your guidance in step by step with pictures where shall I click in order to install the English language.

ASKER CERTIFIED SOLUTION
Avatar of Sajid Shaik M
Sajid Shaik M
Flag of Saudi Arabia image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
SOLUTION
Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Avatar of viki2000

ASKER

@Alex Green
I have seen that link above that you provided, before I asked the question here.
The location have not changed indeed, but look at my screenshots above - I cannot identify the screens when I click how is recommended in the link, that's my problem. The screens do not look the same.
If you think I could click blind through all the recommended screens in the link above in an alien language which is equal for me as as Wingdings fonts in Word, that you understood wrong what I need. I cannot follow that guide, when everything seems laid out different in Arabic, the screen do not match what all the guides that I see on internet - I can post more screenshots, juts tell me what to click.
Time for a script then :-)

[/#--------------------------------------------------------------------------------- 
#The sample scripts are not supported under any Microsoft standard support 
#program or service. The sample scripts are provided AS IS without warranty  
#of any kind. Microsoft further disclaims all implied warranties including,  
#without limitation, any implied warranties of merchantability or of fitness for 
#a particular purpose. The entire risk arising out of the use or performance of  
#the sample scripts and documentation remains with you. In no event shall 
#Microsoft, its authors, or anyone else involved in the creation, production, or 
#delivery of the scripts be liable for any damages whatsoever (including, 
#without limitation, damages for loss of business profits, business interruption, 
#loss of business information, or other pecuniary loss) arising out of the use 
#of or inability to use the sample scripts or documentation, even if Microsoft 
#has been advised of the possibility of such damages 
#--------------------------------------------------------------------------------- 
#
# v2.0 - XP - 2016/10/26 - Allow changing current UI on Windows 10 if language pack already present
#
#requires -Version 2.0

<#
 	.SYNOPSIS
       This script can
            .display the language pack still installed in Windows.
            .display the language pack available on a DFS/MDT share.
            .change the system display language in Windows.
            .install language pack from DFS/MDT share
            .remove local language pack from DFS/MDT share
    .PARAMETER  'AvaliableLanguage'
		List all of installed system language in Windows.
	.PARAMETER	'SetLanguage'
        Specifies the installed system language.
    .PARAMETER  'InstallLanguage'
        Install a language pack from DFS/MDT share
    .PARAMETER  'RemoveLanguage'
        Remove a local language pack from DFS/MDT share
    .PARAMETER  'AvailableDFSLanguage'
        List all language pack available on the DFS/MDT share

	.EXAMPLE
        C:\PS> C:\Script\ChangeSystemDisplayLanguage.ps1 -AvailiableLanguage

        ID InstalledLanguageTag
        -- --------------------
         1 en-US

		This example shows how to list all of isntalled system language in Windows.
	.EXAMPLE
        C:\PS> C:\Script\ChangeSystemDisplayLanguage.ps1 -SetLanguage "zh-CN"

        Successfully change the system display language.

        Restart the computer.
        It will take effect after logoff the current user, do you want to logoff right now?
        [Y] Yes  [N] No  [?] Help (default is "Y"):

        This example shows how to change the system display language in Windows.
#>

[CmdletBinding(DefaultParameterSetName='SetLanguage')]
Param
(
    [Parameter(Mandatory=$true,ParameterSetName='AvaliableLanguage')]
    [Switch]$AvailableLanguage,
    [Parameter(Mandatory=$true,ParameterSetName='SetLanguage')]
    [String]$SetLanguage,
    [Parameter(Mandatory=$true,ParameterSetName='InstallLanguage')]
    [String]$InstallLanguage,
    [Parameter(Mandatory=$true,ParameterSetName='RemoveLanguage')]
    [String]$RemoveLanguage,
    [Parameter(Mandatory=$false,ParameterSetName='AvailableDFSLanguage')]
    [Switch]$AvailableDFSLanguage
)

$DFSLanguagePacksRootPath = "\\mydomain.com\mdt\2013\Prod"

Function GetChoice
{
    #Prompt message
    $Caption = "Logoff needed."
    $Message = "It will take effect after logoff the current user, do you want to logoff right now?"
    $Choices = [System.Management.Automation.Host.ChoiceDescription[]]`
    @("&Yes","&No")

    [Int]$DefaultChoice = 0

    $ChoiceRTN = $Host.UI.PromptForChoice($Caption, $Message, $Choices, $DefaultChoice)
	
    Switch ($ChoiceRTN)
    {
        0 {Logoff}
        1 {break}
    }
}

Function CheckInstalledLanguage
{
     Write-Host "> Current Culture :"$((Get-Culture).Name)
    $OSInfo = Get-WmiObject -Class Win32_OperatingSystem
    $languagePacks = $OSInfo.MUILanguages
    $languagePacks
}

Function Get-GeoId($Name='*')
{
    $cultures = [System.Globalization.CultureInfo]::GetCultures('InstalledWin32Cultures') #| Out-GridView
     foreach($culture in $cultures)
    {
       try{
           $region = [System.Globalization.RegionInfo]$culture.Name
           #Write-Host "00 :"$Name "|" $region.DisplayName "|" $region.Name "|" $region.GeoId "|" $region.EnglishName "|" $culture.LCID
           if($region.Name -like $Name)
           {
                $region.GeoId
           }
       }
       catch {}
    }
}

Function Get-LCID($Name='*')
{
    $cultures = [System.Globalization.CultureInfo]::GetCultures('InstalledWin32Cultures') #| Out-GridView

     foreach($culture in $cultures)
    {
       try{
           $region = [System.Globalization.RegionInfo]$culture.Name
           #Write-Host "00 :"$Name "|" $region.DisplayName "|" $region.Name "|" $region.GeoId "|" $region.EnglishName "|" $culture.LCID
           if($region.Name -like $Name)
           {
                $culture.LCID
                #Write-Host "LCID=" $culture.LCID
           }
       }
       catch {}
    }
}


Function Get-KeyboardLayout($Name='*')
{
    #Input = fr-FR -> LCID = 1036 -> Keyboard Hex = 40C
    $LCID = Get-LCID($Name)
    #[convert]::ToInt16($LCID,16)
    [convert]::ToString($LCID,16)
    #Write-Host "KeyboardLayout:" $([convert]::ToString($LCID,16))
}

Function Get-OSCurrentVersion()
{
    [System.Environment]::OSVersion
}

Function Get-MUIPackagePath($Name='*',$Version)
{
    $ID=1
    #Write-Host "Language Packs DFS Root path : $DFSLanguagePacksRootPath\Packages\LanguagePack"
    $(Get-ChildItem -Path "$DFSLanguagePacksRootPath\Packages\LanguagePack") | 
    ForEach-Object `
    {
        $N = $_.Name.ToString().LastIndexOf("_")
        $N2 = $_.Name.ToString().LastIndexOf("_",$N-1)
        $N1 = $_.Name.ToString().LastIndexOf("_",$N2-1)+1
        $NV = $_.Name.ToString().LastIndexOf("_",$N1-2)
        $MUI = New-Object -TypeName PSObject -Property @{'ID' = $ID++; 'LanguageTag' = $_.Name.ToString().Substring($N1,$N2-$N1); 'Version' = $_.Name.ToString().Substring($NV+1,$N1-$NV-2); 'Path' = $_.FullName.ToString()+"\lp.cab"} | Select ID,LanguageTag,Version,Path  
        $MUI.Version = [Version]$MUI.Version
        If ($MUI.LanguageTag -eq $Name -and $MUI.Version.Major -eq $Version.Major -and $MUI.Version.Minor -eq $Version.Minor -and $MUI.Version.Build -eq $Version.Build){
        Return $MUI
        }
    }    #| Format-Table -AutoSize
}
#---------------------------------------

If ([System.Environment]::OSVersion.Version.Major -lt 10)
{
    Write-Host "Exit." -ForegroundColor Yellow -BackgroundColor Black
    Write-Host "Need to execute on Windows 10 version or greater." -ForegroundColor Yellow -BackgroundColor Black
    Exit
}

#---------------------------------------

If($AvailableLanguage)
{
    $ID = 1
    CheckInstalledLanguage | Foreach{New-Object -TypeName PSObject -Property @{'ID' = $ID++; 'InstalledLanguageTag' = $_}}|Format-Table -AutoSize
}


If($SetLanguage)
{
    $InstalledLngTags = CheckInstalledLanguage
    $ID = 1
    Write-Host "Found $($InstalledLngTags.Count) installed languages."
    $InstalledLngTags | Foreach{New-Object -TypeName PSObject -Property @{'ID' = $ID++; 'InstalledLanguageTag' = $_}}|Format-Table -AutoSize
    #$FoundLanguage = $False
 
    If (!$InstalledLngTags)
    {
            #Handle no language pack found - Language not installed
            Write-Host "This language pack $SetLanguage is not installed. Please install at first."
    }
    ElseIf($InstalledLngTags.ToLower() -contains $SetLanguage.ToLower() -eq $False)
    {
            #Handle language pack not matching - Language not installed
            Write-Host "This language pack $SetLanguage is not installed. Please install at first."
    }
    Else
    {
            #Language installed, set it.
            Set-Culture $SetLanguage
            Set-WinSystemLocale $SetLanguage
            Set-WinHomeLocation $(Get-GeoId($SetLanguage))
            Set-WinUserLanguageList $SetLanguage -force

            Write-Host "Successfully change the system display language to :"$SetLanguage"."
            GetChoice    
    }
}

If($InstallLanguage)
{
    Write-Host "Installing $InstallLanguage language pack from DFS location."
    $LP = Get-MUIPackagePath $InstallLanguage $(Get-OSCurrentVersion).Version
    If (!$LP)
    {
        Write-Host ">This language pack '$InstallLanguage' with version '$((Get-OSCurrentVersion).Version)' is not available on the DFS share." -ForegroundColor Red -BackgroundColor Black
        Write-Host ">Use -AvailableDFSLanguage argument to display list." -ForegroundColor Red -BackgroundColor Black
        Exit
    }
    Add-WindowsPackage -Online -PackagePath $LP.Path
    Write-Host "You need to restart the computer to be able to use this new language pack."
    Restart-Computer -Force -Confirm        
}

If($RemoveLanguage)
{
    Write-Host "Removing $RemoveLanguage local language pack from DFS location"
    $LP = Get-MUIPackagePath $RemoveLanguage $(Get-OSCurrentVersion).Version
    If (!$LP)
    {
        Write-Host ">This language pack '$RemoveLanguage' with version '$((Get-OSCurrentVersion).Version)' is not available on the DFS share." -ForegroundColor Red -BackgroundColor Black
        Write-Host ">Use -AvailableDFSLanguage argument to display list." -ForegroundColor Red -BackgroundColor Black
        Exit
    }
    Remove-WindowsPackage -Online -PackagePath $LP.Path
    Write-Host "Language pack removed"    
}

If ($AvailableDFSLanguage)
{
    $ID=1
    Write-Host "Language Packs DFS Root path : $DFSLanguagePacksRootPath\Packages\LanguagePack"
    $(Get-ChildItem -Path "$DFSLanguagePacksRootPath\Packages\LanguagePack").Name | 
    ForEach-Object `
    {
        $N = $_.ToString().LastIndexOf("_")
        $N2 = $_.ToString().LastIndexOf("_",$N-1)
        $N1 = $_.ToString().LastIndexOf("_",$N2-1)+1
        $NV = $_.ToString().LastIndexOf("_",$N1-2)
        New-Object -TypeName PSObject -Property @{'ID' = $ID++; 'LanguageTag' = $_.ToString().Substring($N1,$N2-$N1); 'Version' = $_.ToString().Substring($NV+1,$N1-$NV-2)} | Select ID,LanguageTag,Version
    }    | Format-Table -AutoSize
}

Open in new window



Copy that into a notepad, save it to your desktop, then click start, run and type powershell.... if you can't find run then do windows key + R

Then type the following

CD c:\users

Cd your username

cd desktop

Then .\scriptname.ps1 -setlanguage en-GB
@Sajid Shaik M
I managed to change the input language to English and I entered in command prompt.
Then I was able to check the system version.

It is Win10 Home 2018 Build 1734, OS language 0x0401 (1015) Arabic-Saudi Arabia.
https://www.autoitscript.com/autoit3/docs/appendix/OSLangCodes.htm 
https://msdn.microsoft.com/en-us/library/cc233982.aspx 
And according with Wiklipedia:
https://en.wikipedia.org/wiki/Windows_10_version_history 
The Win10  Build 17134 is version 1803.

Do you think your proposed solution applies also to this this version of Win10 ?

Somehow, blindly, I managed to arrive to Settings – System – About page, where normally should be mentioned if the Win10 is single language or multi language or in case is not mentioned, then is multi language, as much as I know.
Do you speak/read Arabic language?
If yes, then could you please read and tell if in the last screenshot below is somewhere mentioned that version of Win10 is SL (Single Language) or ML (Multi Language)?

User generated imageUser generated imageUser generated image
@Alex Green
Does your solution require that Arabic laptop to be connected to internet?
From where takes Win10 the English language if not from internet?
I am afraid I cannot connect it to internet, but I can use another PC to download data and move with USB drive to the Arabic laptop.
It would be the internet, you're going to have to get the language packs one way or another.
@Alex Green
I have copied your script on C: and named it scriptp1.ps1, then with click right I see Run With PowerShell, a blue screen appears, asked me if Yes, No and few more, I say Yes, then nothing happens.
If I go Run C:\script1.ps1 -setlanguage en-GB does not do anything, it just opened the Notepad with the script.
By the way, everything that I see is from right to left, as in arabic language, very strange for my brain.
Here is what I have done next.
Knowing now that my Win10 is Home 64bit  Build 17134 version 1803, I have downloaded from here the EN US language pack:
https://www.itechtics.com/download-language-packs-windows-10-version-1803/
Then I just put it on USB stick, renamed it lpus.cab,moved it on laptop C: and then following the recommendation from the link provided by
Sajid Shaik M:
https://stackoverflow.com/questions/31698742/how-to-change-windows-10-interface-language-on-single-language-version
I have applied at command prompt as Administrator:
dism /Online /Add-Package /PackagePath:C:\lpus.cab
Now, how do I switch to english US, supposing is installed?
SOLUTION
Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
Finally I did it.
After I installed the English US pack as I described above, then in Settings - Region and Language, also accessible like that:
'Run' dialogue (Windows key + R) Then type "ms-settings:regionlanguage" without quotes and I arrived to the screen below.
Then only blind, by trial and error, I found that besides some Arabic text there is also English text written as option and I supposed is the display language.
I have just chose that and I restarted the laptop and finally I got the English interface.
Was an ugly job to do it, but was good that I did not have to reinstall it.
User generated image
Thank you for your suggestions and the time spent with me.