Сегодняшний рассказ продолжает серию публикаций о языковых настройках. Для управления ими в Windows 11 появились новые командлеты: Install-Language и Copy-UserInternationalSettingsToSystem. С ними стала возможна полная локализации системы командлетами PowerShell. Но понадобятся еще пять других :)
Цель упражнения — полностью локализовать установленную Windows на русский язык для текущего пользователя и всех созданных впоследствии аккаунтов.
Я не призываю переводить английскую ОС с ног до головы на русский язык. Тогда уж проще взять русский дистрибутив. Я показываю тонкости работы языковых командлетов. А вам нужно отталкиваться от практической задачи, выбирая только необходимые составляющие локализации.
В качестве подопытной системы используется английская Windows 11 23H2. ОС установлена с настройками по умолчанию, и никакие языковые параметры не менялись. Если у вас другой язык дистрибутива или добавлены языки, учитывайте это при управлении списком языков. В остальном разницы нет.
Для успеха необходимо подключение к интернету, потому что языковой пакет скачивается с серверов Microsoft. (Добавление языковых пакетов в автономный образ пошагово описано в официальной документации.)
[+] Сегодня в программе
Install-Language
В Windows 11 добавили новый модуль LanguagePackManagement, а затем портировали его в Windows 10. Командлет Install-Language входит в состав этого модуля.
Пример добавления русского языка в английскую систему:
Install-Language ru-RU Language Language Packs Language Features -------- -------------- ----------------- ru-RU LpCab BasicTyping, Handwriting, TextToSpeech, OCR
Название и описание командлета несколько вводят в заблуждение относительно графического интерфейса. На самом деле добавляется не язык, а языковой пакет и сопутствующие компоненты — рукописный ввод, OCR и т.д.
Добавленный командлетом язык не активируется автоматически!
Он появляется лишь в списке языков интерфейса, потому что установили языковой пакет. Однако новый язык не добавляется в список предпочитаемых и следовательно недоступен в качестве языка ввода.
Вы можете полностью применить установленный язык другими командлетами. Оба приема я показывал в блоге. Этот фрагмент кода с помощью Get-WinUserLanguageList добавляет русский язык и как следствие раскладку клавиатуры, но не меняет язык интерфейса.
# Добавить русский язык в список предпочитаемых # Как следствие добавляется русский метод ввода # https://www.outsidethebox.ms/20484/#_Toc501 $List = Get-WinUserLanguageList $List.Add("ru-RU") Set-WinUserLanguageList $List -Force Get-WinUserLanguageList
Следующий фрагмент делает то же самое, а также ставит русский на первое место в списке предпочитаемых языков. Плюс командлет Set-WinUILanguageOverride назначает язык интерфейса. Для вступления изменений в силу требуется завершить сеанс.
# Добавить русский язык в список предпочитаемых # Как следствие добавляется русский метод ввода $List = Get-WinUserLanguageList $List.Add("ru-RU") # Сделать русский язык первым в списке предпочитаемых # https://www.outsidethebox.ms/19024/#lang Set-WinUserLanguageList $($list[1], $list[0]) -Force Get-WinUserLanguageList # Задать русский язык в качестве языка интерфейса WinUILanguageOverride ru-RU
При использовании Install-Language можно избежать установки дополнительных компонентов параметром -ExcludeFeatures
. Однако он блокирует все компоненты сразу, а тонкой настройки не предусмотрено. Это решается с помощью командлетов для управления компонентами по требованию. Ниже пример получения сведений о компонентах и удаления OCR после установки языка посредством Install-Language.
# Состояние русских языковых компонентов после установки русского языка Get-WindowsCapability -Online | Where-Object {$_.Name -like '*lang*ru-RU*'} Name : Language.Basic~~~ru-RU~0.0.1.0 State : Installed Name : Language.Handwriting~~~ru-RU~0.0.1.0 State : Installed Name : Language.OCR~~~ru-RU~0.0.1.0 State : Installed Name : Language.TextToSpeech~~~ru-RU~0.0.1.0 State : Installed # Удаление компонентa OCR Remove-WindowsCapability -Name "Language.OCR~~~ru-RU~0.0.1.0" -Online
Кроме того, у командлета есть параметр -CopyToSettings
. Добавляя язык, можно установить его в качестве языка для неюникодных программ, а также языком интерфейса, ввода и форматов на экране приветствия и в настройки всех новых учетных записей.
Однако обратите внимание, что метод ввода и форматы у новых аккаунтов остались английскими. При том что на экране приветствия все соответствует описанию. Добавление языка до запуска Install-Language ничего не изменило. Что ж, мы пойдем другим путем, чуть ниже.
Наконец, после работы Install-Language вверху страницы языковых параметров появляется уведомление, что некоторыми настройками управляет организация (см. первую картинку в статье). Я не нашел ни сконфигурированных политик, ни заблокированных [языковых] настроек, с которыми такие сообщения обычно идут рука об руку. Похоже на ошибочное сообщение.
Uninstall-Language
Для удаления языка в том же модуле LanguagePackManagement предусмотрен командлет Uninstall-Language. У него свои нюансы.
- Удаление языкового пакета и дополнительных компонентов выполняется асинхронно — в фоне и не моментально, а вступает в силу после перезагрузки.
- Языковой пакет не удалится, если его язык задан для интерфейса ОС. Допустим у вас выбран русский язык. Тогда удалятся только языковые компоненты, а языковой пакет останется. Поэтому сначала следует явно переопределить язык интерфейса командлетом Set-WinUILanguageOverride.
Set-WinUILanguageOverride en-US Uninstall-Language ru-RU
- Удаление не затрагивает язык и метод ввода, добавленные вручную или командлетом Get-WinUserLanguageList.
Copy-UserInternationalSettingsToSystem
Командлет Copy-UserInternationalSettingsToSystem добавили в модуль International. Спасибо Alexander Starostin за наводку. Командлет копирует пользовательские настройки на экран входа / системные учетные записи и/или в настройки всех новых учетных записей.
В этом примере языковые параметры копируются всюду:
Copy-UserInternationalSettingsToSystem -WelcomeScreen $True -NewUser $True
Здесь тонкостей поменьше.
- У Install-Language регион почему-то исключен из копирования. А здесь копируется полный набор параметров. Кстати,
GeoID
фигурирует в блоге в контексте блокировки Office 365 в РФ и РБ. - Копирование языка на экран входа определяет не только язык интерфейса там, но и дефолтную раскладку для ввода пароля. Ее можно задать командлетом Set-WinDefaultInputMethodOverride везде, в том числе на экране входа:
Set-WinDefaultInputMethodOverride -InputTip "0409:00000409" #en-US
Тонкой же настройке я посвятил статью: Как грамотно настроить язык ввода на экране входа в Windows.
- Наконец, командлет доступен только в Windows 11. Его не портировали ни в Windows 10, ни в Windows Server 2022.
Скрипт для полной локализации ОС
Помимо рассмотренных выше командлетов в скрипт вошли также:
- Set-WinHomeLocation — задает регион
- Set-WinSystemLocale — указывает кодовую страницу
- Set-WinDefaultInputMethodOverride (необязательно) — переопределяет метод ввода по умолчанию, на случай если вы при полной локализации все-таки предпочитаете дефолтную английскую раскладку
Код ниже:
- устанавливает русский язык со всеми компонентами
- добавляет русский язык в список языков и методов ввода
- ставит русский на первое место в списке предпочитаемых (при условии, что он на втором из двух)
- задает русский в качестве языка интерфейса
- задает регион РФ
- копирует вышеперечисленные языковые настройки на экран приветствия и в новые учетные записи
- задает русскую кодовую страницу
Скрипт:
# Полная локализация Windows: https://www.outsidethebox.ms/22149/ Install-Language ru-RU Set-WinUILanguageOverride ru-RU $List = Get-WinUserLanguageList $List.Add("ru-RU") Set-WinUserLanguageList $($list[1], $list[0]) -Force Set-WinHomeLocation -GeoId 203 # https://go.microsoft.com/fwlink/?LinkID=242308 Set-WinSystemLocale ru-RU Copy-UserInternationalSettingsToSystem -WelcomeScreen $True -NewUser $True # Бонус: переопределить дефолтный метод ввода на английский # Set-WinDefaultInputMethodOverride -InputTip "0409:00000409"
Результат:
Заключение
Новые командлеты навели два недостающих мостика к локализации всех компонентов установленной системы. Конечно, с непривычки трудно ориентироваться в разнообразии языковых командлетов. Но фактически разработчики стараются делать отдельный командлет для каждой настройки в графическом интерфейсе. Зная это, проще находить подходящий командлет для решения конкретной задачи.
Беспрестанно переводить на русский язык английскую ОС — это не какая-то блажь, или форма мазохизма… Например, техника teclast приходит именно с английским языком, и, чем переустанавливать, действительно, проще добавить язык, скачать языковой пакет и применить его. По времени это плюсминус те же полчаса, но зато нет необходимости выезжать на место.
В смысле, ей требуется русский язык, потому что она опирается на параметры системы / пользователя?
Имена встроенных учётных записей и групп не локализуются же?
Вроде нет, но я на это не смотрел. Пост ведь не про глубинные эффекты локализации. Итог локализации будет такой же, как если вы всё это проделаете вручную.
Ну и группы точно по SID можно в PowerShell:)
Да, всегда использую SID.
Вадим, а как добавить ещё один метод ввода? Нужна латышская клавиатура.
Строка 5 последнего скрипта
Ваш ответ, слишком лаконичен для меня… Добавить ещё одну строчку?
$List.Add(«lv-LV»)
Управление языками в списке я подробно разбирал, ссылка есть в этой статье, там где про это идёт речь. Поэтому предполагается что вы разберётесь и поэкспериментируете, а не просто будете копировать бездумно.
Да, такая строчка добавит желаемый язык, но за ней есть ещё и другая, которая формирует список языков исходя из того что их там два. А у вас их теперь три.
Не добавляет… Позиция ваша понятна, прошу прощения, спрашивать больше не буду.
УМВР
https://i.imgur.com/ebRtsHF.png
Да, всё работает, был невнимателен, большое спасибо, Вадим.
Отлично!