Creative Commons License

Microsoft .NET

닷넷!시작하기
닷넷! Ver 2.0~
닷넷!스킬업
웹개발
윈폼개발
실용모듈개발
Tip & Tech
하루 한 문법

Microsoft .NET 개발자들을 위한 공간입니다. 기초강의에서 부터 고급 기술 정보 및 팁등을 다루도록 하겠습니다.

.

웹개발

이제 웹 기반 응용개발 지식은 거의 필수적으로 요구되는 시대입니다. 구체적인 웹 사이트 개발은 아니더라도 거시적인 웹 기반 서비스에 대한 지식 배양을 위해 할 것이 참 많네요 ^^

[ASP.NET] ASP.NET 2.0 다국어 지원 웹 사이트 구축

작성자 : 박종명
최초 작성일 : 2008-06-25 (수요일)
최종 수정일 : 2008-06-25 (수요일)
조회 수 : 7144

ASP.NET 2.0 다국어 지원 웹 사이트 구축하기』

 

여러 언어를 지원해야 하는 다국어 웹 사이트를 구축하기 위한 방법을 알아보자.

 

제일 쉬운 접근 방법은 각 언어에 해당하는 웹 사이트를 별도로 만드는 것이다.

그러나 이것은 접근 방법이 쉽다는 것 뿐, 개발 양적인 측면이나 유지/보수성을 생각한다면 결코 좋은 접근 방법이 아닐 것이다. 동일한 컨셉과 구조, 컨텐츠를 제공하는 웹 사이트가 단지 언어만 다르다는 이유로 쌍둥이 사이트를 새로 개발해야 한다는 문제점과 그렇게 구축된 웹 사이트의 특정 컨텐츠 추가나 변경을 해야 할 때에는 모든 웹 사이트를 다 수정해야 하는 문제점이 있다.

 

예전부터 효율적인 다국어 지원을 위해서 다양한 방법들이 개발자들에 의해 구현되어 왔었는데..

가장 보편적으로는 다국어 처리를 위한 일종의 유틸리티 성 모듈을 거쳐 처리하는 방식이 대부분 이었다.

 

이번 글에서는 닷넷이 제공하는 표준 리소스 메커니즘을 이용해 다국어 지원을 효율적으로 하는 방법을 알아 본다.

 

ASP.NET 1.x 2.0 모두 리소스를 이용할 수 있다.

닷넷의 리소스에 대한 개념은 다음 글에서 확인해 주길 바란다.

리소스(Resource)

 

ASP.NET 1.1 에서는 리소스를 이용한 다국어처리를 위해 ResourceManager 를 이용했었다.

그러나 ASP.NET 2.0에서는 보다 관리용이하고 개발용이 하도록 개선된 부분이 있다.

 

 

전역(Global) 리소스 파일 / 지역(Local) 리소스 파일

ASP.NET 2.0 에서는 리소스 파일의 사용 범위에 따라 전역,지역 두 가지로 분리되었다.

App_Code App_Data 처럼 리소스 파일 역시 예약된 폴더를 가지고 있다.

 

전역 리소스 파일 저장 -> App_GlobalResources

지역 리소스 파일 저장 -> App_LocalResources

 

전역 리소스는 말 그대로 웹 사이트 모든 영역에서 사용할 수 있으나 지역 리소스는 특정 단일 페이지(aspx, ascx, master) 에서만 사용가능하다. 또한 당연하겠지만 App_GlobalResources 폴더는 웹 사이트 루트에 단 1 개만 허용되지만 App_LocalResources 폴더는 웹 사이트 내의 모든 폴더에 하나 씩 존재해도 된다.

 

 

Web.Config 에 언어정보 추가하기.

언어 설정에 따른 지역화를 테스트 하기 위해 웹 사이트의 설정 파일인 Web.Config 파일에 다음과 같이 언어 정보를 기록하자.

 

<globalization uiCulture="en" />


일단 테스트를 위해 현재 UICulture 를 영어(en) 으로 설정하였다.

 

* 현재 브라우저에 설정된 기본 언어(첫 번째 언어) 를 참고해서 UICulture 를 지정하려면 ‘auto’ 를 사용하면 된다

<globalization uiCulture="auto" />

또는

<%@ Page UICulture="es" UICulture="auto" %>

 

이렇게 설정 하면 브라우저에 설정된 첫 번째 언어로 설정되게 된다

 

 

전역(Global) 리소스 이용하기.

