본문 바로가기

Language/MFC

MFC 다국어 처리


다국어처리 


일반적으로 MFC에서 작업을 특별히 하지 않으면 Stringtable에는 

IDS_ABOUTBOX, IDP_DOCKETS_INIT_FAILED (소켓 옵션 설정시) 이 두가지 만 등록이 되어있습니다.

기본적으로 원하는 값은 순차적으로 카운트 되며 이게 곧 ID 넘버가 됩니다. 

이런저런 걸 추가한 뒤 다른 언어를 하고자 할때는 다음과 같은 작업으로 손쉽게 하면 됩니다. 



일단 다국어 stringtable을 위한 리소스 dll 생성

New Project --> Win32 프로젝트 --> 응용프로그램종류 : DLL / 빈 프로젝트 체크 --> 리소스파일 추가 --> stringtable 리소스 추가 




(그림은 아이콘이 선택되어 있지만 String Table로 추가)




이렇게 하면 빈 프로젝트에 딴거 없이 일단 리소스 파일이 추가 됩니다. 

그리고 마지막으로 프로젝트 설정으로 가셔서 [구성 속성 --> 링커 --> 명령줄] 에 /NOENTRY 를 입력 후 확인 하면 컴파일이 됩니다. 

컴파일 후 디버그 폴더나 릴리즈 폴더에 보시면 DLL이 만들어 집니다. 

위와 같은 방법으로 dll을 만든 후 String table 작업을 한 뒤 (모든 ID는 동일해야 합니다.) DLL을 연결 합니다. 

프로젝트에 작업한 String table이 있는 dll을 붙여 넣습니다. 


그런 후 언어를 선택하는 함수(적절한 함수를 만드시면 됩니다.)에 다음과 같은 코드를 삽입.

.h 에 멤버로 
LANGID m_CurLangID; //언어 아이디
HINSTANCE m_hResourceDll; // dll 인스턴스 
 
정의 한 후 .cpp에 

void CKAVISApp::LogLanguageChg(int Index)
{
                 switch(Index)
                {
                 case 0:
                                m_CurLangID = 0x049;
                                m_hResourceDll = 0;
                                 break;
                 case 1:
                                m_CurLangID = 0x040c;
                                m_hResourceDll = LoadLibrary(_T( "Lan_Frn.dll"));
                                 break;
                }
}

코드는 제 코드입니다. ㅋㅋㅋ 

일단 전 App에 입력을 했습니다. 불어로 만들었구요. case 0 은 기본 언어이기 때문에 굳이 dll이 필요가 없죠. 
참고로 언어 아이디는 국가별로 지정이 되어있습니다. 아래 포스팅에도 나와있구요. 

불어는 없어서 찾아보니 0x040c 로 정의 되어 있군요. 

실제 사용할 곳에서는 다음과 같이 입력!

CString log;
log.LoadStringA(m_hResourceDll, IDS_LOG_I50001);

CString 클레스에서는 String table을 로드 하는 멤버 함수가 정의되어 있습니다. 
첫 번째 인자엔 현제 지정된 Dll 인스턴스를, 그리고 Stringtable ID를 넘겨 주면 됩니다. 



Reference Blog