출처 : 데브피아 석재헌님의 글
http://www.devpia.com/Forum/BoardView.aspx?no=7281&ref=7281&page=2&forumname=vc_lec&stype=
- 다국어 리소스
국내뿐만 아니라 해외에서도 널리 쓰이는 소프트웨어가 되기 위해서는 주체가 누구든지 로컬라이징(Localizing-이하 ‘지역화’)을 해 주든지 과정이 필요합니다.이 때 개발자가 만든 프로그램이 이러한 지역화에 준비되어 있지 않으면, 개발자 뿐만 아니라 많은 사람들이 피곤하게 됩니다. (특히, 개발자만 죽어나는 경향이 있습니다.)그러나, 다국어 리소스에 대한 준비 과정 자체는 상당히 간단하고, 미리 준비만 잘 해놓으면, 오히려 개발자가 일을 분담시킬 수 있습니다.이 글에서는 어떤 방식으로 다국어 리소스를 준비하는 사용하고지에 대해서 살펴 보도록 하겠습니다. - 다국어 리소스 사용 준비
다국어 리소스 사용 준비 과정은 무척 간단합니다.모든 리소스, 특히 문자열 리소스 사용시에 하드코딩을 없애고, 리소스로 따로 분리하도록 하면 끝입니다. 간단하지만, 다국어 버젼을 위해서는 반드시 꼭 하셔야 하는 일입니다.예를 들어 보겠습니다.AfxMessageBox( "Hello, World!" , MB_OK , 0); AfxMessageBox( IDS_HELLO , MB_OK , 0 );
위의 첫 번째의 경우는 언어가 바뀔 때마다 하드코딩을 해줘야 합니다. 두 번째의 경우는 리소스만 바꿔주면 됩니다.
언어가 바뀔 때마다 하드코딩을 해주는 것과, 리소스만 바꿔주면 되는 것이 결국은 동일한 일이 아니냐고 물어보고 싶으신 분들도 있을 겁니다.자신 있게 그건 그렇지 않다고 말씀드릴 수 있습니다. 첫 번째의 경우는 언어가 바뀌면 컴파일을 새로 하는 과정이 필요하고, 리소스와 코드가 분리되어 있지 않기 때문에, 다른 사람에게 지역화하는 과정을 분담시킬 수 없습니다.두 번째의 경우, 나중에 또 다른 글에서 말씀 드리겠지만, 랭귀지 리소스는 따로 빼서 Satellite dll로 만들 수도 있고 (이 때 부분적인 컴파일은 필요합니다.), 지역화를 하는 사람이 반드시 프로그램을 개발한 사람이 할 필요가 없습니다.그리고, 향후 다른 언어의 추가 시에도 소스 전체를 뒤지지 않아도 되고, 유지 보수 때에도, 백만 스물 두 배는 쉬워집니다.그리고 첫 번째의 경우도 소스코드를 모두들 다른 사람 혹은 다른 회사에게 넘겨 주면 지역화는 가능하겠지만, 개발사 입장에서는 그런 방식의 지역화를 기뻐할 지는 의문입니다.특히, 두 번째의 경우 다른 사람에게 일을 분담할 수 있다는 개발자 입장에서는 굉장한 강점입니다. 한국 개발자들 할 일도 많은데, 이런 일은 어학에 능숙한 분들에게 맡기고, 개발자들은 본업에 충실하게 일하는 그런 명랑한 삶을 살아야 하지 않겠습니까?이 밖에도 성공적인 지역화를 위해서는 몇 가지 원칙이 있습니다. 마이크로 소프트 웹 사이트에 잘 정리된 내용이 있어서, 인용합니다. - 다국어 리소스
여기서 Visual Studio에서 언어별로 리소스를 만드는 과정을 보여 드리겠습니다.Visual Studio에서 간단한 Dialog 기반의 프로젝트를 생성해서, 생성된 다이얼로그 혹은 다른 리소스를 선택하고 마우스 오른 쪽 버튼을 누르면, “Insert Copy” 메뉴가 보입니다.
여기서 아래와 같이 자신이 추가하기를 원하는 리소스를 선택해 주시면 됩니다.
이와 같은 방식으로 선택하면, 아래와 같이 IDD_MULTIRESOURCE_DIALOG의 영문판 리소스가 추가 된 것을 볼 수 있습니다.
이와 같은 과정을 반복해서, 모든 리소스에 대해서 각각 다른 나라 언어를 위한 리소스를 만들어 주고, 그 나라 언어에 맞게끔 지역화를 해주면, 준비는 끝입니다.여기서 한 가지 주의할 점은, 문자열 리소스와는 달리 다이얼로그 리소스는 해당 환경의 폰트에 따라 윈도우의 크기가 개발자가 생각했던 것과 다르게 나타날 수 있습니다.배포하기 이전에 반드시 정상적으로 윈도우가 출력이 되는지, 모양은 원래의 설계와 동일한 확인할 필요가 있습니다.또 하나의 주의점은 각 나라마다 다이얼로그에 쓰이는 기본 폰트 역시 반드시 확인해 야 합니다. 한국의 ‘굴림’ 폰트가 미국에서도 똑같이 ‘굴림’이라고 인식될 수는 없을 테니 말입니다.참고로 말씀 드리면 영문 프로그램의 경우 ‘MS Sans Serif’, 폰트 사이즈는 8을 많이 사용합니다. - 다국어 리소스 테스트
위의 내용을 바탕으로 해서 테스트 프로그램을 하나 작성해 보겠습니다.윈도우 응용 프로그램에서 리소스를 가져올 때 기준이 되는 것은 사용자의 User Interface 기본 언어입니다. 이러한 User Interface 기본 언어는 제어판에서 지역 설정 항목에서 바꿀 수 있습니다.MFC에서는 이러한 로케일 기본 언어에 따라서, 자동으로 해당 언어에 해당되는 리소스를 불러오게 됩니다.그리고, 이 리소스를 불러 올 때, 기본 적으로는 관련 함수를 호출한 모듈을 기본으로 해서 검색합니다. 좀 더 자세한 내용은, 이 다음 글에서 리소스만을 따로 분리해서 만드는 Satellite dll을 만드는 과정을 설명하면서 다루겠습니다.원래대로 라면, 영어와 한국어 이렇게 두 가지 언어 리소스를 준비한 다음, 각각 영어가 기본 언어인 시스템에서, 한국어가 기본 언어인 시스템에서 각각 실행해 봐야 하겠지만, ?SetThreadLocale함수를 통해서, 쓰레드의 기본 로케일을 변경한 후, 위에서 준비한 언어 리소스가 제대로 불려지는지 확인하겠습니다./* Check if English or not */ if( strCommandLine.Find(_T("english")) >= 0 ) SetThreadLocale(MAKELCID(MAKELANGID(LANG_ENGLISH,SUBLANG_ENGLISH_US),SORT_DEFAULT)); else SetThreadLocale(MAKELCID(MAKELANGID(LANG_KOREAN,SUBLANG_KOREAN),SORT_DEFAULT));
위와 같은 식으로 영문과 한글로 각각 기본 언어를 바꾸고, 실행한 결과는 아래와 같습니다.
다국어 버젼의 리소스들이 훌륭하게 동작하고 있는 것을 확인할 수 있습니다.
- 결론
이상으로 오늘의 글은 끝을 맺기로 하겠습니다.간략하게 정리를 해보자면, 성공적인 프로젝트의 지역화를 위해서는, 소스와 리소스를 분리하는 작업이 필요하며, 이것은 소스 코드 개발 시부터, 개발자가 염두에 두고 작업을 해야 합니다.
또, 이 글에서는 Visual Studio에서 어떤 방식으로 다국어 리소스를 추가할 수 있는 지를 살펴 보았습니다.
다음 글에서는 리소스의 분리와 이를 이용한 Satellite dll을 만드는 방법, 그리고 프로젝트에서 이를 이용하는 방법에 대해서 살펴 보기로 하겠습니다.