Трюки управления языковыми параметрами из 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 лет назад, а сейчас лишь эволюционирует.