WindowsАдминистрирование

Трюки управления языковыми параметрами из PowerShell и командной строки

Замечание об учетной записи Microsoft

При работе с аккаунтом Microsoft есть возможность синхронизации языковых параметров. Если она включена, выполнение действий из этой статьи может привести к неоднозначным результатам.

Из облака могут подтягиваться параметры, настроенные на другом ПК или ранее сконфигурированные на этом же ПК. Второе возможно при многократном изменении настроек в короткий промежуток времени. Поэтому для чистоты эксперимента синхронизацию языковых настроек лучше отключить.

Теперь к делу!

Добавление и удаление языков

В форум пришел человек, который пользуется японским языком, но только периодически. Он установил японский язык и получил соответствующий метод ввода. Но поскольку этот язык нужен лишь изредка, большую часть времени он только мешает (раскладок и без него было три).

Время уходит на ручные действия и загрузку языкового пакета. Вопрос был в том, как оптимизировать процесс.


Для начала не нужно ставить языковой пакет, чтобы получить метод ввода. Достаточно добавить язык, а флажки с дополнительных компонентов можно снять.

Добавление: скрипт добавляет японский язык и обновляет список языков.

$List = Get-WinUserLanguageList
$List.Add("ja-JP")
Set-WinUserLanguageList $List -Force
$List

Удаление: скрипт получает список языков, находит там японский и удаляет его, после чего обновляет список языков.

$List = Get-WinUserLanguageList
$remove = $List | where LanguageTag -eq "ja"
$List.Remove($remove)
Set-WinUserLanguageList $List -Force
$List

Управление методами ввода (раскладками)

У меня на виртуальном десктопе клиента проявилась странная проблема. После перезагрузки из переключателя языков исчезала кастомная фонетическая раскладка, которой я пользуюсь очень много лет, так сложилось исторически.

Переключатель методов ввода тоже исчезал, поскольку ради одного английского он не нужен. При этом раскладка корректно отображалась в свойствах русского языка. Вручную это решалось так: добавить стандартную раскладку – удалить фонетическую – добавить фонетическую – удалить стандартную.

Я автоматизировал это скриптом в автозагрузке. Каждый элемент языкового массива содержит набор свойств – языковых параметров. Ими тоже можно рулить в PowerShell.

Скрипт получает список языков и очищает методы ввода для стоящего вторым русского. Вообще, полная очистка не предусмотрена, потому что у языка всегда должен быть хотя бы один метод ввода. Поэтому в графическом интерфейсе невозможно удалить из языка единственную раскладку. Однако дальше добавляется раскладка с нужным идентификатором, а затем уже обновленный список раскладок применяется к языку.

$List = Get-WinUserLanguageList
$List[1].InputMethodTips.Clear()
$List[1].InputMethodTips.Add('0419:A0000419')
Set-WinUserLanguageList $List -Force
$List

Код 0419:A0000419 относится к моей фонетической раскладке. У вас она не установлена, поэтому скрипт просто удалит все раскладки из русского языка. Это к вопросу, как сделать язык без метода ввода 😉


Управление региональными форматами

В форум пришел человек, у которого в 20H1 после перезагрузки сбрасывался региональный формат с украинского на русский. У меня проблема воспроизвелась, поэтому я предложил обходной путь – при входе в систему задавать скриптом нужный формат региона.

Форматы не входят в сферу языков, поэтому способы выше не подходят. Выручает другой командлет – Set-Culture, задающий пользовательский регион с помощью идентификатора локали, LCID (в данном случае – украинской).

Set-Culture uk-UA

Управление различными языковыми настройками одной командой

На самом деле в форуме я предложил другой метод управления региональными форматами. Он мне вспомнился в рамках написания статьи о настройке языка ввода при входе в систему, но там его некуда было пристегнуть. Способ можно назвать «дедовским», потому что он работает еще со времен Windows Vista.

Создается специальный файл ответов в формате XML, который передается в качестве параметра командной строки элементу панели управления intl.cpl!

Делаем трюк два в одном! XML-файл добавляет украинский язык и задает регион, а русская стандартная раскладка заменяется на фонетическую.

<!--  control.exe intl.cpl,,/f:"C:\Scripts\lang.xml" 
        https://support.microsoft.com/help/2764405/  -->
