воскресенье, 11 декабря 2011 г.

Локализация Windows 7 SP1

Я уже однажды писал на тему локализации 7-ки в теме "Vistalizator нам поможет!" для таких версий форточек как Домашняя она же Home Edition Basic/Premium, Начальная она же Starter и Профессиональная она же Professional, но тогда была версия оси без сервисного пакета, а на сегодня и я сам и все бренды уже подтянулись и выпускают свои компы с первым сервисным пакетом (SP1). Поэтому стал ребром вопрос, как бы мне решить проблему локализации с этой версией 7-ки. Автор vistalizator-а в данном случае молчит как рыба, а проблема есть. И я стал копать, точнее гуглить.

Начну с того, что скачать сами файлы установки ака MUI (local packs for Windows 7 SP1) можно отсюда. Просто выбираем свою версию 32 или 64бит, язык и скачиваем. Считайте половину дела сделали :о). Далее можно воспользоваться вот этой подробной инструкцией и сделать всё по ней. Я же, решил взять эту инструкцию на вооружение и написать небольшой скрипт, который будет делать всю работу за меня единожды и навсегда :о).

Что понадобиться для работы скрипта?

На самом деле те, кто глянет начальную инструкцию и захотят быстренько всё сделать, как там прописано, смею заверить, у них ничего не выйдет. Потому как файл, который требуется для локализации нужно ещё как-то вычленить из exe файла. А это дело не для слабонервных, т.к. при обычном запуске файла локализации, этот гад начинает сам себя распаковывать в текущую директорию с именем lp.cab и тут уже дело реакции - нужно быстро скопировать и куда-нибудь вставить этот файл. Самым простым вариантом решения этой проблемы может быть вот такой простой скрипт:
start mui-eng-x64.exe
tasklist
tasklist
ren lp.cab lp_.cab
Но есть и другой вариант. Мне понадобиться одна простенькая программка, которая была написана ещё в далёком 98 году, которая называется EXE2CAB version 3.2 by Yuri Niyazov. Смысл программы прост - извлечение cab файла из exe-шника. Далее мне понадобиться choice.exe из самой форточки %windir%/system32. Ну и пожалуй прямые руки и понимание процесса.

Также нужно создать файл с расширением mui.reg вот с такими данными:

Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\MUI\UILanguages\he-IL]
"LCID"=dword:0000040d
"DefaultFallback"="en-US"
"en-US"=hex(7):00,00,00,00
"Type"=dword:00000092

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\MUI\UILanguages\ru-RU]
"LCID"=dword:00000419
"DefaultFallback"="en-US"
"en-US"=hex(7):00,00,00,00
"Type"=dword:00000092

[HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\MUI\UILanguages\en-US]
"LCID"=dword:00000409
"DefaultFallback"="en-US"
"en-US"=hex(7):00,00,00,00
"Type"=dword:00000091
Скрипт расcчитан в моём случае на 3 языка - инглиш, русский и иврит. Но можно по желанию и переделать его на любое количество языков. Главное понимать логику действа.

Итак, сам скрипт по локализации Windows 7 SP1:

@echo off

rem working directory on the server
rem if you running this script locally, then variable SH must be empty, i.e. set sh=
set SH=\\server\mui_langpacks\SP1\

rem checking x32 or x64 bit windows installation
If exist "%programfiles(x86)%" (
goto menu64
) else (
goto menu32
)

:menu32
rem Draw the menu
echo.
echo Please choose an install option
echo.
echo 1 - Exit the installer and return to a shell
echo 2 - install English mui for Windows 7 32bit
echo 3 - install Hebrew mui for Windows 7 32bit
echo 4 - install Russian mui for Windows 7 32bit
echo.
echo.

rem Prompt for a choice
rem Add more options after the /c
rem
rem /c - possible choices
rem /d - default option
rem /m - message to display
rem /t - seconds to wait
rem
rem choice /c: /d /m "" /t
rem
%windir%\system32\choice.exe /c:1234 /d 1 /m "Install option:" /t 30
if errorlevel 4 goto menu4
if errorlevel 3 goto menu3
if errorlevel 2 goto menu2
if errorlevel 1 goto end1
goto menu32

:menu64

rem Draw the menu
echo.
echo Please choose an install option
echo.
echo 1 - Exit the installer and return to a shell
echo 2 - install English mui for Windows 7 64bit
echo 3 - install Hebrew mui for Windows 7 64bit
echo 4 - install Russian mui for Windows 7 64bit
echo.
echo.

%windir%\system32\choice.exe /c:1234 /d 1 /m "Install option:" /t 30
if errorlevel 4 goto menu7
if errorlevel 3 goto menu6
if errorlevel 2 goto menu5
if errorlevel 1 goto end1
goto menu64

