본문 바로가기
Programming/MFC,C++

[퍼옴] MFC 언어추가방법

by 기적 2014. 11. 26.

mfc 프로젝트에서 다양한 언어를 지원해야할 경우에 사용하는 방법입니다.

 

dll로 분리하여 관리하면 한 프로젝트에서 리소스를 관리하는것 보다 조금 더 정리된 상태에서 관리가 가능합니다.

그리고 개발자가 직접 코드를 수정하지 않고 외부 인력이 번역하여 수정할 수 있기 때문에 개발자가 조금 더 편할수 있습니다.ㅎㅎ

 

이 예제는 vs2012에서 작성하였습니다.

 

1. dll 프로젝트를 생성합니다.

저는 아래와 같이 MFC DLL을 선택하였습니다.

 

 

쭉쭉 진행~

 

 

2. 원본 프로젝트의 resource.h, *.rc, res폴더를 새로 만든 프로젝트에 복사합니다.

 

3. 파일을 복사한 후 새로만든 프로젝트의 *.rc파일을 삭제하고 덮어 씌운 원래 프로젝트의 *.rc파일을 새로만들어진 프로젝트의 *.rc파일로 변경합니다.

이렇게 변경하면 원래 프로젝트의 리소스를 그대로 가져올 수 있습니다. 

 

4. 가져온 리소스를 변경을 원하는 언어로 변경합니다.

변경 방법은 리소스에 마우스 우클릭하여 복사본 삽입메뉴를 선택하면 됩니다. 

 

 

 5. 원하는 언어를 선택합니다.

저는 영어를 선택했네요.

 

 6. 아래와 같이 IDD_ABOUTBOX가 영어 버전이 추가되었습니다.

원래의 IDD_ABOUTBOX는 필요없으므로 이제 삭제합니다. 영어버전만 남깁니다.

프로젝트 이름이 이상하지만 무시하고 계속 진행.

 

7. 빌드하면 dll파일이 생깁니다.

 

 

 

 8. 전 최종적으로 이런식으로 프로젝트를 생성하였습니다.

 

 

9. 아래와 같이 코드에 적용하면 끝.

 코드는 사용자 설정 언어를 파악하여 원하는 언어를 선택하는 부분입니다.

 LoadLibrary호출 후 AfxSetResourceHandle을 통해서 리소스를 선택하면 적용됩니다.

 

 최근에 확인했는데 GetUserDefaultLangID()가 시스템 언어는 읽지만 표시언어는 제대로 못읽는거 같네요. GetSystemDefaultLangID()도 마찬가지구요. 이게 윈도우 특성을 탈지도 모르겠네요. 해본 사람마다 말이 달라서...

일단 저는 GetUserDefaultUILanguage()로 해결했습니다.

 bool kor = true;

//LANGID lang = PRIMARYLANGID(GetUserDefaultLangID());

LANGID lang = (0xFF & GetUserDefaultUILanguage()); //표시 언어 읽기


switch(lang)

{

case LANG_KOREAN :

    kor = true;

    break;

case LANG_ENGLISH :

    kor = false;

    break;

}


// Check if Korean or not

if( kor )

{

    HINSTANCE hInstance = AfxGetResourceHandle();  

    if(hInstance != NULL)

        FreeLibrary(hInstance);


    HMODULE hModule = LoadLibrary(_T("MultiLangKor.dll"));

    if(hModule != NULL)

        AfxSetResourceHandle( hModule );


    //SetThreadLocale( MAKELCID( MAKELANGID(LANG_KOREAN , SUBLANG_KOREAN) , SORT_DEFAULT));

}

else

{

    HINSTANCE hInstance = AfxGetResourceHandle();  

    if(hInstance != NULL)

        FreeLibrary(hInstance);


    HMODULE hModule = LoadLibrary(_T("MultiLangEng.dll"));

    if(hModule != NULL)

        AfxSetResourceHandle( hModule );


    //SetThreadLocale( MAKELCID( MAKELANGID(LANG_ENGLISH , SUBLANG_ENGLISH_US) , SORT_DEFAULT)); 

}





댓글