본문 바로가기

Windows/MFC

다국어 버전 준비작업..

다국어 지원 프로그램은 대체로 아래에 제가 설명하는 방법을 많이 씁니다. 왜냐하면 이방법이 가장 쉽고 변화에 쉽게 대처 할수 있기 때문입니다.

1. 먼저 응용 프로그램을 MFC라이브러리 동적 연결 프로젝트로 만듭니다 (본프로그램 그러니까 언어 DLL을 사용할 프로그램)
2. 기타 다른 부속 라이브러리(님이 만드는 모든 DLL 이라고 하면 거의 맞을겁니다.)도 MFC 라이브러리 동적 연결 프로젝트로 만듭니다.

다국어 지원 DLL은 MFC라이브러 동적 연결 정규 DLL로 만듭니다. (한국어 DLL따로 중국어 DLL따로 일본어 DLL따로 모두다 다른 DLL로) 이경우 리소스의 아이디는 모두같아야합니다.만일 한국어의 '파일 열기'라는 문자열의 ID를 ID_FILE_OPEN으로 했다면 중국어와 일본어의 '파일열었스므당'의 아이디도 ID_FILE_OPEN으로 같아야 합니다. (더 정확히 말하면 ID_FILE_OPEN에 해당 하는 숫자가 같아야하지만 이부분은 VC가 알아 해줍니다. 물론 한국어 리소스 파일에 뒤엎어 쓰기를 해야 하지만====>한국어 DLL을 만들고 새로운 프로젝트를 만들지 말고 한국어 DLL은 안전한 곳에 보관하고 한국어 DLL프로젝트에 중국DLL을 만드는 씩으로... 이때 새로운 문자열(새로운 리소스)을 생성하거나 기존의 문자열(기존의 리소스)을 삭제 하지말고 편집만해야합니다.)

이제 님의 C..WinApp의 구현파일에 아래 와 같이 기술합니다.

[code]
CMyWinApp::InitInstance
{
    ......................
    .....................
    m_hOResource = AfxGetResourceHandle();
    m_hResource = ::LoadLibrary("원하는 언어의DLL");
    AfxSetResourcehandle(m_hResource);
    ....................
    ....................
}

CMyWinApp::ExitInstance()
{
    AfxSetResourceHandel(m_hOResource);
    ::FreeLibrary(m_hResource);
    CWinApp::ExitInstance();
}[/code]

이제 프로그램 설치시 원하는 언어를 선택하게 하고 사용자가 지정한 언어의 ResourceDLL만 설치(카피해줌)해주면 됩니다.
(차후에 언어가 변경되면 재설치하라고 하면 됩니다.)
이렇게하면 다국어 버젼의 프로그램을 무리 없이 만들수 있습니다.

언어에 따른 ResourceDLL의 크기는 국가의 언어(국어)사정에 따라 다릅니다. 이것은 어쩔수 없습니다.
그냥 DLL이 크면 큰대로 작으면 작은대로 판매하면 그만입니다.
그리고 LoadLibrary() FreeLibrary AfxGetResourceHandle AfxSetResourceHandle 오버해드는 생각 헐것도 없습니다.
저의 경우에는 눈에 보이지도 않았고 다른 프로그램도 이방법을 쓰는걸로 알고 있습니다. 따라서 오버 해드는 신경 안쓰셔도 될겁니다.

그리고 중국어DLL 일본어DLL 한국의DLL을 모두 각각 만들어야 하며(독립된 DLL로) 설치 프로그램만 모두 가지고 있고
실행 프로그램은 윈도우의 환경에 맞는 DLL만(원하는 DLL만) 가지면 됩니다.
또다른 방법으로는 실행 프로그램과함께 모든 리소스 DLL를 설치해주고 대화 상자를 화면에 보여서 원하는
언어의 DLL를 선택하게하고 사용자가 선택한 내용을 윈도우 레지스트리에 저장해두고 프로그램이 이 레지스트리
값을 읽어서 사용하게 하면 됩니다. 아래와 같이

[code]
CMyWinApp::InitInstance
{
    ......................
    .....................
    //LoadStdProfileSettings()와 SetRegistryKey함수 뒤에 코딩 하세요
    CString Language;

    Language = AfxGetApp()->GetProfileString(_T("자원 규정"),_T("언어선택"));
    if (Language.IsEmpty())
    {
        if (IDOK == dlg.DoModal())
        {
            Language = dlg.m_Language;
            AfxGetApp()->WriteProfileString(_T("자원 규정"),_T("언어선택"),Language);
        }
        else
        {
            AfxMessageBox("Not Find Language DLL");
            return FALSE;
        }
    }
    m_hOResource = AfxGetResourceHandle();
    m_hResource = ::LoadLibrary(Language);
    AfxSetResourcehandle(m_hResource);

    ....................
    ....................
}

CMyWinApp::ExitInstance()
{
    AfxSetResourceHandel(m_hOResource);
    ::FreeLibrary(m_hResource);
    CWinApp::ExitInstance();
}[/code]

레지스트리 부분은 워낙에 오래돼서 잘 생각이 안납니다. 하지만 이렇게 하면 될겁니다.
레지스트리 부분에서 안되면 다른분에게 물어 보세요 쉬운 부분이라 잘 가르쳐 줄겁니다.
그럼