rem ############################################################################
rem These are subroutines to run the installer for each menu choice
rem ############################################################################

:menu2
echo.
echo Now installing English language for Windows 7 32bit SP1
%sh%exe2cab.exe %sh%windows6.1-kb2483139-x86-en-us_783d6dd59e2ec8fb0995a059c9c121795bde46c8.exe -q
dism /online /add-package /packagepath:%sh%windows6.1-kb2483139-x86-en-us_783d6dd59e2ec8fb0995a059c9c121795bde46c8.cab
bcdedit /set {current} locale en-US
bcdboot %WinDir% /l en-US
regedit /s %sh%mui.reg
reg delete HKLM\SYSTEM\CurrentControlSet\Control\MUI\UILanguages\he-IL /f
reg delete HKLM\SYSTEM\CurrentControlSet\Control\MUI\UILanguages\ru-RU /f
del %sh%windows6.1-kb2483139-x86-en-us_783d6dd59e2ec8fb0995a059c9c121795bde46c8.cab /q
goto end

:menu3
echo.
echo Now installing Hebrew language for Windows 7 32bit SP1
%sh%exe2cab.exe %sh%windows6.1-kb2483139-x86-he-il_1849d14777a76c7c5b4ef766490dccc8aed5c56b.exe -q
dism /online /add-package /packagepath:%sh%windows6.1-kb2483139-x86-he-il_1849d14777a76c7c5b4ef766490dccc8aed5c56b.cab
bcdedit /set {current} locale he-IL
bcdboot %WinDir% /l he-IL
regedit /s %sh%mui.reg
reg delete HKLM\SYSTEM\CurrentControlSet\Control\MUI\UILanguages\en-US /f
reg delete HKLM\SYSTEM\CurrentControlSet\Control\MUI\UILanguages\ru-RU /f
del %sh%windows6.1-kb2483139-x86-he-il_1849d14777a76c7c5b4ef766490dccc8aed5c56b.cab /q
goto end

:menu4
echo.
echo Now installing Russian language for Windows 7 32bit SP1
%sh%exe2cab.exe %sh%windows6.1-kb2483139-x86-ru-ru_6532a8f36ad7d15277d5d60da92555f0fbee4daa.exe -q
dism /online /add-package /packagepath:%sh%windows6.1-kb2483139-x86-ru-ru_6532a8f36ad7d15277d5d60da92555f0fbee4daa.cab
bcdedit /set {current} locale ru-RU
bcdboot %WinDir% /l ru-RU
regedit /s %sh%mui.reg
reg delete HKLM\SYSTEM\CurrentControlSet\Control\MUI\UILanguages\en-US /f
reg delete HKLM\SYSTEM\CurrentControlSet\Control\MUI\UILanguages\he-IL /f
del %sh%windows6.1-kb2483139-x86-ru-ru_6532a8f36ad7d15277d5d60da92555f0fbee4daa.cab /q
goto end

:menu5
echo.
echo Now installing English language for Windows 7 64bit SP1
%sh%exe2cab.exe %sh%windows6.1-kb2483139-x64-en-us_9b9c8a867baff2920507fbf1e1b4a158572b9b87.exe -q
dism /online /add-package /packagepath:%sh%windows6.1-kb2483139-x64-en-us_9b9c8a867baff2920507fbf1e1b4a158572b9b87.cab
bcdedit /set {current} locale en-US
bcdboot %WinDir% /l en-US
regedit /s %sh%mui.reg
reg delete HKLM\SYSTEM\CurrentControlSet\Control\MUI\UILanguages\he-IL /f
reg delete HKLM\SYSTEM\CurrentControlSet\Control\MUI\UILanguages\ru-RU /f
del %sh%windows6.1-kb2483139-x64-en-us_9b9c8a867baff2920507fbf1e1b4a158572b9b87.cab /q
goto end

:menu6
echo.
echo Now installing Hebrew language for Windows 7 64bit SP1
%sh%exe2cab.exe %sh%windows6.1-kb2483139-x64-he-il_617029400059f0847d7d90d4da673ae4ed43ebd9.exe -q
dism /online /add-package /packagepath:%sh%windows6.1-kb2483139-x64-he-il_617029400059f0847d7d90d4da673ae4ed43ebd9.cab
bcdedit /set {current} locale he-IL
bcdboot %WinDir% /l he-IL
regedit /s %sh%mui.reg
reg delete HKLM\SYSTEM\CurrentControlSet\Control\MUI\UILanguages\en-US /f
reg delete HKLM\SYSTEM\CurrentControlSet\Control\MUI\UILanguages\ru-RU /f
del %sh%windows6.1-kb2483139-x64-he-il_617029400059f0847d7d90d4da673ae4ed43ebd9.cab /q
goto end

