ASP.NET 2.0은 다중 언어 변환 기능과 다중 스타일 테마 변환 기능을 제공합니다. 두 가지 구현 형태는 비교적 유사하므로 함께 설명하겠습니다.
1. 언어 전환기 다국어 전환 Quick Start Tutorial에서는 사용자가 선택한 언어를 저장하고 적용하는 방법을 소개합니다. 일반적으로 DropDownList는 사용자가 선택할 수 있는 지원 언어를 표시하는 데 사용됩니다. 일반적으로 마스터 페이지에 배치되며 여기에는 사용자가 선택한 언어가 저장됩니다. 쿠키 세션이나 쿼리 문자열에 저장할 수도 있습니다. 사용자가 이전에 선택한 언어를 사용하려면 페이지에서 InitializeCulture 메서드를 재정의하세요. 언어 설정 작업(여기서는 SelectedIndexChanged 이벤트)이 InitializeCulture 시간 이후에 발생하므로 설정 작업이 완료된 후 현재 페이지를 즉시 적용하려면 이 페이지를 다시 로드하고 InitializeCulture 이벤트를 트리거하는 리디렉션이 필요합니다. 아래는 빠른 시작 코드의 일부입니다. 빨간색 부분에 주의하세요. 일부 페이지 주소 뒤에 쿼리 문자열이 있을 수 있으므로 개인적으로 빨간색 코드 부분을 Response.Redirect(Request.Url.PathAndQuery);로 대체하는 것이 가장 좋다고 생각합니다.
protected void DropDownLanguage_SelectedIndexChanged(개체 전송자, EventArgs e)
{
string SelectedLanguage = DropDownLanguage.SelectedValue.ToString();
//선택한 사용자 언어를 프로필에 저장
Profile.SetPropertyValue("PreferredCulture", SelectedLanguage);
//InitializeCulture()를 실행하기 위해 페이지를 강제로 다시 초기화합니다.
Response.Redirect(Request.Url.LocalPath);
}
보호된 재정의 void InitializeCulture()
{
// 프로필에 사용자 언어 설정이 포함되어 있는지 확인하기 위해 가상 메서드 InitializeCulture()를 재정의합니다.
string UserCulture = Profile.GetPropertyValue("PreferredCulture").ToString();
if (UserCulture != "")
{
// 프로필에 사용자 언어 설정이 있습니다. 해당 언어로 전환하세요.
Thread.CurrentThread.CurrentUICulture = 새로운 CultureInfo(UserCulture);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(UserCulture);
}
}
코드 중복을 줄이기 위해 일반적으로 고객 기본 페이지 클래스를 사용자 정의하여 페이지 클래스를 상속한 다음 사용자 정의된 페이지 기본 클래스에서 InitializeCulture 메서드를 다시 초기화합니다. 마지막으로 사용자 정의 페이지 기본 클래스에서 각 페이지를 상속합니다. 이렇게 하면 모든 페이지에서 InitializeCulture 메서드를 재정의할 필요가 없습니다.
하지만 위의 방법은 여전히 만족스럽지 않습니다. 페이지를 추가할 때마다 우편번호를 수정하여 사용자 정의 페이지 기본 클래스를 상속받아야 하기 때문입니다.
InitializeCulture 메서드에서는 현재 스레드의 Culture 및 UICulture만 실제로 수정된다는 점을 확인했습니다. 그러면 이 두 속성을 애플리케이션 이벤트와 같은 전역 이벤트에서 수정할 수 있습니까? 나는 오래 전에 다음 코드와 유사하게 Application의 BeginRequest 이벤트가 트리거될 때 InitializeCulture의 세부 정보를 구현하여 이 작업을 시도했습니다.
void Application_BeginRequest(객체 전송자, EventArgs e)
{
string lang = string.Empty;//기본값은 고정 문화권입니다.
랭 = Profile.PreferredCulture;
if (string.IsNullOrEmpty(lang))
{
랭 = 문자열.비어있음;
}
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang);
}
빨간색 부분은 다른 방법으로 대체되어야 합니다. 왜냐하면 startrequest 트리거 단계에서 프로필 개체가 asp.net에 의해 아직 생성되지 않았기 때문입니다. 쿠키로 대체될 수 있습니다.
이렇게 하고나서 언어설정을 하고 나니 작동이 않되었던 기억이 나네요. 당시에는 글로벌 이벤트에서 처리하고 나중에 덮어쓰게 될 수도 있으니 안될 수도 있겠다는 생각이 들었습니다. 그래서 그 당시에는 여전히 초기화 문화(InitializeCulture) 메서드가 사용되었습니다. 오늘 나는 asp.net 포럼에서 누군가가 이런 일을 하는 것을 보았습니다.
void Application_BeginRequest(객체 전송자, EventArgs e){
string lang = string.Empty;//기본값은 고정 문화권입니다.
HttpCookie cookie = Request.Cookies["DropDownName"];
if (쿠키 != null && cookie.Value != null)
lang = Request.Form[cookie.Value];
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang);
}
그래서 그 때 뭔가 설정이 제대로 되어 있지 않은 것 같아 다시 시도해 보니 페이지 헤더 명령 <%@ Page UICulture="auto" Culture="auto" %>가 발생한 이유였습니다. 문화는 페이지에 설정되며 전역 설정보다 우선 적용됩니다. 제거한 후 전역 설정이 적용되었습니다. 페이지의 문화권 설정은 전역 설정을 재정의하고 페이지의 초기화 문화 설정(정확히 말하면 이 메서드를 지원하는 모든 컨트롤)이 페이지 설정을 재정의하는 것으로 보입니다. 실제로 Page 클래스에 있는 InitializeCulture 메서드의 기본 구현은 비어 있으므로 페이지 헤더 명령 UICulture="auto" Culture="auto"를 제거하면 Global의 설정이 적용됩니다.
또한 사용자의 선택 사항을 저장하기 위해 실제로 Profile을 사용하려는 경우 PreRequestHandlerExecute 이벤트가 트리거될 때 처리합니다.
void Application_PreRequestHandlerExecute(객체 전송자, EventArgs e)
{
string lang = string.Empty;//기본값은 고정 문화권입니다.
랭 = Profile.PreferredCulture;
if (string.IsNullOrEmpty(lang))
{
랭 = 문자열.비어있음;
}
Thread.CurrentThread.CurrentUICulture = CultureInfo.GetCultureInfo(lang);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(lang);
}
이때 Profile이 생성되었으므로 사용이 가능합니다.
2. 멀티 스타일 테마 전환 테마 전환기
이번 글에서는 테마 전환에 대해 이야기하고 있는데, 그 형태가 언어 전환과 매우 유사하다고 생각합니다. 그는 HttpModule을 사용합니다. Global.asax 파일의 해당 이벤트 처리 및 배포 아래에 직접 배치할 수 있다고 생각합니다. 쿠키를 저장용으로 사용하는데 아직은 Profile을 사용하는 것이 좋다고 생각합니다.
출처 : 두꺼운 축적과 번영 BLOG