웹 프로젝트에 App_GlobalResources 폴더를 생성하고 다음과 같이 리소스 파일을 생성하자.

 

 

언어 정보가 없는 Resource.resx 기본 리소스 파일이다.

이 리소스 파일은 해당 언어의 리소스 파일이 없을 경우 대체(fallback) 리소스 파일로 사용된다.

이 기본 리소스 파일을 한국어를 위한 리소스 파일로 사용할 것이며 영어를 지원하기 위해서 Resource.en.resx

사용한다.

 

리소스 파일명에 포함된 언어 정보는 정확히 기입해야 한다.

런타임에 ASP.NET  에서는 CurrentUICulture 속성과 가장 많이 일치 하는 리소스 파일을 자동으로 찾아서 사용하게 된다. 이때 참조되는 정보가 리소스 파일명이 된다.

 

각 국가별 언어 표현은 아래와 같이 확인할 수 있다.

 

이렇게 리소스 파일이 준비 되었으면 컨트롤의 지역화를 수행해 보자.

웹 페이지에 버턴과 Localize 컨트롤을 올리고 Text 속성에 명시적으로 지역화를 수행하도록 한다.

 

<asp:Button ID="Button1" runat="server"

        Text="<%$ Resources:Resource, Message %>" /><br />

              

<asp:Localize ID="Localize1" runat="server"

        Text="<%$ Resources:Resource, Message %>"></asp:Localize>

 

전역 리소스 파일을 사용할 경우 다음과 같은 표현식으로 리소스 내용을 참조하게 된다.

이를 명시적 지역화라 한다.

<%$ Resource: Class , Key %>

Class 의 경우 확장자와 언어정보를 제외한 리소스 파일명이 된다. 이 예에서는 Resource 가 된다.

Key 는 리소스 파일에 기록한 Key 정보 이다. Key 에 해당하는 Value 를 가져오는 것이 되겠다.

 

Localize 컨트롤은 닷넷 2.0에 새로 추가된 컨트롤로써 Literal 컨트롤을 상속받은 컨트롤이다.

이는 웹 페이지에 고정되고 정적인 내용을 표현하기 위한 가벼운 컨트롤 즈음 될 것이다.

(사실 Literal , Label 컨트롤로도 동일한 지역화를 구현할 수 있다)

 

이렇게 다 구현되었다면 Web.Config <globalization uiCulture="en" /> 내용을 변경하면서 테스트 해 보자. 아래는 en, ko 두 가지를 테스트 해본 결과 이다.

 

 

en으로 설정하면 Resource.en.resx 가 사용될 것이며 ko 로 했을 경우에는 Resource.ko.resx 가 없으므로 기본 리소스 파일인 Resource.resx 가 대체되어 사용되었다.

 

또한 다음과 같이 전역 리소스의 내용을 출력할 수 있다.

Response.Write(this.GetGlobalResourceObject("Resource", "Message"));

 

 

지역(Local) 리소스 이용하기.

웹 프로젝트의 원하는 폴더에(웹 루트도 상관없다) App_LocalResources 폴더를 생성하고 다음과 같이 리소스 파일을 생성하자.

 

이전과 동일하게 기본리소스와 영어지원을 위한 리소스 두 개를 생성하고 내용을 Key-Value 형태로 기록하였다.

 

주의 해야 할 것은 지역(Local) 리소스의 경우 특정 한 페이지만을 위한 리소스 이므로 페이지명과 연결 시켜서 리소스 파일명이 부여되어야 한다.

현재 이 예제에서는 Local.aspx.resx 리소스라는 말은 Local.aspx 라는 페이지를 위한 리소스 파일이 되는 것이다.

또한 닷넷 컨트롤의 속성과 리소스 파일의 Key 이름과도 연관성이 있는데, 이 예제에서는 ButtonResource.Text 라 했으므로 컨트롤의 Text 속성에 이 Key 가 자동으로 사용된다 라고 해석하면 되겠다.

 

일단 지역 리소스파일을 이용해 컨트롤의 지역화를 수행해 보자

<asp:Button ID="Button1" runat="server"

        Text="<%$ Resources: ButtonResource.Text %>" />

또는       

<asp:Button ID="Button2" runat="server" Text="DefaultText2"

        meta:resourcekey="ButtonResource" />

 

