본문 바로가기

Development/.Net

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

반응형

   

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

   

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

   

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

그러나 이것은 접근 방법이 쉽다는 것 뿐, 개발 양적인 측면이나 유지/보수성을 생각한다면 결코 좋은 접근 방법이 아닐 것이다.

동일한 컨셉과 구조, 컨텐츠를 제공하는 웹 사이트가 단지 언어만 다르다는 이유로 쌍둥이 사이트를 새로 개발해야 한다는 문제점과

그렇게 구축된 웹 사이트의 특정 컨텐츠 추가나 변경을 해야 할 때에는 모든 웹 사이트를 다 수정해야 하는 문제점이 있다.

   

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

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

   

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

   

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

   

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) 리소스의 적용 상황

닷넷 프레임워크에서는 지역화를 위한 단일한 접근이 아니라 범위에 따른 두 개의 영역으로 리소스 파일을 관리하도록 하였다.

이 둘 중 어느것을 사용할 지에 대한 기준은 프로젝트의 성격에 따라 다르겠지만

일반적으로 다음과 같은 가이드 라인을 제공할 수 가 있겠다.

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

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

전역 리소스 파일이 너무 커져 협업의 어려움이나 관리의 어려움이 있을 경우 지역 리소스 사용

- 웹 사이트의 모든 페이지의 리소스를 하나의 전역 리소스에 다 표현한다면 파일을 관리하기도 어려울 것이며,

협업 시 발생하는 파일 동시 변경과 같은 문제점도 발생할 수 있다.

로컬 리소스를 사용하면 각 폴더마다 리소스 폴더를 별도로 둘 수 있으며 각 페이지에 해당하는 리소스 파일을 각각 생성함으로써

협업 시 서로 신경 쓰지 않고 작업할 수 있으며 페이지 별로 리소스를 관리하기 때문에 파일에 대한 관리도 용이해 질 수 있다.

각 페이지의 컨트롤의 텍스트 표현(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 />

   

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

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

   

여기서 말하는 이미지 다국어 처리 방법은 리소스와 연계한 힌트 성 글이니 이 글을 절대적으로 수용할 필요도 없으며

적합하지 않을 가능성이 크다. 그래서 참고인 것이다 ^^;

 <http://www.devpia.com/MAEUL/Contents/Detail.aspx?BoardID=13&MAEULNo=6&no=154&ref=154>에서 삽입

   

   

반응형