git-svn-id: https://edk2.svn.sourceforge.net/svnroot/edk2/trunk/edk2@2368 6f19259b-4bc3-4df7-8a09-765794883524
		
			
				
	
	
		
			436 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			436 lines
		
	
	
		
			8.0 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/*++
 | 
						|
 | 
						|
Copyright (c) 2006, Intel Corporation                                                         
 | 
						|
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.             
 | 
						|
 | 
						|
Module Name:
 | 
						|
 | 
						|
  language.c
 | 
						|
 | 
						|
Abstract:
 | 
						|
 | 
						|
 Language settings
 | 
						|
  
 | 
						|
Revision History
 | 
						|
 | 
						|
--*/
 | 
						|
 | 
						|
#include "String.h"
 | 
						|
#include "Language.h"
 | 
						|
 | 
						|
#define NARROW_GLYPH_NUMBER 8
 | 
						|
#define WIDE_GLYPH_NUMBER   75
 | 
						|
 | 
						|
//
 | 
						|
// Default language code, currently is English
 | 
						|
//
 | 
						|
CHAR8 *mDefaultLangCode = "eng";
 | 
						|
 | 
						|
typedef struct {
 | 
						|
  EFI_HII_FONT_PACK FixedLength;
 | 
						|
  EFI_NARROW_GLYPH  NarrowArray[NARROW_GLYPH_NUMBER];
 | 
						|
  EFI_WIDE_GLYPH    WideArray[WIDE_GLYPH_NUMBER];
 | 
						|
} FONT_PACK;
 | 
						|
 | 
						|
FONT_PACK mFontPack = {
 | 
						|
  {
 | 
						|
    {
 | 
						|
      sizeof (EFI_HII_FONT_PACK) + (NARROW_GLYPH_NUMBER * sizeof (EFI_NARROW_GLYPH)) + (WIDE_GLYPH_NUMBER * sizeof (EFI_WIDE_GLYPH)),
 | 
						|
      EFI_HII_FONT
 | 
						|
    },
 | 
						|
    NARROW_GLYPH_NUMBER,
 | 
						|
    WIDE_GLYPH_NUMBER
 | 
						|
  },
 | 
						|
  {     // 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
 | 
						|
      }
 | 
						|
    }
 | 
						|
  },
 | 
						|
  {     // Wide Glyphs
 | 
						|
    {
 | 
						|
      0x0020,
 | 
						|
      0x00,
 | 
						|
      {
 | 
						|
        0x00,
 | 
						|
        0x00,
 | 
						|
        0x00,
 | 
						|
        0x00,
 | 
						|
        0x00,
 | 
						|
        0x00,
 | 
						|
        0x00,
 | 
						|
        0x00,
 | 
						|
        0x00,
 | 
						|
        0x00,
 | 
						|
        0x00,
 | 
						|
        0x00,
 | 
						|
        0x00,
 | 
						|
        0x00,
 | 
						|
        0x00,
 | 
						|
        0x00,
 | 
						|
        0x00,
 | 
						|
        0x00,
 | 
						|
        0x00
 | 
						|
      },
 | 
						|
      {
 | 
						|
        0x00,
 | 
						|
        0x00,
 | 
						|
        0x00,
 | 
						|
        0x00,
 | 
						|
        0x00,
 | 
						|
        0x00,
 | 
						|
        0x00,
 | 
						|
        0x00,
 | 
						|
        0x00,
 | 
						|
        0x00,
 | 
						|
        0x00,
 | 
						|
        0x00,
 | 
						|
        0x00,
 | 
						|
        0x00,
 | 
						|
        0x00,
 | 
						|
        0x00,
 | 
						|
        0x00,
 | 
						|
        0x00,
 | 
						|
        0x00
 | 
						|
      },
 | 
						|
      {
 | 
						|
        0x00,
 | 
						|
        0x00,
 | 
						|
        0x00
 | 
						|
      }
 | 
						|
    },  //
 | 
						|
  }
 | 
						|
};
 | 
						|
 | 
						|
VOID
 | 
						|
