[MFC] 다국어지원프로그래밍
저장활동 / 2008. 7. 9. 09:34
리소스를 DLL로 작성하여 다른 언어 지원시 리소스 DLL만 바꿔준다.
1 리소스를 DLL로 만들기
- VC에서 비어있는 dll프로젝트를 만든다.
- 새로 리소스파일을 추가
- 리소스의 속성을 보면 언어를 설정할 수 있다. 지원하는 언어로 설정하여 리소스 작성
- DLL컴파일 -> 리소스 DLL이 만들어 진다.
2 주의사항
- 두 DLL의 ID는 철저하게 일치하여야 한다. (ID란 매크로가 아니라 부여된 번호를 말한다.)
- 리소스가 DLL로 따로 작성되기 때문에 호스트 프로그램과 ID값을 일치시키는데 신경써야 한다. (리소스를 분리하지 않으면 자동으로 되겠지만)
- 다른 언어용 리소스 DLL은 가지고 있는 요소들이 일치하여야 한다. 한쪽에만 특정 다이얼로그가 있어선 안된다.
- 단축키(Accelerator)도 가능한 일치시키는게 좋지만 다국어 지원시 달라질 수도 있다.
3 권장 사용법
- 호스트 프로그램에서 언어 설정을 바꿀 수 있는 메뉴가 존재
- 현재 설정된 언어는 레지스트리에 저장
- 로딩시 이 값을 읽어 해당 DLL을 로드
4 MUI(OS에서 지원!)
- 원래 코드의 텍스트 리소스파일만 따로 떼어내어 dll을 만들되, 만들어질 이름을 실행화일이름.코드번호.mui' 로 한다.
해당 언어로 변환하여 빌드한다.
- 원본 코드에서 텍스트 관련 리소스는 삭제한다. 빌드.
- 언어별로 mui파일만 작성해 놓으면 OS가 선택해 스트링관련 리소스 로드!!! (언어팩이 이렇게 가능해지는건가?)
5 기존 코드 다국어 변형 작업
- 언어 작업시 제어판->국가및 언어 옵션-> 모든 설정을 해당 언어로 셋팅. (리부팅 필요)
- 리소스 : 스트링 테이블, 다이얼로그, 글자가 들어간 비트맵및 아이콘 수정. 리소스의 언어를 반드시 해당언어로 설정.
- #define 되어 있는 부분에 작성자가 스트링을 소스내에 모아 놓았을 수도 있음. 수정.(헤더파일들 검색)
- MessageBox 검색, 수정
- AfxMessageBox 역시 검색, 수정. AfxMessageBox의 경우 미리 정의된 AFX_IDS_APP_TITLE 을 메세지 박스 타이틀로 사용.
이 매크로가 정의 되어 있지 않은 경우 프로그램 이름을 타이틀로 사용
- DrawText, TextOut 등을 검색 수정.
- (!!!중요!!!) MFC등을 사용한 프로그램의 경우에는 출력되는 스트링을 찾을 수 없거나 MFC리소스에 있는 경우가 있다.
이는 시스템에서 출력하는 메세지로 OS 이미지의 쉘에서 해당 스트링이 바뀌어야 하는 것으로 App.쪽에선 수정할 필요가 없다.
- 프로그램 실행파일 이름과 타이틀도 바꾼다. 상호 호출하는 Apps. 인 경우 호출하는 프로그램 이름이 정의된 곳을 찾아서 바꾸어준다.
클래스 이름은 바뀔 필요가 없다. 타이틀은 FindWindow등에서 사용될 가능성이 농후 하므로 검색하여 찾아준다.ex) NWAVE 카메라: 리소스 수정, rc파일 직접 열어 메뉴항목 수정(반드시 eVC에서 리소스 해당언어설정), MessageBox 수정, DrawText 수정, CameraDll도 마찬가지. SendMessage!!!, 스트링 관련 함수들 - wsprintf, wcscpy, wcscat등, format