PowerShell UICulture 与 Windows 设置

PowerShell UICulture vs. Windows setting

我在 Win 10 下修改 PS 5.1 期间,与问题 的 objective 相关, 我遇到了几个相关问题。

  1. 与 UICulture 关联的 Windows 设置在哪里? 我没有找到“区域和语言”控制面板的“键盘和语言”选项卡 here

  2. 可以从 PS 中持续更改吗? 到目前为止,我发现的所有内容都只保留在一个会话中。


设置设置 -> 时间和语言 -> 语言 -> Windows 显示语言 显示“Español(西班牙)”,而PS 给出

> Get-UICulture ; [System.Threading.Thread]::CurrentThread.CurrentUICulture ; [CultureInfo]::CurrentUICulture ;
LCID             Name             DisplayName
----             ----             -----------
1033             en-US            English (United States)
1033             en-US            English (United States)
1033             en-US            English (United States)

没有任何干预更改,并且在刚刚启动的会话中。

.NET中,cultures (System.Globalization.CultureInfo)用于控制(人类)文化特定的两个相关但独立的方面用于显示表示:

  • 有效UI文化,反映在[cultureinfo]::CurrentUICulture,控制(人类)语言,应该用于 UI 元素和最终用户消息,例如错误消息。

    • 在Windows上,它的值继承自所谓的Windows显示语言,这是一个持久的、特定于用户的设置,您可以按如下所述进行修改。

    • 在 PowerShell 中,您还可以通过自动 $PSUICulture variable (reports the culture name only) or the Get-UICulture cmdlet(报告 [cultureinfo] 实例)查询有效 UI 文化。
      警告:在WindowsPowerShell中,报告的值是在会话启动时生效的值time(这是当时的当前持久值),因此任何会话中的更改都不会反映出来。此问题已在 PowerShell [Core] v6+ 中得到纠正。

  • 有效的文化,反映在[cultureinfo]::CurrentCulture,控制格式用于表示数字、货币值和 date/time 值.

    • On Windows,它的值继承自活动的locale,a.k.a. 区域格式,它们是持久的、用户特定的设置,您可以按如下所述进行修改。

    • 在 PowerShell 中,您还可以通过自动 $PSCulture variable (reports the culture name only) Get-Culture cmdlet(报告 [cultureinfo] 实例)查询有效 UI 文化。
      警告:在WindowsPowerShell中,报告的值是在会话启动时生效的值time,因此任何会话中的更改都不会反映出来。此问题已在 PowerShell [Core] v6+ 中得到纠正。


切换到不同的文化:

Interactive (GUI) 方法,对于当前用户总是持久 :

  • UI 文化,a.k.a Windows 显示语言:

    • 在 Windows 10 上,打开 设置应用程序 (例如,通过开始菜单),转到类别 Time & Language,然后单击左侧边栏中的 Language

      • 快捷方式:

        • 快速打开“设置”应用:

          • 使用快捷键WinKey-i.
          • 运行 start ms-settings:(也适用于 cmd)。
        • 在“开始”菜单中,只需键入“语言”,然后从结果中输入 select Language Settings - 这会将您直接带到“设置”应用中的相关页面。

        • 运行 intl.cpl 打开遗留的 Region 控制面板小程序并点击 Language preferences link,它会带你转到“设置”应用中的相关页面。

  • 文化,a.k.a区域格式(locale)

    • 在 Windows 10 上,打开 设置应用程序 (例如,通过开始菜单),转到类别 Time & Language,然后单击左侧边栏中的 Region,然后 select Regional format 下所需的文化(顶部的 Region 设置 而不是 控制文化)。

      • 快捷方式:

        • 在“开始”菜单中,只需键入“区域格式”,然后从结果中输入 select Set regional format - 这会将您直接带到“设置”应用中的相关页面。

        • 运行 intl.cpl 打开遗留的 Region 控制面板小程序和 select 从 Format: drop-下榜单。

