login register Sysop! about ME  
qrcode
    최초 작성일 :    2005년 04월 22일
  최종 수정일 :    2005년 04월 22일
  작성자 :    taeyo
  편집자 :    Taeyo (김 태영)
  읽음수 :    26,557

강좌 목록으로 돌아가기

필자의 잡담~

호오.. 이번 강좌는 기대치가 조금은 있는 것 같네요 ^^.. 해서 불끈불끈 힘이 솟아나 버렸답니다.

아참.. 그리구요. 드뎌 .NET 2.0 베타 2가 등장한 모양입니다. ^^

다국어 지원을 어케해 볼까?

저번 강좌에서 다루었던 리소스 파일로 공통 메시지 관리하는 방법은 어떠셨나요? 맘에 드셨나요?

뭐.. 그렇죠.. 쉽사리 맘에 드실리가 없죠~~  꼭 한번은 이렇게 튕겨주시는 센스~  호홋!!!

이제 약속대로 저번 강좌에 이어 그러니깐, Resx 파일을 이용해서 다국어를 지원하는 방법에 대해 이야기를 진행해보도록 하겠습니다. 뭔가 타이틀은 거창해 보이지만 사실은 매우 간단해서!! 오히려 어이가 따귀를 날리는 느낌을 받으실런지도 모르겠어요~~~

일단, 여러분은 지난 강좌에서 다음과 같이 Resources 폴더 안에다가 AppResources.resx 파일을 작성해 보셨을 것입니다. 기억나시죠? 이거 기억 안나면 진짜 쌔드 모드로 들어가 버립니다....  -_-

그렇습니다. 이렇게 작성을 했었죠. 그리고, aspx 페이지에서는 이 메시지들을 가져와서 출력해 주었었습니다. 자. 그렇다면 이번에는 다국어를 지원하기 위해서 동일한 Resources 폴더안에다가 기존 리소스 파일과 이름은 동일하지만, 확장자 전에 .en이 붙는 형식으로, 즉 다음과 같은 이름의 resx 파일을 추가해 보세요.

카피하시기 편하라고, 친절하게 다시금 적어드리자면...

AppResources.en.resx

그렇습니다. ^^..  그리고, 무엇보다 중요한 것은!!! 명명규칙을 반드시 지켜주셔야 한다는 것입니다.

눈치채신 분도 있으시겠지만, 리소스 파일명과 확장자 사이에 들어가는 문자는 바로 여러분이 지원하고자 하는 다국어의 표준 명칭이어야 합니다. (이 표준명칭을 어디서 쉽게 살펴볼 수 있는지는 잠시 뒤에 알려드리겠습니다)

자. resx 파일을 위와같이 추가하셨다면, 해당 파일을 여시고... AppResources.resx 에다가 작성했던 것과 동일한 키값을 가지고 메시지들을 기록해주세요. 예를 들면, 다음과 같이 말입니다.

반드시, name 부분은 기존 AppResources.resx 에 작성했던 것과 동일하게 맞춰주셔야 합니다. 이 name이라는 것이 각각의 값을 읽어오기 위해 사용하는 일종의 Key이니까요 ^^. 즉, name 부분은 기존 resx 파일들의 것과 맞춰주시고, value 만을 각각의 언어별로 따로 지정해 주시면 된다 이겁니다. ^^

자~ 여기까지 되셨나요?

그렇다면, 기왕 추가하는 거 우리 독일 쪽하고 중국 쪽도 한번 지원해볼까요? 그렇다면, 한번 빠져~ 봅시다~ (개콘의 안어벙 버전~)

어떻게 해야 하냐구요? 영어 버전을 추가할 때와 크게 다를 것이 없습니다. 독일어를 위해서는 AppResources.de.resx를, 중국어를 위해서는 AppResources.AppResources.zh-cn.resx를 추가하시면 되는 것이죠.... 그러니깐, 다음 그림처럼 말입니다. ^^

호오.. 독일말과 중국말도 할줄 아는 것이냐구요???  그럴리가 있겠습니까???  독일어는 자동 번역기를 통해서 얻어낸 것이구요. 중국어는 현재 중국 상해에 파견 나가있는 동생 태지를 통해서 알아낸 것일 뿐입니다. ^^  음헤헤~~~

아참... 근데, 왜 독일의 경우는 언어코드값이 de이고, 중국은 zh-cn 이냐구요? 무엇을 기준으로 그것을 알수가 있느냐구요? 글쎄요... 그게 저도 궁금합니다... -_-

가장 간단하게 이것을 알아볼 수 있는 방법은 인터넷 익스플로러를 통해서 입니다. IExplorer를 실행시키시고, 메뉴 중에서 [도구]의 [인터넷 옵션]으로 가보세요 ^^  그러면 다음 그림과 같은 [인터넷 옵션] 윈도우가 뜨죠?

그 중 하단의 [언어]를 클릭해 보세요 ^^ 그러면 다음 그림처럼 기본 언어를 추가 및 선택할 수 있는 윈도우가 나옵니다. 여기서 [추가] 버튼을 눌러서 다양안 언어들을 추가해 보세요 ^^

저는 그림에서 보이듯이 중국어(중국)과 영어, 독일어를 추가했습니다. 각 언어 뒤에는 해당 언어의 표준 명칭이 나오고 있죠??? 하하하..  이걸 기준으로 리소스 파일명에 언어 표준 명칭을 붙여준 것이랍니다. 간단하죠??

자.. 여러분도 위의 그림처럼 영어, 독일어 등을 추가해줘 보세요 ^^ 그리고, 일단은 그림처럼 한국어를 제일 위쪽에 위치하도록 두시면 됩니다. 일단은 말이죠~

자.. 이제 준비는 다 되었습니다. 이제 해야할 일은 기존에 작성했던 aspx 페이지의 코드를 약간 수정하는 것입니다. Page_Load의 코드를 약간만 수정하도록 해 보겠습니다. 다음처럼 말이죠(파란색의 코드가 추가된 부분이랍니다)

private void Page_Load(object sender, System.EventArgs e)
{
    string fullName = "SampleProject.Resources.AppResources";

    System.Reflection.Assembly Assem = System.Reflection.Assembly.GetExecutingAssembly();
    ResourceManager appResourceMgr = new ResourceManager(fullName, Assem);

    string lang = Request.UserLanguages[0];
    lang = lang.Split(new char[]{';'})[0];
    CultureInfo ci = new CultureInfo(lang);

    Button1.Text = Mgr.GetString("Msg.Click", ci);
    Label1.Text = Mgr.GetString("Msg.Welcome", ci);
}

파란색으로 추가된 코드를 설명드리자면 대략 이렇습니다.

첫번째 라인의 코드는 현재 요청자가 사용하는 브라우저 언어 중에서 첫번째 언어에 대한 정보를 가져오게 됩니다. Request.UserLanguages[0] 라는 부분이 바로 그것을 의미하죠~ 만일, UserLanguages[0]가 아니라 코드를 UserLanguages[1] 라고 작성했다면 이것은 브라우저에서 지정된 언어들 중에서 두번째 언어 명칭을 가져오게 되겠죠? ^^   그렇습니다. 참고로, 일전의 그림([언어 기본 설정] 윈도우)을 참고해 보면.. 현재의 경우, UserLanguages[0]은 한국어이구요. UserLanguages[1]은 중국어가 될 것입니다.

두번째 라인의 코드는 그 언어 값에서 ";"라는 문자를 기준으로 스플릿을 해서 앞쪽의 문자열만을 뽑아오는 것인데요. 이러한 코드가 왜 필요하냐면... Request.UserLanguages[0]를 통해서 가져오게 되는 언어 코드값들이 달랑 "ko", "en", "de"와 같이 넘어오는게 아니라...  "en;q=0.5", "zh-cn;q=0.8"와 같이 값이 얻어지기 때문에... 순수한 언어코드만을 뽑아내기 위해서 저런 코드를 사용해본 것입니다....

참고로, 제가 보여드린 코드가 최적의 코드인 것은 아니라는 점을 말씀드리고 싶습니다. ^^

세번째 라인이 매우 중요한데요. 이것이 바로 다중 언어 지원을 위해서 컬쳐정보 개체를 생성하는 부분입니다. CultureInfo 라는 것은 특정 컬쳐를 나타내는 개체인데요...  이게 말로 설명하기가 쪼금 애매한 것인긴 한데... 음... 컬쳐 있잖습니까!!  그러니깐, 왜 국가마나 날짜형식이나 통화나 뭐 그런 것들이 다 다르잖아요. 그러니깐 그것을 대표하는 것을 컬쳐라고 하는 거거든요... -_-;;; 

갑자기 찾아온 표현력의 부재현상으로 인해 이 부분에 대한 부연 설명을  MSDN의 내용을 인용하여 잠시 소개해 드려보겠습니다.

CultureInfo는 날짜 형식 지정과 문자열 정렬 같은 일반적인 작업에 필요한 정보를 제공하는 culture 관련 개체에 대한 액세스뿐 아니라 사용된 culture 이름, 쓰기 시스템, 달력 등의 특정 culture에 대한 정보를 나타냅니다.

