From 67880e735241f1e071ac6aa537bd1e0c1b3b3825 Mon Sep 17 00:00:00 2001 From: Dmitry Chapyshev Date: Mon, 28 Apr 2008 14:04:22 +0000 Subject: [PATCH] - Add support second keyboard layout - Update all translations svn path=/trunk/; revision=33175 --- reactos/base/setup/usetup/errorcode.h | 1 + reactos/base/setup/usetup/interface/usetup.c | 8 + reactos/base/setup/usetup/lang/bg-BG.h | 7 + reactos/base/setup/usetup/lang/cs-CZ.h | 7 + reactos/base/setup/usetup/lang/de-DE.h | 7 + reactos/base/setup/usetup/lang/el-GR.h | 7 + reactos/base/setup/usetup/lang/en-US.h | 7 + reactos/base/setup/usetup/lang/es-ES.h | 7 + reactos/base/setup/usetup/lang/fr-FR.h | 7 + reactos/base/setup/usetup/lang/it-IT.h | 7 + reactos/base/setup/usetup/lang/lt-LT.h | 7 + reactos/base/setup/usetup/lang/pl-PL.h | 7 + reactos/base/setup/usetup/lang/ru-RU.h | 7 + reactos/base/setup/usetup/lang/sk-SK.h | 7 + reactos/base/setup/usetup/lang/sv-SE.h | 7 + reactos/base/setup/usetup/lang/uk-UA.h | 7 + reactos/base/setup/usetup/mui.c | 186 ++++++++++++++++--- reactos/base/setup/usetup/mui.h | 115 ++++++------ reactos/base/setup/usetup/settings.c | 132 +++++++------ 19 files changed, 401 insertions(+), 139 deletions(-) diff --git a/reactos/base/setup/usetup/errorcode.h b/reactos/base/setup/usetup/errorcode.h index e0d38fd4d9e..86aabad399d 100644 --- a/reactos/base/setup/usetup/errorcode.h +++ b/reactos/base/setup/usetup/errorcode.h @@ -64,6 +64,7 @@ typedef enum ERROR_WRITE_PTABLE, ERROR_ADDING_CODEPAGE, ERROR_UPDATE_LOCALESETTINGS, + ERROR_ADDING_KBLAYOUTS, ERROR_LAST_ERROR_CODE }ERROR_NUMBER; diff --git a/reactos/base/setup/usetup/interface/usetup.c b/reactos/base/setup/usetup/interface/usetup.c index b33dad33587..271de7912ff 100644 --- a/reactos/base/setup/usetup/interface/usetup.c +++ b/reactos/base/setup/usetup/interface/usetup.c @@ -3188,6 +3188,14 @@ RegistryPage(PINPUT_RECORD Ir) return QUIT_PAGE; } + /* Add keyboard layouts */ + CONSOLE_SetStatusText(MUIGetString(STRING_ADDKBLAYOUTS)); + if (!AddKeyboardLayouts()) + { + MUIDisplayError(ERROR_ADDING_KBLAYOUTS, Ir, POPUP_WAIT_ENTER); + return QUIT_PAGE; + } + /* Update keyboard layout settings */ CONSOLE_SetStatusText(MUIGetString(STRING_KEYBOARDSETTINGSUPDATE)); if (!ProcessKeyboardLayoutRegistry(LayoutList)) diff --git a/reactos/base/setup/usetup/lang/bg-BG.h b/reactos/base/setup/usetup/lang/bg-BG.h index 65c195f062d..5b626250b29 100644 --- a/reactos/base/setup/usetup/lang/bg-BG.h +++ b/reactos/base/setup/usetup/lang/bg-BG.h @@ -1470,6 +1470,11 @@ MUI_ERROR bgBGErrorEntries[] = "¥ãᯥ譮 ãáâ ­®¢ï¢ ­¥ ­  ¬¥á⭨⥠­ áâனª¨.\n" "ENTER = १ ¯ã᪠­¥ ­  ª®¬¯îâêà " }, + { + //ERROR_ADDING_KBLAYOUTS, + "Setup failed to add keyboard layouts to registry.\n" + "ENTER = Reboot computer" + }, { NULL, NULL @@ -1689,6 +1694,8 @@ MUI_STRING bgBGStrings[] = "Œ"}, {STRING_GB, "ƒ"}, + {STRING_ADDKBLAYOUTS, + "Adding keyboard layouts"}, {0, 0} }; diff --git a/reactos/base/setup/usetup/lang/cs-CZ.h b/reactos/base/setup/usetup/lang/cs-CZ.h index aba61787a40..feafea57989 100644 --- a/reactos/base/setup/usetup/lang/cs-CZ.h +++ b/reactos/base/setup/usetup/lang/cs-CZ.h @@ -1467,6 +1467,11 @@ MUI_ERROR csCZErrorEntries[] = "Nepodaýilo se nastavit m¡stn¡ nastaven¡.\n" "ENTER = Restartovat poŸ¡taŸ" }, + { + //ERROR_ADDING_KBLAYOUTS, + "Setup failed to add keyboard layouts to registry.\n" + "ENTER = Reboot computer" + }, { NULL, NULL @@ -1686,6 +1691,8 @@ MUI_STRING csCZStrings[] = "MB"}, {STRING_GB, "GB"}, + {STRING_ADDKBLAYOUTS, + "Adding keyboard layouts"}, {0, 0} }; diff --git a/reactos/base/setup/usetup/lang/de-DE.h b/reactos/base/setup/usetup/lang/de-DE.h index b792eda5327..5858a0524f4 100644 --- a/reactos/base/setup/usetup/lang/de-DE.h +++ b/reactos/base/setup/usetup/lang/de-DE.h @@ -1461,6 +1461,11 @@ MUI_ERROR deDEErrorEntries[] = "Setup konnte die Systemsprache nicht einstellen.\n" "ENTER = Computer neustarten" }, + { + //ERROR_ADDING_KBLAYOUTS, + "Setup failed to add keyboard layouts to registry.\n" + "ENTER = Reboot computer" + }, { NULL, NULL @@ -1680,6 +1685,8 @@ MUI_STRING deDEStrings[] = "MB"}, {STRING_GB, "GB"}, + {STRING_ADDKBLAYOUTS, + "Adding keyboard layouts"}, {0, 0} }; diff --git a/reactos/base/setup/usetup/lang/el-GR.h b/reactos/base/setup/usetup/lang/el-GR.h index aecf555a910..b4c0d45df54 100644 --- a/reactos/base/setup/usetup/lang/el-GR.h +++ b/reactos/base/setup/usetup/lang/el-GR.h @@ -1461,6 +1461,11 @@ MUI_ERROR elGRErrorEntries[] = "Setup could not set the system locale.\n" "ENTER = Reboot computer" }, + { + //ERROR_ADDING_KBLAYOUTS, + "Setup failed to add keyboard layouts to registry.\n" + "ENTER = Reboot computer" + }, { NULL, NULL @@ -1680,6 +1685,8 @@ MUI_STRING elGRStrings[] = "MB"}, {STRING_GB, "GB"}, + {STRING_ADDKBLAYOUTS, + "Adding keyboard layouts"}, {0, 0} }; diff --git a/reactos/base/setup/usetup/lang/en-US.h b/reactos/base/setup/usetup/lang/en-US.h index 416cb0e3941..804d5db0803 100644 --- a/reactos/base/setup/usetup/lang/en-US.h +++ b/reactos/base/setup/usetup/lang/en-US.h @@ -1461,6 +1461,11 @@ MUI_ERROR enUSErrorEntries[] = "Setup could not set the system locale.\n" "ENTER = Reboot computer" }, + { + //ERROR_ADDING_KBLAYOUTS, + "Setup failed to add keyboard layouts to registry.\n" + "ENTER = Reboot computer" + }, { NULL, NULL @@ -1680,6 +1685,8 @@ MUI_STRING enUSStrings[] = "MB"}, {STRING_GB, "GB"}, + {STRING_ADDKBLAYOUTS, + "Adding keyboard layouts"}, {0, 0} }; diff --git a/reactos/base/setup/usetup/lang/es-ES.h b/reactos/base/setup/usetup/lang/es-ES.h index 3f1297ceacf..6d7a3d20b52 100644 --- a/reactos/base/setup/usetup/lang/es-ES.h +++ b/reactos/base/setup/usetup/lang/es-ES.h @@ -1461,6 +1461,11 @@ MUI_ERROR esESErrorEntries[] = "El instalador no pudo configurar el idioma del sistema.\n" "ENTER = Reiniciar el equipo" }, + { + //ERROR_ADDING_KBLAYOUTS, + "Setup failed to add keyboard layouts to registry.\n" + "ENTER = Reboot computer" + }, { NULL, NULL @@ -1679,6 +1684,8 @@ MUI_STRING esESStrings[] = "MB"}, {STRING_GB, "GB"}, + {STRING_ADDKBLAYOUTS, + "Adding keyboard layouts"}, {0, 0} }; diff --git a/reactos/base/setup/usetup/lang/fr-FR.h b/reactos/base/setup/usetup/lang/fr-FR.h index ab23f1b5974..a4c343295bb 100644 --- a/reactos/base/setup/usetup/lang/fr-FR.h +++ b/reactos/base/setup/usetup/lang/fr-FR.h @@ -1473,6 +1473,11 @@ MUI_ERROR frFRErrorEntries[] = "Setup n'a pu changer la langue systŠme.\n" "ENTER = Red‚marrer l'ordinateur" }, + { + //ERROR_ADDING_KBLAYOUTS, + "Setup failed to add keyboard layouts to registry.\n" + "ENTER = Reboot computer" + }, { NULL, NULL @@ -1692,6 +1697,8 @@ MUI_STRING frFRStrings[] = "Mo"}, {STRING_GB, "Go"}, + {STRING_ADDKBLAYOUTS, + "Adding keyboard layouts"}, {0, 0} }; diff --git a/reactos/base/setup/usetup/lang/it-IT.h b/reactos/base/setup/usetup/lang/it-IT.h index c20b82746c0..cd92ad2b91c 100644 --- a/reactos/base/setup/usetup/lang/it-IT.h +++ b/reactos/base/setup/usetup/lang/it-IT.h @@ -1461,6 +1461,11 @@ MUI_ERROR itITErrorEntries[] = "Setup non ha potuto impostare la regionalizzazione del sistema.\n" "INVIO = Riavviare il computer" }, + { + //ERROR_ADDING_KBLAYOUTS, + "Setup failed to add keyboard layouts to registry.\n" + "ENTER = Reboot computer" + }, { NULL, NULL @@ -1680,6 +1685,8 @@ MUI_STRING itITStrings[] = "MB"}, {STRING_GB, "GB"}, + {STRING_ADDKBLAYOUTS, + "Adding keyboard layouts"}, {0, 0} }; diff --git a/reactos/base/setup/usetup/lang/lt-LT.h b/reactos/base/setup/usetup/lang/lt-LT.h index cf26cab3fe7..42a5222df6c 100644 --- a/reactos/base/setup/usetup/lang/lt-LT.h +++ b/reactos/base/setup/usetup/lang/lt-LT.h @@ -1470,6 +1470,11 @@ MUI_ERROR ltLTErrorEntries[] = "Setup could not set the system locale.\n" "ENTER = Reboot computer" }, + { + //ERROR_ADDING_KBLAYOUTS, + "Setup failed to add keyboard layouts to registry.\n" + "ENTER = Reboot computer" + }, { NULL, NULL @@ -1689,6 +1694,8 @@ MUI_STRING ltLTStrings[] = "MB"}, {STRING_GB, "GB"}, + {STRING_ADDKBLAYOUTS, + "Adding keyboard layouts"}, {0, 0} }; diff --git a/reactos/base/setup/usetup/lang/pl-PL.h b/reactos/base/setup/usetup/lang/pl-PL.h index 776e35306c3..6320d4844d0 100644 --- a/reactos/base/setup/usetup/lang/pl-PL.h +++ b/reactos/base/setup/usetup/lang/pl-PL.h @@ -1468,6 +1468,11 @@ MUI_ERROR plPLErrorEntries[] = "Instalator nie m¢gˆ ustawi† wersji j©zykowej.\n" "ENTER = Restart komputera" }, + { + //ERROR_ADDING_KBLAYOUTS, + "Setup failed to add keyboard layouts to registry.\n" + "ENTER = Reboot computer" + }, { NULL, NULL @@ -1687,6 +1692,8 @@ MUI_STRING plPLStrings[] = "MB"}, {STRING_GB, "GB"}, + {STRING_ADDKBLAYOUTS, + "Adding keyboard layouts"}, {0, 0} }; diff --git a/reactos/base/setup/usetup/lang/ru-RU.h b/reactos/base/setup/usetup/lang/ru-RU.h index c6e762e0183..90e87305d20 100644 --- a/reactos/base/setup/usetup/lang/ru-RU.h +++ b/reactos/base/setup/usetup/lang/ru-RU.h @@ -1461,6 +1461,11 @@ MUI_ERROR ruRUErrorEntries[] = "¥ 㤠«®áì ãáâ ­®¢¨âì «®ª «ì á¨á⥬ë.\n" "ENTER = ¥à¥§ £à㧪 " }, + { + //ERROR_ADDING_KBLAYOUTS, + "Setup failed to add keyboard layouts to registry.\n" + "ENTER = Reboot computer" + }, { NULL, NULL @@ -1680,6 +1685,8 @@ MUI_STRING ruRUStrings[] = "Œ"}, {STRING_GB, "ƒ"}, + {STRING_ADDKBLAYOUTS, + "Adding keyboard layouts"}, {0, 0} }; diff --git a/reactos/base/setup/usetup/lang/sk-SK.h b/reactos/base/setup/usetup/lang/sk-SK.h index 3c8d7a0346b..9ee58a919c0 100644 --- a/reactos/base/setup/usetup/lang/sk-SK.h +++ b/reactos/base/setup/usetup/lang/sk-SK.h @@ -1468,6 +1468,11 @@ MUI_ERROR skSKErrorEntries[] = "Setup could not set the system locale.\n" "ENTER = Reçtart poŸ¡taŸa" }, + { + //ERROR_ADDING_KBLAYOUTS, + "Setup failed to add keyboard layouts to registry.\n" + "ENTER = Reboot computer" + }, { NULL, NULL @@ -1687,6 +1692,8 @@ MUI_STRING skSKStrings[] = "MB"}, {STRING_GB, "GB"}, + {STRING_ADDKBLAYOUTS, + "Adding keyboard layouts"}, {0, 0} }; diff --git a/reactos/base/setup/usetup/lang/sv-SE.h b/reactos/base/setup/usetup/lang/sv-SE.h index 1b476e25e57..8a32d69518a 100644 --- a/reactos/base/setup/usetup/lang/sv-SE.h +++ b/reactos/base/setup/usetup/lang/sv-SE.h @@ -1461,6 +1461,11 @@ MUI_ERROR svSEErrorEntries[] = "Setup could not set the system locale.\n" "ENTER = Reboot computer" }, + { + //ERROR_ADDING_KBLAYOUTS, + "Setup failed to add keyboard layouts to registry.\n" + "ENTER = Reboot computer" + }, { NULL, NULL @@ -1679,6 +1684,8 @@ MUI_STRING svSEStrings[] = "MB"}, {STRING_GB, "GB"}, + {STRING_ADDKBLAYOUTS, + "Adding keyboard layouts"}, {0, 0} }; diff --git a/reactos/base/setup/usetup/lang/uk-UA.h b/reactos/base/setup/usetup/lang/uk-UA.h index 5fd24b69046..ffbb8baf799 100644 --- a/reactos/base/setup/usetup/lang/uk-UA.h +++ b/reactos/base/setup/usetup/lang/uk-UA.h @@ -1461,6 +1461,11 @@ MUI_ERROR ukUAErrorEntries[] = "Setup could not set the system locale.\n" "ENTER = Reboot computer" }, + { + //ERROR_ADDING_KBLAYOUTS, + "Setup failed to add keyboard layouts to registry.\n" + "ENTER = Reboot computer" + }, { NULL, NULL @@ -1680,6 +1685,8 @@ MUI_STRING ukUAStrings[] = "MB"}, {STRING_GB, "GB"}, + {STRING_ADDKBLAYOUTS, + "Adding keyboard layouts"}, {0, 0} }; diff --git a/reactos/base/setup/usetup/mui.c b/reactos/base/setup/usetup/mui.c index 53037cd4fe9..e1c7347e9b5 100644 --- a/reactos/base/setup/usetup/mui.c +++ b/reactos/base/setup/usetup/mui.c @@ -49,36 +49,36 @@ static const MUI_LANGUAGE LanguageList[] = { - /* Lang ID, DefKbdLayout,ANSI CP, OEM CP, MAC CP, Language Name, page strgs,error strings, other strings */ - {L"00000409", L"00000409", L"1252", L"437", L"10000", L"English", enUSPages, enUSErrorEntries, enUSStrings }, - {L"00000401", L"00000401", L"1256", L"720", L"10004", L"Arabic", enUSPages, enUSErrorEntries, enUSStrings }, - {L"00000402", L"00000402", L"1251", L"866", L"10007", L"Bulgarian", bgBGPages, bgBGErrorEntries, bgBGStrings }, - {L"00000403", L"00000403", L"1252", L"850", L"10000", L"Catalan", enUSPages, enUSErrorEntries, enUSStrings }, - {L"00000804", L"00000804", L"936", L"936", L"10008", L"Chinese (PRC)", enUSPages, enUSErrorEntries, enUSStrings }, - {L"00000405", L"00000405", L"1250", L"852", L"10029", L"Czech", csCZPages, csCZErrorEntries, csCZStrings }, - {L"00000406", L"00000406", L"1252", L"850", L"10000", L"Danish", enUSPages, enUSErrorEntries, enUSStrings }, - {L"00000407", L"00000407", L"1252", L"850", L"10000", L"Deutsch", deDEPages, deDEErrorEntries, deDEStrings }, - {L"00000413", L"00000813", L"1252", L"850", L"10000", L"Dutch", enUSPages, enUSErrorEntries, enUSStrings }, - {L"0000040B", L"0000040B", L"1252", L"850", L"10000", L"Finnish", enUSPages, enUSErrorEntries, enUSStrings }, - {L"0000040C", L"0000040C", L"1252", L"850", L"10000", L"French", frFRPages, frFRErrorEntries, frFRStrings }, - {L"00000408", L"00000408", L"1253", L"737", L"10006", L"Greek", elGRPages, elGRErrorEntries, elGRStrings }, - {L"0000040D", L"0000040D", L"1255", L"862", L"10005", L"Hebrew", enUSPages, enUSErrorEntries, enUSStrings }, - {L"0000040E", L"0000040E", L"1250", L"852", L"10029", L"Hungarian", enUSPages, enUSErrorEntries, enUSStrings }, - {L"00000410", L"00000410", L"1252", L"850", L"10000", L"Italian", itITPages, itITErrorEntries, itITStrings }, - {L"00000411", L"00000411", L"932", L"932", L"10001", L"Japanese", enUSPages, enUSErrorEntries, enUSStrings }, - {L"00000412", L"00000412", L"949", L"949", L"10003", L"Korean", enUSPages, enUSErrorEntries, enUSStrings }, - {L"00000427", L"00000427", L"1257", L"775", L"10029", L"Lithuanian", ltLTPages, ltLTErrorEntries, ltLTStrings }, - {L"00000414", L"00000414", L"1252", L"850", L"10000", L"Norwegian", enUSPages, enUSErrorEntries, enUSStrings }, - {L"00000419", L"00000419", L"1251", L"866", L"10007", L"Russkij", ruRUPages, ruRUErrorEntries, ruRUStrings }, - {L"0000041B", L"0000041B", L"1250", L"852", L"10029", L"Slovak", skSKPages, skSKErrorEntries, skSKStrings }, - {L"0000040A", L"0000040A", L"1252", L"850", L"10000", L"Spanish", esESPages, esESErrorEntries, esESStrings }, - {L"00000415", L"00000415", L"1250", L"852", L"10029", L"Polski", plPLPages, plPLErrorEntries, plPLStrings }, - {L"00000816", L"00000816", L"1252", L"850", L"10000", L"Portuguese", enUSPages, enUSErrorEntries, enUSStrings }, - {L"0000041D", L"0000041D", L"1252", L"850", L"10000", L"Swedish", svSEPages, svSEErrorEntries, svSEStrings }, - {L"0000041E", L"0000041E", L"874", L"874", L"10021", L"Thai", enUSPages, enUSErrorEntries, enUSStrings }, - {L"0000041F", L"0000041F", L"1254", L"857", L"10081", L"Turkish", enUSPages, enUSErrorEntries, enUSStrings }, - {L"00000422", L"00000422", L"1251", L"866", L"10017", L"Ukrainian", ukUAPages, ukUAErrorEntries, ukUAStrings }, - {NULL, NULL, NULL, NULL, NULL} + /* Lang ID, DefKbdLayout, SecKbLayout, ANSI CP, OEM CP, MAC CP, Language Name, page strgs,error strings, other strings */ + {L"00000409", L"00000409", NULL, L"1252", L"437", L"10000", L"English", enUSPages, enUSErrorEntries, enUSStrings }, + {L"00000401", L"00000401", L"00000409", L"1256", L"720", L"10004", L"Arabic", enUSPages, enUSErrorEntries, enUSStrings }, + {L"00000402", L"00000402", L"00000409", L"1251", L"866", L"10007", L"Bulgarian", bgBGPages, bgBGErrorEntries, bgBGStrings }, + {L"00000403", L"00000403", L"00000409", L"1252", L"850", L"10000", L"Catalan", enUSPages, enUSErrorEntries, enUSStrings }, + {L"00000804", L"00000804", L"00000409", L"936", L"936", L"10008", L"Chinese (PRC)", enUSPages, enUSErrorEntries, enUSStrings }, + {L"00000405", L"00000405", L"00000409", L"1250", L"852", L"10029", L"Czech", csCZPages, csCZErrorEntries, csCZStrings }, + {L"00000406", L"00000406", L"00000409", L"1252", L"850", L"10000", L"Danish", enUSPages, enUSErrorEntries, enUSStrings }, + {L"00000407", L"00000407", L"00000409", L"1252", L"850", L"10000", L"Deutsch", deDEPages, deDEErrorEntries, deDEStrings }, + {L"00000413", L"00000813", L"00000409", L"1252", L"850", L"10000", L"Dutch", enUSPages, enUSErrorEntries, enUSStrings }, + {L"0000040B", L"0000040B", L"00000409", L"1252", L"850", L"10000", L"Finnish", enUSPages, enUSErrorEntries, enUSStrings }, + {L"0000040C", L"0000040C", L"00000409", L"1252", L"850", L"10000", L"French", frFRPages, frFRErrorEntries, frFRStrings }, + {L"00000408", L"00000408", L"00000409", L"1253", L"737", L"10006", L"Greek", elGRPages, elGRErrorEntries, elGRStrings }, + {L"0000040D", L"0000040D", L"00000409", L"1255", L"862", L"10005", L"Hebrew", enUSPages, enUSErrorEntries, enUSStrings }, + {L"0000040E", L"0000040E", L"00000409", L"1250", L"852", L"10029", L"Hungarian", enUSPages, enUSErrorEntries, enUSStrings }, + {L"00000410", L"00000410", L"00000409", L"1252", L"850", L"10000", L"Italian", itITPages, itITErrorEntries, itITStrings }, + {L"00000411", L"00000411", L"00000409", L"932", L"932", L"10001", L"Japanese", enUSPages, enUSErrorEntries, enUSStrings }, + {L"00000412", L"00000412", L"00000409", L"949", L"949", L"10003", L"Korean", enUSPages, enUSErrorEntries, enUSStrings }, + {L"00000427", L"00000427", L"00000409", L"1257", L"775", L"10029", L"Lithuanian", ltLTPages, ltLTErrorEntries, ltLTStrings }, + {L"00000414", L"00000414", L"00000409", L"1252", L"850", L"10000", L"Norwegian", enUSPages, enUSErrorEntries, enUSStrings }, + {L"00000419", L"00000419", L"00000409", L"1251", L"866", L"10007", L"Russkij", ruRUPages, ruRUErrorEntries, ruRUStrings }, + {L"0000041B", L"0000041B", L"00000409", L"1250", L"852", L"10029", L"Slovak", skSKPages, skSKErrorEntries, skSKStrings }, + {L"0000040A", L"0000040A", L"00000409", L"1252", L"850", L"10000", L"Spanish", esESPages, esESErrorEntries, esESStrings }, + {L"00000415", L"00000415", L"00000409", L"1250", L"852", L"10029", L"Polski", plPLPages, plPLErrorEntries, plPLStrings }, + {L"00000816", L"00000816", L"00000409", L"1252", L"850", L"10000", L"Portuguese", enUSPages, enUSErrorEntries, enUSStrings }, + {L"0000041D", L"0000041D", L"00000409", L"1252", L"850", L"10000", L"Swedish", svSEPages, svSEErrorEntries, svSEStrings }, + {L"0000041E", L"0000041E", L"00000409", L"874", L"874", L"10021", L"Thai", enUSPages, enUSErrorEntries, enUSStrings }, + {L"0000041F", L"0000041F", L"00000409", L"1254", L"857", L"10081", L"Turkish", enUSPages, enUSErrorEntries, enUSStrings }, + {L"00000422", L"00000422", L"00000409", L"1251", L"866", L"10017", L"Ukrainian", ukUAPages, ukUAErrorEntries, ukUAStrings }, + {NULL, NULL, NULL, NULL, NULL, NULL} }; extern @@ -249,6 +249,132 @@ MUIGetString(ULONG Number) return ""; } +static BOOLEAN +AddKbLayoutsToRegistry(IN LPCWSTR DefKbLayout, IN LPCWSTR SecKbLayout) +{ + OBJECT_ATTRIBUTES ObjectAttributes; + UNICODE_STRING KeyName; + UNICODE_STRING ValueName; + HANDLE KeyHandle; + NTSTATUS Status; + ULONG Disposition; + WCHAR szKeyName[48] = L"\\Registry\\User\\.DEFAULT\\Keyboard Layout"; + + // Open the keyboard layout key + RtlInitUnicodeString(&KeyName, + szKeyName); + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + + Status = NtCreateKey(&KeyHandle, + KEY_ALL_ACCESS, + &ObjectAttributes, + 0, + NULL, + 0, + &Disposition); + + if(NT_SUCCESS(Status)) + NtClose(KeyHandle); + else + { + DPRINT1("NtCreateKey() failed (Status %lx)\n", Status); + return FALSE; + } + + KeyName.MaximumLength = sizeof(szKeyName); + Status = RtlAppendUnicodeToString(&KeyName, L"\\Preload"); + + if(!NT_SUCCESS(Status)) + { + DPRINT1("RtlAppend failed! (%lx)\n", Status); + DPRINT1("String is %wZ\n", &KeyName); + return FALSE; + } + + InitializeObjectAttributes(&ObjectAttributes, + &KeyName, + OBJ_CASE_INSENSITIVE, + NULL, + NULL); + + Status = NtCreateKey(&KeyHandle, + KEY_ALL_ACCESS, + &ObjectAttributes, + 0, + NULL, + 0, + &Disposition); + + if (!NT_SUCCESS(Status)) + { + DPRINT1("NtCreateKey() failed (Status %lx)\n", Status); + return FALSE; + } + + /* Set def keyboard layout */ + RtlInitUnicodeString(&ValueName, + L"1"); + + Status = NtSetValueKey(KeyHandle, + &ValueName, + 0, + REG_SZ, + (PVOID)DefKbLayout, + (8 + 1) * sizeof(WCHAR)); + if (!NT_SUCCESS(Status)) + { + DPRINT1("NtSetValueKey() failed (Status %lx)\n", Status); + NtClose(KeyHandle); + return FALSE; + } + + if (SecKbLayout != NULL) + { + /* Set second keyboard layout */ + RtlInitUnicodeString(&ValueName, + L"2"); + + Status = NtSetValueKey(KeyHandle, + &ValueName, + 0, + REG_SZ, + (PVOID)SecKbLayout, + (8 + 1) * sizeof(WCHAR)); + if (!NT_SUCCESS(Status)) + { + DPRINT1("NtSetValueKey() failed (Status %lx)\n", Status); + NtClose(KeyHandle); + return FALSE; + } + } + + NtClose(KeyHandle); + return TRUE; +} + +BOOLEAN +AddKeyboardLayouts(VOID) +{ + ULONG lngIndex = 0; + do + { + if (_wcsicmp(LanguageList[lngIndex].LanguageID , SelectedLanguageId) == 0) + { + return AddKbLayoutsToRegistry(LanguageList[lngIndex].LanguageKeyboardLayoutID, + LanguageList[lngIndex].SecondLangKbLayoutID); + } + + lngIndex++; + } + while (LanguageList[lngIndex].MuiPages != NULL); + + return FALSE; +} + static BOOLEAN AddCodepageToRegistry(IN LPCWSTR ACPage, IN LPCWSTR OEMCPage, IN LPCWSTR MACCPage) { diff --git a/reactos/base/setup/usetup/mui.h b/reactos/base/setup/usetup/mui.h index df39c218a2d..cbea4a584a5 100644 --- a/reactos/base/setup/usetup/mui.h +++ b/reactos/base/setup/usetup/mui.h @@ -31,6 +31,7 @@ typedef struct { PWCHAR LanguageID; PWCHAR LanguageKeyboardLayoutID; + PWCHAR SecondLangKbLayoutID; PWCHAR ACPage; PWCHAR OEMCPage; PWCHAR MACCPage; @@ -52,65 +53,69 @@ MUIDefaultKeyboardLayout(VOID); BOOLEAN AddCodePage(VOID); +BOOLEAN +AddKeyboardLayouts(VOID); + VOID SetConsoleCodePage(VOID); LPSTR MUIGetString(ULONG Number); -#define STRING_PLEASEWAIT 1 -#define STRING_INSTALLCREATEPARTITION 2 -#define STRING_INSTALLDELETEPARTITION 3 -#define STRING_PARTITIONSIZE 4 -#define STRING_CHOOSENEWPARTITION 5 -#define STRING_HDDSIZE 6 -#define STRING_CREATEPARTITION 7 -#define STRING_PARTFORMAT 8 -#define STRING_NONFORMATTEDPART 9 -#define STRING_INSTALLONPART 10 -#define STRING_CHECKINGPART 11 -#define STRING_QUITCONTINUE 12 -#define STRING_REBOOTCOMPUTER 13 -#define STRING_TXTSETUPFAILED 14 -#define STRING_COPYING 15 -#define STRING_SETUPCOPYINGFILES 16 -#define STRING_PAGEDMEM 17 -#define STRING_NONPAGEDMEM 18 -#define STRING_FREEMEM 19 -#define STRING_REGHIVEUPDATE 20 -#define STRING_IMPORTFILE 21 -#define STRING_DISPLAYETTINGSUPDATE 22 -#define STRING_LOCALESETTINGSUPDATE 23 -#define STRING_KEYBOARDSETTINGSUPDATE 24 -#define STRING_CODEPAGEINFOUPDATE 25 -#define STRING_DONE 26 -#define STRING_REBOOTCOMPUTER2 27 -#define STRING_CONSOLEFAIL1 28 -#define STRING_CONSOLEFAIL2 29 -#define STRING_CONSOLEFAIL3 30 -#define STRING_FORMATTINGDISK 31 -#define STRING_CHECKINGDISK 32 -#define STRING_FORMATDISK1 33 -#define STRING_FORMATDISK2 34 -#define STRING_KEEPFORMAT 35 -#define STRING_HDINFOPARTCREATE 36 -#define STRING_HDDINFOUNK1 37 -#define STRING_HDDINFOUNK2 38 -#define STRING_HDINFOPARTDELETE 39 -#define STRING_HDDINFOUNK3 40 -#define STRING_HDINFOPARTZEROED 41 -#define STRING_HDDINFOUNK4 42 -#define STRING_HDINFOPARTEXISTS 43 -#define STRING_HDDINFOUNK5 44 -#define STRING_HDINFOPARTSELECT 45 -#define STRING_HDDINFOUNK6 46 -#define STRING_NEWPARTITION 47 -#define STRING_UNPSPACE 48 -#define STRING_MAXSIZE 49 -#define STRING_UNFORMATTED 50 -#define STRING_FORMATUNUSED 51 -#define STRING_FORMATUNKNOWN 52 -#define STRING_KB 53 -#define STRING_MB 54 -#define STRING_GB 55 +#define STRING_PLEASEWAIT 1 +#define STRING_INSTALLCREATEPARTITION 2 +#define STRING_INSTALLDELETEPARTITION 3 +#define STRING_PARTITIONSIZE 4 +#define STRING_CHOOSENEWPARTITION 5 +#define STRING_HDDSIZE 6 +#define STRING_CREATEPARTITION 7 +#define STRING_PARTFORMAT 8 +#define STRING_NONFORMATTEDPART 9 +#define STRING_INSTALLONPART 10 +#define STRING_CHECKINGPART 11 +#define STRING_QUITCONTINUE 12 +#define STRING_REBOOTCOMPUTER 13 +#define STRING_TXTSETUPFAILED 14 +#define STRING_COPYING 15 +#define STRING_SETUPCOPYINGFILES 16 +#define STRING_PAGEDMEM 17 +#define STRING_NONPAGEDMEM 18 +#define STRING_FREEMEM 19 +#define STRING_REGHIVEUPDATE 20 +#define STRING_IMPORTFILE 21 +#define STRING_DISPLAYETTINGSUPDATE 22 +#define STRING_LOCALESETTINGSUPDATE 23 +#define STRING_KEYBOARDSETTINGSUPDATE 24 +#define STRING_CODEPAGEINFOUPDATE 25 +#define STRING_DONE 26 +#define STRING_REBOOTCOMPUTER2 27 +#define STRING_CONSOLEFAIL1 28 +#define STRING_CONSOLEFAIL2 29 +#define STRING_CONSOLEFAIL3 30 +#define STRING_FORMATTINGDISK 31 +#define STRING_CHECKINGDISK 32 +#define STRING_FORMATDISK1 33 +#define STRING_FORMATDISK2 34 +#define STRING_KEEPFORMAT 35 +#define STRING_HDINFOPARTCREATE 36 +#define STRING_HDDINFOUNK1 37 +#define STRING_HDDINFOUNK2 38 +#define STRING_HDINFOPARTDELETE 39 +#define STRING_HDDINFOUNK3 40 +#define STRING_HDINFOPARTZEROED 41 +#define STRING_HDDINFOUNK4 42 +#define STRING_HDINFOPARTEXISTS 43 +#define STRING_HDDINFOUNK5 44 +#define STRING_HDINFOPARTSELECT 45 +#define STRING_HDDINFOUNK6 46 +#define STRING_NEWPARTITION 47 +#define STRING_UNPSPACE 48 +#define STRING_MAXSIZE 49 +#define STRING_UNFORMATTED 50 +#define STRING_FORMATUNUSED 51 +#define STRING_FORMATUNKNOWN 52 +#define STRING_KB 53 +#define STRING_MB 54 +#define STRING_GB 55 +#define STRING_ADDKBLAYOUTS 56 #endif diff --git a/reactos/base/setup/usetup/settings.c b/reactos/base/setup/usetup/settings.c index 562d1dad674..47fb17b512d 100644 --- a/reactos/base/setup/usetup/settings.c +++ b/reactos/base/setup/usetup/settings.c @@ -868,13 +868,14 @@ ProcessKeyboardLayoutRegistry(PGENERIC_LIST List) { PGENERIC_LIST_ENTRY Entry; PWCHAR LanguageId; + WCHAR CurrentLangId[8 + 1]; OBJECT_ATTRIBUTES ObjectAttributes; UNICODE_STRING KeyName; UNICODE_STRING ValueName; - ULONG Disposition; + ULONG ResLength, Length; HANDLE KeyHandle; NTSTATUS Status; - WCHAR szKeyName[48] = L"\\Registry\\User\\.DEFAULT\\Keyboard Layout"; // 48 = "\Registry\User\.DEFAULT\Keyboard Layout\Preload" + NULL char + PKEY_VALUE_PARTIAL_INFORMATION ValueInfo; Entry = GetGenericListEntry(List); if (Entry == NULL) @@ -884,8 +885,7 @@ ProcessKeyboardLayoutRegistry(PGENERIC_LIST List) if (LanguageId == NULL) return FALSE; - // First create the "Keyboard Layout" key - RtlInitUnicodeString(&KeyName, szKeyName); + RtlInitUnicodeString(&KeyName, L"\\Registry\\User\\.DEFAULT\\Keyboard Layout\\Preload"); InitializeObjectAttributes(&ObjectAttributes, &KeyName, @@ -893,70 +893,94 @@ ProcessKeyboardLayoutRegistry(PGENERIC_LIST List) NULL, NULL); - Status = NtCreateKey(&KeyHandle, - KEY_ALL_ACCESS, - &ObjectAttributes, - 0, - NULL, - 0, - &Disposition); - - if(NT_SUCCESS(Status)) - NtClose(KeyHandle); - else - { - DPRINT1("NtCreateKey() failed (Status %lx)\n", Status); - return FALSE; - } - - // Then create the "Preload" key - KeyName.MaximumLength = sizeof(szKeyName); - Status = RtlAppendUnicodeToString(&KeyName, L"\\Preload"); + Status = NtOpenKey(&KeyHandle, + KEY_ALL_ACCESS, + &ObjectAttributes); if(!NT_SUCCESS(Status)) { - DPRINT1("RtlAppend failed! (%lx)\n", Status); - DPRINT1("String is %wZ\n", &KeyName); + DPRINT1("NtOpenKey() failed (Status %lx)\n", Status); + NtClose(KeyHandle); return FALSE; } - InitializeObjectAttributes(&ObjectAttributes, - &KeyName, - OBJ_CASE_INSENSITIVE, - NULL, - NULL); - - Status = NtCreateKey(&KeyHandle, - KEY_ALL_ACCESS, - &ObjectAttributes, - 0, - NULL, - 0, - &Disposition); - - if (!NT_SUCCESS(Status)) - { - DPRINT1("NtCreateKey() failed (Status %lx)\n", Status); - return FALSE; - } - - /* Set default keyboard layout */ + /* Get current keyboard layout */ RtlInitUnicodeString(&ValueName, L"1"); - Status = NtSetValueKey(KeyHandle, - &ValueName, - 0, - REG_SZ, - (PVOID)LanguageId, - (8 + 1) * sizeof(WCHAR)); - if (!NT_SUCCESS(Status)) + Length = sizeof(KEY_VALUE_PARTIAL_INFORMATION) + (8 + 1) * sizeof(WCHAR); + + ValueInfo = (KEY_VALUE_PARTIAL_INFORMATION*) RtlAllocateHeap(RtlGetProcessHeap(), + 0, + Length); + + if (ValueInfo == NULL) { - DPRINT1("NtSetValueKey() failed (Status %lx)\n", Status); + DPRINT("RtlAllocateHeap() failed\n"); NtClose(KeyHandle); return FALSE; } + Status = NtQueryValueKey(KeyHandle, + &ValueName, + KeyValuePartialInformation, + ValueInfo, + Length, + &ResLength); + if (!NT_SUCCESS(Status)) + { + DPRINT1("NtQueryValueKey() failed (Status %lx)\n", Status); + NtClose(KeyHandle); + return FALSE; + } + + RtlCopyMemory(CurrentLangId, + ValueInfo->Data, + (8 + 1) * sizeof(WCHAR)); + + CurrentLangId[8 + 1] = 0; + + RtlFreeHeap(RtlGetProcessHeap(), + 0, + ValueInfo); + + if (wcscmp(CurrentLangId, LanguageId) != 0) + { + RtlInitUnicodeString(&ValueName, + L"1"); + + Status = NtSetValueKey(KeyHandle, + &ValueName, + 0, + REG_SZ, + (PVOID)LanguageId, + (8 + 1) * sizeof(WCHAR)); + + if (!NT_SUCCESS(Status)) + { + DPRINT1("NtSetValueKey() failed (Status %lx)\n", Status); + NtClose(KeyHandle); + return FALSE; + } + + RtlInitUnicodeString(&ValueName, + L"2"); + + Status = NtSetValueKey(KeyHandle, + &ValueName, + 0, + REG_SZ, + (PVOID)CurrentLangId, + (8 + 1) * sizeof(WCHAR)); + + if (!NT_SUCCESS(Status)) + { + DPRINT1("NtSetValueKey() failed (Status %lx)\n", Status); + NtClose(KeyHandle); + return FALSE; + } + } + NtClose(KeyHandle); return TRUE;