ExportFonts (
 | 
						|
  VOID
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
  Routine to export glyphs to the HII database.  This is in addition to whatever is defined in the Graphics Console driver.
 | 
						|
 | 
						|
Arguments:
 | 
						|
  None
 | 
						|
            
 | 
						|
Returns:
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  EFI_HII_HANDLE    HiiHandle;
 | 
						|
  EFI_HII_PACKAGES  *PackageList;
 | 
						|
 | 
						|
  PackageList = PreparePackages (1, NULL, &mFontPack);
 | 
						|
  //
 | 
						|
  // Register our Fonts into the global database
 | 
						|
  //
 | 
						|
  HiiHandle = 0;
 | 
						|
  Hii->NewPack (Hii, PackageList, &HiiHandle);
 | 
						|
 | 
						|
  gBS->FreePool (PackageList);
 | 
						|
}
 | 
						|
 | 
						|
VOID
 | 
						|
InitializeLanguage (
 | 
						|
  BOOLEAN LangCodesSettingRequired
 | 
						|
  )
 | 
						|
/*++
 | 
						|
 | 
						|
Routine Description:
 | 
						|
  Determine the current language that will be used 
 | 
						|
  based on language related EFI Variables
 | 
						|
 | 
						|
Arguments:
 | 
						|
  LangCodesSettingRequired - If required to set LangCode variable
 | 
						|
            
 | 
						|
Returns:
 | 
						|
 | 
						|
--*/
 | 
						|
{
 | 
						|
  EFI_STATUS  Status;
 | 
						|
  UINTN       Index;
 | 
						|
  UINTN       Size;
 | 
						|
  CHAR8       LangCode[ISO_639_2_ENTRY_SIZE];
 | 
						|
  CHAR8       *LangCodes;
 | 
						|
  CHAR16      *LanguageString;
 | 
						|
 | 
						|
  LanguageString  = NULL;
 | 
						|
  LangCodes       = NULL;
 | 
						|
 | 
						|
  ExportFonts ();
 | 
						|
 | 
						|
  //
 | 
						|
  // Collect the languages from what our current Language support is based on our VFR
 | 
						|
  //
 | 
						|
  Hii->GetPrimaryLanguages (Hii, gStringPackHandle, &LanguageString);
 | 
						|
 | 
						|
  LangCodes = AllocatePool (StrLen (LanguageString));
 | 
						|
  ASSERT (LangCodes);
 | 
						|
 | 
						|
  //
 | 
						|
  // Convert LanguageString from Unicode to EFI defined ASCII LangCodes
 | 
						|
  //
 | 
						|
  for (Index = 0; LanguageString[Index] != 0x0000; Index++) {
 | 
						|
    LangCodes[Index] = (CHAR8) LanguageString[Index];
 | 
						|
  }
 | 
						|
 | 
						|
  LangCodes[Index] = 0;
 | 
						|
 | 
						|
  if (LangCodesSettingRequired) {
 | 
						|
    Status = gRT->SetVariable (
 | 
						|
                    L"LangCodes",
 | 
						|
                    &gEfiGlobalVariableGuid,
 | 
						|
                    EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
 | 
						|
                    AsciiStrLen (LangCodes),
 | 
						|
                    LangCodes
 | 
						|
                    );
 | 
						|
  }
 | 
						|
  //
 | 
						|
  // 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)) {
 | 
						|
    Status = gRT->SetVariable (
 | 
						|
                    L"Lang",
 | 
						|
                    &gEfiGlobalVariableGuid,
 | 
						|
                    EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
 | 
						|
                    ISO_639_2_ENTRY_SIZE,
 | 
						|
                    mDefaultLangCode
 | 
						|
                    );
 | 
						|
  }
 | 
						|
 | 
						|
  if (LangCodes) {
 | 
						|
    gBS->FreePool (LangCodes);
 | 
						|
  }
 | 
						|
 | 
						|
  if (LanguageString != NULL) {
 | 
						|
    gBS->FreePool (LanguageString);
 | 
						|
  }
 | 
						|
 | 
						|
}
 |