在语言选择里,倒底做了什么样的事情,让ROS系统可以选择不同的语言?ROS系统又是怎么样实现不同的语言支持的呢?
#001 static PAGE_NUMBER
#002 LanguagePage(PINPUT_RECORD Ir)
#003 {
初始化语言列表。
#004 /* Initialize the computer settings list */
#005 if (LanguageList == NULL)
#006 {
根据安装的配置文件选择语言。
#007 LanguageList = CreateLanguageList(SetupInf,DefaultLanguage);
#008
#009 if (LanguageList == NULL)
#010 {
#011 PopupError("Setup Failed to initialize available translations",NULL,POPUP_WAIT_NONE);
#012 return INTRO_PAGE;
#013 }
#014 }
#015
在屏幕上显示语言列表。
#016 DrawGenericList(LanguageList,
#017 2,
#018 18,
#019 xScreen - 3,
#020 yScreen - 3);
#021
滚动选择的语言上。
#022 ScrollToPositionGenericList (LanguageList,GetDefaultLanguageIndex());
#023
#024 MUIDisplayPage(LANGUAGE_PAGE);
#025
循环处理,直到用户选择了安装的语言。
#026 while(TRUE)
#027 {
#028 CONSOLE_ConInKey(Ir);
#029
使用向下方向键选择语言。
#030 if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
#031 (Ir->Event.KeyEvent.wVirtualKeyCode == VK_DOWN)) /* DOWN */
#032 {
#033 #if 0
#034 SelectedLanguageId = (PWCHAR)GetListEntryUserData(GetCurrentListEntry(LanguageList));
#035
#036 /* Redraw language selection page in native language */
#037 MUIDisplayPage(LANGUAGE_PAGE);
#038 #endif
#039
#040 ScrollDownGenericList (LanguageList);
#041 }
使用向上方向键选择语言。
#042 else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
#043 (Ir->Event.KeyEvent.wVirtualKeyCode == VK_UP)) /* UP */
#044 {
#045 #if 0
#046 SelectedLanguageId = (PWCHAR)GetListEntryUserData(GetCurrentListEntry(LanguageList));
#047
#048 /* Redraw language selection page in native language */
#049 MUIDisplayPage(LANGUAGE_PAGE);
#050 #endif
#051
#052 ScrollUpGenericList (LanguageList);
#053 }
#054 if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
#055 (Ir->Event.KeyEvent.wVirtualKeyCode == VK_NEXT)) /* PAGE DOWN */
#056 {
#057 ScrollPageDownGenericList (LanguageList);
#058 }
#059 else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
#060 (Ir->Event.KeyEvent.wVirtualKeyCode == VK_PRIOR)) /* PAGE UP */
#061 {
#062 ScrollPageUpGenericList (LanguageList);
#063 }
#064 else if ((Ir->Event.KeyEvent.uChar.AsciiChar == 0x00) &&
#065 (Ir->Event.KeyEvent.wVirtualKeyCode == VK_F3)) /* F3 */
#066 {
#067 if (ConfirmQuit(Ir) == TRUE)
#068 return QUIT_PAGE;
#069 }
#070 else if (Ir->Event.KeyEvent.uChar.AsciiChar == 0x0D) /* ENTER */
#071 {
#072 SelectedLanguageId = (PWCHAR)GetListEntryUserData(GetCurrentListEntry(LanguageList));
#073
#074 if (wcscmp(SelectedLanguageId,DefaultLanguage))
#075 {
#076 UpdateKBLayout();
#077 }
#078
#079 // Load the font
#080 SetConsoleCodePage();
#081
这里进入下一个介绍页面。
#082 return INTRO_PAGE;
#083 }
#084 else if ((Ir->Event.KeyEvent.uChar.AsciiChar > 0x60) && (Ir->Event.KeyEvent.uChar.AsciiChar < 0x7b))
#085 {
#086 /* a-z */
#087 GenericListKeyPress (LanguageList,Ir->Event.KeyEvent.uChar.AsciiChar);
#088 }
#089 }
#090
#091 return INTRO_PAGE;
#092 }
通过上面的函数处理,就可以选不同的语言。在函数里调用SetConsoleCodePage函数来设置代码页,也就是通过代码页来实现不同的语言来显示。也就是通过下面的代码来实现:
#001 BOOL WINAPI
#002 SetConsoleOutputCP(
#003 IN UINT wCodepage)
#004 {
#005 HANDLE hConsoleOutput;
#006 IO_STATUS_BLOCK IoStatusBlock;
#007 NTSTATUS Status;
#008
#009 hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE);
#010
#011 Status = NtDeviceIoControlFile(
#012 hConsoleOutput,
#013 NULL,
#014 NULL,
#015 NULL,
#016 &IoStatusBlock,
#017 IOCTL_CONSOLE_LOADFONT,
#018 &wCodepage,
#019 sizeof(ULONG),
#020 NULL,
#021 0);
#022 return NT_SUCCESS(Status);
#023 }
代码页的作用,就是设置不同国家的编码方式。比如同一个16进制的码8022,在不同国家里,它是表示不同的语言文字。因此选择代码页,就相当于选择不同国家的语言排列方式。
原文链接:https://www.f2er.com/react/308478.html