完全更改当前 PowerShell 会话的语言(包括文化)

2023-12-07

我的Win 10系统有西班牙语。 我的意思是完全用英语操作 PowerShell 会话。 在我尝试过的一切(见下文)中,我设法改变了UICulture to en-US对于当前会话,但不是Culture.

有什么办法可以永久改变Culture对于当前的 PowerShell 会话?


改变Culture(没有成功):

    > $( Get-Culture ; Get-UICulture ; [System.Threading.Thread]::CurrentThread.CurrentCulture ; [System.Threading.Thread]::CurrentThread.CurrentUICulture ; [CultureInfo]::CurrentCulture ; [CultureInfo]::CurrentUICulture ; ) | Format-Table -Property LCID,Name,DisplayName,IsNeutralCulture,UseUserOverride,IsReadOnly
     LCID Name  DisplayName             IsNeutralCulture UseUserOverride IsReadOnly
     ---- ----  -----------             ---------------- --------------- ----------
    11274 es-AR Spanish (Argentina)                False            True      False
     1033 en-US English (United States)            False            True      False
    11274 es-AR Spanish (Argentina)                False            True      False
     1033 en-US English (United States)            False            True      False
    11274 es-AR Spanish (Argentina)                False            True      False
     1033 en-US English (United States)            False            True      False 
    > Set-Culture 'en-US'
    > [Threading.Thread]::CurrentThread.CurrentCulture='en-US'
    > $( Get-Culture ; Get-UICulture ; [System.Threading.Thread]::CurrentThread.CurrentCulture ; [System.Threading.Thread]::CurrentThread.CurrentUICulture ; [CultureInfo]::CurrentCulture ; [CultureInfo]::CurrentUICulture ; ) | Format-Table -Property LCID,Name,DisplayName,IsNeutralCulture,UseUserOverride,IsReadOnly
     LCID Name  DisplayName             IsNeutralCulture UseUserOverride IsReadOnly
     ---- ----  -----------             ---------------- --------------- ----------
    11274 es-AR Spanish (Argentina)                False            True      False
     1033 en-US English (United States)            False            True      False
    11274 es-AR Spanish (Argentina)                False            True      False
     1033 en-US English (United States)            False            True      False
    11274 es-AR Spanish (Argentina)                False            True      False
     1033 en-US English (United States)            False            True      False

注:我推断System.Threading.Thread and Threading.Thread是相同的。


我尝试过的其他事情:

Answers here and here。 由于它们是 SO 帖子,我想不在这里发布它们会减少混乱。但如果我觉得方便的话我可以添加它们。

我发现了其他一些帖子,都重复相同的命令。


EDIT:

设置文化的方法:

S1。 Win 设置 -> 时间和语言 -> 区域 -> 区域格式

S2. Set-Culture <culture>

S3. [CultureInfo]::CurrentCulture=<culture>

S4. [Threading.Thread]::CurrentThread.CurrentCulture=<culture>

获得文化的方法:

G1。与S1相同。

G2. Get-Culture

G3. [CultureInfo]::CurrentCulture

G4. [Threading.Thread]::CurrentThread.CurrentCulture

我发现了什么:

  1. S3/G3 和 S4/G4 似乎涉及相同的会话设置/环境变量/注册表项等(?),并且完全等效。
  2. 方法 S1 影响新会话中的 (G2, G3, G4)。
  3. 方法S2立即影响G1,并在新会话中影响(G3,G4)。
  4. 方法 (S3, S4) 立即影响 (G3, G4)(微不足道),但仅在当前线程中,而不是会话中,并且 (1, 2) 根本不影响。
  5. 方法 S1 中的可用选项比方法 S2 中的选项更丰富。我可以在S1中更改为“西班牙语(阿根廷)”,“英语(美国)”等,它会反映在PS中。但是如果我将S1更改为“Spansh(巴西)”,那么PS将显示en-US,就好像它是一种后备文化。

以下函数将改变两者Culture and UICulture对于 PowerShell 5.1 中的当前 PowerShell 会话:

function Set-PowerShellLanguage {
    
    Param (
        [Parameter(Mandatory)] 
        [System.Globalization.CultureInfo] $CultureInfo
    )

    if ($CultureInfo -notin (Get-WinUserLanguageList | % {$_.LanguageTag})) {
        Write-Error "Language pack for $CultureInfo is not installed."
        return
    }
    [System.Reflection.Assembly]::Load('System.Management.Automation').GetType('Microsoft.PowerShell.NativeCultureResolver').GetField('m_Culture', 'NonPublic, Static').SetValue($null, $CultureInfo)
    [System.Reflection.Assembly]::Load('System.Management.Automation').GetType('Microsoft.PowerShell.NativeCultureResolver').GetField('m_uiCulture', 'NonPublic, Static').SetValue($null, $CultureInfo)
}

它实际上是一个合并已经链接的答案 and mkelement0 的评论.

用法示例:

PS C:\> Get-Culture

LCID             Name             DisplayName
----             ----             -----------
1033             en-US            English (United States)


PS C:\> Get-UICulture

LCID             Name             DisplayName
----             ----             -----------
1033             en-US            English (United States)


PS C:\> Set-PowerShellLanguage 'es-AR'
PS C:\> Get-Culture

LCID             Name             DisplayName
----             ----             -----------
11274            es-AR            Spanish (Argentina)


PS C:\> Get-UICulture

LCID             Name             DisplayName
----             ----             -----------
11274            es-AR            Spanish (Argentina)


PS C:\>
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

完全更改当前 PowerShell 会话的语言(包括文化) 的相关文章

随机推荐