完全更改当前 PowerShell 会话的语言(包括文化)
Fully change language (including Culture) for the current PowerShell session
我的 Win 10 系统有西班牙语。
我的意思是用英语完全运行一个 PowerShell 会话。
在我尝试的所有内容中(见下文),我设法将当前会话的 UICulture
更改为 en-US
,但不是 Culture
.
有什么方法可以永久更改当前 PowerShell 会话的 Culture
?
正在更改 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
和Threading.Thread
是一样的
其他我试过的东西:
答案 and here。
由于它们是 SO 帖子,我想不在这里发布它们可以减少混乱。但如果方便的话,我可以添加它们。
我发现了其他一些帖子,它们都在重复相同的命令。
编辑:
设置文化的方法:
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
我发现了什么:
- S3/G3和S4/G4似乎涉及相同的会话设置/环境变量/注册表项等(?),并且完全等价。
- 方法 S1 在新会话中影响(G2、G3、G4)。
- 方法 S2 立即影响 G1,并在新会话中影响 (G3, G4)。
- 方法 (S3, S4) 会立即影响 (G3, G4)(微不足道)但仅在当前线程中,而不是会话中,而 (1, 2) 根本不会。
- 方法S1中可用的选项比方法S2中的选项丰富。我可以在 S1 中将其更改为“西班牙语(阿根廷)”、“英语(美国)”等,它会反映在 PS 中。但是,如果我将 S1 更改为“Spansh (Brazil)”,那么 PS 将显示
en-US
,就好像它是后备文化一样。
以下函数将更改 PowerShell 5.1 中当前 PowerShell 会话的 Culture
和 UICulture
:
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)
}
它实际上是already linked answer and mkelement0's comment的合并。
用法示例:
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:\>
我的 Win 10 系统有西班牙语。
我的意思是用英语完全运行一个 PowerShell 会话。
在我尝试的所有内容中(见下文),我设法将当前会话的 UICulture
更改为 en-US
,但不是 Culture
.
有什么方法可以永久更改当前 PowerShell 会话的 Culture
?
正在更改 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
和Threading.Thread
是一样的
其他我试过的东西:
答案
我发现了其他一些帖子,它们都在重复相同的命令。
编辑:
设置文化的方法:
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
我发现了什么:
- S3/G3和S4/G4似乎涉及相同的会话设置/环境变量/注册表项等(?),并且完全等价。
- 方法 S1 在新会话中影响(G2、G3、G4)。
- 方法 S2 立即影响 G1,并在新会话中影响 (G3, G4)。
- 方法 (S3, S4) 会立即影响 (G3, G4)(微不足道)但仅在当前线程中,而不是会话中,而 (1, 2) 根本不会。
- 方法S1中可用的选项比方法S2中的选项丰富。我可以在 S1 中将其更改为“西班牙语(阿根廷)”、“英语(美国)”等,它会反映在 PS 中。但是,如果我将 S1 更改为“Spansh (Brazil)”,那么 PS 将显示
en-US
,就好像它是后备文化一样。
以下函数将更改 PowerShell 5.1 中当前 PowerShell 会话的 Culture
和 UICulture
:
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)
}
它实际上是already linked answer and mkelement0's comment的合并。
用法示例:
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:\>