Apply GetBestLanguage() for the implementation of HiiStringIdToImage() API.
E.g. L"PlatformLang" variable is "en" and registered string supports "en-US" git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@7954 6f19259b-4bc3-4df7-8a09-765794883524
This commit is contained in:
@ -2089,12 +2089,17 @@ HiiStringIdToImage (
|
|||||||
{
|
{
|
||||||
EFI_STATUS Status;
|
EFI_STATUS Status;
|
||||||
HII_DATABASE_PRIVATE_DATA *Private;
|
HII_DATABASE_PRIVATE_DATA *Private;
|
||||||
|
EFI_HII_STRING_PROTOCOL *HiiString;
|
||||||
EFI_STRING String;
|
EFI_STRING String;
|
||||||
UINTN StringSize;
|
UINTN StringSize;
|
||||||
UINTN FontLen;
|
UINTN FontLen;
|
||||||
EFI_FONT_INFO *StringFontInfo;
|
EFI_FONT_INFO *StringFontInfo;
|
||||||
EFI_FONT_DISPLAY_INFO *NewStringInfo;
|
EFI_FONT_DISPLAY_INFO *NewStringInfo;
|
||||||
CHAR8 CurrentLang[RFC_3066_ENTRY_SIZE];
|
CHAR8 TempSupportedLanguages;
|
||||||
|
CHAR8 *SupportedLanguages;
|
||||||
|
UINTN SupportedLanguagesSize;
|
||||||
|
CHAR8 *CurrentLanguage;
|
||||||
|
CHAR8 *BestLanguage;
|
||||||
|
|
||||||
if (This == NULL || PackageList == NULL || Blt == NULL || PackageList == NULL) {
|
if (This == NULL || PackageList == NULL || Blt == NULL || PackageList == NULL) {
|
||||||
return EFI_INVALID_PARAMETER;
|
return EFI_INVALID_PARAMETER;
|
||||||
@ -2105,57 +2110,104 @@ HiiStringIdToImage (
|
|||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
// When Language points to NULL, current system language is used.
|
// Initialize string pointers to be NULL
|
||||||
//
|
//
|
||||||
if (Language != NULL) {
|
SupportedLanguages = NULL;
|
||||||
AsciiStrCpy (CurrentLang, (CHAR8 *) Language);
|
CurrentLanguage = NULL;
|
||||||
} else {
|
BestLanguage = NULL;
|
||||||
GetCurrentLanguage (CurrentLang);
|
String = NULL;
|
||||||
}
|
StringInfo = NULL;
|
||||||
|
StringFontInfo = NULL;
|
||||||
|
NewStringInfo = NULL;
|
||||||
|
|
||||||
//
|
//
|
||||||
// Get the string to be displayed.
|
// Get the string to be displayed.
|
||||||
//
|
//
|
||||||
|
Private = HII_FONT_DATABASE_PRIVATE_DATA_FROM_THIS (This);
|
||||||
|
HiiString = &Private->HiiString;
|
||||||
|
|
||||||
StringSize = MAX_STRING_LENGTH;
|
//
|
||||||
String = (EFI_STRING) AllocateZeroPool (StringSize);
|
// Get the size of supported language.
|
||||||
if (String == NULL) {
|
//
|
||||||
|
SupportedLanguagesSize = 0;
|
||||||
|
Status = HiiString->GetLanguages (
|
||||||
|
HiiString,
|
||||||
|
PackageList,
|
||||||
|
&TempSupportedLanguages,
|
||||||
|
&SupportedLanguagesSize
|
||||||
|
);
|
||||||
|
if (Status != EFI_BUFFER_TOO_SMALL) {
|
||||||
|
return Status;
|
||||||
|
}
|
||||||
|
|
||||||
|
SupportedLanguages = AllocatePool (SupportedLanguagesSize);
|
||||||
|
if (SupportedLanguages == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
return EFI_OUT_OF_RESOURCES;
|
||||||
}
|
}
|
||||||
|
|
||||||
Private = HII_FONT_DATABASE_PRIVATE_DATA_FROM_THIS (This);
|
Status = HiiString->GetLanguages (
|
||||||
StringFontInfo = NULL;
|
HiiString,
|
||||||
NewStringInfo = NULL;
|
PackageList,
|
||||||
|
SupportedLanguages,
|
||||||
Status = Private->HiiString.GetString (
|
&SupportedLanguagesSize
|
||||||
&Private->HiiString,
|
);
|
||||||
CurrentLang,
|
if (EFI_ERROR (Status)) {
|
||||||
PackageList,
|
goto Exit;
|
||||||
StringId,
|
}
|
||||||
String,
|
|
||||||
&StringSize,
|
if (Language == NULL) {
|
||||||
&StringFontInfo
|
Language = "";
|
||||||
);
|
}
|
||||||
|
CurrentLanguage = GetEfiGlobalVariable (L"PlatformLang");
|
||||||
|
BestLanguage = GetBestLanguage (
|
||||||
|
SupportedLanguages,
|
||||||
|
FALSE,
|
||||||
|
Language,
|
||||||
|
(CurrentLanguage == NULL) ? CurrentLanguage : "",
|
||||||
|
(CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLang),
|
||||||
|
NULL
|
||||||
|
);
|
||||||
|
if (BestLanguage == NULL) {
|
||||||
|
Status = EFI_NOT_FOUND;
|
||||||
|
goto Exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
StringSize = MAX_STRING_LENGTH;
|
||||||
|
String = (EFI_STRING) AllocateZeroPool (StringSize);
|
||||||
|
if (String == NULL) {
|
||||||
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
|
goto Exit;
|
||||||
|
}
|
||||||
|
|
||||||
|
Status = HiiString->GetString (
|
||||||
|
HiiString,
|
||||||
|
BestLanguage,
|
||||||
|
PackageList,
|
||||||
|
StringId,
|
||||||
|
String,
|
||||||
|
&StringSize,
|
||||||
|
&StringFontInfo
|
||||||
|
);
|
||||||
if (Status == EFI_BUFFER_TOO_SMALL) {
|
if (Status == EFI_BUFFER_TOO_SMALL) {
|
||||||
FreePool (String);
|
FreePool (String);
|
||||||
String = (EFI_STRING) AllocateZeroPool (StringSize);
|
String = (EFI_STRING) AllocateZeroPool (StringSize);
|
||||||
if (String == NULL) {
|
if (String == NULL) {
|
||||||
return EFI_OUT_OF_RESOURCES;
|
Status = EFI_OUT_OF_RESOURCES;
|
||||||
|
goto Exit;
|
||||||
}
|
}
|
||||||
Status = Private->HiiString.GetString (
|
Status = HiiString->GetString (
|
||||||
&Private->HiiString,
|
HiiString,
|
||||||
Language,
|
BestLanguage,
|
||||||
PackageList,
|
PackageList,
|
||||||
StringId,
|
StringId,
|
||||||
String,
|
String,
|
||||||
&StringSize,
|
&StringSize,
|
||||||
NULL
|
NULL
|
||||||
);
|
);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (EFI_ERROR (Status)) {
|
if (EFI_ERROR (Status)) {
|
||||||
goto Exit;
|
goto Exit;
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
//
|
||||||
@ -2204,6 +2256,15 @@ HiiStringIdToImage (
|
|||||||
);
|
);
|
||||||
|
|
||||||
Exit:
|
Exit:
|
||||||
|
if (SupportedLanguages != NULL) {
|
||||||
|
FreePool (SupportedLanguages);
|
||||||
|
}
|
||||||
|
if (CurrentLanguage != NULL) {
|
||||||
|
FreePool (CurrentLanguage);
|
||||||
|
}
|
||||||
|
if (BestLanguage != NULL) {
|
||||||
|
FreePool (BestLanguage);
|
||||||
|
}
|
||||||
if (String != NULL) {
|
if (String != NULL) {
|
||||||
FreePool (String);
|
FreePool (String);
|
||||||
}
|
}
|
||||||
|
@ -57,49 +57,4 @@ R8_EfiLibCompareLanguage (
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
|
||||||
Determine what is the current language setting. The space reserved for Lang
|
|
||||||
must be at least RFC_3066_ENTRY_SIZE bytes;
|
|
||||||
|
|
||||||
If Lang is NULL, then ASSERT.
|
|
||||||
|
|
||||||
@param Lang Pointer of system language. Lang will always be filled with
|
|
||||||
a valid RFC 3066 language string. If "PlatformLang" is not
|
|
||||||
set in the system, the default language specifed by PcdUefiVariableDefaultPlatformLang
|
|
||||||
is returned.
|
|
||||||
|
|
||||||
@return EFI_SUCCESS If the EFI Variable with "PlatformLang" is set and return in Lang.
|
|
||||||
@return EFI_NOT_FOUND If the EFI Variable with "PlatformLang" is not set, but a valid default language is return in Lang.
|
|
||||||
|
|
||||||
**/
|
|
||||||
EFI_STATUS
|
|
||||||
EFIAPI
|
|
||||||
GetCurrentLanguage (
|
|
||||||
OUT CHAR8 *Lang
|
|
||||||
)
|
|
||||||
{
|
|
||||||
EFI_STATUS Status;
|
|
||||||
UINTN Size;
|
|
||||||
|
|
||||||
ASSERT (Lang != NULL);
|
|
||||||
|
|
||||||
//
|
|
||||||
// Get current language setting
|
|
||||||
//
|
|
||||||
Size = RFC_3066_ENTRY_SIZE;
|
|
||||||
Status = gRT->GetVariable (
|
|
||||||
L"PlatformLang",
|
|
||||||
&gEfiGlobalVariableGuid,
|
|
||||||
NULL,
|
|
||||||
&Size,
|
|
||||||
Lang
|
|
||||||
);
|
|
||||||
|
|
||||||
if (EFI_ERROR (Status)) {
|
|
||||||
AsciiStrCpy (Lang, (CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLang));
|
|
||||||
}
|
|
||||||
|
|
||||||
return Status;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -34,27 +34,6 @@ R8_EfiLibCompareLanguage (
|
|||||||
)
|
)
|
||||||
;
|
;
|
||||||
|
|
||||||
/**
|
|
||||||
Determine what is the current language setting. The space reserved for Lang
|
|
||||||
must be at least RFC_3066_ENTRY_SIZE bytes;
|
|
||||||
|
|
||||||
If Lang is NULL, then ASSERT.
|
|
||||||
|
|
||||||
@param Lang Pointer of system language. Lang will always be filled with
|
|
||||||
a valid RFC 3066 language string. If "PlatformLang" is not
|
|
||||||
set in the system, the default language specifed by PcdUefiVariableDefaultPlatformLang
|
|
||||||
is returned.
|
|
||||||
|
|
||||||
@return EFI_SUCCESS If the EFI Variable with "PlatformLang" is set and return in Lang.
|
|
||||||
@return EFI_NOT_FOUND If the EFI Variable with "PlatformLang" is not set, but a valid default language is return in Lang.
|
|
||||||
|
|
||||||
**/
|
|
||||||
EFI_STATUS
|
|
||||||
EFIAPI
|
|
||||||
GetCurrentLanguage (
|
|
||||||
OUT CHAR8 *Lang
|
|
||||||
);
|
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user