<gs:GlobalizationServices xmlns:gs="urn:longhornGlobalizationUnattend">
<!-- Пользователи. Здесь текущий, но с правами администратора можно настроить
     систему и профиль Default, т.е. все будущие учетные записи -->
    <gs:UserList>
        <gs:User UserID="Current" CopySettingsToDefaultUserAcct="false" CopySettingsToSystemAcct="false"/>  
    </gs:UserList>
<!-- Регион, язык и раскладка клавиатуры в комплекте с ним  -->
    <gs:UserLocale>
        <gs:Locale Name="uk-UA" SetAsCurrent="true" ResetAllSettings="false">
        </gs:Locale>
    </gs:UserLocale>
 <!-- Добавление и удаление раскладок клавиатуры -->
    <gs:InputPreferences>
        <gs:InputLanguageID Action="add" ID="0419:A0000419"/>  
        <gs:InputLanguageID Action="remove" ID="0419:00000419"/> 
    </gs:InputPreferences>
<!-- Язык для программ, не поддерживающих Юникод. Для этого параметра
        команду необходимо запускать с правами администратора.
    <gs:SystemLocale Name="ru-RU"/> -->
 </gs:GlobalizationServices>

Сохраненный файл можно применить одной командой из первой строки.


С помощью XML также можно установить системную кодовую страницу и скопировать параметры в системные аккаунты и профиль Default. В этом случае команду надо выполнять от имени администратора, а изменение локали применяется после перезагрузки.

Способ описан в KB2764405. Подробностей там немного, но есть пример точечной настройки форматов, а также ссылка на справку по XML. Судя по документу, когда-то метод затачивался под скрипты групповой политики в организациях, блокирующих доступ пользователей к региональным настройкам. В списке ОС статьи базы знаний отсутствует Windows 10, однако в целом технология в ней работает.

Более того, в ряде пограничных сценариев – это единственный метод автоматизации применения региональных настроек!

Международные команды DISM и командлеты PowerShell дополняют друг друга, но не покрывают всех ситуаций. Смотрите развесистый скрипт Проничкина на GitHub, где он комбинирует командлеты с файлом ответов для настройки системных учетных записей и удаленных сессий PowerShell.

Я не могу рекомендовать XML в качестве единственного способа применения региональных настроек, поскольку он обладает ограничениями (например, невозможно добавить несколько языков в один прием), а в некоторых сценариях ведет себя непоследовательно. Но если не извращаться и применять по делу, это вполне рабочий вариант.

Бонус: настройка предпочитаемого языка интерфейса в Windows 10 20H1

В блоге Майкла Нихауза недавно появилась запись с отсылкой к сессии Ignite 2019, которая привлекла мое внимание. В 20H1 придумали, как предотвратить проблему, с которой сталкивались многие международные организации и некоторые домашние пользователи.

Суть проблемы в том, что невозможно обновить ОС до новой версии или переустановить систему поверх, если язык дистрибутива не совпадает с языком установки системы.

Дома это решается обновлением посредством Windows Update, а при обновлении с диска – предварительной сменой языка из среды восстановления.

Однако 90% процентов организаций с многоязычной средой развертывают английский дистрибутив с языковыми пакетами, а необходимый пользователям язык задают параметром файла ответов UILanguage. Поскольку параметр в первую очередь задает язык установки ОС, впоследствии администраторы наступают на грабли, пытаясь обновить такую систему до новой версии с английского дистрибутива через WSUS/SCCM.


Суть изменения описывает слайд 12 презентации. В версии 20H1 предпочитаемый язык интерфейса ОС можно задать:

  • как и прежде параметром UILanguage в файле ответов, но теперь он не задает язык установки ОС, т.е. не блокирует обновление
  • новой командой DISM для автономных образов: dism /image:c:\target /set-sysuilang:ru-ru

Это не решает проблем с уже установленными ОС, но позволяет их избежать в новых установках.


Заключение

Несмотря на многочисленные итерации графического интерфейса языковых настроек, способы автоматизации управления языками и методами ввода вполне стабильны. Да, в Windows 8 вместе с PowerShell 3.0 появились командлеты типа Get-WinUserLanguageList. Тогда же появились компоненты по требованию (features on demand), изменившие в том числе подход к управлению языковыми пакетами и компонентами. Но существенным изменением это было 8 лет назад, а сейчас лишь эволюционирует.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *