안녕하세요.. 허접스런 제가 답변을 올립니다..
제가 경험 한것은 아니지만.. 제가 예전에 읽었던 내용이 있어서 혹시 참고가 될려나 하구
답변을 올립니다..
제가 참고한 사이트는 다들 아시겠지만,, www.devpia.com이구요..
아래의 글은 거기서 갈무리해왔습니다. 원자의 동의는 없지만. 공부하는 우리 초급들을 위해서 너그러이
용서해 주시겠죠..
그리고.. 위에서 언급한 사이트에서 고수님들이 다국어지원에 대해 많은 논의를 한것들이 있습니다..
너무 BC++만 고집 하지 마시고 MFC나 SDK의 도움으로 문제를 해결하는것두 좋을것 같습니다..
그럼 꾸벅........
저는 외국회사에서 Web Product, Java, Unix, Embedded System OS(MS것은 자기네들이 알아서 잘 하기 땜에 할 기회도 별로 없고 개인적으로 재미도 별로 없음)의 I18N(Internationalization)을 담당하는 엔지니어로 서우석님의 말씀에 약간 보탬이 될만한 말씀을 드리고자 글 올립니다.
서우석님께서 하신 말씀대로 Microsoft의 표준적인 I18N 및 L10N(Localization)의 전략은 코드와 리소스간의 완벽한 분리에 있습니다. 그래서 MS제품군(물론 여타 다른 메이저 회사들도 마찬가지입니다)들의 소프트웨어를 살펴보시면 아시겠지만 리소스만 분리되어 있는 dynamic library가 별도로 존재하고 있습니다. 바로 이 library에 각종 UI 및 String등의 resource가 들어있습니다. 그리고 dll의 구조를 잘 아시는 분이라면 이 부분만 바꾸더라도 Localize된 소프트웨어를 얻을 수 있지요.(물론 상용툴 및 MS의 비공개툴-내부사용목적의 L10N전용 툴-도 존재합니다. VS의 Resouce 편집기와 거의 똑같이 생겼고 Binary상태의 Dll을 편집하여 로컬라이즈된 Dll을 빌드 할 수 있습니다)
한편, 간혹 API나 MFC클래스들를 살펴보다보면 스트링 포매팅이나 프린팅 함수중에 잘 감이 오지 않는 함수들을 종종 발견하실 수 있을 겁니다.AfxMessageBox를 예를 들어 보겠습니다.AfxMessageBox의 프로토타입은 다음과 같습니다.
int AfxMessageBox( LPCTSTR lpszText, UINT nType = MB_OK, UINT nIDHelp = 0 );
아마 VC++ 프로그래머 여러분들은 이 함수를 거의 밥먹듯이 사용하실겁니다. 그런데 MSDN Library를 유심히 보셨던 분들은 또 다른 프로토타입을 보셨던 경험이 있을겁니다.
int AFXAPI AfxMessageBox( UINT nIDPrompt, UINT nType = MB_OK, UINT nIDHelp = (UINT) -1 );
다른 인자의 타입은 똑같아 보이는데 유독 첫번째 것이 거슬리지요? 그리고 눈 씻고 찾아봐도 메시지를 출력할 스트링에 대한 타입은 없지않습니까?(실제로 저는 4~5년 전 MFC 프로그래밍을 처음 배울 때 이 함수타입을 보고 이런 의문을 가졌었습니다)
바로 nIDPrompt가 스트링입니다. 하지만 타입이 UINT이지 않느냐라고 반문하신다면 이것이 바로 스트링 리소스를 포인팅하는 리소스ID라는 것 입니다. 바로 Resource Editor에서 편집하는 그 리소스 말이지요. 그럼 왜 직접 스트링을 안 쓰고 간접적으로 스트링을 참조할까요? 물어보나 마나 다국어버젼을 쉽게 만들기 위해서 입니다. 왜냐면 로컬라이즈할때 코드는 건들 필요가 없지 않습니까? Resource만 번역을 하면 되니깐 말이지요. 자 그럼 여러분이 이 Resource만 들고 외국어 잘하는 번역사나 전문적으로 Software를 Localize하는 회사에 찾아가서 "번역 해주세요~" 하고 말씀하시면 됩니다. 코드는 보여줄 필요 없으니 걱정하실 필요도 없고 말이지요.
끝으로 첨언하면 Unix계열의 소프트웨어나 Java로 만든 소프트웨어등도 다국어를 타겟으로 한 제품들을 보면 이런식의 API(없으면 만들어서라도)를 이용해 소프트웨어를 개발한다는 것을 참고로 아시면 좋을겁니다. 제가 왜 이런 말씀을 드리냐하면, 우리나라 SW개발사들을 보면 이런 고려(I18N)를 하지않고 비공학적(누가 SW를 예술이라 울부짖습니까? SW는 수리물리와 여러 기본 학문을 근간으로 한 공학입니다)으로 마구잡이 코딩을 해서 (물론 이러면 유지보수 및 업그레이드도 어렵지만)우리나라에서도 팔리기 힘든 제품을 만들고 이러니 다른 언어 제품도 못만들고 서서히 사라져 가는 경우가 많기 때문입니다. 우리나라도 아이디어만 갖고 여기저기 기워만드는 소프트웨어를 만들기 보다는 보다 잘 설계된 공학적 구조로 미국에도 팔아먹고 일본에도 팔아먹고 BiDi까지 지원해서 중동지방까지 팔아먹는 Software를 만들었으면 좋겠습니다.
참고로 BiDi란 양뱡향(Bidirectional) 문장을 의미합니다. 아랍어는 오른쪽에서 왼쪽으로 글을 쓰다 아라비아숫자나 영문자를 만나면 느닷없이 왼쪽에서 오른쪽으로 쓰는 골때리는 문자특성을 갖고 있지요.
자, 이런거 고려해서 우리 넓은 세상으로 막 나갑시다.
끝으로, 참고자료를 소개합니다.
1.CJKV Information processing, 1999, O'reilly
2.Developing International Software for Window95 and WindowsNT, 1995, Microsoft Press
만약 여러분들이 MSDN을 구독하시면 MSDN Library의 Books 디렉토리에 두번째 책이 고스란히 들어있음을 발견할 수 있을겁니다. 지금 제가 보는 MSDN Library는 2000년 1월호인데 아마 이 이후는 무조건 있을거라 생각되고 앞호에는 있을지 없을지는 잘 모르겠네요. MSDN Library for VS6 (VS깔 때 번들로 포함된 MSDN Library)는 여러분들이 직접 확인해보세요. 없다고 뭐라해봤자 저는 소개한 죄밖에 없습니다.
Bowne Global Solutions,
Software Asianization Laboratory
Yeolip.Yoon@korea.bowneglobal.com
http://iworld.net/~ylyoon
ppiri 님이 쓰신 글 :
: 영어권을 제외한 외국과 채팅을 할려면 유니코드가 필요하다구 들었는데요.
: 어떻게 만들어야 할지 몰라서요..
: 서로 글을 보내면 글씨가 깨져서 나오는 것을 없앨려구요..
: 보내고 받는 건 AnsiString으로 되어있거든요..
: 이걸 특별히 어떻게 바꿔야하는지 모르겠어요..
: 글구요.. 예제가 있으면 좋겠네요..
: 부탁합니다.
: