다국어처리
일반적으로 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