]> git.proxmox.com Git - mirror_edk2.git/blob - IntelFrameworkModulePkg/Universal/BdsDxe/Language.c
5b154e98ee18c958fda8117b85799881da737f1a
[mirror_edk2.git] / IntelFrameworkModulePkg / Universal / BdsDxe / Language.c
1 /** @file
2 Language settings
3
4 Copyright (c) 2004 - 2008, Intel Corporation. <BR>
5 All rights reserved. This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
9
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13 **/
14
15 #include "Language.h"
16 #include "FrontPage.h"
17
18 //
19 // Lookup table of ISO639-2 3 character language codes to ISO 639-1 2 character language codes
20 // Each entry is 5 CHAR8 values long. The first 3 CHAR8 values are the ISO 639-2 code.
21 // The last 2 CHAR8 values are the ISO 639-1 code.
22 //
23 GLOBAL_REMOVE_IF_UNREFERENCED CONST CHAR8 Iso639ToRfc3066ConversionTable[] =
24 "\
25 aaraa\
26 abkab\
27 afraf\
28 amham\
29 araar\
30 asmas\
31 aymay\
32 azeaz\
33 bakba\
34 belbe\
35 benbn\
36 bihbh\
37 bisbi\
38 bodbo\
39 brebr\
40 bulbg\
41 catca\
42 cescs\
43 corkw\
44 cosco\
45 cymcy\
46 danda\
47 deude\
48 dzodz\
49 ellel\
50 engen\
51 epoeo\
52 estet\
53 euseu\
54 faofo\
55 fasfa\
56 fijfj\
57 finfi\
58 frafr\
59 fryfy\
60 gaiga\
61 gdhgd\
62 glggl\
63 grngn\
64 gujgu\
65 hauha\
66 hebhe\
67 hinhi\
68 hrvhr\
69 hunhu\
70 hyehy\
71 ikuiu\
72 ileie\
73 inaia\
74 indid\
75 ipkik\
76 islis\
77 itait\
78 jawjw\
79 jpnja\
80 kalkl\
81 kankn\
82 kasks\
83 katka\
84 kazkk\
85 khmkm\
86 kinrw\
87 kirky\
88 korko\
89 kurku\
90 laolo\
91 latla\
92 lavlv\
93 linln\
94 litlt\
95 ltzlb\
96 malml\
97 marmr\
98 mkdmk\
99 mlgmg\
100 mltmt\
101 molmo\
102 monmn\
103 mrimi\
104 msams\
105 myamy\
106 nauna\
107 nepne\
108 nldnl\
109 norno\
110 ocioc\
111 ormom\
112 panpa\
113 polpl\
114 porpt\
115 pusps\
116 quequ\
117 rohrm\
118 ronro\
119 runrn\
120 rusru\
121 sagsg\
122 sansa\
123 sinsi\
124 slksk\
125 slvsl\
126 smise\
127 smosm\
128 snasn\
129 sndsd\
130 somso\
131 sotst\
132 spaes\
133 sqisq\
134 srpsr\
135 sswss\
136 sunsu\
137 swasw\
138 swesv\
139 tamta\
140 tattt\
141 telte\
142 tgktg\
143 tgltl\
144 thath\
145 tsnts\
146 tuktk\
147 twitw\
148 uigug\
149 ukruk\
150 urdur\
151 uzbuz\
152 vievi\
153 volvo\
154 wolwo\
155 xhoxh\
156 yidyi\
157 zhaza\
158 zhozh\
159 zulzu\
160 ";
161
162 #define NARROW_GLYPH_NUMBER 8
163 #define WIDE_GLYPH_NUMBER 75
164
165 EFI_GUID mFontPackageGuid = {
166 0x78941450, 0x90ab, 0x4fb1, {0xb7, 0x5f, 0x58, 0x92, 0x14, 0xe2, 0x4a, 0xc}
167 };
168
169 typedef struct {
170 ///
171 /// This 4-bytes total array length is required by HiiAddPackages()
172 ///
173 UINT32 Length;
174
175 //
176 // This is the Font package definition
177 //
178 EFI_HII_PACKAGE_HEADER Header;
179 UINT16 NumberOfNarrowGlyphs;
180 UINT16 NumberOfWideGlyphs;
181 EFI_NARROW_GLYPH NarrowArray[NARROW_GLYPH_NUMBER];
182 EFI_WIDE_GLYPH WideArray[WIDE_GLYPH_NUMBER];
183 } FONT_PACK_BIN;
184
185 FONT_PACK_BIN mFontBin = {
186 sizeof (FONT_PACK_BIN),
187 {
188 sizeof (FONT_PACK_BIN) - sizeof (UINT32),
189 EFI_HII_PACKAGE_SIMPLE_FONTS,
190 },
191 NARROW_GLYPH_NUMBER,
192 0,
193 { // Narrow Glyphs
194 {
195 0x05d0,
196 0x00,
197 {
198 0x00,
199 0x00,
200 0x00,
201 0x4E,
202 0x6E,
203 0x62,
204 0x32,
205 0x32,
206 0x3C,
207 0x68,
208 0x4C,
209 0x4C,
210 0x46,
211 0x76,
212 0x72,
213 0x00,
214 0x00,
215 0x00,
216 0x00
217 }
218 },
219 {
220 0x05d1,
221 0x00,
222 {
223 0x00,
224 0x00,
225 0x00,
226 0x78,
227 0x7C,
228 0x0C,
229 0x0C,
230 0x0C,
231 0x0C,
232 0x0C,
233 0x0C,
234 0x0C,
235 0x0C,
236 0x7E,
237 0x7E,
238 0x00,
239 0x00,
240 0x00,
241 0x00
242 }
243 },
244 {
245 0x05d2,
246 0x00,
247 {
248 0x00,
249 0x00,
250 0x00,
251 0x78,
252 0x7C,
253 0x0C,
254 0x0C,
255 0x0C,
256 0x0C,
257 0x0C,
258 0x0C,
259 0x1C,
260 0x3E,
261 0x66,
262 0x66,
263 0x00,
264 0x00,
265 0x00,
266 0x00
267 }
268 },
269 {
270 0x05d3,
271 0x00,
272 {
273 0x00,
274 0x00,
275 0x00,
276 0x7E,
277 0x7E,
278 0x0C,
279 0x0C,
280 0x0C,
281 0x0C,
282 0x0C,
283 0x0C,
284 0x0C,
285 0x0C,
286 0x0C,
287 0x0C,
288 0x00,
289 0x00,
290 0x00,
291 0x00
292 }
293 },
294 {
295 0x05d4,
296 0x00,
297 {
298 0x00,
299 0x00,
300 0x00,
301 0x7C,
302 0x7E,
303 0x06,
304 0x06,
305 0x06,
306 0x06,
307 0x66,
308 0x66,
309 0x66,
310 0x66,
311 0x66,
312 0x66,
313 0x00,
314 0x00,
315 0x00,
316 0x00
317 }
318 },
319 {
320 0x05d5,
321 0x00,
322 {
323 0x00,
324 0x00,
325 0x00,
326 0x3C,
327 0x3C,
328 0x0C,
329 0x0C,
330 0x0C,
331 0x0C,
332 0x0C,
333 0x0C,
334 0x0C,
335 0x0C,
336 0x0C,
337 0x0C,
338 0x00,
339 0x00,
340 0x00,
341 0x00
342 }
343 },
344 {
345 0x05d6,
346 0x00,
347 {
348 0x00,
349 0x00,
350 0x00,
351 0x38,
352 0x38,
353 0x1E,
354 0x1E,
355 0x18,
356 0x18,
357 0x18,
358 0x18,
359 0x18,
360 0x18,
361 0x18,
362 0x18,
363 0x00,
364 0x00,
365 0x00,
366 0x00
367 }
368 },
369 {
370 0x0000,
371 0x00,
372 {
373 0x00,
374 0x00,
375 0x00,
376 0x00,
377 0x00,
378 0x00,
379 0x00,
380 0x00,
381 0x00,
382 0x00,
383 0x00,
384 0x00,
385 0x00,
386 0x00,
387 0x00,
388 0x00,
389 0x00,
390 0x00,
391 0x00
392 }
393 }
394 }
395 };
396
397 /**
398 Routine to export glyphs to the HII database. This is in addition to whatever is defined in the Graphics Console driver.
399
400 **/
401 VOID
402 ExportFonts (
403 VOID
404 )
405 {
406 EFI_HII_HANDLE HiiHandle;
407
408 HiiHandle = HiiAddPackages (
409 &mFontPackageGuid,
410 mBdsImageHandle,
411 &mFontBin,
412 NULL
413 );
414 ASSERT (HiiHandle != NULL);
415 }
416
417 /**
418 Convert language code from RFC3066 to ISO639-2.
419
420 @param LanguageRfc3066 RFC3066 language code.
421 @param LanguageIso639 ISO639-2 language code.
422
423 @retval EFI_SUCCESS Language code converted.
424 @retval EFI_NOT_FOUND Language code not found.
425
426 **/
427 EFI_STATUS
428 EFIAPI
429 ConvertRfc3066LanguageToIso639Language (
430 IN CHAR8 *LanguageRfc3066,
431 OUT CHAR8 *LanguageIso639
432 )
433 {
434 UINTN Index;
435
436 if ((LanguageRfc3066[2] != '-') && (LanguageRfc3066[2] != 0)) {
437 CopyMem (LanguageIso639, LanguageRfc3066, 3);
438 return EFI_SUCCESS;
439 }
440
441 for (Index = 0; Iso639ToRfc3066ConversionTable[Index] != 0; Index += 5) {
442 if (CompareMem (LanguageRfc3066, &Iso639ToRfc3066ConversionTable[Index + 3], 2) == 0) {
443 CopyMem (LanguageIso639, &Iso639ToRfc3066ConversionTable[Index], 3);
444 return EFI_SUCCESS;
445 }
446 }
447
448 return EFI_NOT_FOUND;
449 }
450
451 /**
452 Determine the current language that will be used
453 based on language related EFI Variables.
454
455 @param LangCodesSettingRequired - If required to set LangCode variable
456
457 **/
458 VOID
459 InitializeLanguage (
460 BOOLEAN LangCodesSettingRequired
461 )
462 {
463 EFI_STATUS Status;
464 UINTN Size;
465 CHAR8 *Lang;
466 CHAR8 LangCode[ISO_639_2_ENTRY_SIZE];
467 CHAR8 *LangCodes;
468 CHAR8 *PlatformLang;
469 CHAR8 *PlatformLangCodes;
470 UINTN Index;
471 BOOLEAN Invalid;
472
473 ExportFonts ();
474
475 LangCodes = (CHAR8 *)PcdGetPtr (PcdUefiVariableDefaultLangCodes);
476 if (LangCodesSettingRequired) {
477 if (!FeaturePcdGet (PcdUefiVariableDefaultLangDeprecate)) {
478 //
479 // UEFI 2.1 depricated this variable so we support turning it off
480 //
481 Status = gRT->SetVariable (
482 L"LangCodes",
483 &gEfiGlobalVariableGuid,
484 EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
485 AsciiStrLen (LangCodes),
486 LangCodes
487 );
488 }
489
490
491 PlatformLangCodes = (CHAR8 *)PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes);
492 Status = gRT->SetVariable (
493 L"PlatformLangCodes",
494 &gEfiGlobalVariableGuid,
495 EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
496 AsciiStrSize (PlatformLangCodes),
497 PlatformLangCodes
498 );
499 }
500
501 if (!FeaturePcdGet (PcdUefiVariableDefaultLangDeprecate)) {
502 //
503 // UEFI 2.1 depricated this variable so we support turning it off
504 //
505
506 //
507 // Find current LangCode from Lang NV Variable
508 //
509 Size = ISO_639_2_ENTRY_SIZE;
510 Status = gRT->GetVariable (
511 L"Lang",
512 &gEfiGlobalVariableGuid,
513 NULL,
514 &Size,
515 &LangCode
516 );
517 if (!EFI_ERROR (Status)) {
518 Status = EFI_NOT_FOUND;
519 for (Index = 0; LangCodes[Index] != 0; Index += ISO_639_2_ENTRY_SIZE) {
520 if (CompareMem (&LangCodes[Index], LangCode, ISO_639_2_ENTRY_SIZE) == 0) {
521 Status = EFI_SUCCESS;
522 break;
523 }
524 }
525 }
526
527 //
528 // If we cannot get language code from Lang variable,
529 // or LangCode cannot be found from language table,
530 // set the mDefaultLangCode to Lang variable.
531 //
532 if (EFI_ERROR (Status)) {
533 Lang = (CHAR8 *)PcdGetPtr (PcdUefiVariableDefaultLang);
534 Status = gRT->SetVariable (
535 L"Lang",
536 &gEfiGlobalVariableGuid,
537 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
538 ISO_639_2_ENTRY_SIZE,
539 Lang
540 );
541 }
542 }
543
544 Invalid = FALSE;
545 PlatformLang = BdsLibGetVariableAndSize (L"PlatformLang", &gEfiGlobalVariableGuid, &Size);
546 if (PlatformLang != NULL) {
547 //
548 // Check Current PlatformLang value against PlatformLangCode. Need a library that is TBD
549 // Set Invalid based on state of PlatformLang.
550 //
551
552 FreePool (PlatformLang);
553 } else {
554 // No valid variable is set
555 Invalid = TRUE;
556 }
557
558 if (Invalid) {
559 PlatformLang = (CHAR8 *)PcdGetPtr (PcdUefiVariableDefaultPlatformLang);
560 Status = gRT->SetVariable (
561 L"PlatformLang",
562 &gEfiGlobalVariableGuid,
563 EFI_VARIABLE_NON_VOLATILE | EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS,
564 AsciiStrSize (PlatformLang),
565 PlatformLang
566 );
567 }
568 }