diff --git a/IntelFrameworkModulePkg/Universal/BdsDxe/FrontPage.c b/IntelFrameworkModulePkg/Universal/BdsDxe/FrontPage.c index fb605d57d9..29974769bb 100644 --- a/IntelFrameworkModulePkg/Universal/BdsDxe/FrontPage.c +++ b/IntelFrameworkModulePkg/Universal/BdsDxe/FrontPage.c @@ -129,10 +129,12 @@ FrontPageCallback ( { CHAR8 *LanguageString; CHAR8 *LangCode; - CHAR8 Lang[RFC_3066_ENTRY_SIZE]; + CHAR8 *Lang; CHAR8 OldLang[ISO_639_2_ENTRY_SIZE]; UINTN Index; EFI_STATUS Status; + CHAR8 *PlatformSupportedLanguages; + CHAR8 *BestLanguage; if ((Value == NULL) || (ActionRequest == NULL)) { return EFI_INVALID_PARAMETER; @@ -158,7 +160,12 @@ FrontPageCallback ( // LanguageString = HiiLibGetSupportedLanguages (gFrontPagePrivate.HiiHandle); ASSERT (LanguageString != NULL); - + // + // Allocate working buffer for RFC 4646 language in supported LanguageString. + // + Lang = AllocatePool (AsciiStrSize (LanguageString)); + ASSERT (Lang != NULL); + Index = 0; LangCode = LanguageString; while (*LangCode != 0) { @@ -171,30 +178,53 @@ FrontPageCallback ( Index++; } - Status = gRT->SetVariable ( - L"PlatformLang", - &gEfiGlobalVariableGuid, - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, - AsciiStrSize (Lang), - Lang - ); - - if (!FeaturePcdGet (PcdUefiVariableDefaultLangDeprecate)) { - // - // Set UEFI deprecated variable "Lang" for backwards compatibility - // - Status = ConvertRfc3066LanguageToIso639Language (Lang, OldLang); - if (!EFI_ERROR (Status)) { - Status = gRT->SetVariable ( - L"Lang", - &gEfiGlobalVariableGuid, - EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, - ISO_639_2_ENTRY_SIZE, - OldLang - ); - } + PlatformSupportedLanguages = GetEfiGlobalVariable (L"PlatformLangCodes"); + if (PlatformSupportedLanguages == NULL) { + PlatformSupportedLanguages = AllocateCopyPool ( + AsciiStrSize ((CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes)), + (CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes) + ); + ASSERT (PlatformSupportedLanguages != NULL); } + + // + // Select the best language in platform supported Language. + // + BestLanguage = GetBestLanguage ( + PlatformSupportedLanguages, + FALSE, + Lang, + NULL + ); + if (BestLanguage != NULL) { + Status = gRT->SetVariable ( + L"PlatformLang", + &gEfiGlobalVariableGuid, + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, + AsciiStrSize (BestLanguage), + Lang + ); + if (!FeaturePcdGet (PcdUefiVariableDefaultLangDeprecate)) { + // + // Set UEFI deprecated variable "Lang" for backwards compatibility + // + Status = ConvertRfc3066LanguageToIso639Language (BestLanguage, OldLang); + if (!EFI_ERROR (Status)) { + Status = gRT->SetVariable ( + L"Lang", + &gEfiGlobalVariableGuid, + EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS, + ISO_639_2_ENTRY_SIZE, + OldLang + ); + } + } + FreePool (BestLanguage); + } + + FreePool (PlatformSupportedLanguages); + FreePool (Lang); FreePool (LanguageString); break; @@ -247,8 +277,9 @@ InitializeFrontPage ( IFR_OPTION *OptionList; CHAR8 *LanguageString; CHAR8 *LangCode; - CHAR8 Lang[RFC_3066_ENTRY_SIZE]; - CHAR8 CurrentLang[RFC_3066_ENTRY_SIZE]; + CHAR8 *Lang; + CHAR8 *CurrentLang; + CHAR8 *BestLanguage; UINTN OptionCount; EFI_STRING_ID Token; CHAR16 *StringBuffer; @@ -329,10 +360,6 @@ InitializeFrontPage ( } } - // - // Get current language setting - // - GetCurrentLanguage (CurrentLang); // // Allocate space for creation of UpdateData Buffer @@ -350,6 +377,28 @@ InitializeFrontPage ( HiiHandle = gFrontPagePrivate.HiiHandle; LanguageString = HiiLibGetSupportedLanguages (HiiHandle); ASSERT (LanguageString != NULL); + // + // Allocate working buffer for RFC 4646 language in supported LanguageString. + // + Lang = AllocatePool (AsciiStrSize (LanguageString)); + ASSERT (Lang != NULL); + + CurrentLang = GetEfiGlobalVariable (L"PlatformLang"); + // + // Select the best language in LanguageString as the default one. + // + BestLanguage = GetBestLanguage ( + LanguageString, + FALSE, + (CurrentLang != NULL) ? CurrentLang : "", + (CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLang), + LanguageString, + NULL + ); + // + // BestLanguage must be selected as it is the first language in LanguageString by default + // + ASSERT (BestLanguage != NULL); OptionCount = 0; LangCode = LanguageString; @@ -394,7 +443,7 @@ InitializeFrontPage ( Token = gFrontPagePrivate.LanguageToken[OptionCount]; } - if (AsciiStrCmp (Lang, CurrentLang) == 0) { + if (AsciiStrCmp (Lang, BestLanguage) == 0) { OptionList[OptionCount].Flags = EFI_IFR_OPTION_DEFAULT; } else { OptionList[OptionCount].Flags = 0; @@ -405,6 +454,11 @@ InitializeFrontPage ( OptionCount++; } + if (CurrentLang != NULL) { + FreePool (CurrentLang); + } + FreePool (BestLanguage); + FreePool (Lang); FreePool (LanguageString); UpdateData.Offset = 0;