:menu7
echo.
echo Now installing Russian language for Windows 7 64bit SP1
%sh%exe2cab.exe %sh%windows6.1-kb2483139-x64-ru-ru_0587eb296a2f04e0d3699650d39b53ee18b97a79.exe -q
dism /online /add-package /packagepath:%sh%windows6.1-kb2483139-x64-ru-ru_0587eb296a2f04e0d3699650d39b53ee18b97a79.cab
bcdedit /set {current} locale ru-RU
bcdboot %WinDir% /l ru-RU
regedit /s %sh%mui.reg
reg delete HKLM\SYSTEM\CurrentControlSet\Control\MUI\UILanguages\en-US /f
reg delete HKLM\SYSTEM\CurrentControlSet\Control\MUI\UILanguages\he-IL /f
del %sh%windows6.1-kb2483139-x64-ru-ru_0587eb296a2f04e0d3699650d39b53ee18b97a79.cab /q
goto end

rem ######################################################################
:end
echo.
echo !!! That's all folks !!!
echo.
echo Have a nice day!
echo.
pause
start shutdown -r -t 10 -c "Attension please!!! Your computer is going to restart after 10 seconds!!!"

:end1
exit
Запускать скрипт нужно из под windows 7 с правами администратора. Важно одно НО - перед тем как запускать сам скрипт откорректируйте под себя переменную SH вначале скрипта, если будете запускать не с сервера, а локально, к примеру, с флешки, то оставьте переменную SH пустой (set sh=). По окончанию скрипт автоматически перезагрузит компьютер на автомате. Можно ещё заодно отключить UAC если на то пошло, но так как это требует перезагрузки, то я не стал усложнять скрипт. Вот в общем-то и всё. :о)

Update от 11.12.2011: Забыл отписать немного о логике скрипта. На самом деле она очень проста, но можно задасться вопросом: "А на кой чёрт нужен этот первый mui.reg файл?". Из опыта скажу, что по неясным обстоятельствам, т.к. я тестировал скрипт под vmware, то столкнулся со странной проблемой, что в некоторых случаях при установке пакета локализации и дальнейшей перезагрузке, форточка выпадает в BSOD с ошибкой 0x0000012A вот такого вот вида:

Чисто из интереса я провёл небольшое расследование и выяснилось, что иногда после работы скрипта исчезала ветка реестра:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\MUI\UILanguages\[language tag]

где language_tag=en-US или ru-RU или he-IL. Почему это происходит мне неизвестно, но поняв, что это всё-таки происходит и возможна некоторая проблема в работе скрипта, мной было принято очень простое решение. Даже если скрипт не всегда корректно укладывает в реестр нужные ему данные, я ему помогу с этим. Вот поэтому идёт сначала импорт рег-файла, а затем уже стирание ненужных веток для ненужных языков. Как говорил Папанов в фильме "Бриллиантовая рука": "и овцы целы и волки сыты, Кутузов".

Update от 31.05.2012:

На самом деле уже с 22 апреля 2012 можно не париться со всякими скриптами, а воспользоваться старым добрым Vistalizator-ом. Это просто проще для обычных пользователей. Да в общем и технарям программка придётся по-вкусу. 

5 комментариев:

Анонимный комментирует...

да, что-то на подобии этого

Анонимный комментирует...

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

Kin комментирует...

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

Анонимный комментирует...

А как побороть такую ошибку?
Cистема DISM
Версия: 6.1.7600.16385

Версия образа: 6.1.7601.18489

Обрабатывается 1 из 1 - Добавление пакета Microsoft-Windows-Client-Refresh-Langu
agePack-Package~31bf3856ad364e35~amd64~en-US~6.1.7601.17514
[===========================66.0%====== ]
Произошла ошибка - "Microsoft-Windows-Client-Refresh-LanguagePack-Package" Ошибк
а: 0x80070002

Ошибка: 2

Не удается найти указанный файл.

Файл журнала DISM находится по адресу C:\Windows\Logs\DISM\dism.log

C:\Windows\system32>

Kin комментирует...

Эта ошибка (0x80070002) обычно происходит, когда был скачан битый файл. Попробуйте заново закачать исходный файл и заново интегрировать. К тому же обратите внимание на версию и битность системы. Это всё очень важно. Также может быть время на компьютере установлено не верно и из-за этого выпадает проблема.
Ну и до кучи - http://www.errorlive.com/error-code-0x80070002