В чате @winsiders участник Kato пожаловался на необычную проблему после обновления до Windows 10 1803. Изначально у него в системе было три языка – английский (US), русский и украинский, а после обновления добавилось еще два английских – United Kingdom и Canada, которые не удалялись в Параметрах (кнопка Remove недоступна). Соответственно, эти языки появлялись в списке раскладок клавиатуры, хотя в настройках их не было.
[+] Сегодня в программе
Теория
В общем случае, можно удалить любой язык, который не используется по умолчанию. Например, если в системе только английский и русский языки, то первый можно удалить, если основным назначен второй. При этом неважно, каким был исходный язык системы (дистрибутива), что легко определяется в PowerShell командой:
(Get-CimInstance Win32_OperatingSystem).oslanguage
Команда выводит идентификатор языка, где 1033 – английский (US), 1049 – русский, остальные тут в десятичном виде или у Microsoft в шестнадцатеричном (вставляйте значения в калькулятор программиста).
На проблемной ОС эта команда выдала 2057, что соответствует English (United Kingdom). В сочетании с картиной из параметров это было очень странно, потому что у языка дистрибутива никаких языковых пакетов быть не должно, поскольку он и так есть в системе.
Для начала мы попытались удалить языковые пакеты UK и Canada командами lpksetup. Однако к успеху это ни привело, что намекало на фактические отсутствие этих языковых пакетов, но не приближало к решению проблемы фантомных языков. Пришлось зайти с черного хода.
Удаление неудаялемых языков
У PowerShell есть два командлета для управления языками пользователя – Get-WinUserLanguageList и Set-WinUserLanguageList. Первый умеет получать список языков, а второй задавать его. В PowerShell список соответствовал картине в параметрах.
Из справки второго командлета не вполне очевидно, как удалить ненужные языки. Зато она дает достаточно толстый намек на то, что вывод первого командлета представляет собой массив. Это можно использовать во благо. Нам нужны только первые три языка из списка.
$List = Get-WinUserLanguageList Set-WinUserLanguageList $($list[0], $list[1], $list[2]) -Force Get-WinUserLanguageList
Первая команда помещает в переменную массив из списка языков, а вторая задает в качестве текущих языков первые три элемента массива. При этом остальные языки удаляются! Третья команда выводит список языков для проверки.
Решено! В который уже раз PowerShell позволяет элегантно решить задачу без запредельных усилий. Если будете экспериментировать под учетной записью Microsoft, отключите синхронизацию языковых параметров во избежание нежелательных эффектов (я словил несколько странностей :).
Удаление неудаялемых раскладок клавиатуры
Этот раздел был добавлен значительно позже, потому что в статью приходят люди со смежной проблемой — появление фантомных раскладок клавиатуры при отсутствии соответствующих установленных языков. У этой проблемы может быть несколько вариантов решения.
Игнорирование дистанционных раскладок
Примените твик и перезагрузитесь. См. также пост в канале Telegram с кратким объяснением и готовым REG-файлом.
Windows Registry Editor Version 5.00 [HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layout] "IgnoreRemoteKeyboardLayout"=dword:00000001
Удаление раскладок из разделов Preload
HKEY_USERS\.DEFAULT\Keyboard Layout\Preload HKEY_CURRENT_USER\Keyboard Layout\Preload
Удаление раскладок из системы
Это подходит в случае, если раскладка не нужна в принципе. Раскладки прописаны в разделе
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Keyboard Layouts\<LCID>
Нужно удалять подраздел с нежелательной раскладкой.
Удаление раскладки после смены кодовой страницы (языка для неюникодных программ)
В современных Windows при смене кодовой страницы (например, с английской на русскую) автоматически добавляется для всех пользователей и метод ввода этого языка. Причем сам язык не добавляется! Однако в большинстве случаев этот язык уже установлен у пользователей, поэтому они ничего не замечают. Но бывает иначе. Варианты решения:
- Добавить в параметрах такой же язык, как установлен для кодовой страницы, а затем удалить его. В результате удаляется и ненужная раскладка. Самый простой способ, но у одного из читателей после перезагрузки раскладка возвращалась.
- Добавлять и тут же удалять язык скриптом из автозагрузки. Прием против лома — возвращения раскладки после перезагрузки.
- Заменить в языке проблемный метод ввода не несуществующий. Элегантное решение, недоступное в графическом интерфейсе.
В Windows 10 1803 языковые настройки практически полностью перекочевали из классической панели управления в Параметры (исключение составляет классическое окно с настройками сочетаний клавиш и языковой панели). В связи с этим я обновил статью про 6 языковых настроек, которые могут поставить вас в тупик в контексте изменившегося интерфейса.
Vlad62
Да, наверное этот способ более понятный(наглядный) чем на Ансверс.
https://answers.microsoft.com/thread/699a81c6-3d5e-4c0a-88e1-6b0b1b1e2e0c
Добавил ссылку на статью.
Есть еще очень простой способ решить проблему. Но срабатывает не всегда.
1) Перелогиниваемся.
2) Делаем полное выключение компьютера(Пуск>Выключение>Удерживая Shift, Завершение работы).
Vadim Sterkin
На момент решения задачи никакого способа на Answers не было https://i.imgur.com/R7Kapr8.png
И да, я обошелся двумя командами вместо четырех :)
Евгений
Простите за оффтоп, но может подскажите как изменить системный шрифт, который в новой панели управления и не только в ней. Меня он раздражает, какой-то он нечеткий.
Vadim Sterkin
Если не оффтопить, то и извиняться не надо будет. Пишите в http://www.forum.oszone.net
xupomant
В моем случае на ноутбуке было настроено несколько учетных записей пользователей (Администратор — локальная учетная запись, и 2 пользователя — доменная учетная запись). Я сделал все, как в статье под одним из пользователей, все сработало, но когда вошел под другим, то в Панели задач и в Параметрах у него остался язык Русский (Молдова), который у 1-го пользователя перед этим удалился. Мне пришлось повторить процедуру, но запуск PowerShell я сделал НЕ от имени Администратора, а просто под пользователем, т.к. иначе команда Get-WinUserLanguageList не выводила 3-ий язык.
Vadim Sterkin
Хорошее замечание. Я нигде не писал, что PowerShell нужно запускать от имени администратора, потому что это пользовательские настройки. Но да, на скриншотах именно администратор, так получилось :)
bender
у меня сходная, но не совсем та же проблема. windows 10 (build 1709). имеются три языковые вкладки: французская, русская и японская. всякий раз, когда я перегружаю комп, к имеющимся добавляется английская (сша), при этом в списке вкладок ее не видно, и команда Get-WinUserLanguageList ее не отображает (будучи запущенной как из-под текущего юзера, так и из-под админа).
американская вкладка удаляется вручную: для этого я ее сначала добавляю, а потом удаляю. но это достает неимоверно. надеялся, что с помощью данной статьи проблему порешаю. не порешал. буду копать дальше.
http://ixbt.photo/photo/236831/60113Rs0i9exC9d/1226332w.jpg
Vadim Sterkin
Я видел похожую проблему, раскладка подгружалась из
и восстанавливалась при перезагрузке. До конца не дорешали, но это может быть следствием синхронизации языков.
Мой последний совет был удалить проблемную раскладку из реестра
предварительно сделав резервную копию раздела
nett00n
Помогла очистка лишних раскладок в
Но ещё закешировалось в