1

在我在 Win 10 下修改 PS 5.1 的过程中,与问题的目标有关,即为当前 PowerShell 会话完全更改语言(包括文化),我遇到了几个相关的问题。

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

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


设置Settings -> Time and Language -> Language -> Windows显示语言显示“Español(España)”,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)

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

4

2 回答 2

5

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

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

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

    • 在 PowerShell 中,您还可以通过自动$PSUICulture变量(仅报告区域性名称)或Get-UICulturecmdlet(报告[cultureinfo]实例)查询有效的 UI 区域性。
      警告:在Windows PowerShell中,报告的值是在会话启动时有效的值(这是当时的当前持久值),因此不会反映任何会话中的更改。此问题已在 PowerShell [Core] v6+ 中得到纠正。

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

    • 在 Windows 上,它的值是从活动的locale继承的,也就是 region format,它们是持久的、用户特定的设置,您可以如下所述进行修改。

    • 在 PowerShell 中,您还可以通过自动$PSCulture变量(仅报告文化名称Get-Culturecmdlet(报告[cultureinfo]实例)查询有效的 UI 文化。
      警告:在Windows PowerShell中,报告的值是在会话启动时有效的值,因此不会反映任何会话中的更改。此问题已在 PowerShell [Core] v6+ 中得到纠正。


切换到不同的文化:

对于当前用户,交互式(GUI) 方法始终是持久的:

  • UI 文化,又称 Windows 显示语言

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

      • 捷径:

        • 快速打开设置应用程序:

          • 使用键盘快捷键WinKey-i
          • 运行start ms-settings:cmd也可以运行)。
        • 在“开始”菜单中,只需键入“语言”并Language Settings从结果中进行选择 - 这会将您直接带到“设置”应用程序中的相关页面。

        • 运行intl.cpl以打开旧版Region控制面板小程序并单击Language preferences链接,该链接会将您带到“设置”应用程序中的相关页面。

  • 文化,又名区域格式(语言环境)

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

      • 捷径:

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

        • 运行intl.cpl以打开旧版控制面板小程序并从下拉列表中Region选择所需的区域性。Format:

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

程序化方法:

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

    • UI 文化,又称 Windows 显示语言

      • 没有_ Set-UICulturecmdlet,但在 Windows 8 / Windows Server 2012 R2 及更高版本中,您可以使用 Set-WinUILanguageOverridecmdlet。
        请注意,与目标文化相关的语言的语言包必须随系统一起提供,或者必须事先下载。

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

    • 文化,又名区域格式(语言环境)

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

      • 重要提示:更改仅在未来的PowerShell 会话中生效,但不需要注销/重新启动。

  • 仅在会话中更改

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

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

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

    • 结果是,如果您想使用与持久配置不同的文化运行整个 PowerShell 会话,您可以 在 PowerShell [Core] v6+中的文件中进行分配[cultureinfo]::CurrentUICulture[cultureinfo]::CurrentCulture$PROFILE但您需要 Windows PowerShell 的解决方法-请参阅此答案

      • 警告:Windows PowerShell静态初始化$PSUICulture$PSCulture因此这些变量反映解决方法设置的有效区域性(依赖于修改非公共字段);但是,Get-UICulture/Get-Culture[cultureinfo]::CurrentUICulture/[cultureinfo]::CurrentCulture一样。
于 2020-07-16T17:20:36.767 回答
0

这个答案补充了 mklement0。PS 会话中的设置继承自Win 设置->时间和语言->语言->启动会话时Windows 的显示语言。

因此,要为所有会话“永久”更改此设置,必须更改 Windows 设置。或者,可以仅为中的 PS 会话更改此设置profile.ps1,这不会“污染”Windows 配置。

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

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

于 2020-07-23T15:33:19.427 回答