注意: 这些 设置同样适用于 .NET 和非 .NET 应用程序,假设这些应用程序旨在尊重用户的区域格式(语言环境、文化)和显示语言(UI 文化) 并附带特定于语言的资源。
相比之下,通过 [cultureinfo]::CurrentUICulture / [cultureinfo]::CurrentCulture(见下文)仅在会话中进行更改仅适用于 .NET 应用程序。

程序化 方法:

  • 持续的当前用户 更改(GUI 方法的等价物):

    • UI 文化,a.k.a Windows 显示语言:

      • 没有Set-UICulturecmdlet,但是在Windows8/Windows Server 2012 R2及以上版本可以使用 Set-WinUILanguageOverride 命令。
        请注意,与目标文化关联的语言的语言包必须是系统自带的,或者之前必须已经下载。

      • 重要提示:在您注销并重新打开或重新启动之前,更改不会生效。

    • 文化,a.k.a区域格式(locale)

      • 使用 Set-Culture cmdlet,在 Windows 8 / Windows Server 2012 R2 及更高版本中可用。

      • 重要:更改仅在 未来 PowerShell 会话,但不需要注销/重启。

  • 仅在会话中 更改:

    • 重要:此类更改仅适用于.NET-based应用程序。因此,从区域性已更改的 PowerShell 会话调用非 .NET 控制台应用程序不会对该控制台应用程序产生影响。但是,更改确实 对 PowerShell cmdlet、脚本和函数的调用生效。即使更改的范围在技术上仅限于 当前线程 ,PowerShell 也会将更改传播到 new 线程中执行的代码(Start-ThreadJobForEach-Object -Parallel) 以及通过 PowerShell 远程处理在 远程机器 上执行的代码(例如 Invoke-Command)。然而,奇怪的是,从 PowerShell 7.0 开始,后台作业 (Start-Job),运行 在子进程中执行 继承调用线程的文化 - 参见this GitHub issue.

    • 您可以分配给[cultureinfo]::CurrentUICulture / [cultureinfo]::CurrentCulture以更改UI文化/当前线程(仅,非持久);例如,以下命令使用法国文化输出当前日期和时间:

      • [cultureinfo]::CurrentCulture = 'fr-FR'; Get-Date
    • 警告:由于 Windows PowerShell、[cultureinfo]::CurrentUICulture 中的错误[cultureinfo]::CurrentCulture 在每次交互式提交命令后意外地 重置为会话启动值 ;此问题已在 PowerShell [Core] v6+ 中修复 - 请参阅 .

    • 结果是 如果您想要 运行 整个 PowerShell 会话具有不同于持久配置的区域性 ,您可以 在 PowerShell [Core] v6+$PROFILE 文件中对 [cultureinfo]::CurrentUICulture[cultureinfo]::CurrentCulture 进行赋值,但您需要一个 Windows PowerShell 的解决方法 - 请参阅 this answer.

      • 警告:Windows PowerShell 静态 初始化$PSUICulture$PSCulture,因此这些变量 反映解决方法 设置的有效区域性(它依赖于修改 非public字段);但是,Get-UICulture / Get-Culture 以及 [cultureinfo]::CurrentUICulture / [cultureinfo]::CurrentCulture 都可以。

这个答案是对 的补充。 PS 会话中的设置继承自 Win 设置 -> 时间和语言 -> 语言 -> 开始会话时 Windows 的显示语言。

因此,要为所有会话“持续”更改此设置,必须更改 Windows 设置。 或者,可以在 profile.ps1change this only for the PS session,这不会“污染”Windows 配置。

我不确定是否可以通过从 PS.[=] 直接访问 HKEY_CURRENT_USER\Control Panel\International([ref])(或 HKEY_CURRENT_USER\Volatile Environment?)来管理这些19=]

请注意(在 Windows PowerShell 中)$PSUICulture 在上次 Windows 登录时通过检索上面的 Windows 设置静态初始化。 因此它对当前 PS 设置不敏感(可能在当前 PS 会话期间更改)。 所以 $PSUICulture 可能不同于 Get-UICulture。 这不适用于 PowerShell Core。