54. EFI_HII_STRING_PROTOCOL의 NewString 및 SetString 함수를 사용하여 다른 언어에 대한 문자열 패키지를 동적으로 추가
이 장에서는 UNI 변환을 시스템에 동적으로 추가하려 한다.
예를 들어, 영어 문자열만 있는 PlatformDxe가 있다. https://github.com/tianocore/edk2/blob/master/OvmfPkg/PlatformDxe/Platform.uni
#langdef en-US "English"
#string STR_FORMSET_TITLE #language en-US "OVMF Platform Configuration"
#string STR_FORMSET_HELP #language en-US "Change various OVMF platform settings."
#string STR_MAIN_FORM_TITLE #language en-US "OVMF Settings"
#string STR_RES_CUR #language en-US "Preferred Resolution at Next Boot"
#string STR_RES_CUR_HELP #language en-US "The preferred resolution of the Graphics Console at next boot. It might be unset, or even invalid (hence ignored) wrt. the video RAM size."
#string STR_RES_NEXT #language en-US "Change Preferred Resolution for Next Boot"
#string STR_RES_NEXT_HELP #language en-US "You can specify a new preference for the Graphics Console here. The list is filtered against the video RAM size."
#string STR_SAVE_EXIT #language en-US "Commit Changes and Exit"
#string STR_DISCARD_EXIT #language en-US "Discard Changes and Exit"BIOS 메뉴에서 언어 기본 설정을 프랑스어로 변경하더라도 이러한 문자열은 여전히 영어로 출력된다. 확인해볼 수 있다.
Select Language 옵션을 사용하여 언어를 Francais로 변경한다.

그런 다음 Device Manager -> OVMF Platform Configuration을 살펴보도록 한다.

하나의 문자열 패키지에는 하나의 언어에 대한 번역된 문자열만 있는 것을 기억하고 있다. HII 요소가 여러 언어를 지원하는 경우, 패키지 목록에 여러 STRING 패키지가 있다. PlatformDxe의 경우 패키지 목록에 하나의 문자열 패키지만 있다.
https://github.com/tianocore/edk2/blob/master/OvmfPkg/PlatformDxe/Platform.inf
먼저 패키지 목록에서 가능한 모든 문자열을 출력해보겠다. 우리는 UNI 소스 코드를 보았지만, 일부 문자열은 시스템에서 동적으로 추가될 수 있으므로 이를 확인하는 것이 좋다.
패키지 목록에서 문자열을 출력하려면, 패키지 목록의 EFI_HII_HANDLE이 필요하다. 이를 위해 EFI_HII_DATABASE_PROTOCOL에서 ListPackageLists 함수를 활용할 수 있다.
이 함수를 사용하면 HandleBufferLength=0으로 한 번 호출하고, EFI_BUFFER_TOO_SMALL 오류를 수신하지만, HandleBufferLength에 대한 값을 가져와야 한다. 필요한 크기만을 할당하고, 이 함수를 다시 호출한다.
말만 들었는데도 조금 지루한 과정이다.
이 작업을 더 쉽게 하기 위해서 HiiLib 에서 HiiGetHiiHandles 함수를 활용해 보겠다.
이것으로 우리의 애플리케이션은 다음과 같이 간단화할 수 있다.
여기 문자열을 얻기 위해 가능한 모든 문자열 토큰을 반복하여 HiiGetString 함수를 호출하는 것을 볼 수 있다.
이 애플리케이션을 빌드하고 실행하면 다음과 같은 결과를 얻게 된다.
프랑스어로 번역된 배열을 만들어 보자.
이제 문자열 출력 반복문에 대한 설명을 해보자면, 문자열 패키지를 생성하고 동일한 패키지 목록 아래 HII 데이터베이스에 채워야 한다. 여기서 우리는 한 가지 방법을 사용할 수 있다.
manual 문자열 패키지를 생성하는 대신, 새 언어의 dummy인 L"" 문자열을 사용하여 gHiiString->NewString 함수를 호출할 수 있다.
en-US 문자열 패키지에 40개의 문자열이 있는 경우, ID=41인 문자열 L"" 하나만 있는 fr-FR 문자열 패키지가 생성된다. 그리고 이 패키지는 자동으로 패키지 목록에 추가된다.
fr-FR 문자열 패키지가 패키지 목록 있으면, 모든 데이터 문자열에 대해 gHiiString->SetString 함수를 간단히 호출할 수 있다.
다음은 EFI_HII_STRING_PROTOCOL의 NewString 및 SetString 함수에 대한 API 설명이다.
gHiiString 프로토콜을 직접 사용하기 위해 UefiHiiServicesLib 라이브러리 클래스와 해당 헤더 Library/UefiHiiServicesLib.h를 추가하는 것을 잊지 않도록 하자.
애플리케이션을 빌드하고 실행한다.
그런 다음 exit으로 BIOS 메뉴로 이동한다.
Select Language 옵션으로 언어를 Francais로 변경한다.
그 다음, DeviceManager -> OVMF Platform Configuration으로 이동한다. 이미 번역이 완료되어 있음을 알 수 있다.

메뉴를 종료한 다음 다시 이동하면 Device manager의 문자열도 "Configuration de la OVMF plateforme"로 변경된 것을 볼 수 있다.

Last updated