이 문서에서는 Asp.net의 리소스 세계화 및 지역화에 대한 기본 개념부터 시작하여 Asp.net1.1 및 Asp.net2.0에서 세계화 및 지역화를 달성하는 단계와 방법을 설명합니다.
하나. 기본 개념
1. 리소스를 현지화하는 이유는 무엇입니까?
우리 사이트는 전 세계 다양한 국가와 지역의 사람들이 볼 수 있으며, 각 국가와 지역의 사람들은 각자의 언어와 문화적 특성을 가지고 있습니다. 중국 본토는 중국어 간체를 사용하고, 홍콩, 마카오, 대만은 중국어 번체를 사용합니다. 또한, 국가마다 통화, 숫자, 달력 등의 정보 표현 형식이 다르며, 우리나라는 주로 연, 월, 일 형식을 사용하는 반면, 미국은 월, 일, 연 형식을 사용합니다. 이처럼 차이점이 많아 예를 많이 들지 않겠습니다. 우리 웹사이트 방문자에게 더 나은 사용자 경험을 제공하기 위해 우리는 글로벌 솔루션을 제공해야 합니다. 사용자가 언어와 지역을 선택하면 사이트는 사용자의 언어 및 문화적 습관에 따라 페이지 정보를 표시합니다. 현지화.
2. 문화권, 고정 문화권, 비특정 문화권, 문화권별
문화권 이름은 RFC 1766 표준을 따르며 "<언어코드2>-<국가/지역 코드2>" 형식을 따릅니다. 여기서 <언어코드2>는 ISO 639-1에서 파생됩니다. 두 글자 소문자 코드, <country/regioncode2>는 ISO 3166에서 파생된 두 글자 대문자 코드입니다. 예를 들어 미국 영어는 "en-US"입니다. 2자리 언어 코드를 사용할 수 없는 경우 ISO 639-2에서 파생된 3자리 코드가 사용됩니다. 예를 들어 Dhivehi 언어가 사용되는 지역에는 3자리 코드 "div"가 사용됩니다. 일부 문화권 이름에는 쓰기 기호를 지정하는 접미사가 있습니다. 예를 들어 "-Cyrl"은 키릴 쓰기 기호를 지정하고 "-Latn"은 라틴어 쓰기 기호를 지정합니다. 예:
문화권 이름 | 문화권 식별자 | 언어 - 국가 |
zh-CN | 0x0804 | 중국어 - 중국 |
zh-TW | 0x0404 | 중국어 - 대만 |
zh-CHS | 0x0004 | 중국어 간체 |
zh-CHT | 0x |
7C |
04 | 중국어 | |
en | 0x0009 | 영어 |
en | - | US |
0x0409 | 영어 | - |
uz | - | UZ - Cyrl |
0x0843 | 우즈베크어(키릴 자모) - 우즈베키스탄 uz-UZ-Latn 0x0443 | 우즈베크 어(라틴어) - 우즈베키스탄 |
고정 문화권은 지원되지 않습니다. 문화에 민감합니다. 빈 문자열("")을 사용하여 이름 또는 문화권 식별자 0x007F로 고정 문화권을 지정할 수 있습니다. 고정 문화권 인스턴스는 CultureInfo 클래스의 InvariantCulture 속성으로 표현됩니다. 고정 문화는 국가가 아닌 영어에만 연결됩니다. 문화가 필요한 "세계화된" 네임스페이스의 거의 모든 방법에서 사용할 수 있습니다. 프로그램이 문자열 비교 또는 대소문자 변경 작업을 수행하는 경우 InvariantCulture를 사용하여 시스템에서 설정한 문화권에 관계없이 동작이 InvariantCulture로 표시되는 영어의 고정 문화권에 따라 수행되도록 해야 합니다. 그러나 고정 문화권은 문화권 독립적인 결과(예: 시스템 서비스)가 필요한 프로세스에서만 사용해야 합니다. 그렇지 않으면 얻은 결과가 언어적으로 올바르지 않거나 문화적으로 부적절할 수 있습니다. 예: CultureInfo Invc = 새 CultureInfo("");
CultureInfo Invc = CultureInfo.InvariantCulture; 이 두 줄의 코드는 동일한 효과를 가지며, 목적은 고정 문화권 인스턴스를 얻는 것입니다.
예를 들어 이제 DateTime 인스턴스 dateTime에서 dateTime.ToString() 메서드를 실행하려고 합니다. 이 메서드는 실제로 현재 스레드의 CurrentCulture를 기본 문화권으로 사용하고 이 문화권을 기반으로 날짜 인스턴스를 해당 문자열 형식으로 변환합니다. 따라서 현재 스레드 또는 시스템 문화권에 따라 ToString 작업을 수행하는 데 필요하지 않은 경우 dateTime.ToString("G", CultureInfo.InvariantCulture) 또는 dateTime.ToString("G" 메서드를 사용해야 합니다. , DateTimeFormatInfo.InvariantInfo) .
중립문화는 국가가 아닌 언어와 관련된 문화이다. 특정 문화는 특정 언어 및 특정 국가와 관련된 문화입니다. 예를 들어 "en"은 중립 문화권이고 "en-US"는 특정 문화권입니다. "zh-CHS"(중국어 간체) 및 "zh-CHT"(중국어 번체)는 문화 중립적입니다.
문화권에는 계층 구조가 있습니다. 즉, 특정 문화권의 부모는 비특정 문화권이고, 비특정 문화권의 부모는 InvariantCulture입니다. CultureInfo 클래스의 Parent 속성은 특정 문화권과 관련된 비특정 문화권을 반환합니다. 문화권별 리소스가 시스템에 없거나 사용할 수 없는 경우 문화권별 리소스가 아닌 경우 사용됩니다. 문화권별 리소스도 사용할 수 없으면 주 어셈블리에 포함된 리소스가 사용됩니다.
3. 지역화를 위한 공통 유형, 속성 및 메서드를 구현합니다.
CultureInfo 클래스는 문화 이름, 문자 체계, 사용된 달력을 포함하여 특정 문화에 대한 정보는 물론 날짜 및 형식 지정과 같은 일반적인 작업에 대한 정보를 나타냅니다. 문자열 정렬) 문화별 정보 개체에 대한 액세스를 제공합니다. 일반적으로 CultureInfo 클래스를 인스턴스화하는 방법에는 다음과 같은 두 가지가 있습니다.
CultureInfo 문화 = CultureInfo.CreateSpecificCulture(이름);
CultureInfoculture = new CultureInfo(name);
둘의 차이점은 첫 번째 방법을 사용하면 고정된 문화권 또는 특정 문화권의 CultureInfo 인스턴스만 만들 수 있다는 것입니다. name이 빈 문자열이면 고정 문화권 인스턴스가 만들어집니다. name이 비특정 문화권이면 name과 연결된 기본 문화권별 CultureInfo 인스턴스가 만들어집니다. 두 번째 방법은 이름으로 지정된 문화권의 CultureInfo 인스턴스를 만드는 것입니다. 이름은 고정되거나 특정적이지 않거나 문화별로 다를 수 있습니다.
Thread 클래스의 CurrentCulture 속성은 현재 스레드의 문화권을 가져오거나 설정하는 데 사용됩니다. 특정 문화권으로 설정되어야 합니다. Thread.CurrentThread.CurrentCulture = new CultureInfo("en-US"); Thread.CurrentThread.CurrentCulture = new CultureInfo("en "); 경우 오류가 보고됩니다.
Thread 클래스의 CurrentUICulture 속성은 런타임에 문화권별 리소스를 찾기 위해 리소스 관리자가 사용하는 현재 문화권을 가져오거나 설정하는 데 사용됩니다. 여기서 리소스 관리자는 ResourceManger 클래스와 연결될 수 있습니다.
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
ResourceManger 클래스는 문화권별 리소스를 찾고, 지역화된 리소스가 없을 때 대체 리소스를 제공하고, 리소스 직렬화를 지원할 수 있습니다. 일반적으로 사용되는 ResourceManager 생성자는 public ResourceManager(string, Assembly)입니다. 그 의미는 지정된 루트 이름을 사용하여 지정된 어셈블리에서 리소스 파일을 찾는 ResourceManager 클래스의 새 인스턴스를 초기화하는 것입니다. 소위 루트 이름은 예를 들어 "MyResource.en-US.resources"라는 리소스 파일의 루트 이름이 "MyResource"입니다. "MyWebSite.Resource.UserFolder.MyResource"와 같은 루트 이름 표현에 네임스페이스를 추가할 수 있습니다. 어셈블리는 typeof(MyPage).Assembly와 같이 리소스 파일을 호출해야 하는 페이지가 있는 어셈블리일 수 있습니다. ResourceManager 클래스의 GetString 메서드는 리소스 파일에서 지정된 키 값을 가져오는 데 사용됩니다. 예: 스레드의 CurrentUICulture 속성이 설정된 경우 다음 방법을 따르십시오.
ResourceManager rm = new ResourceManager("items", Assembly.GetExecutingAssembly());
String str = rm.GetString("welcome");
지정된 문화권에 따라 리소스를 얻으려면 다음과 같이 작성하십시오.
ResourceManager rm = new ResourceManager("items", Assembly.GetExecutingAssembly());
CultureInfo ci = Thread.CurrentThread.CurrentCulture;
String str = rm.GetString("환영합니다",ci);
둘. Asp.net1.1에서 리소스 지역화를 구현하려면
먼저 웹 사이트 프로젝트 WebTest에 Resource 폴더를 만들고 이 폴더에 전체 프로젝트에 공통된 리소스 파일을 저장해야 합니다. 예를 들어 MyResource.en.resx, MyResource.en-US.resx, MyResource.zh-CN.res라는 세 가지 리소스 파일을 만들었습니다. 각 리소스 파일에는 두 개의 키-값 쌍이 있으며, 키 값은 State와 Address입니다. 아래와 같이 리소스 파일을 사용해야 하는 MyPage.aspx 페이지에서 리소스 파일을 호출합니다.
Thread.CurrentThread.CurrentCulture= CultureInfo.CreateSpecificCulture("zh-CN");
Thread.CurrentThread.CurrentUICulture = 스레드.CurrentThread.CurrentCulture;
ResourceManager rm = new ResourceManager("WebTest.Resource.MyResource", typeof (MyPage).Assembly);
Label1.Text = rm.GetString("상태");
Label2.Text = rm.GetString("Address");
이때 Label1과 Label2는 MyResource.zh-CN.resx 파일의 규정에 따라 "상태"와 "주소"를 표시합니다. 위의 방법은 가장 기본적이고 간단한 현지화 방법입니다. 여기에는 몇 가지 문제가 숨겨져 있습니다. 이 방법을 하나씩 해결하고 최적화해 보겠습니다.
1. 사용자의 기본 문화권을 얻는 방법
은 사용자 브라우저의 "속성" -> "언어" 옵션 설정을 통해 이루어집니다.
CultureInfo CultureInfo = CultureInfo.CreateSpecificCulture(Request.UserLanguages[0]);
Thread.CurrentThread.CurrentCulture = 문화정보;
Thread.CurrentThread.CurrentUICulture =cultureInfo;
일반적으로 CurrentCulture와 CurrentUICulture는 동일한 문화권을 갖도록 설정됩니다. 물론 서로 다를 수도 있습니다. 예를 들어 CurrentCulture는 en-US이고 CurrentUICulture는 zh-CN입니다. 그 결과 페이지의 통화, 날짜 및 기타 정보가 미국 영어 형식으로 표시되고 리소스 관리자는 리소스 파일에서 가져와야 하는 콘텐츠를 MyResource.zh-CN.resx에서 가져옵니다. 파일.
사이트 페이지에서 사용자가 언어를 선택할 수 있는 기능을 제공하지 않는 경우 기본적으로 사용자 브라우저에 설정된 문화권에 따라 표시되므로 Global.asax의 Application_BeginRequest 메서드에 위 코드를 넣으면 됩니다. .cs 파일입니다. 이렇게 하면 사용자가 페이지를 요청할 때마다 프로그램이 먼저 문화를 설정합니다.
2. 사용자의 로케일 설정 기억
브라우저의 로케일 설정이나 선택 사항은 세션을 통해 기억될 수 있습니다. 그러나 이 작업은 해당 시점에 세션을 여전히 사용할 수 없기 때문에 Global.asax.cs 파일의 Application_BeginRequest 메서드에서 수행할 수 없습니다. 사이트에서 사용자가 언어를 선택하는 기능을 제공하지 않으면 사용자의 지역 설정을 기억할 필요가 없습니다. 위에서 설명한 대로 Global.asax.cs 파일의 Application_BeginRequest 메서드에서 설정하면 됩니다. 성능. 이는 주로 사용자가 중간에 브라우저의 언어 설정을 갑자기 변경하는 충돌을 방지하지만 웹 사이트는 세션에 저장된 문화권에 따라 여전히 사용자에게 페이지 콘텐츠를 표시합니다.
사용자가 언어를 선택하도록 하는 기능을 언급했다면 당연히 페이지 프로그램의 세션을 사용하여 사용자의 문화 선택을 기록해야 합니다. 클라이언트에서 서버 세그먼트로의 모든 요청 때문에 서버 세그먼트는 처리 및 응답을 위해 새로운 스레드를 엽니다. 프로그램이 고객의 선택을 기억하지 못하는 경우 기본 문화권으로만 응답합니다.
3. 리소스 관리자는 지정된 문화권에 해당하는 리소스 파일을 어떻게 찾나요?
값 연산을 수행할 때, 즉 ResourceManager 클래스의 GetString 메서드를 실행할 때 리소스 관리자는 현재 스레드의 CurrentUICulture 속성에 따라 해당 리소스 파일을 검색합니다. 몇 가지 상황이 있습니다:
(1) 예를 들어 현재 CurrentUICulture에 해당하는 문화권이 en-US인 경우 먼저 MyResource.en-US.resx가 있는지 확인하고, 존재하지 않으면 해당 값을 가져옵니다. MyResource.en.resx가 존재하는지 여부.
(2) 예를 들어 현재 CurrentUICulture에 해당하는 문화권은 en입니다. en은 비특정 문화권이므로 먼저 해당 문화권인 en-US의 리소스 파일 MyResource.en-US.resx가 있는지 확인합니다. 기본적으로 존재하는 경우, 존재하지 않는 경우 값을 가져오고 MyResource.en.resx가 존재하는지 확인하십시오.
(3) 예를 들어 현재 CurrentUICulture에 해당하는 문화권이 en-GB인 경우 먼저 MyResource.en-GB.resx 리소스 파일을 찾아서 MyResource.en.resx가 있는지 확인합니다. 존재하는 경우 값을 가져옵니다. 존재하지 않는 경우 en과 연결된 기본 특정 문화권 en-US의 리소스 파일 MyResource.en-US.resx가 존재하지 않는지 확인합니다. 현재는 있지만 MyResource.en-CA.resx가 존재하는 경우에도 프로그램은 적절한 리소스 파일을 찾을 수 없다는 예외를 발생시킵니다.
따라서 현재 스레드 CurrentUICulture가 특정 문화권에 해당하는 경우 리소스 관리자는 먼저 이 특정 문화권에 해당하는 리소스 파일을 검색합니다. 해당 리소스 파일이 없으면 해당 비문화권 리소스 파일을 찾습니다. 아직 검색되지 않았습니다. 그런 다음 비문화권 관련 연결과 연결된 기본 문화권의 리소스 파일을 찾습니다. 현재 스레드의 CurrentUICulture가 비특정 문화권에 해당하는 경우 리소스 관리자는 먼저 비특정 문화권에 해당하는 기본 문화권별 리소스 파일이 있는지 확인합니다. 존재하지 않으면 비특정 문화권에 해당하는 리소스 파일이 있는지 확인합니다. - 특정 문화권이 존재하며 존재하지 않는 경우에도 예외가 발생합니다.
4. 현지화 지원을 제공하지 않는 문화는 어떻게 처리하나요?
사이트에서 사용자의 기본 문화권을 지원하는 해당 리소스 파일을 제공하지 않는 경우 현재 스레드의 CurrentUICulture를 en-US 또는 zh-CN과 같은 사이트의 기본 문화권으로 변환해야 합니다. 전환에는 두 가지 기회가 있습니다.
하나는 Request.UserLanguages[0]을 얻을 때 구성 파일에 있는 지원되는 문화권 사전 설정과 비교하는 것입니다. 지원되지 않는 것으로 확인되면 즉시 CurrentUICulture를 기본 문화권으로 설정합니다.
두 번째는 ResourceManager의 GetString 메서드를 사용하여 값을 가져올 때 Try catch 구조를 사용하여 MissingManifestResourceException 예외를 캡처하는 것입니다. 예외 처리에서 먼저 CurrentUICulture를 기본 문화권으로 설정한 다음 GetString을 사용하여 값을 다시 가져옵니다.
<globalization requestEncoding="utf-8" responseEncoding="utf-8" uiCulture="zh-CN"culture="en-US"/>를
통해 사이트의 기본 문화권과 uiCulture를 설정합니다.
위에 표시된 대로 사이트의 기본 문화권은 en-US(여기서는 특정 문화권이어야 함)이고 uiCulture는 zh-CN으로 지정되어 있습니다.
물론 각 페이지의 페이지 태그에서 페이지별로 설정할 수도 있습니다: <@Page Culture="zh-CN" UICulture="en">. 여기서 web.config가 어떻게 설정되어 있는지에 관계없이 페이지 태그의 설정에 따라 페이지가 표시됩니다.
삼. Asp.net2.0에서 리소스 지역화 구현
Asp.net2.0은 리소스 지역화를 위한 보다 다양한 구현 방법을 제공합니다. 여기서는 Asp.net1.1과의 차이점에 중점을 두겠습니다.
1. Web.config를 통해 사이트의 기본 문화권과 uiCulture를 설정하는 방법은
이미 Asp.net1.1에서 web.config 파일을 사용하여 사이트의 문화권을 설정하는 방법에 대해 설명했지만 Asp.net2.0에서는 더 유연합니다. 일반적으로 사이트의 모든 페이지가 동일한 문화를 따르기를 원할 것입니다. 아래와 같이 web.config에 있는 세계화 요소의 UICulture 및 Culture(culture) 속성에 사이트 전체 "auto" 값을 할당하면 됩니다. 이 "auto" 값은 Asp.net1.1에서 허용되지 않습니다. <globalization uiCulture="auto"culture="auto" /> auto의 의미는 ASP.NET이 브라우저에서 보낸 HTTP 헤더를 확인하여 사용자가 선호하는 문화권 설정을 얻고, 이 문화권을 사용하여 해당 문화권의 기본 문화권을 설정한다는 것입니다. 즉, 현재 스레드의 CurrentUICulture 및 CurrentCulture 속성입니다.
자동 설정 외에도 Asp.net에 대한 사이트의 기본 문화권을 지정할 수도 있습니다. <globalization uiCulture="auto:zh-CN"culture="auto:zh-CN" /> 참고: 이는 ASP인 경우에만 가능합니다. NET에서는 사용자가 선호하는 문화권을 결정하기 위해 HTTP 헤더를 찾을 수 없습니다. 예를 들어 브라우저의 "속성" -> "언어"에 문화권 설정이 없고 완전히 비어 있는 경우 자동 뒤에 설정된 기본 문화권이 적용됩니다.
web.config에서 세계화가 구성된 후에는 애플리케이션에서 코드를 작성할 필요가 없습니다. 스레드의 CurrentUICulture 및 CurrentCulture는 세계화 요소에 설정된 uiCulture 및 문화 속성 값에 따라 문화권 설정을 가져옵니다. 세계화가 구성되지 않은 경우 스레드의 CurrentUICulture 및 CurrentCulture는 기본적으로 en-US로 설정됩니다.
2. Web.config 파일을 사용하여 사용자의 지역 선택을 추적합니다.
Asp.net1.1에서 지역 선택을 제공하는 사이트는 일반적으로 사용자가 사이트에 요청할 때마다 세션을 사용하여 사용자의 선택을 기록합니다. 표시 콘텐츠는 사용자가 선택한 문화에 따라 현지화됩니다. Asp.net2.0에서 제공되는 또 다른 방법은 web.config 파일을 사용하여 사용자의 문화 선택을 추적하는 것입니다.
web.config 파일에 LanguagePreference라는 문자열 기반 프로필 속성을 추가하여 사용자 문화의 익명 식별을 지원할 수 있습니다. anonymousIdentification 요소의 활성화된 속성은 "true"여야 합니다. 그렇지 않으면 익명 식별 기능을 사용할 수 없습니다.
<anonymousIdentification 활성화="true"/>
<프로필>
<속성>
<add name="LanguagePreference" type="string" defaultValue="auto" allowedAnonymous="true" />
</속성>
</profile>
아래에서는 Asp.net2.0에서 LanguagePreference 특성을 프로그래밍하는 방법을 설명합니다. 먼저 System.Web.UI.Page에서 상속되고 사이트의 모든 페이지 클래스에 대한 기본 클래스 역할을 하는 PageBase 클래스를 작성할 수 있습니다. 이것의 목적은 실제로 매우 간단합니다. 즉, 각 페이지에서 몇 가지 공통 처리 프로세스를 추출하여 기본 클래스에 넣어 코드 중복을 줄이고 유지 관리성을 향상시키는 것입니다. 그런 다음 PageBase 클래스에 다음 코드를 작성합니다. protected override void InitializeCulture()
{
base.InitializeCulture();
string LanguagePreference = ((ProfileCommon)this.Context.Profile).LanguagePreference;
//사용자가 이 사이트를 처음 방문하고 Profile.LanguagePreference가 비어 있는 경우 사용자 브라우저의 언어 설정을 식별합니다.
if(string.IsNullOrEmpty(LanguagePreference))
{
if (this.Context.Request.UserLanguages != null)
{
LanguagePreference = this.Context.Request.UserLanguages[0];
((ProfileCommon)Context.Profile).LanguagePreference = LanguagePreference;
}
}
또 다른
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo(LanguagePreference);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(LanguagePreference);
}
}
Asp.net2.0에는 System.Web.UI.Page 클래스의 InitializeCulture 메서드가 새로 추가되었습니다. 현재 스레드에 대한 Culture 및 UICulture를 설정합니다. 페이지 수명 주기는 페이지의 Init 및 Load 전에 InitializeCulture 메서드가 실행되도록 설계되었습니다. 위 코드에서 먼저 ((ProfileCommon)this.Context.Profile).LanguagePreference를 사용하여 현재 LanguagePreference 프로필 속성의 값을 가져오고 비어 있는지, 즉 사용자에 대해 문화 설정이 저장되었는지 확인합니다. . 비어 있는 경우 사용자가 선호하는 문화권은 Http 헤더에서 가져오고 ((ProfileCommon)Context.Profile).LanguagePreference = LanguagePreference;를 통해 저장됩니다. 비어 있지 않으면 사용자의 문화권 설정이 저장되었음을 의미하며, 이 문화권을 사용하여 현재 스레드의 CurrentUICulture 및 CurrentCulture 속성을 설정합니다.
<globalization uiCulture="auto"culture="auto" />가 Web.config에 정의된 경우 위 코드는 다음과 같이 단순화될 수 있습니다. protected override void InitializeCulture()
{
base.InitializeCulture();
string LanguagePreference = ((ProfileCommon)this.Context.Profile).LanguagePreference;
if(!string.IsNullOrEmpty(LanguagePreference))
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo(LanguagePreference);
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture(LanguagePreference);
}
또 다른
{
((ProfileCommon)Context.Profile).LanguagePreference = Thread.CurrentThread.CurrentCulture.Name;
}
}
사이트가 사이트의 마스터 페이지에 언어 선택 목록을 배치하는 등 사용자가 문화를 선택할 수 있는 기능을 제공하는 경우 다음 명령문을 통해 사용자가 선택한 문화를 기억할 수 있습니다.
protected void lstLanguage_SelectedIndexChanged(개체 전송자,EventArgs e)
{
if (lstLanguage.SelectedValue != "Auto") //기본 옵션은 Auto입니다.
{
Profile.LanguagePreference = lstLanguage.SelectedValue;
}
또 다른
{
Profile.LanguagePreference = null;
}
Response.Redirect(Request.Url.AbsolutePath);
}
이벤트 처리 코드는 Page_Load 이후에 실행되므로 Response.Redirect(Request.Url.AbsolutePath); 코드 줄에 주의하세요. 페이지를 빠르게 변경하려면 리디렉션 작업을 수행해야 합니다.
Asp.net2.0의
사이트에 글로벌 리소스 파일을 생성할 때
VS.Net2005는 글로벌 리소스 파일을 저장하기 위해 특별히 App_GlobalResources 폴더를 자동으로 생성합니다.소위 글로벌 리소스 파일은 사이트의 여러 페이지 파일이나 마스터 페이지에서 사용되는 리소스 파일입니다. MyResource.resx 및 MyResource.zh-cn.resx라는 파일을 생성한다고 가정합니다. 프로그램에서 다음 코드를 사용하여 리소스 파일의 값을 얻을 수 있습니다. this.lblCountry.Text = Resources.MyResource.Country;
여기서 Country는 리소스 파일의 키입니다. 분명히 이는 Asp.net 1.1의 리소스 파일에서 값을 가져오는 것보다 훨씬 쉽습니다.
여기서 주목해야 할 두 가지 문제가 있습니다. 첫째, 동일한 루트 이름을 가진 리소스 파일 그룹을 생성할 때 문화권 식별이 없는 파일(예: MyResource.resx 및 MyResource.en-gb)을 생성해야 합니다. zh-cn.resx는 필요에 따라 생성됩니다. MyResource.resx가 생성되지 않고 MyResource.zh-cn.resx만 생성된 경우 위 코드의 Resources 네임스페이스 아래에 MyResource가 표시되지 않으므로 위 코드의 컴파일을 통과할 수 없습니다. MyResource.resx는 현재 스레드의 CurrentUICulture와 일치하는 지역화된 리소스 파일을 찾을 수 없거나 지역화된 리소스 파일에서 해당 키 값을 찾을 수 없는 경우 사이트의 기본 언어 콘텐츠를 저장해야 합니다. Asp.net은 MyResource.resx 파일의 키를 기반으로 합니다. 국가 키가 MyResource.resx에 없지만 국가 키가 MyResource.zh-cn.resx에 있는 경우 위 코드도 오류를 보고합니다. 컴파일할 때. 둘째, Asp.net은 해당 영역에서 지역화된 리소스를 찾을 수 없는 경우 예외를 보고하지 않습니다. MyResource.resx 파일에서 자동으로 값을 가져오지만 현재 스레드의 CurrentUICulture는 변경되지 않습니다.
사이트에서 로컬 리소스 파일을 생성할 때 VS.Net2005는 로컬 리소스 파일을 저장하기 위해 특별히 App_LocalResources 폴더를 자동으로 생성합니다. 소위 로컬 리소스 파일은 사이트의 단일 페이지 파일에 사용되는 리소스 파일입니다. 이름 지정 방법은 일반적으로 Default.aspx.resx 및 Default.aspx.zh-cn.resx입니다. 이제 기본 리소스 파일에 Language, lblNavigation.Text 및 lblNavigation.ForeColor라는 세 가지 키를 추가합니다. 그 중 Default.aspx.resx의 lblNavigation.ForeColor는 파란색으로, Default.aspx.zh-cn.resx의 lblNavigation.ForeColor는 빨간색으로 설정했습니다. 페이지 파일의 Default.aspx에 있는 로컬 리소스 파일에서 콘텐츠를 가져오는 방법에는 두 가지가 있습니다.
(1) <asp:Label ID="lblLanguage" runat="server" Text="<%$ Resources:Language %>"></asp:Label>
(2) <asp:Label ID="lblNavigaion" runat="server" Meta:resourcekey="lblNavigation"></asp:Label>
첫 번째 방법을 사용할 때는 $ 기호를 주의해서 사용하세요. 두 번째 방법을 사용하는 것이 더 유연하며 컨트롤의 여러 속성에 대한 값을 한 번에 설정할 수 있습니다.
여기서는 여전히 주목해야 할 문제가 있습니다. 페이지의 기본 로컬 리소스 파일을 생성해야 합니다(예: Default.aspx.resx가 필요하고 Default.aspx.zh-cn.resx가 필요함). 기본 로컬 리소스 파일을 생성하지 않고 페이지에서 로컬 리소스 파일을 사용하는 경우 첫 번째 바인딩 방법을 사용하면 컴파일 오류가 발생하고 두 번째 바인딩 방법을 사용하면 컴파일 오류가 발생하지 않습니다. 오류가 발생하지만 이러한 속성의 설정은 마치 기록되지 않은 것처럼 아무런 효과가 없습니다.
4. 지역화된 이미지 표시
지역화된 이미지를 표시하는 것도 Asp.net2.0의 새로운 기능입니다. Asp.net2.0에서는 리소스 파일이 문자열 유형의 키-값 쌍 조합으로 제한되지 않고 여러 유형의 파일을 저장할 수 있습니다. 이 기능을 사용하여 이미지를 현지화합니다. 실제로 소위 지역화된 이미지는 서로 다른 지역에 맞게 준비된 이미지를 서로 다른 지역화된 리소스 파일에 배치하는 것에 지나지 않습니다. 예를 들어 LitwareSlogan.jpg를 MyResource.resx에 넣고 LitwareSlogan.cn.jpg를 MyResource.zh-cn.resx에 넣습니다.
다양한 지역화된 버전의 전역 리소스 파일에 지역화된 버전의 이미지 파일이 포함되어 있는 경우 MyLocalImage.ashx라는 핸들러 파일을 사용자 정의하여 사용자의 언어 기본 설정에 따라 조건부로 로드할 수 있습니다. 코드는 다음과 같습니다.
페이지의 호출 방법:
<asp:Image ID="Image1" runat="server" ImageUrl="~/ MyLocalImage.ashx" />
MyLocalImage.ashx 핸들러 작성 방법:
공용 클래스 MyLocalImage: IHttpHandler
{
공개 무효 ProcessRequest(HttpContext 컨텍스트)
{
context.Response.ContentType = "이미지/png";
string LanaguageReference = ((ProfileCommon)context.Profile).LanguagePreference;
if (!string.IsNullOrEmpty(LanaguageReference))
{
Thread.CurrentThread.CurrentUICulture = new CultureInfo(LanaguageReference);
}
비트맵 bm = Resources.Litware.LitwareSlogan;
MemoryStream 이미지 = new MemoryStream();
bm.Save(image,ImageFormat.Png);
context.Response.BinaryWrite(image.GetBuffer());
}
}
MyLocalImage.ashx에 정의된 사용자 정의 처리기 클래스는 이전에 사용자 정의 InitializeCulture 메서드에서 본 것과 유사한 논리를 사용하여 전역 리소스 파일에서 이미지 파일을 검색하기 전에 현재 스레드에 대한 CurrentUICulture 설정을 초기화합니다. 현재 스레드의 CurrentUICulture가 페이지의 기본 클래스에 설정되어 있고 여기에서 재설정되어야 하는 이유가 궁금할 수 있습니다. 이는 여기의 스레드가 기본 클래스에서 처리되는 스레드와 동일하지 않기 때문입니다. 사용자 지정 처리기는 CurrentUICulture 설정을 올바르게 초기화한 후 강력한 형식의 MyResource.resx 리소스 클래스를 통해 이미지 파일에 액세스할 수 있습니다. 그런 다음 이미지 파일의 비트를 HTTP 응답 스트림에 쓰기만 하면 됩니다.