머리말
MasterPage를 사용하여 ASP.NET 어플리케이션에서 지역화(localization)를 구현하는 방법을 인터넷에서 찾아보는 동안 깨달은 바는, 많은 사람들이 동일한 문제를 해결하고자 한다는 사실이다. 안타깝게도, 이 문제에 적합한 해결방안을 찾지 못해서 의도한 바를 직접 구현했다.
배경
해결방안은 닷넷 프레임워크의 표준 지역화 메커니즘을 사용하였다.
코드 사용
출시된 솔루션은 현재 선택된 culture를 위한 저장소로 Session 오브젝트를 사용했다. 이 오브젝트는 global.asax 파일의 한 부분인 Session_Start메서드 동안 초기화된다.
만약 문명 변경이 사용자에 의해 요청된다면, MasterPage는 Session 오브젝트에서 저장된 culture를 변경한다.
Page에서 상속 받는 BasePage 안에서 메서드 InitializeCulture는 재정의되고 session 오브젝트에 저장된 적당한 culture 정보를 현재 스레드로 설정한다. 그래서, 모든 웹 폼은 이 BasePage에서 파생되어야 할 필요가 있다.
Global.asax 파일에서부터 시작해보자.
void Session_Start(object sender, EventArgs e)
{
//set english as default startup language
Session["MyCulture"] = "en-GB";
}
아니면, culture는 key <globalization culture="en-GB" />로 Web.config 파일에 정의할 수도 있으며, 그 후에는 처리되고 Session_Start메서드에서 Session오브젝트안에 저장된다.
다음 단계는 마스터 페이지이다.
<%@ Master Language="C#" AutoEventWireup="true" CodeFile="MasterPage.master.cs" Inherits="MasterPage" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head runat="server">
<title>[Udev - Masterpage with Localization Support]</title>
</head>
<body>
<form id="theForm" runat="server">
<div>
<asp:contentplaceholder id="ContentPlaceHolder" runat="server">
</asp:contentplaceholder>
</div>
<div style="margin-top:20px;">
<asp:LinkButton ID="btnSetGerman" runat="server" Text="Deutsch" CommandArgument="de-CH" OnClick="RequestLanguageChange_Click"></asp:LinkButton>
<asp:LinkButton ID="btnSetEnglish" runat="server" Text="English" CommandArgument="en-GB" OnClick="RequestLanguageChange_Click"></asp:LinkButton>
</div>
</form>
</body>
</html>
아래 culture를 변경시키는 부분은 MasterPage 에 직접 혹은 삽입된(embedded) UserControl안에 위치시킬 수도 있다. 요청된 언어로 결정하기 위해서는, ttribute of the LinkButton의 CommandArgument특성이 사용된다.
그리고 다음은 마스터 페이지의 코드 비하인드이다.
public partial class MasterPage : System.Web.UI.MasterPage
{
protected void Page_Load(object sender, EventArgs e)
{
}
protected void RequestLanguageChange_Click(object sender, EventArgs e)
{
LinkButton senderLink = sender as LinkButton;
//store requested language as new culture in the session
Session["MyCulture"] = senderLink.CommandArgument;
//reload last requested page with new culture
Server.Transfer(Request.Path);
}
}
CommandArgument안에 전달된 요청된 언어는 처리되고 Session 오브젝트에 저장된다. 그 후로는, 초기에 요청된 페이지는 서버 측에서 리로드된다.
BasePage에 대한 중요한 말이 아직 남았다.
/// <summary>
/// Custom base page used for all web forms.
/// </summary>
public class BasePage : Page
{
protected override void InitializeCulture()
{
//retrieve culture information from session
string culture = Convert.ToString(Session["MyCulture"]);
//check whether a culture is stored in the session
if (culture.Length > 0) Culture = culture;
//set culture to current thread
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(culture);
Thread.CurrentThread.CurrentUICulture = new CultureInfo(culture);
//call base class
base.InitializeCulture();
}
}
위에서 언급했듯이, InitializeCulture 메소드는 재정의되고 Session 오브젝트에서 저장된 culture를 가져오고 현재 실행중인 스레드를 여기에 할당한다.
유의: 아티클에서는 오직 culture만 언급되었지만, UI culture도 마찬가지이다. 핸들링은 절대적으로 똑같고 , 이 아티클에서 더 다룰 사항은 아니다. 더 자세한 정보는 MSDN 페이지를 참조하도록 한다. :)
실행되는 예제는 위 압축파일을 다운로드 받도록 한다.
출처 : http://www.codeproject.com/useritems/MasterPage_Localization.asp
이 글은 날개달기에 의해 번역되었습니다.