『 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>에서 삽입
'Development > .Net' 카테고리의 다른 글
VS2008 활용 (0) | 2010.08.06 |
---|---|
팀 탐색기 2008에서 TFS 2010으로 연결하기 (0) | 2010.07.26 |
[C#] DataGridView의 다양한 활용 (0) | 2010.01.07 |
지식정보 :: C# 에서 엑셀 표현하기 (2) | 2009.12.16 |
DataTable 데이터 생성시 느낌표가 뜹니다 (0) | 2009.12.04 |