3 * Copyright (C) 2008 ReactOS Team
5 * This program is free software; you can redistribute it and/or modify
6 * it under the terms of the GNU General Public License as published by
7 * the Free Software Foundation; either version 2 of the License, or
8 * (at your option) any later version.
10 * This program is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 * GNU General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
20 * COPYRIGHT: See COPYING in the top level directory
21 * PROJECT: ReactOS text-mode setup
22 * FILE: subsys/system/usetup/mui.c
23 * PURPOSE: Text-mode setup
28 #include "errorcode.h"
34 #include "lang/bg-BG.h"
35 #include "lang/en-US.h"
36 #include "lang/de-DE.h"
37 #include "lang/el-GR.h"
38 #include "lang/es-ES.h"
39 #include "lang/fr-FR.h"
40 #include "lang/it-IT.h"
41 #include "lang/pl-PL.h"
42 #include "lang/ru-RU.h"
43 #include "lang/sk-SK.h"
44 #include "lang/sv-SE.h"
45 #include "lang/uk-UA.h"
46 #include "lang/lt-LT.h"
48 static const MUI_LANGUAGE LanguageList
[] =
50 /* Lang ID, DefKbdLayout,ANSI CP, OEM CP, MAC CP, Language Name, page strgs,error strings */
51 {L
"00000409", L
"00000409", L
"1252", L
"437", L
"10000", L
"English", enUSPages
, enUSErrorEntries
, enUSStrings
},
52 {L
"00000402", L
"00000402", L
"1251", L
"866", L
"10007", L
"Bulgarian", bgBGPages
, bgBGErrorEntries
, enUSStrings
},
53 {L
"00000403", L
"00000403", L
"1252", L
"850", L
"10000", L
"Catalan", enUSPages
, enUSErrorEntries
, enUSStrings
},
54 {L
"00000804", L
"00000804", L
"936", L
"936", L
"10008", L
"Chinese (PRC)", enUSPages
, enUSErrorEntries
, enUSStrings
},
55 {L
"00000406", L
"00000406", L
"1252", L
"850", L
"10000", L
"Danish", enUSPages
, enUSErrorEntries
, enUSStrings
},
56 {L
"00000413", L
"00000813", L
"1252", L
"850", L
"10000", L
"Dutch", enUSPages
, enUSErrorEntries
, enUSStrings
},
57 {L
"0000040B", L
"0000040B", L
"1252", L
"850", L
"10000", L
"Finnish", enUSPages
, enUSErrorEntries
, enUSStrings
},
58 {L
"0000040C", L
"0000040C", L
"1252", L
"850", L
"10000", L
"French", frFRPages
, frFRErrorEntries
, enUSStrings
},
59 {L
"00000407", L
"00000407", L
"1252", L
"850", L
"10000", L
"German", deDEPages
, deDEErrorEntries
, deDEStrings
},
60 {L
"00000408", L
"00000408", L
"1253", L
"737", L
"10006", L
"Greek", elGRPages
, elGRErrorEntries
, enUSStrings
},
61 {L
"0000040D", L
"0000040D", L
"1255", L
"862", L
"10005", L
"Hebrew", enUSPages
, enUSErrorEntries
, enUSStrings
},
62 {L
"0000040E", L
"0000040E", L
"1250", L
"852", L
"10029", L
"Hungarian", enUSPages
, enUSErrorEntries
, enUSStrings
},
63 {L
"00000410", L
"00000410", L
"1252", L
"850", L
"10000", L
"Italian", itITPages
, itITErrorEntries
, enUSStrings
},
64 {L
"00000411", L
"00000411", L
"932", L
"932", L
"10001", L
"Japanese", enUSPages
, enUSErrorEntries
, enUSStrings
},
65 {L
"00000412", L
"00000412", L
"949", L
"949", L
"10003", L
"Korean", enUSPages
, enUSErrorEntries
, enUSStrings
},
66 {L
"00000427", L
"00000427", L
"1257", L
"775", L
"10029", L
"Lithuanian", ltLTPages
, ltLTErrorEntries
, enUSStrings
},
67 {L
"00000414", L
"00000414", L
"1252", L
"850", L
"10000", L
"Norwegian", enUSPages
, enUSErrorEntries
, enUSStrings
},
68 {L
"00000419", L
"00000419", L
"1251", L
"866", L
"10007", L
"Russian", ruRUPages
, ruRUErrorEntries
, enUSStrings
},
69 {L
"0000041B", L
"0000041B", L
"1250", L
"852", L
"10029", L
"Slovak", skSKPages
, skSKErrorEntries
, enUSStrings
},
70 {L
"0000040A", L
"0000040A", L
"1252", L
"850", L
"10000", L
"Spanish", esESPages
, esESErrorEntries
, enUSStrings
},
71 {L
"00000415", L
"00000415", L
"1250", L
"852", L
"10029", L
"Polish", plPLPages
, plPLErrorEntries
, enUSStrings
},
72 {L
"00000816", L
"00000816", L
"1252", L
"850", L
"10000", L
"Portuguese", enUSPages
, enUSErrorEntries
, enUSStrings
},
73 {L
"0000041D", L
"0000041D", L
"1252", L
"850", L
"10000", L
"Swedish", svSEPages
, svSEErrorEntries
, enUSStrings
},
74 {L
"0000041E", L
"0000041E", L
"874", L
"874", L
"10021", L
"Thai", enUSPages
, enUSErrorEntries
, enUSStrings
},
75 {L
"0000041F", L
"0000041F", L
"1254", L
"857", L
"10081", L
"Turkish", enUSPages
, enUSErrorEntries
, enUSStrings
},
76 {L
"00000422", L
"00000422", L
"1251", L
"866", L
"10017", L
"Ukrainian", ukUAPages
, ukUAErrorEntries
, enUSStrings
},
77 {NULL
, NULL
, NULL
, NULL
, NULL
}
82 PopupError(IN PCCH Text
,
89 FindMUIEntriesOfPage(IN ULONG PageNumber
)
93 const MUI_PAGE
* Pages
= NULL
;
97 /* First we search the language list till we find current selected language messages */
98 if (_wcsicmp(LanguageList
[lngIndex
].LanguageID
, SelectedLanguageId
) == 0)
100 /* Get all available pages for this language */
101 Pages
= LanguageList
[lngIndex
].MuiPages
;
105 /* Get page messages */
106 if (Pages
[muiIndex
].Number
== PageNumber
)
107 return Pages
[muiIndex
].MuiEntry
;
111 while (Pages
[muiIndex
].MuiEntry
!= NULL
);
116 while (LanguageList
[lngIndex
].MuiPages
!= NULL
);
123 FindMUIErrorEntries(VOID
)
129 /* First we search the language list till we find current selected language messages */
130 if (_wcsicmp(LanguageList
[lngIndex
].LanguageID
, SelectedLanguageId
) == 0)
132 /* Get all available error messages for this language */
133 return LanguageList
[lngIndex
].MuiErrors
;
138 while (LanguageList
[lngIndex
].MuiPages
!= NULL
);
145 FindMUIStringEntries(VOID
)
151 /* First we search the language list till we find current selected language messages */
152 if (_wcsicmp(LanguageList
[lngIndex
].LanguageID
, SelectedLanguageId
) == 0)
154 /* Get all available strings for this language */
155 return LanguageList
[lngIndex
].MuiStrings
;
160 while (LanguageList
[lngIndex
].MuiPages
!= NULL
);
166 MUIDefaultKeyboardLayout(VOID
)
171 /* First we search the language list till we find current selected language messages */
172 if (_wcsicmp(LanguageList
[lngIndex
].LanguageID
, SelectedLanguageId
) == 0)
174 /* Return default keyboard layout */
175 return LanguageList
[lngIndex
].LanguageKeyboardLayoutID
;
180 while (LanguageList
[lngIndex
].MuiPages
!= NULL
);
186 MUIDisplayPage(IN ULONG page
)
188 const MUI_ENTRY
* entry
;
192 entry
= FindMUIEntriesOfPage(page
);
195 PopupError("Error: Failed to find translated page",
205 flags
= entry
[index
].Flags
;
209 CONSOLE_SetTextXY(entry
[index
].X
, entry
[index
].Y
, entry
[index
].Buffer
);
212 CONSOLE_SetHighlightedTextXY(entry
[index
].X
, entry
[index
].Y
, entry
[index
].Buffer
);
215 CONSOLE_SetUnderlinedTextXY(entry
[index
].X
, entry
[index
].Y
, entry
[index
].Buffer
);
218 CONSOLE_SetStatusText(entry
[index
].Buffer
);
225 while (entry
[index
].Buffer
!= NULL
);
229 MUIDisplayError(IN ULONG ErrorNum
, OUT PINPUT_RECORD Ir
, IN ULONG WaitEvent
)
231 const MUI_ERROR
* entry
;
233 if (ErrorNum
>= ERROR_LAST_ERROR_CODE
)
235 PopupError("Invalid error number provided",
236 "Press ENTER to continue",
243 entry
= FindMUIErrorEntries();
246 PopupError("Error: Failed to find translated error message",
253 PopupError(entry
[ErrorNum
].ErrorText
,
254 entry
[ErrorNum
].ErrorStatus
,
260 MUIGetString(ULONG Number
)
263 const MUI_STRING
* entry
;
265 entry
= FindMUIStringEntries();
268 for (i
= 0; entry
[i
].Number
!= 0; i
++)
270 if (entry
[i
].Number
== Number
)
272 return entry
[i
].String
;
277 PopupError("Error: Failed to find translated string",
286 AddCodepageToRegistry(IN LPCWSTR ACPage
, IN LPCWSTR OEMCPage
, IN LPCWSTR MACCPage
)
288 OBJECT_ATTRIBUTES ObjectAttributes
;
289 UNICODE_STRING KeyName
;
290 UNICODE_STRING ValueName
;
294 // Open the nls codepage key
295 RtlInitUnicodeString(&KeyName
,
296 L
"\\Registry\\Machine\\SYSTEM\\CurrentControlSet\\Control\\NLS\\CodePage");
297 InitializeObjectAttributes(&ObjectAttributes
,
299 OBJ_CASE_INSENSITIVE
,
302 Status
= NtOpenKey(&KeyHandle
,
305 if (!NT_SUCCESS(Status
))
307 DPRINT1("NtOpenKey() failed (Status %lx)\n", Status
);
312 RtlInitUnicodeString(&ValueName
, L
"ACP");
313 Status
= NtSetValueKey(KeyHandle
,
318 wcslen(ACPage
) * sizeof(PWCHAR
));
319 if (!NT_SUCCESS(Status
))
321 DPRINT1("NtSetValueKey() failed (Status %lx)\n", Status
);
327 RtlInitUnicodeString(&ValueName
, L
"OEMCP");
328 Status
= NtSetValueKey(KeyHandle
,
333 wcslen(OEMCPage
) * sizeof(PWCHAR
));
334 if (!NT_SUCCESS(Status
))
336 DPRINT1("NtSetValueKey() failed (Status %lx)\n", Status
);
342 RtlInitUnicodeString(&ValueName
, L
"MACCP");
343 Status
= NtSetValueKey(KeyHandle
,
348 wcslen(MACCPage
) * sizeof(PWCHAR
));
349 if (!NT_SUCCESS(Status
))
351 DPRINT1("NtSetValueKey() failed (Status %lx)\n", Status
);
367 if (_wcsicmp(LanguageList
[lngIndex
].LanguageID
, SelectedLanguageId
) == 0)
369 return AddCodepageToRegistry(LanguageList
[lngIndex
].ACPage
,
370 LanguageList
[lngIndex
].OEMCPage
,
371 LanguageList
[lngIndex
].MACCPage
);
376 while (LanguageList
[lngIndex
].MuiPages
!= NULL
);
382 SetConsoleCodePage(VOID
)
389 if (_wcsicmp(LanguageList
[lngIndex
].LanguageID
, SelectedLanguageId
) == 0)
391 wCodePage
= (UINT
) wcstoul(LanguageList
[lngIndex
].OEMCPage
, NULL
, 10);
392 SetConsoleOutputCP(wCodePage
);
398 while (LanguageList
[lngIndex
].MuiPages
!= NULL
);