Сегодняшний рассказ продолжает серию публикаций о языковых настройках. Для управления ими в 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 # Задать русский язык в качестве языка интерфейса Set-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"
Результат:
Заключение
Новые командлеты навели два недостающих мостика к локализации всех компонентов установленной системы. Конечно, с непривычки трудно ориентироваться в разнообразии языковых командлетов. Но фактически разработчики стараются делать отдельный командлет для каждой настройки в графическом интерфейсе. Зная это, проще находить подходящий командлет для решения конкретной задачи.
Nikolay Kolesnik
Беспрестанно переводить на русский язык английскую ОС — это не какая-то блажь, или форма мазохизма… Например, техника teclast приходит именно с английским языком, и, чем переустанавливать, действительно, проще добавить язык, скачать языковой пакет и применить его. По времени это плюсминус те же полчаса, но зато нет необходимости выезжать на место.
Vadim Sterkin
В смысле, ей требуется русский язык, потому что она опирается на параметры системы / пользователя?
Алексей Каманин
Имена встроенных учётных записей и групп не локализуются же?
Vadim Sterkin
Вроде нет, но я на это не смотрел. Пост ведь не про глубинные эффекты локализации. Итог локализации будет такой же, как если вы всё это проделаете вручную.
Ну и группы точно по SID можно в PowerShell:)
Алексей Каманин
Да, всегда использую SID.
valerij rozov
Вадим, а как добавить ещё один метод ввода? Нужна латышская клавиатура.
Vadim Sterkin
Строка 5 последнего скрипта
Валерий
Ваш ответ, слишком лаконичен для меня… Добавить ещё одну строчку?
$List.Add(«lv-LV»)
Vadim Sterkin
Управление языками в списке я подробно разбирал, ссылка есть в этой статье, там где про это идёт речь. Поэтому предполагается что вы разберётесь и поэкспериментируете, а не просто будете копировать бездумно.
Да, такая строчка добавит желаемый язык, но за ней есть ещё и другая, которая формирует список языков исходя из того что их там два. А у вас их теперь три.
Валерий
Не добавляет… Позиция ваша понятна, прошу прощения, спрашивать больше не буду.
Vadim Sterkin
УМВР
https://i.imgur.com/ebRtsHF.png
valerij rozov
Да, всё работает, был невнимателен, большое спасибо, Вадим.
Vadim Sterkin
Отлично!
Дмитрий Ключников
Добрый день, Вадим.
Столкнулся с проблемой при локализацией Windows 11 22H2 Enterprise.
Для разливки через sccm собираю образ, и через DISM установил русификацию в целом по этой инструкции
https://learn.microsoft.com/en-us/windows-hardware/manufacture/desktop/add-language-packs-to-windows?view=windows-11
Установил:
Microsoft-Windows-Client-Language-Pack_x64_ru-ru.cab
Microsoft-Windows-LanguageFeatures-Basic-ru-ru-Package~31bf3856ad364e35~amd64~~.cab
Microsoft-Windows-LanguageFeatures-Handwriting-ru-ru-Package~31bf3856ad364e35~amd64~~.cab
Microsoft-Windows-LanguageFeatures-OCR-ru-ru-Package~31bf3856ad364e35~amd64~~.cab
Microsoft-Windows-LanguageFeatures-TextToSpeech-ru-ru-Package~31bf3856ad364e35~amd64~~.cab
Образ сохранил Dism /Unmount-Image /MountDir:»C:\work\sccm\MountISO» /Commit
После сборки образа установил его с флешки на тестовый ПК.
Переключил язык интерфейса русифицировался, но с некоторыми особенностями. Ни одно меню тепер не совпадает по функционалу.
Скриншоты прикладываю.
https://ibb.co/k0gGbJY
https://ibb.co/d5y8PZ3
https://ibb.co/nzmwRVY
https://ibb.co/r3rmKkh
Не подскажете, куда копнуть в данном случае?
И второй вариант.
При попытке установить пакет локализации на WIn 11 23H2 выходит ошибка.
Судя по всему не совпадает версия, но другой-то нет.
Скачивал все отсюда
https://learn.microsoft.com/en-us/azure/virtual-desktop/windows-11-language-packs#requirements
Дистрибутив ОС образ msdn
Dism /Image:»C:\work\SCCM\MountISO» /get-packages | findstr «LanguagePack»
Package Identity : Microsoft-Windows-Client-LanguagePack-Package~31bf3856ad364e35~arm64~en-US~10.0.22621.2428
Dism /Image:»C:\work\sccm\MountISO» /Add-Package /PackagePath=»C:\work\SCCM\Windows 11\LanguagesAndOptionalFeatures\Microsoft-Windows-Client-Language-Pack_x64_ru-ru.cab»
Cистема DISM
Версия: 10.0.19041.3636
Версия образа: 10.0.22631.2428
Processing 1 of 1 — Adding package Microsoft-Windows-Client-LanguagePack-Package~31bf3856ad364e35~amd64~ru-RU~10.0.22621.1
[==========================100.0%==========================]
Ошибка: 0x800f081e
The specified package is not applicable to this image.
2023-12-08 12:52:52, Info CBS Appl: Evaluating package applicability for package Microsoft-Windows-Client-LanguagePack-Package~31bf3856ad364e35~amd64~ru-RU~10.0.22621.1, applicable state: Absent
2023-12-08 12:52:52, Info DISM DISM Package Manager: PID=5956 TID=16692 Error in operation: the package is not applicable. (CBS HRESULT=0x800f081e) — CCbsConUIHandler::Error
Vadim Sterkin
Дмитрий, спасибо за подробное описание проблемы.
1. Я конечно видел частичную локализацию, но такое вижу впервые О_о Вроде вы все правильно делаете, и у меня сейчас нет возможности перепроверять все шаги
Копать нужно в сторону техподдержки Майкрософт. В качестве обходного пути попробуйте
— в режиме аудита установить локализацию на живую систему, потом сиспреп, захват…
— повторить с 23H2
— или может проще русскую использовать тогда уж
2. Не понял. На корпоративное издание у вас получается применить этот cab, а это какое то другое издание, и на него уже не выходит?
А так, да. похоже на отлуп из-за старой версии.
Дмитрий Ключников
К сожалению, так и не получилось подобрать подходящий по версии cab с LanguagePack.
Кстати, с образом 22H2, который вышел осенью 23 года, такая же история, как и с 22H3
Пакет не применяется из-за версии, она стала выше, 10.0.22621.2715. Вот видно из-за мажорной версии пакет и не применяется. Он вышел раньше.
А возможно -ли как-то извлечь пакеты , который скачивается командлетом Install-Language ru-RU?
Нам необходимо собирать корпоративный образ, и заранее внедрять через Dism в оффлайн образ, так что метод со скачиванием не подойдет.
Я нашёл еще одим метод, русифицировать с помощью appx-приложения, но тут тоже непонятно, какие подводные камни. Этот известен с Windows 10 и хотя бы работает стабильнее.
Vadim Sterkin
Не знаю, но это точно не поддерживается.
Я предложил вам аудит и захват, но вы проигнорировали.
Можете взять более старую версию и интегрировать в неё пакет и обновления https://t.me/sterkin_ru/1101. Кодовая база у 22H2 и 23H2 одинаковая, всё доставляется накопительными…
Зависит от того, где вы берёте пакет… А так локализация обновляется через магазин уже достаточно давно.
Дмитрий Ключников
Скорее не понял, как поставить пакет в режиме аудита?
Русскую не можем ставить, потом нужно будет проводить Inplace Upgrade с 10-ки. А там английская с MUI.
Этот вариант тоже проработаю, спасибо!
Vadim Sterkin
Как описано в этой статье.
См. также https://www.outsidethebox.ms/9951/