mirror of https://github.com/acidanthera/audk.git
610 lines
11 KiB
C
610 lines
11 KiB
C
/** @file
|
|
Language settings
|
|
|
|
Copyright (c) 2004 - 2008, Intel Corporation. <BR>
|
|
All rights reserved. This program and the accompanying materials
|
|
are licensed and made available under the terms and conditions of the BSD License
|
|
which accompanies this distribution. The full text of the license may be found at
|
|
http://opensource.org/licenses/bsd-license.php
|
|
|
|
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
|
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
|
|
|
**/
|
|
|
|
#include "Language.h"
|
|
#include "FrontPage.h"
|
|
|
|
//
|
|
// Lookup table of ISO639-2 3 character language codes to ISO 639-1 2 character language codes
|
|
// Each entry is 5 CHAR8 values long. The first 3 CHAR8 values are the ISO 639-2 code.
|
|
// The last 2 CHAR8 values are the ISO 639-1 code.
|
|
//
|
|
GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 Iso639ToRfc3066ConversionTable[] =
|
|
"\
|
|
aaraa\
|
|
abkab\
|
|
afraf\
|
|
amham\
|
|
araar\
|
|
asmas\
|
|
aymay\
|
|
azeaz\
|
|
bakba\
|
|
belbe\
|
|
benbn\
|
|
bihbh\
|
|
bisbi\
|
|
bodbo\
|
|
brebr\
|
|
bulbg\
|
|
catca\
|
|
cescs\
|
|
corkw\
|
|
cosco\
|
|
cymcy\
|
|
danda\
|
|
deude\
|
|
dzodz\
|
|
ellel\
|
|
engen\
|
|
epoeo\
|
|
estet\
|
|
euseu\
|
|
faofo\
|
|
fasfa\
|
|
fijfj\
|
|
finfi\
|
|
frafr\
|
|
fryfy\
|
|
gaiga\
|
|
gdhgd\
|
|
glggl\
|
|
grngn\
|
|
gujgu\
|
|
hauha\
|
|
hebhe\
|
|
hinhi\
|
|
hrvhr\
|
|
hunhu\
|
|
hyehy\
|
|
ikuiu\
|
|
ileie\
|
|
inaia\
|
|
indid\
|
|
ipkik\
|
|
islis\
|
|
itait\
|
|
jawjw\
|
|
jpnja\
|
|
kalkl\
|
|
kankn\
|
|
kasks\
|
|
katka\
|
|
kazkk\
|
|
khmkm\
|
|
kinrw\
|
|
kirky\
|
|
korko\
|
|
kurku\
|
|
laolo\
|
|
latla\
|
|
lavlv\
|
|
linln\
|
|
litlt\
|
|
ltzlb\
|
|
malml\
|
|
marmr\
|
|
mkdmk\
|
|
mlgmg\
|
|
mltmt\
|
|
molmo\
|
|
monmn\
|
|
mrimi\
|
|
msams\
|
|
myamy\
|
|
nauna\
|
|
nepne\
|
|
nldnl\
|
|
norno\
|
|
ocioc\
|
|
ormom\
|
|
panpa\
|
|
polpl\
|
|
porpt\
|
|
pusps\
|
|
quequ\
|
|
rohrm\
|
|
ronro\
|
|
runrn\
|
|
rusru\
|
|
sagsg\
|
|
sansa\
|
|
sinsi\
|
|
slksk\
|
|
slvsl\
|
|
smise\
|
|
smosm\
|
|
snasn\
|
|
sndsd\
|
|
somso\
|
|
sotst\
|
|
spaes\
|
|
sqisq\
|
|
srpsr\
|
|
sswss\
|
|
sunsu\
|
|
swasw\
|
|
swesv\
|
|
tamta\
|
|
tattt\
|
|
telte\
|
|
tgktg\
|
|
tgltl\
|
|
thath\
|
|
tsnts\
|
|
tuktk\
|
|
twitw\
|
|
uigug\
|
|
ukruk\
|
|
urdur\
|
|
uzbuz\
|
|
vievi\
|
|
volvo\
|
|
wolwo\
|
|
xhoxh\
|
|
yidyi\
|
|
zhaza\
|
|
zhozh\
|
|
zulzu\
|
|
";
|
|
|
|
#define NARROW_GLYPH_NUMBER 8
|
|
#define WIDE_GLYPH_NUMBER 75
|
|
|
|
EFI_GUID mFontPackageGuid = {
|
|
0x78941450, 0x90ab, 0x4fb1, {0xb7, 0x5f, 0x58, 0x92, 0x14, 0xe2, 0x4a, 0xc}
|
|
};
|
|
|
|
typedef struct {
|
|
///
|
|
/// This 4-bytes total array length is required by HiiAddPackages()
|
|
///
|
|
UINT32 Length;
|
|
|
|
//
|
|
// This is the Font package definition
|
|
//
|
|
EFI_HII_PACKAGE_HEADER Header;
|
|
UINT16 NumberOfNarrowGlyphs;
|
|
UINT16 NumberOfWideGlyphs;
|
|
EFI_NARROW_GLYPH NarrowArray[NARROW_GLYPH_NUMBER];
|
|
EFI_WIDE_GLYPH WideArray[WIDE_GLYPH_NUMBER];
|
|
} FONT_PACK_BIN;
|
|
|
|
FONT_PACK_BIN mFontBin = {
|
|
sizeof (FONT_PACK_BIN),
|
|
{
|
|
sizeof (FONT_PACK_BIN) - sizeof (UINT32),
|
|
EFI_HII_PACKAGE_SIMPLE_FONTS,
|
|
},
|
|
NARROW_GLYPH_NUMBER,
|
|
0,
|
|
{ // Narrow Glyphs
|
|
{
|
|
0x05d0,
|
|
0x00,
|
|
{
|
|
0x00,
|
|
0x00,
|
|
0x00,
|
|
0x4E,
|
|
0x6E,
|
|
0x62,
|
|
0x32,
|
|
0x32,
|
|
0x3C,
|
|
0x68,
|
|
0x4C,
|
|
0x4C,
|
|
0x46,
|
|
0x76,
|
|
0x72,
|
|
0x00,
|
|
0x00,
|
|
0x00,
|
|
0x00
|
|
}
|
|
},
|
|
{
|
|
0x05d1,
|
|
0x00,
|
|
{
|
|
0x00,
|
|
0x00,
|
|
0x00,
|
|
0x78,
|
|
0x7C,
|
|
0x0C,
|
|
0x0C,
|
|
0x0C,
|
|
0x0C,
|
|
0x0C,
|
|
0x0C,
|
|
0x0C,
|
|
0x0C,
|
|
0x7E,
|
|
0x7E,
|
|
0x00,
|
|
0x00,
|
|
0x00,
|
|
0x00
|
|
}
|
|
},
|
|
{
|
|
0x05d2,
|
|
0x00,
|
|
{
|
|
0x00,
|
|
0x00,
|
|
0x00,
|
|
0x78,
|
|
0x7C,
|
|
0x0C,
|
|
0x0C,
|
|
0x0C,
|
|
0x0C,
|
|
0x0C,
|
|
0x0C,
|
|
0x1C,
|
|
0x3E,
|
|
0x66,
|
|
0x66,
|
|
0x00,
|
|
0x00,
|
|
0x00,
|
|
0x00
|
|
}
|
|
},
|
|
{
|
|
0x05d3,
|
|
0x00,
|
|
{
|
|
0x00,
|
|
0x00,
|
|
0x00,
|
|
0x7E,
|
|
0x7E,
|
|
0x0C,
|
|
0x0C,
|
|
0x0C,
|
|
0x0C,
|
|
0x0C,
|
|
0x0C,
|
|
0x0C,
|
|
0x0C,
|
|
0x0C,
|
|
0x0C,
|
|
0x00,
|
|
0x00,
|
|
0x00,
|
|
0x00
|
|
}
|
|
},
|
|
{
|
|
0x05d4,
|
|
0x00,
|
|
{
|
|
0x00,
|
|
0x00,
|
|
0x00,
|
|
0x7C,
|
|
0x7E,
|
|
0x06,
|
|
0x06,
|
|
0x06,
|
|
0x06,
|
|
0x66,
|
|
0x66,
|
|
0x66,
|
|
0x66,
|
|
0x66,
|
|
0x66,
|
|
0x00,
|
|
0x00,
|
|
0x00,
|
|
0x00
|
|
}
|
|
},
|
|
{
|
|
0x05d5,
|
|
0x00,
|
|
{
|
|
0x00,
|
|
0x00,
|
|
0x00,
|
|
0x3C,
|
|
0x3C,
|
|
0x0C,
|
|
0x0C,
|
|
0x0C,
|
|
0x0C,
|
|
0x0C,
|
|
0x0C,
|
|
0x0C,
|
|
0x0C,
|
|
0x0C,
|
|
0x0C,
|
|
0x00,
|
|
0x00,
|
|
0x00,
|
|
0x00
|
|
}
|
|
},
|
|
{
|
|
0x05d6,
|
|
0x00,
|
|
{
|
|
0x00,
|
|
0x00,
|
|
0x00,
|
|
0x38,
|
|
0x38,
|
|
0x1E,
|
|
0x1E,
|
|
0x18,
|
|
0x18,
|
|
0x18,
|
|
0x18,
|
|
0x18,
|
|
0x18,
|
|
0x18,
|
|
0x18,
|
|
0x00,
|
|
0x00,
|
|
0x00,
|
|
0x00
|
|
}
|
|
},
|
|
{
|
|
0x0000,
|
|
0x00,
|
|
{
|
|
0x00,
|
|
0x00,
|
|
0x00,
|
|
0x00,
|
|
0x00,
|
|
0x00,
|
|
0x00,
|
|
0x00,
|
|
0x00,
|
|
0x00,
|
|
0x00,
|
|
0x00,
|
|
0x00,
|
|
0x00,
|
|
0x00,
|
|
0x00,
|
|
0x00,
|
|
0x00,
|
|
0x00
|
|
}
|
|
}
|
|
}
|
|
};
|
|
|
|
/**
|
|
Routine to export glyphs to the HII database. This is in addition to whatever is defined in the Graphics Console driver.
|
|
|
|
**/
|
|
VOID
|
|
ExportFonts (
|
|
VOID
|
|
)
|
|
{
|
|
EFI_HII_HANDLE HiiHandle;
|
|
|
|
HiiHandle = HiiAddPackages (
|
|
&mFontPackageGuid,
|
|
mBdsImageHandle,
|
|
&mFontBin,
|
|
NULL
|
|
);
|
|
ASSERT (HiiHandle != NULL);
|
|
}
|
|
|
|
/**
|
|
Convert language code from RFC3066 to ISO639-2.
|
|
|
|
@param LanguageRfc3066 RFC3066 language code.
|
|
@param LanguageIso639 ISO639-2 language code.
|
|
|
|
@retval EFI_SUCCESS Language code converted.
|
|
@retval EFI_NOT_FOUND Language code not found.
|
|
|
|
**/
|
|
EFI_STATUS
|
|
EFIAPI
|
|
ConvertRfc3066LanguageToIso639Language (
|
|
IN CHAR8 *LanguageRfc3066,
|
|
OUT CHAR8 *LanguageIso639
|
|
)
|
|
{
|
|
UINTN Index;
|
|
|
|
if ((LanguageRfc3066[2] != '-') && (LanguageRfc3066[2] != 0)) {
|
|
CopyMem (LanguageIso639, LanguageRfc3066, 3);
|
|
return EFI_SUCCESS;
|
|
}
|
|
|
|
for (Index = 0; Iso639ToRfc3066ConversionTable[Index] != 0; Index += 5) {
|
|
if (CompareMem (LanguageRfc3066, &Iso639ToRfc3066ConversionTable[Index + 3], 2) == 0) {
|
|
CopyMem (LanguageIso639, &Iso639ToRfc3066ConversionTable[Index], 3);
|
|
return EFI_SUCCESS;
|
|
}
|
|
}
|
|
|
|
return EFI_NOT_FOUND;
|
|
}
|
|
|
|
/**
|
|
Get next language from language code list (with separator ';').
|
|
|
|
If LangCode is NULL, then ASSERT.
|
|
If Lang is NULL, then ASSERT.
|
|
|
|
@param LangCode On input: point to first language in the list. On
|
|
output: point to next language in the list, or
|
|
NULL if no more language in the list.
|
|
@param Lang The first language in the list.
|
|
|
|
**/
|
|
VOID
|
|
EFIAPI
|
|
GetNextLanguage (
|
|
IN OUT CHAR8 **LangCode,
|
|
OUT CHAR8 *Lang
|
|
)
|
|
{
|
|
UINTN Index;
|
|
CHAR8 *StringPtr;
|
|
|
|
ASSERT (LangCode != NULL);
|
|
ASSERT (*LangCode != NULL);
|
|
ASSERT (Lang != NULL);
|
|
|
|
Index = 0;
|
|
StringPtr = *LangCode;
|
|
while (StringPtr[Index] != 0 && StringPtr[Index] != ';') {
|
|
Index++;
|
|
}
|
|
|
|
CopyMem (Lang, StringPtr, Index);
|
|
Lang[Index] = 0;
|
|
|
|
if (StringPtr[Index] == ';') {
|
|
Index++;
|
|
}
|
|
*LangCode = StringPtr + Index;
|
|
}
|
|
|
|
/**
|
|
Determine the current language that will be used
|
|
based on language related EFI Variables.
|
|
|
|
@param LangCodesSettingRequired - If required to set LangCode variable
|
|
|
|
**/
|
|
VOID
|
|
InitializeLanguage (
|
|
BOOLEAN LangCodesSettingRequired
|
|
)
|
|
{
|
|
EFI_STATUS Status;
|
|
UINTN Size;
|
|
CHAR8 *Lang;
|
|
CHAR8 LangCode[ISO_639_2_ENTRY_SIZE];
|
|
CHAR8 *LangCodes;
|
|
CHAR8 *PlatformLang;
|
|
CHAR8 *PlatformLangCodes;
|
|
UINTN Index;
|
|
BOOLEAN Invalid;
|
|
|
|
ExportFonts ();
|
|
|
|
LangCodes = (CHAR8 *)PcdGetPtr (PcdUefiVariableDefaultLangCodes);
|
|
if (LangCodesSettingRequired) {
|
|
if (!FeaturePcdGet (PcdUefiVariableDefaultLangDeprecate)) {
|
|
//
|
|
// UEFI 2.1 depricated this variable so we support turning it off
|
|
//
|
|
Status = gRT->SetVariable (
|
|
L"LangCodes",
|
|
&gEfiGlobalVariableGuid,
|
|
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
|
|
AsciiStrLen (LangCodes),
|
|
LangCodes
|
|
);
|
|
}
|
|
|
|
|
|
PlatformLangCodes = (CHAR8 *)PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes);
|
|
Status = gRT->SetVariable (
|
|
L"PlatformLangCodes",
|
|
&gEfiGlobalVariableGuid,
|
|
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
|
|
AsciiStrSize (PlatformLangCodes),
|
|
PlatformLangCodes
|
|
);
|
|
}
|
|
|
|
if (!FeaturePcdGet (PcdUefiVariableDefaultLangDeprecate)) {
|
|
//
|
|
// UEFI 2.1 depricated this variable so we support turning it off
|
|
//
|
|
|
|
//
|
|
// Find current LangCode from Lang NV Variable
|
|
//
|
|
Size = ISO_639_2_ENTRY_SIZE;
|
|
Status = gRT->GetVariable (
|
|
L"Lang",
|
|
&gEfiGlobalVariableGuid,
|
|
NULL,
|
|
&Size,
|
|
&LangCode
|
|
);
|
|
if (!EFI_ERROR (Status)) {
|
|
Status = EFI_NOT_FOUND;
|
|
for (Index = 0; LangCodes[Index] != 0; Index += ISO_639_2_ENTRY_SIZE) {
|
|
if (CompareMem (&LangCodes[Index], LangCode, ISO_639_2_ENTRY_SIZE) == 0) {
|
|
Status = EFI_SUCCESS;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
|
|
//
|
|
// If we cannot get language code from Lang variable,
|
|
// or LangCode cannot be found from language table,
|
|
// set the mDefaultLangCode to Lang variable.
|
|
//
|
|
if (EFI_ERROR (Status)) {
|
|
Lang = (CHAR8 *)PcdGetPtr (PcdUefiVariableDefaultLang);
|
|
Status = gRT->SetVariable (
|
|
L"Lang",
|
|
&gEfiGlobalVariableGuid,
|
|
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
|
|
ISO_639_2_ENTRY_SIZE,
|
|
Lang
|
|
);
|
|
}
|
|
}
|
|
|
|
Invalid = FALSE;
|
|
PlatformLang = BdsLibGetVariableAndSize (L"PlatformLang", &gEfiGlobalVariableGuid, &Size);
|
|
if (PlatformLang != NULL) {
|
|
//
|
|
// Check Current PlatformLang value against PlatformLangCode. Need a library that is TBD
|
|
// Set Invalid based on state of PlatformLang.
|
|
//
|
|
|
|
FreePool (PlatformLang);
|
|
} else {
|
|
// No valid variable is set
|
|
Invalid = TRUE;
|
|
}
|
|
|
|
if (Invalid) {
|
|
PlatformLang = (CHAR8 *)PcdGetPtr (PcdUefiVariableDefaultPlatformLang);
|
|
Status = gRT->SetVariable (
|
|
L"PlatformLang",
|
|
&gEfiGlobalVariableGuid,
|
|
EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
|
|
AsciiStrSize (PlatformLang),
|
|
PlatformLang
|
|
);
|
|
}
|
|
}
|