지역 리소스를 사용할 경우 전역 리소스처럼 명시적 지역화를 수행할 수도 있지만 Meta 태그를 이용한 암시적 지역화로도 사용가능하다. 암시적 지역화는 앞서 말했듯이 리소스 키 값만 연결해 주면 컨트롤의 특정 속성과 리소스 파일에 속성이 매칭되어 사용되는 것을 말한다.

 

또한 명시적 지역화를 사용할 경우에도 Class 명을 생략할 수 있다. 단일 페이지에 연결된 리소스 파일이기 때문에 굳이 리소스 파일명을 기입할 필요가 없는 것이다. 역시 Web.config 의 언어 정보를 변경하면서 수행하면 다음과 같이 결과가 나온다.

 

 

물론 지역(Local) 리소스 파일의 경우에도 다음과 같이 일반 출력이 가능하다

Response.Write(this.GetLocalResourceObject("ButtonResource.Text"));

 

 

전역(Global) 리소스 와 지역(Local) 리소스의 적용 상황

닷넷 프레임워크에서는 지역화를 위한 단일한 접근이 아니라 범위에 따른 두 개의 영역으로 리소스 파일을 관리하도록 하였다. 이 둘 중 어느것을 사용할 지에 대한 기준은 프로젝트의 성격에 따라 다르겠지만 일반적으로 다음과 같은 가이드 라인을 제공할 수 가 있겠다.

1)       공용 메시지나 단순 출력 메시지일 경우 전역 리소스 사용

2)       웹 사이트에 전역적으로 사용되는 메시지일 경우 전역 리소스 사용

3)       전역 리소스 파일이 너무 커져 협업의 어려움이나 관리의 어려움이 있을 경우 지역 리소스 사용
-
웹 사이트의 모든 페이지의 리소스를 하나의 전역 리소스에 다 표현한다면 파일을 관리하기도 어려울 것

        이며, 협업 시 발생하는 파일 동시 변경과 같은 문제점도 발생할 수 있다 로컬 리소스를 사용하면 각 폴더

        마다 리소스 폴더를 별도로 둘 수 있으며 각 페이지에 해당하는 리소스 파일을 각각 생성함으로써
 
협업 시 서로 신경 쓰지 않고 작업할 수 있으며 페이지 별로 리소스를 관리하기 때문에 파일에 대한 관리

        도 용이해 질 수 있다.

4)       각 페이지의 컨트롤의 텍스트 표현(Text 속성)을 위해서는 지역 리소스 사용
- 3)
의 이유와도 동일함.
 
모든 페이지의 컨트롤 Text 속성을 단 하나의 전역 리소스에 포함해야 한다면.. 끔찍할 것이다.

 

이상의 가이드 라인을 기준으로 현재 프로젝트에 적합한 리소스 파일을 사용하기 바란다.

 

 

리소스를 이용한 웹 페이지 지역화에 대해 보다 상세한 내용은 다음의 MSDN 을 참고하기 바란다.

http://msdn2.microsoft.com/ko-kr/library/ms227427(VS.80).aspx

 

 

 

* 참고

아래 이미지를 보자

  

이와 같이 텍스트를 포함하는 이미지일 경우에도 다국어 처리를 해 주어야 한다.

여러 방법이 있을 수 있으나,

통상적으로 각 언어별로 이미지를 새로 만들어 폴더를 구분하는 방법이 있다.

이 경우에도 리소스 파일과 연계하여 사용하면 그나마 유연한 환경이 될 것이라 본다.

아래처럼 각 언어별 리소스 파일에 이미지의 경로를 기록하는 것이다.

 

    

그리고 아래와 같이 현재 UICulture 에 맞는 리소스의 경로를 참조하도록 한다.

<asp:Image ID="Image1" runat="server" ImageUrl="<%$ Resources:Resource, ImageUrl %>" />

또는       

<img src="<%$ Resources:Resource, ImageUrl %>" runat=server />

 

물론 웹 사이트의 모든 이미지를 서버 컨트롤로 만드는 것이 결코 좋은 선택은 아니다.

닷넷의 서버 컨트롤은 필요하다면 최소화 하는 것이 수행 속도 면에서는 좋을 수 있다.

 

여기서 말하는 이미지 다국어 처리 방법은 리소스와 연계한 힌트 성 글이니 이 글을 절대적으로 수용할 필요도 없으며 적합하지 않을 가능성이 크다.  그래서 참고인 것이다 ^^;

 


 

 

이름
비밀번호
홈페이지
EI <- 왼쪽의 문자를 오른쪽 박스에 똑같이 입력해 주세요