Полностью изменить язык (включая культуру) для текущего сеанса PowerShell. - PullRequest
2 голосов
/ 13 июля 2020

Моя система Win 10 имеет испанский sh язык. Я имею в виду полностью управлять сеансом PowerShell на английском языке sh. Во всем, что я пробовал (см. Ниже), мне удалось изменить UICulture на 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 и Threading.Thread одинаковы.


Другие вещи, которые я пробовал :

Ответы здесь и здесь . Поскольку это ТАКИЕ сообщения, я думаю, что их отсутствие здесь уменьшает беспорядок. Но я мог бы добавить их, если сочту удобным.

Я нашел несколько других сообщений, все повторяющие те же команды.


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, похоже, связаны с одними и теми же настройками сеанса / переменной среды / ключом реестра и т.д. c. (?) и чтобы быть полностью эквивалентным.
  2. Метод S1 влияет на (G2, G3, G4) в новом сеансе.
  3. Метод S2 влияет на G1 немедленно, а (G3, G4) в новый сеанс.
  4. Методы (S3, S4) влияют на (G3, G4) немедленно (тривиально), но только в текущем потоке, а не в сеансе, и (1, 2) не влияют вообще.
  5. Вариантов, доступных для метода S1, больше, чем для метода S2. Я могу изменить в S1 на «Испанский sh (Аргентина)», «Английский sh (США)» и т.д. c., И это отразится в PS. Но если я изменю в S1 на «Span sh (Brazil)», тогда PS покажет en-US, как если бы это была резервная культура.

1 Ответ

1 голос
/ 27 июля 2020

Следующая функция изменит как Culture, так и UICulture для текущего сеанса PowerShell в PowerShell 5.1:

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)
}

Фактически это объединение уже связанного ответа и комментарий 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:\>
...