CultureInfo 클래스에는 관련 언어, 보조 언어, 국가/지역, 달력, culture 규칙 등의 culture 관련 정보가 저장되어 있습니다. 또한 이 클래스를 사용하여 DateTimeFormatInfo, NumberFormatInfo, CompareInfo 및 TextInfo의 culture 관련 인스턴스에 액세스할 수도 있습니다. 이러한 개체에는 대/소문자 구분, 날짜와 숫자 형식 지정 및 문자열 비교 같은 culture 관련 작업에 필요한 정보가 들어 있습니다.

culture 이름은 "<languagecode2>-<country/regioncode2>" 형식의 RFC 1766 표준을 따릅니다. 여기서 <languagecode2>는 ISO 639-1에서 유래한 두 문자의 소문자 코드이고, <country/regioncode2>는 ISO 3166에서 유래한 두 문자의 대문자 코드입니다. 예를 들어, 미국 영어는 "en-US"입니다.

* 위의 글은 MSDN(VS.NET 한글 도움말)에서 인용한 것임을 밝힙니다.

그런 것입니다!!!!

해서, 현재 요청 브라우저가 지원하는 첫번째 언어를 기준으로 하여 컬쳐정보 개체를 만든 것입니다. ^^

그리고 난 다음에는.. 기존과 마찬가지로 ResourceManager 개체의 GetString 메소드를 호출하여 우리가 원하는 메세지를 가져오는데 말입니다. GetString 메서드의 두번째 인자로 현재 가져오고자 하는 컬쳐정보 개체를 지정해주면 된다 이겁니다!!!!

그러면, 자동으로 알아서... 브라우저의 기본 언어(첫번째 언어)가 중국어(zh-cn)로 설정되어 있다면, 자동으로 ResourceManager가 AppResources.zh-cn.resx 로부터 메시지를 찾아서 가져오고, 만일 브라우저의 기본언어가 독일어(de)로 되어져 있다면 자동으로 AppResources.de.resx 로부터 메시지를 찾아서 가져오게 된다는 것입니다. ^^

진짜? 진짜???

그렇습니다. 의심이 많으신 분들을 위해서 같이 한번 테스트를 해보도록 하죠.. 위와 같이 소스를 작성하셨다면 빌드를 하고 한번 페이지를 실행해 보도록 하겠습니다..

기본적으로는 다음처럼 한글이 나타나게 될 것입니다. 왜? 현재는 기본 언어가 한국어로 되어져 있으니까요!!

자. 이제 브라우저의 메뉴 중 [도구]-[인터넷 옵션]에 가셔서.. 아까 그 언어 지정하는 곳을 찾아갑니다. 거기서 이번에는 독일어를 [위로 이동] 하셔서 기본 언어로 만들어 보세요. 다음 그림처럼요~ 그리고 [확인]을 클릭하여 브라우저로 돌아옵니다.

그리고, 페이지를 이제 새로 고침해 보세요..

호곡 멋들어지게 독일어가 화면에 출력되는 것을 보실 수 있죠? 이제는 기본적으로 브라우저에서 독일어를 기본으로 쓰는 사람들(아마 거의 독일사람들이겠죠?)이 들어오면.. 페이지는 기본적으로 위의 그림처럼 독일어를 화면에 나타낼 줄 것입니다. ^^

재미있죠? 다시 언어를 중국어로 바꾸고, 페이지를 새로 고침해 보세요... 역시나 멋지게 중국어가 뜹니다

하하하... 멋지지 않나요? 자동으로 이렇게 해당 언어에 맞는 리소스파일을 찾아서 그로부터 메시지를 가져와 출력해준다는 사실이 말입니다.!!!!

그렇다면, 만일... 브라우저의 언어는 프랑스어(fr)인데, 서버에는 AppResources.fr.resx 라는 파일이 존재하지 않으면 어떻게 될까요???????? 그 경우에는 자동으로 기본 리소스 파일은 AppResources.resx에 있는 값을 가져오게 됩니다. ^^

이것이 바로 .NET에서 제공하는 리소스 파일의 감동적인 장점인 것입니다. 하하하~~~ 감동적이지 않나요? 다국어 지원이 이렇게 용이하다니.... 말입니다.

강좌가 즐겁고 유쾌하였다면.... 잡담 게시판에 응원글 부탁드려요~~

그럼 저는 또 다음 시간에 다른 재미있는 정보로 찾아뵙겠습니다.


authored by


 
 
.NET과 Java 동영상 기반의 교육사이트

로딩 중입니다...

서버 프레임워크 지원 : NeoDEEX
based on ASP.NET 3.5
Creative Commons License
{5}
{2} 읽음   :{3} ({4})