Michele Leroux Bustamante 적용 대상: 요약: 갈수록 많은 회사들이 사업을 위해 외국으로 진출함에 따라, Microsoft ASP.NET을 통해 전 세계에서 사용할 수 있는 웹 응용 프로그램을 만드는 작업의 중요성이 증가하고 있습니다. ASP.NET 1.1은 ResourceManager 클래스를 통해 지역화된 웹 사이트를 만드는 작업을 지원했습니다. ASP.NET 2.0을 사용하면 다양한 culture 및 로캘을 지원하는 응용 프로그램을 손쉽게 만들 수 있습니다. 목차.NET 1.x를 사용한 지역화 10년 전에 인터넷이 시작된 이후로 비즈니스 커뮤니티는 국제 시장으로 진출하고 있습니다. 이미 대부분의 기업이 전 세계를 대상으로 하는 회사 웹 사이트를 제공하고 있을 뿐만 아니라, 궁극적으로 전 세계 고객에게 서비스를 제공할 수 있는 엔터프라이즈 웹 응용 프로그램을 호스팅하거나 라이센스를 제공하는 기업이 점차 늘어나고 있습니다. 대부분의 클라이언트는 자신의 문화적 환경 내에서 자국어를 사용하여 비즈니스를 수행하고자 하므로, 이러한 웹 사이트 및 응용 프로그램의 지역화를 준비하는 것은 필수적입니다. 물론 이 작업에는 배포 모델(스마트 클라이언트, 웹 사이트 및 응용 프로그램, 웹 서비스 등)에 관계없이 계획과 노력이 필요합니다. 특히 아키텍처 및 디자인 측면에서 더욱 그러합니다. 효율적인 배포 도구를 사용하면 보다 뛰어난 아키텍처를 구축할 수 있지만 이상하게도 웹 응용 프로그램 지역화 도구 분야는 아직 큰 발전을 보이지 못하고 있습니다. 그 결과, 대부분의 기업에서는 시간과 비용이 매우 많이 드는 구식의 번거로운 방식으로 지역화를 수행하고 있습니다. Microsoft ASP.NET 2.0의 출시와 함께 웹 개발자는 보다 뛰어난 방식으로 지역화를 수행할 수 있게 되었습니다. Microsoft Visual Studio .NET 환경에서 기본 제공되는 보다 다양한 도구, 새 런타임 기능 및 지역화 요구 사항에 맞춘 풍부한 새 프로그래밍 API를 사용하면 개발자는 ASP.NET 페이지에서 지역화 가능한 콘텐츠를 빠르게 구분할 수 있으므로 지역화 콘텐츠에 접근하는 데 필요한 코딩 작업을 줄일 수 있고 추가 요구 사항을 충족하도록 환경을 확장하는 동시에 일관성 있는 프로그래밍 모델을 활용할 수 있습니다. 이 백서에서는 응용 프로그램의 지역화를 준비하기 위한 이와 같은 새롭고 향상된 ASP.NET 개발 환경에 대해 살펴봅니다. .NET 1.x를 사용한 지역화.NET Framework 1.x는 새 위성 어셈블리(리소스 전용 어셈블리)를 사용하여 기존 작업을 방해하지 않는 증분식 culture 지원 배포를 지원하는 새 지역화용 아키텍처를 도입했습니다. 이러한 허브 앤 스포크(hub-and-spoke) 배포 패러다임은 개발자가 공용 언어 런타임을 사용하여 ResourceManager 클래스를 통해 지역화된 콘텐츠의 정확한 선택을 관리할 수 있게 합니다. ResourceManager의 여러 이점 중 하나는 캡슐화된 리소스 대체 메커니즘과 상호 작용하여 응용 프로그램의 런타임 culture 설정을 기반으로 하는 "가장 적합한" culture를 찾는다는 점입니다. 따라서 개발자는 지역화된 콘텐츠를 검색하기 위해 각 ResourceSet를 로드하는 프로세스를 관리하는 코드를 작성할 필요가 없습니다. 리소스를 Windows 또는 웹 응용 프로그램에서 소비할 수 있지만, Visual Studio 2003은 특히 Windows 개발자가 Windows Forms를 간편하게 지역화할 수 있도록 합니다. 폼의 Localizable 속성이 true로 설정되면 지역화할 수 있는 form 및 control 속성에 대해 리소스가 자동으로 생성됩니다. 속성 값은 이후의 변환을 위해 기본 리소스로 전달되며 ResourceManager 클래스 인스턴스를 사용하여 이러한 리소스에서 런타임에 컨트롤을 채우기 위해 코드가 생성됩니다. ResourceManager는 실행 스레드에 대한 CurrentUICulture 설정을 인식하고 해당 culture와 일치하는 ResourceSet의 리소스를 찾습니다. 이러한 리소스가 없는 경우에는 리소스 대체 프로세스를 사용합니다. 참고 리소스 대체 프로세스에 대한 자세한 내용은 여기를 참조하십시오. 또한 .NET Framework에는 많은 culture 인식 클래스가 포함되어 있습니다. 이러한 클래스는 서식 지정된 날짜, 시간 및 통화 값 등의 출력을 생성할 때 CurrentUICulture를 인식하므로 개발자들이 수행해야 하는 지루한 작업을 줄여 줍니다. 참고 culture 인식 클래스에 대한 자세한 내용은 이 MSDN 참조를 참조하십시오. 위성 어셈블리, 리소스 관리자 및 culture 인식 클래스의 배포 모델을 ASP.NET 응용 프로그램에도 적용할 수 있지만 이 모델을 Web Forms의 프로그래밍 패러다임에 통합하기 위한 개발자 도구가 없습니다. 현재는 웹 페이지에 대한 리소스 항목을 생성하거나, 이러한 리소스를 런타임에 액세스하거나, 각 요청에 대한 올바른 culture를 설정하는 작업을 수동으로 수행해야 합니다. 따라서 리소스는 웹 응용 프로그램 지역화의 필수적인 부분으로 널리 인식되지는 않습니다. 일반적으로 웹 콘텐츠를 지역화하는 작업에는 특정 culture를 위한 전체 사이트 복제, 기존의 정적 콘텐츠 지역화, 지역화된 데이터 원본 검색을 관리하는 공유 코드 베이스를 위한 사용자 지정 코드 작성 등이 포함되었습니다. ASP.NET 2.0에서는 이러한 방식이 크게 향상되었습니다. 참고 ASP.NET 1.1의 지역화를 위한 아키텍처 접근 방식에 대한 자세한 내용은 다음 MSDN 기사를 참조하십시오. 새로운 ASP.NET 2.0 지역화 기능 소개ASP.NET 2.0은 .NET 1.x 지역화 기능을 기반으로 빌드되었으며, 특히 웹 개발자가 사용할 수 있는 워크플로와 기능이 향상되었습니다. 다음은 차세대 지역화 지원을 실현하기 위한 디자인 목표를 요약한 것입니다.
Visual Studio 2005 및 ASP.NET 2.0에 포함된 새로운 기능은 지역화할 수 있는 콘텐츠를 웹 페이지에서 추출할 수 있는 도구, 상태 비저장 요청 모델을 보완하는 리소스 소비에 대한 더욱 통합된 런타임 지원, 리소스를 페이지 출력에 바인딩하기 위한 최신의 선언적 구문, 왕복(round-trip)에 대해 culture 선택을 자동화하는 새로운 방법 등을 제공하여 웹 응용 프로그램 지역화를 단순화합니다. 특히 다음 기능이 이러한 목표를 지원합니다. 엄격한 형식의 리소스-.NET Framework 2.0 릴리스의 핵심은 개발자에게 Intellisense를 제공하는 엄격한 형식의 리소스를 지원함으로써 런타임에 리소스에 액세스하는 데 필요한 코드를 단순화한다는 점입니다. 관리 리소스 편집기-Visual Studio .NET 2.0에는 리소스 항목(문자열, 이미지, 외부 파일 및 기타 복합 형식 포함) 작성 및 관리 작업을 보다 효율적으로 지원하는 새로운 리소스 편집기가 포함되어 있습니다. Web Forms용 리소스 생성-Windows Forms 개발자는 이미 자동 국제화의 이점을 경험했습니다. Visual Studio 2005는 이제 Web Forms, 사용자 컨트롤 및 마스터 페이지에 대한 리소스를 자동으로 생성하여 신속한 국제화를 지원합니다. 향상된 런타임 지원-액세스가 보다 쉬워진 프로그래밍 인터페이스를 통해 ResourceManager 인스턴스를 런타임에 관리하고 서버 코드에 간편하게 액세스할 수 있습니다. 지역화 식-웹 페이지를 위한 최신 선언적 식은 컨트롤 속성, HTML 속성 또는 정적 콘텐츠 영역에 대한 리소스 항목 매핑을 지원합니다. 또한 이러한 식은 확장 가능하므로 지역화된 콘텐츠를 HTML 출력에 추가하는 프로세스를 제어하는 추가적인 방법을 제공합니다. 자동 Culture 선택-각 웹 요청에 대한 culture 선택을 관리하는 작업을 브라우저 기본 설정에 자동으로 연결할 수 있습니다. 리소스 공급자 모델-새로운 리소스 공급자 모델을 사용하면 개발자는 플랫 파일 및 데이터베이스 테이블과 같은 대체 데이터 원본의 리소스를 호스팅하면서 이러한 리소스에 액세스하기 위한 프로그래밍 모델의 일관성을 유지할 수 있습니다. 이러한 기능은 매우 유연하므로 안정적이고 효과적인 생산성 지향 솔루션이 필요한 소규모 기업에 대한 즉각적인(out-of-the-box) 지원을 제공하는 동시에, 향상된 확장성을 통해 많은 수의 배포 아키텍처에 대한 대기업의 복잡한 요구 또한 지원합니다. 이러한 새 모델의 핵심은 웹의 개발 주기 및 런타임 요구 사항을 추가로 고려하면서 Windows Forms 프로그래밍 모델에 맞도록 웹 응용 프로그램의 리소스를 활용하는 향상된 방식을 제공한다는 점입니다. 다음 절에서는 베타 1에서 구현되는 이러한 새 기능에 대해 자세하게 설명하고 베타 2에서 예상되는 혁신적인 변화에 대해 언급합니다. 로컬 리소스 생성.NET 리소스는 특정 언어 및 문화권의 콘텐츠를 선택적으로 대체함으로써 동일한 코드 베이스가 여러 culture를 지원할 수 있도록 합니다. 그러나 웹 페이지용 리소스를 생성하려면 많은 수동 작업이 필요했기 때문에 개발자가 웹 응용 프로그램에 대해 이 방법을 선택할 만한 이유가 거의 없었습니다. ASP.NET 2.0은 HTML 요소 및 특성, 정적 콘텐츠, 서버 컨트롤 등을 비롯한 복잡한 콘텐츠 에이전트를 지원하는 동시에 웹 페이지용 리소스를 자동으로 생성하는 간단한 방법을 제공합니다. 특정 Web Form에 대한 리소스를 생성하려면 Visual Studio 2005의 도구 메뉴에서 로컬 리소스 생성을 선택합니다. 디자인 보기에서 열려 있는 모든 페이지(Web Forms, 사용자 컨트롤 및 마스터 페이지 포함)에 대해 로컬 리소스를 만들 수 있습니다. 이 단계에서는 자동으로 페이지에 대한 기본 .NET XML 리소스(.resx) 집합이 생성되며, 이러한 리소스 집합은 현재 이름이 \LocalResources인 로컬 리소스 전용 하위 디렉터리에 배치됩니다. 이 디렉터리 이름은 베타 2에서 변경될 예정입니다. 그림 1. Visual Studio .NET 2.0 내에서 Web Forms, 사용자 컨트롤 및 마스터 페이지를 모두 국제화할 수 있습니다. 이 특정 보기는 여러 페이지에 대해 생성된 기본 리소스를 보여 줍니다. 로컬 리소스는 .resx 파일에 저장되며 해당 .resx 파일의 이름은 리소스가 서비스하는 페이지의 이름에 따라 지정됩니다(그림 1 참조). 예를 들어, site.master라는 마스터 페이지에 대한 리소스를 생성하면 site.master.resx라는 새 .resx 파일이 \LocalResources에 나타납니다. default.aspx라는 Web Form의 경우 생성된 리소스의 이름은 default.aspx.resx입니다. Visual Studio 디자이너는 페이지와 해당 컨트롤(runat="server"가 있는 ASP.NET 서버 컨트롤, 사용자 지정 컨트롤 및 HTML 컨트롤)을 조사하여 이러한 리소스를 채웁니다. 즉, 다음 코드와 같이 LocalizableAttribute로 표시된 속성을 확인하는 것입니다. [Localizable(true)] public virtual string Text { get {...} set {...} } 각 컨트롤에 대한 지역화할 수 있는 속성은 자동으로 리소스에 전달되며 각 속성은 고유한 키로 식별됩니다. 이 키는 페이지 컨트롤과 속성 이름을 식별하는 접두사를 포함합니다. 각 속성 값은 컨트롤 선언 내에서 지정되지 않은 경우 컨트롤의 기본값으로 설정됩니다. 다음 LinkButton 선언은 PostBackUrl 및 Text 속성 값을 해당 선언 내에서 지정합니다. <asp:LinkButton id=lnkSelectCulture PostBackUrl="selectculture.aspx" runat="server">Change Selected Culture</asp:LinkButton> 그림 2는 해당 호스트 페이지에 대한 로컬 리소스가 생성된 후 이 LinkButton에 대해 생성된 리소스를 보여 줍니다(샘플 프로젝트에서 cultureinfo.ascx 참조). 기본적으로 리소스는 리소스 파일에 저장되며(cultureinfo.ascx.resx 참조) PostBackUrl과 같은 지역화할 수 없는 속성은 제외됩니다. 그림 2. 서버에서 실행되는(runat="server") ASP.NET 서버 컨트롤, 사용자 지정 서버 컨트롤 및 HTML 컨트롤에 대한 지역화할 수 있는 속성을 기반으로 하여 로컬 리소스가 생성됩니다. 리소스가 생성되면 속성을 리소스 항목에 선언적으로 연결하기 위해 컨트롤 선언도 수정됩니다. 여러 새 선언적 식은 페이지 파서에 의해 인식되며 런타임에 컨트롤 속성을 리소스 값으로 채우기 위해 코드 생성을 트리거합니다. 선언적 지역화 식은 ASP.NET 2.0의 새 구문이며 데이터 바인딩 문과 비슷하지만 리소스 액세스용으로 특별하게 디자인되었습니다. 이러한 식은 두 가지 형태, 즉 암시적 및 명시적으로 제공됩니다. 암시적 식은 로컬 리소스가 생성될 때 자동으로 삽입되며 단일 선언에서 컨트롤 속성 집합에 대한 여러 리소스 항목 매핑을 지원합니다. 명시적 식은 페이지 지역화를 추가로 제어하기 위해 개발자가 추가할 수 있는 선언입니다. meta:resourcekey에 의해 식별되는 다음 암시적 식은 앞의 LinkButton 선언을 위해 생성되었으며 지금은 이 컨트롤에 대한 리소스 키 접두사를 지정합니다. <asp:LinkButton id=lnkSelectCulture PostBackUrl="selectculture.aspx" runat="server" meta:resourcekey="LinkButtonResource1"> Change Selected Culture</asp:LinkButton> 이 접두사를 사용하는 컨트롤 속성의 리소스 항목은 런타임에 해당 컨트롤 속성에 자동으로 매핑됩니다. 컨트롤 선언의 각 속성 값(리소스에 전달되는 값 포함)은 변경되지 않고 그대로 유지됩니다. 페이지 내의 컨트롤에 대한 컨텍스트를 제공하기 위해 이러한 기본값은 디자인 보기에서 표시됩니다. 페이지가 구문 분석될 때 리소스를 컨트롤 속성에 적용하는 코드를 생성하기 위해 지역화 식이 사용됩니다. 개발자는 런타임에 이러한 로컬 리소스에 액세스하기 위해 ResourceManager를 인스턴스화하는 코드를 작성할 필요가 없습니다. 런타임에 리소스 값은 우선 순위를 가지지만 리소스가 없는 경우 기본값이 표시됩니다. 이는 전체 사이트를 배포하지 않아도 콘텐츠가 포함된 페이지를 볼 수 있다는 점에서 웹 디자이너에게 매우 유용합니다. 속성 창에 표시되는 지역화된 속성은 리소스에서 가져온 해당 값을 나타내는 특수한 아이콘으로 표시됩니다. 그림 3은 일부 속성은 ASP.NET 공유 리소스에 바인딩되고(파란색으로 표시됨) 다른 속성은 로컬 리소스에 바인딩되는(빨간색으로 표시됨) ASP.NET ImageButton 컨트롤을 보여 줍니다. 식을 통한 속성 바인딩에 대한 자세한 내용은 이후의 절에서 다룹니다. 그림 3. 속성 창 보기에 표시된 특수한 아이콘을 통해 지역화된 속성을 쉽게 찾을 수 있습니다. 지금까지는 지역화할 수 있는 컨트롤 속성에 대한 암시적 지역화 식과 리소스를 기본적으로 생성하는 로컬 리소스 생성을 중심으로 설명했습니다. 속성을 공유 응용 프로그램 리소스에 바인딩하는 것도 여기에 포함됩니다. 그 외에도 지역화할 수 없는 컨트롤 속성, 다른 HTML 요소 및 정적 콘텐츠에 대한 로컬 리소스 생성을 자동화할 수 있습니다. 이렇게 하려면 명시적 지역화 식을 이러한 페이지 및 컨트롤 요소에 적용하면 됩니다. 다시 말해서, 개발자는 지역화해야 하는 추가 콘텐츠를 선언적으로 지정함으로써 해당 콘텐츠를 페이지에 대한 리소스 생성에 포함하거나 선택적으로 대체 원본에서 가져올 수 있습니다. 공유 응용 프로그램 리소스각 페이지의 로컬 리소스가 자동 생성되면 항목이 중복되고 변환 작업을 반복해서 수행해야 할 수 있습니다. 다행스럽게도 ASP.NET 2.0에는 마스터 페이지와 사용자 컨트롤이 포함된 내부 재사용 모델이 있으므로 머리글, 메뉴, 세로 막대 및 다른 HTML 섹션을 Web Forms에서 공유할 수 있습니다. 각 마스터 페이지, 사용자 컨트롤 및 Web Form은 고유한 로컬 리소스 집합을 소유하므로 리소스 중복이 줄어듭니다. 그러나 용어집 항목과 같은 리소스 항목, 오류 메시지, 방향 특성과 같은 기능 드라이버 등은 모든 페이지에서 통합 및 공유하는 것이 유용할 수 있습니다. 디자이너를 통해 각 페이지에 대한 로컬 리소스가 자동으로 생성되지만 공유된 응용 프로그램 리소스는 수동으로 작성됩니다. 이는 새 응용 프로그램 리소스(.resx)를 솔루션에 추가하고 현재 이름이 \Resource인 공유 리소스 전용 디렉터리(이 디렉터리 이름은 베타 2에서 변경될 예정임)에 배치함을 의미합니다. 이것은 1.x 응용 프로그램에 대한 공유 리소스를 생성하는 방법과 동일하지만, 새 리소스 편집기는 리소스 항목을 작성 및 편집하는 작업을 단순화하며 공유 리소스는 Intellisense 지원과 함께 엄격한 형식이 지정됩니다. 또한 공유 리소스는 ASP.NET 2.0의 새로운 페이지 구문 분석 및 런타임 모델에 참여합니다. 명시적 지역화 식을 사용하여 공유 리소스를 페이지에 바인딩할 수 있으며 ResourceManager가 자동으로 인스턴스화 및 캐시되므로 개발자는 런타임에 리소스에 액세스하기 위해 이 수명 주기를 관리할 필요가 없습니다. Visual Studio 2005에는 그림 2와 그림 4에 있는 새로운 관리 리소스 편집기가 포함되어 있습니다. 그림 2는 Visual Studio 2003의 리소스 편집기와 비슷한 리소스 문자열 편집기를 보여 줍니다. 반면, 그림 4는 문자열, 아이콘 및 기타 이미지 파일 형식, 오디오 파일 형식, XML을 포함한 기타 파일 등을 비롯하여 이 편집기가 지원하는 미리 정의된 리소스 범주 목록을 보여 줍니다. 리소스 편집기가 지원하는 이러한 미리 정의된 형식 외에도 다른 복합 형식을 프로그래밍 방식으로 리소스에 삽입할 수 있습니다. 기본 리소스 파일은 XML 기반입니다. 그림 4. 새로운 관리 리소스 편집기는 수많은 미리 정의된 데이터 형식을 통합 지원하며, 여기 표시된 이미지 리소스 범주에 대한 축소판 보기를 비롯하여 리소스 데이터의 대체 보기를 제공합니다. 편집기를 통해 이미지, 사운드 및 XML 파일과 같은 파일 기반 리소스를 삽입하는 경우 이러한 리소스는 기본적으로 ResxFileRef 항목으로 정의됩니다. 예를 들어, 다음은 각각 외부 이미지 및 XML 파일에 대해 작성된 리소스 항목을 설명합니다. <data name="Spain" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Images\Spain.gif;System.Drawing.Bitmap, System.Drawing, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a</value> </data> <data name="supportedCultures" type="System.Resources.ResXFileRef, System.Windows.Forms"> <value>..\Xml\supportedCultures.xml;System.String, mscorlib, Version=2.0.3600.0, Culture=neutral, PublicKeyToken=b77a5c561934e089;ks_c_5601-1987</value> </data> 리소스 컴파일러는 각 파일 참조를 확인하고 런타임은 참조된 파일을 스트림에 로드하는 작업을 처리하여 올바른 데이터 형식으로 변환합니다. 기본적으로 이미지의 경우 이 형식은 System.Drawing.Bitmap이며 XML은 System.String으로 반환됩니다. 미리 컴파일된 웹 응용 프로그램의 경우 리소스는 출력 어셈블리에 포함됩니다. 이는 실제 파일을 사이트와 함께 배포할 필요가 없음을 의미합니다. ASP.NET 2.0의 새 컴파일 모델(자세한 내용은 이 기사 참조)과 일관성을 가지도록 리소스와 관련 파일을 전체 런타임 컴파일 중에 배포할 수도 있습니다. 공유 리소스의 주요 이점 중 하나는 엄격한 형식의 클래스로 컴파일하여 해당 리소스 키에서 항목을 직접 액세스할 수 있도록 만드는 것입니다. 예를 들어, Flags.resx라는 공유 응용 프로그램 리소스는 Resources.Flags 런타임 형식으로 액세스됩니다. Intellisense는 내부 Resources 형식을 통해 사용할 수 있으며 형식 변환기를 사용할 수 있는 경우 리소스 항목은 원시 데이터 형식으로 반환됩니다. 이미지의 경우 그림 5에서 볼 수 있는 것처럼 데이터 형식은 System.Drawing.Bitmap입니다. 그림 5. 공유 리소스는 엄격한 형식의 리소스로 컴파일되며 내부 Resources 개체를 통해 액세스할 수 있습니다. 이미지 기반 리소스는 웹 컨트롤 개발자가 컨트롤에 사용된 포함 그래픽을 캡슐화하는 작업에도 유용할 수 있지만, 일반적으로 Windows Forms 개발자가 표시를 위해 이진 이미지 형식을 사용할 수 있다는 점에서 더 유용합니다. 어떠한 경우든 엄격한 형식의 리소스와 Intellisense는 런타임에 리소스에 액세스하기 위한 생산성을 향상시킵니다. 예를 들어, 그림 5에서도 엄격한 형식의 Glossary 리소스를 통해 명명된 문자열 값을 간편하게 검색할 수 있음을 볼 수 있습니다. 로컬 및 공유 리소스는 모두 선언적인 방식이나 프로그래밍 방식으로 액세스하여 지역화된 콘텐츠를 생성할 수 있습니다. 이러한 기술에 대해서는 다음 절에서 설명합니다. 암시적 지역화 식앞에서 언급한 것처럼 로컬 리소스는 생성 시 페이지에서 선언을 제어하기 위해 수정을 트리거합니다. 기본 동작은 암시적 지역화 식을 구문 분석 시간 특성 meta:resourcekey에 지정된 서버 컨트롤에 추가하는 것입니다. <asp:LinkButton id=lnkSelectCulture PostBackUrl="selectculture.aspx" runat="server" meta:resourcekey="LinkButtonResource1"> Change Culture Settings</asp:LinkButton> 이 식은 컨트롤의 속성과 관련된 모든 리소스 항목의 예상 접두사를 지정하며, 따라서 암시적 식입니다. 자동 리소스 생성은 지역화할 수 있는 속성만 고려하지만 실제로 이 접두사와 그 뒤에 유효한 속성 이름이 오는 모든 리소스 항목은 컴파일된 페이지 코드에서 해당 속성에 바인딩됩니다. 위 예제에서 LinkButtonResource1은 리소스 키 접두사이고 그림 2에 나온 리소스 항목은 동일한 컨트롤 인스턴스(LinkButtonResource1.Text)에 적용되는 각 속성에 대해 이 접두사를 사용합니다. 이 선언적 문(meta:resourcekey)은 기본 로컬 리소스에서 속성 값을 검색하기 위해 코드를 생성해야 함을 ASP.NET 페이지 파서에 알립니다. 결과 코드는 최종적으로 GetPageResourceObject(이 메서드 이름은 베타 2에서 변경될 수 있음)의 도움을 받아 리소스에 액세스하기 위한 런타임 메서드를 사용합니다. 제공된 샘플 코드에서 컴파일된 cultureinfo.ascx 페이지는 LinkButton, lnkSelectCulture를 작성 및 초기화하는 다음 코드를 포함합니다. LinkButton button1 = new LinkButton(); this.lnkSelectCulture = button1; button1.ID = "lnkSelectCulture"; button1.PostBackUrl = "selectculture.aspx"; button1.AccessKey = ((string) base.GetPageResourceObject("LinkButtonResource1.AccessKey")); button1.SoftkeyLabel = ((string) . base.GetPageResourceObject("LinkButtonResource1.SoftkeyLabel")); button1.Text = ((string) base.GetPageResourceObject("LinkButtonResource1.Text")); button1.ToolTip = ((string) base.GetPageResourceObject("LinkButtonResource1.ToolTip")); button1.Visible = ((bool) base.GetPageResourceObject("LinkButtonResource1.Visible", typeof(Control), "Visible")); 암시적 지역화 식은 페이지 리소스가 생성될 때 모든 서버 컨트롤 선언에 적용됩니다. 이 대체 구문을 사용하여 컨트롤을 지역화하지 않도록 지정함으로써 이 동작을 방지할 수 있습니다. <asp:LinkButton id=lnkSelectCulture PostBackUrl="selectculture.aspx" runat="server" meta:localize="false">Change Culture Settings</asp:LinkButton> 지역화 전략에 중요하다고 생각되지 않는 개별 컨트롤 속성은 그림 2에 나온 관리 리소스 편집기를 사용하여 로컬 리소스에서 수동으로 제거할 수 있습니다. 이렇게 하면 페이지의 기본 로컬 리소스에 있는 항목만 반영되므로 로컬 리소스 항목을 컨트롤 속성에 적용하기 위해 페이지 파서가 생성하는 코드 양이 줄어듭니다. 또한 이것은 지역화된 리소스에 추가된 추가 키 값이 런타임에 적용되지 않음을 의미합니다. 그러한 작업을 수행하도록 하는 코드가 생성되지 않기 때문입니다. 이와 같은 지역화 식은 .NET Framework 2.0과 함께 릴리스되는 새로운 식 작성기 기능을 활용합니다. 암시적 지역화 식은 단일 선언에서 코드를 생성하여 지역화할 수 있는 모든 서버 컨트롤 속성을 채움으로써 개발자가 시간을 절약할 수 있도록 합니다. 이렇게 하면 지역화된 리소스나 데이터 원본에서 값을 가져오기 위해 일반적으로 사용자 지정 데이터 바인딩 문이나 사용자 지정 코드를 필요로 하는 1.x 웹 응용 프로그램에서 현재 요구되는 수동 단계가 더 이상 필요하지 않습니다. 다음 절에서는 LocalizableAttribute로 표시되지 않는 속성을 비롯한 특정 컨트롤 속성과 정적 텍스트의 지역화를 위해 추가 리소스 생성을 자동화하는 방법에 대해 설명합니다. 명시적 지역화 식지역화할 수 있는 컨트롤 속성에 대해 리소스를 자동으로 생성하는 것은 매우 편리하지만, 개발자에게는 특정 속성 값과 기타 콘텐츠 블록의 지역화 또한 지원하는 솔루션이 필요합니다. 명시적 지역화 식은 특정 리소스 항목을 서버 컨트롤 속성과 기타 HTML 요소에 선언적으로 할당하는 방법을 제공합니다. 예를 들어, 다음 ImageButton 컨트롤 선언은 명시적 식을 사용하여 해당 AlternateText 속성을 설정합니다. <asp:ImageButton id="btnIDesign" Runat="server" ImageUrl="~/Images/idesignlogo.jpg" AlternateText='<%$ Resources: MissionSatatement, "IDesign Inc." %>' PostBackUrl="http://www.idesign.net" meta:resourcekey="ImageButtonResource1" /> 명시적 지역화 식에는 다음 구문이 사용됩니다. <%$ resources: [applicationkey], resourcekey, [default] %> 위 예제에서는 MissionStatement의 값을 로컬 리소스에서 가져오므로 applicationkey가 생략됩니다. resourcekey 값은 가져올 리소스 항목을 나타내고 default 값은 디자이너 기본값을 나타냅니다. 디자이너 기본값은 디자인 타임에만 제공되며 페이지 레이아웃을 편집하는 개발자나 웹 디자이너에게 유용합니다. 또한 그림 6에 나온 식 대화 상자를 사용하여 속성 창을 통해 명시적 식을 생성할 수 있습니다. 이 대화 상자는 컨트롤 속성을 로컬 또는 공유 리소스에 바인딩하는 명시적 식을 만드는 작업을 지원합니다. 그림 6. 개발자는 식 대화 상자를 사용하여 리소스를 직관적으로 속성에 매핑하고 명시적 지역화 식을 생성할 수 있습니다. 개발자는 이 대화 상자를 사용하여 다른 컨트롤 속성을 설정할 때와 마찬가지로 속성 창을 통해 명시적 식을 만듭니다. ClassName이 식 속성에서 생략되면(그림 6 참조) 사용 가능한 로컬 리소스 키의 드롭다운 목록이 제공됩니다. 이때 이러한 리소스가 이미 만들어졌다고 가정합니다. ClassName이 생략되지 않으면 로컬 리소스를 대상으로 하는 명시적 식이 사용되어 ResourceKey와 키가 일치하는 로컬 리소스 항목이 생성됩니다. 이렇게 하면 앞에서와 마찬가지로 개발자가 리소스 항목을 만들고 런타임에 속성을 채우기 위해 코드를 생성하는 데 필요한 작업이 줄어듭니다. 공유 리소스에 액세스하려면 ClassName이 전역 리소스 디렉터리에 있는 유효한 리소스 파일의 이름을 지정해야 합니다. 로컬 리소스와 달리 공유 리소스를 대상으로 하는 명시적 식은 이러한 리소스를 자동으로 생성하지 않습니다. 암시적 및 명시적 지역화 식을 혼합하여 공유 리소스와 로컬 리소스에서 각각 다른 속성을 가져올 수 있습니다. 다음 예제는 해당 AlternateText를 공유 리소스 Glossary.resx에서 검색하는 동시에 다른 모든 속성은 암시적 구문을 사용하여 로컬 리소스에서 가져오는 동일한 ImageButton 컨트롤 선언을 보여 줍니다. <asp:ImageButton ID="btnIDesign" Runat="server" ImageUrl="~/Images/idesignlogo.jpg" AlternateText='<%$ Resources:Glossary, MissionSatatement, "IDesign Inc." %>' PostBackUrl="http://www.idesign.net" meta:resourcekey="ImageButtonResource1" /></td> 명시적 지역화 식을 사용하면 지역화되는 속성과 그 위치를 세부적으로 제어할 수 있습니다. 컨트롤 선언에 명시적 식과 암시적 식이 모두 포함된 경우 다음과 같이 페이지 리소스가 생성됩니다.
앞에서 언급한 것처럼 페이지를 구문 분석할 때 공유 또는 로컬 리소스에서 속성 값을 가져오기 위해 이러한 선언에서 코드가 자동으로 생성됩니다. 위 예제에서 결과 코드는 ImageButton 컨트롤을 만들고 공유 Glossary 리소스에서 해당 AlternateText 속성을 설정하며, 지역화할 수 있는 나머지 속성은 로컬 리소스에 의해 설정됩니다. ImageButton button1 = new ImageButton(); // 기타 초기화 코드 button1.ID = "btnIDesign"; button1.AccessKey = (string) base.GetPageResourceObject("ImageButtonResource1.AccessKey"); button1.AlternateText = (string) base.GetAppResourceObject("Glossary", "MissionStatement"); button1.ImageUrl = (string) base.GetPageResourceObject("ImageButtonResource1.ImageUrl"); button1.ToolTip = (string) base.GetPageResourceObject("ImageButtonResource1.ToolTip"); button1.Visible = (bool) base.GetPageResourceObject("ImageButtonResource1.Visible", typeof(Control), "Visible");(참고: 프로그래머 코멘트는 샘플 프로그램 파일에는 영문으로 제공되며 기사에는 설명을 위해 번역문으로 제공됩니다.) HTML 요소 및 정적 텍스트 지역화암시적 및 명시적 지역화 식을 사용하면 서버 컨트롤 속성에 대한 리소스를 간편하게 생성할 수 있습니다. 그러나 페이지의 지역화를 준비하려면 HTML 페이지 제목, 방향 특성, 정적 콘텐츠와 같은 다른 콘텐츠도 고려해야 합니다. 또한 지역화 식을 @Page 지시문과 HTML의 다른 섹션에 적용하여 페이지 리소스를 생성하기 전에 다른 지역화 영역을 선언적으로 나타낼 수 있습니다. HTML 컨트롤HTML 컨트롤은 서버에서 실행(runat="server")되지 않는 경우 암시적 또는 명시적 식의 이점을 활용할 수 없습니다. 서버 컨트롤로 표시되고 나면 로컬 리소스는 컨트롤의 지역화할 수 있는 속성에 대해 자동으로 생성됩니다. ASP.NET 및 사용자 지정 서버 컨트롤과 일관성을 가지도록 HTML 서버 컨트롤을 암시적 또는 명시적 식에 바인딩할 수 있으며 명시적 식의 경우 앞에서 언급한 식 대화 상자를 통해 생성할 수 있습니다. 페이지 머리글에 있는 HTML 요소를 선언적으로 리소스에 바인딩할 수도 있습니다. 이는 페이지 제목 및 스타일시트 링크에 유용합니다. 실제로 HTML 페이지 제목 요소는 @Page 지시문을 통해 설정할 수 있는 Page 속성이라는 점에서도 특별합니다. 기본적으로 로컬 리소스가 생성될 때 각 페이지에 암시적 식이 할당됩니다. <%@ page title="Global Welcome" meta:resourcekey="pageTitle" %> 이것을 명시적 식으로 수정하여 로컬 리소스 대신에 공유 리소스에서 값을 가져올 수도 있습니다. <%@ page title='<%$ resource:Glossary, DefaultPageTitle, "Global Welcome" %>' %> 두 식은 HTML 헤더의 <title> 요소에 있는 값을 무시하며, 이러한 식이 없는 경우에는 명시적 식을 사용하여 여기에 나온 <title> 요소에 식을 직접 적용할 수 있습니다. <head runat="server"> <title text='<%$ resource:Glossary, DefaultPageTitle %>'>Global Welcome</title> </head> 방향 특성<asp:Panel>과 같은 컨트롤에 의해 지원되는 새로운 Direction 속성을 통해 방향 설정에 대한 지원이 향상되었습니다. culture를 기반으로 하여 응용 프로그램의 전체 방향을 나타내는 공유 리소스를 사용함으로써 기본 "LTR" 방향을 기본 공유 리소스에서 지정할 수 있으며 이 값은 또한 각 culture에 기초한 "RTL"의 지정을 통해 무시될 수 있습니다. 브라우저 스크롤 막대의 방향을 제어하고 사이트의 전체 방향을 설정하기 위해 다음 명시적 식은 공유 리소스에서 올바른 값을 가져오고 디자이너 기본값인 "LTR"을 사용합니다. <html runat="server" dir='<% $Resources: Direction, "LTR" %>' > ... </html> 패널을 사용하여 포함된 컨트롤의 방향을 조정할 수도 있습니다. <asp:panel runat="server" direction='<% Resources:Direction, "LTR" %>'> ... </asp:panel> Visual Studio .NET의 방향 지원과 관련된 자세한 내용을 보려면 이 사이트 를 방문하십시오. 정적 텍스트지역화 식은 컨트롤 속성과 다른 HTML 요소를 설정하는 데 유용합니다. 그러나 지역화를 준비하는 대부분의 웹 페이지에는 ASP.NET 컨트롤과 결합된 많은 양의 정적 콘텐츠 블록이 이미 포함되어 있습니다. 정적 콘텐츠를 지역화할 수 있는 것으로 표시하기 위해 새로운 ASP.NET Localize 컨트롤이 제공되므로 정적 콘텐츠를 리소스 생성에 포함할 수 있습니다. 리소스를 생성하기 위한 명령을 실행하기 전에 meta:resourcekey를 지정한 경우 컨트롤에 지정된 키가 사용됩니다. 이는 다른 컨트롤에도 적용됩니다. <asp:Localize runat="server" meta:resourcekey="welcome">Welcome!</asp:Localize> 이 예제에서는 "welcome"이라는 리소스 접두사가 있는 Localize 컨트롤의 Text 속성(welcome.Text)에 대한 새 로컬 리소스 항목이 생성됩니다. 공유 리소스에서 정적 텍스트를 명시적으로 채우기 위해 명시적 지역화 식에 의해 Text 속성이 할당될 수 있습니다. <asp:Localize runat="server" text='<%$ resources: Glossary, welcomeText%>'>Welcome!</asp:Localize> 다른 시나리오와 일관성을 가지도록 이러한 선언적 문은 컨트롤 속성(이 경우에는 Text 속성)을 설정하기 위해 리소스를 요청하는 코드로 구문 분석됩니다. 이 컨트롤의 선언 내에서 표시되는 모든 HTML 태그가 리소스 생성에 포함되므로 변환 프로세스가 복잡해질 수 있습니다. 따라서 태그를 포함하지 않도록 하는 것이 가장 좋습니다. Localize 컨트롤은 기본 클래스인 Literal 컨트롤보다 중요합니다. Literal 컨트롤과 마찬가지로 런타임에 처리되지만, 디자인 보기에서 컨테이너에 의해 바인딩되는 Literal 컨트롤과는 달리 디자이너가 이를 무시하고 개발자가 디자인 보기에서 정적 콘텐츠를 직접 편집할 수 있기 때문입니다. 리소스 지역화 및 배포새로운 선언적 문, 자동 페이지 리소스 생성 및 엄격한 형식의 공유 리소스를 통해 개발자는 웹 응용 프로그램의 지역화를 훨씬 더 쉽게 준비할 수 있습니다. \LocalResources 및 \Resources 디렉터리에 저장되는 기본 리소스(각각 로컬 및 공유 리소스)는 지원되는 culture로 변환될 수 있으며 변환된 버전은 소스와 동일한 디렉터리에 복사됩니다. 변환된 리소스의 명명 규칙은 1.x와 동일한 규칙을 따릅니다. culture 코드는 변환된 .resx 파일 이름에 포함됩니다. 그림 7은 스페인어, 프랑스어 및 이탈리아어로 변환된 페이지 리소스가 포함된 샘플 프로젝트의 확장된 보기를 보여 줍니다. 그림 7. 1.x 리소스 명명 규칙과 일관성을 가지도록 .resx 파일의 이름은 culture 코드에 따라 지정되어야 합니다. .NET Framework 1.x 응용 프로그램은 일반적으로 지역화된 위성 어셈블리와 함께 제공되지만 ASP.NET 2.0에는 새로운 배포 옵션 집합이 있습니다.
2번, 3번 및 4번의 경우에 ASP.NET 2.0 컴파일러는 \LocalResources 및 \Resources 디렉터리에 있는 .resx 소스 파일을 어셈블리로 자동 컴파일합니다. 3번과 4번의 경우에 로컬 리소스는 페이지 컴파일 이전에, 페이지가 처음 액세스될 때, 또는 페이지 소스나 해당 .resx 파일이 수정될 때 컴파일됩니다. .resx용 빌드 공급자가 있기 때문에 이러한 파일을 컴파일 단계 없이 배포할 수 있습니다. 1번에서 언급한 것처럼 1.x 어셈블리, 중립 리소스 및 연관된 위성 어셈블리는 이전 버전과 계속 호환됩니다. 이 배포 모델은 2.0 지역화 식을 사용하지 않을 뿐만 아니라 기본 런타임 리소스 공급자 모델을 통해 이러한 리소스에 액세스할 수도 없습니다. 식 작성기와 리소스 공급자의 확장성 모델은 1.x 리소스 배포와 함께 2.0의 생산성 기능을 활용하는 데 유용할 것입니다. 런타임 리소스 공급자ASP.NET 1.x 응용 프로그램에서 ResourceManager를 사용하려면 데이터 바인딩 문이나 리소스에서 값을 검색하는 기타 메커니즘을 실행하기 전에 코드에서 ResourceManager를 인스턴스화해야 했습니다. ASP.NET 2.0은 필요에 따라 리소스 관리자를 자동으로 인스턴스화하므로 로컬 및 공유 리소스 액세스 시에 이 프로세스를 관리하기 위한 코드를 작성할 필요가 없습니다. 컨트롤 속성과 HTML 요소를 리소스 값으로 채우기 위한 선언적 문을 사용하면 완전히 지역화된 페이지를 생성하기 위해 코드를 작성할 필요가 없습니다. 기본 ResourceProviderFactory는 런타임과 디자인 타임에 연관된 디자이너 팩터리를 통해 페이지 및 공유 리소스에 대한 리소스 공급자를 인스턴스화하는 역할을 수행합니다. 개발자는 베타 1의 Page 개체를 통해 제공되는 GetPageResourceObject를 사용하여 로컬 리소스의 값에 액세스하는 코드를 작성할 수 있습니다. if (this.Context.User.Identity.IsAuthenticated) mnuLogin.Text = GetPageResourceObject("Login"); else mnuLogin.Text = String.Format(GetPageResourceObject("LogoutUser", this.Context.User.Identity.Name); 이 코드를 사용하면 리소스에 종속된 HTML 출력을 위해 런타임 결정이 필요한 경우에 선언적 지역화 식을 무시할 수 있습니다. 공유 페이지 리소스에 액세스하기 위해 Page 개체는 다른 메서드를 제공합니다. string cultures = (string)this.GetAppResourceObject("supportedCultures"); 공유 리소스의 경우 개발자는 Intellisense 및 엄격한 형식의 리소스 액세스를 활용하여 여기서 볼 수 있듯이 String 형식으로 저장된 XML 리소스를 검색할 수 있습니다. string cultures = Resources.Cultures.supportedCultures; 결국 GetPageResourceObject 및 GetAppResourceObject는 구성된 리소스 공급자를 통해 적절한 리소스에 액세스합니다. 따라서 공유 1.x 리소스에 액세스하기 위해 사용자 지정 리소스 공급자를 만든 경우 이러한 메서드는 GetAppResourceObject를 통해 해당 공유 리소스에서 검색할 수 있습니다. 기본 설정 culture 선택일반적으로 1.x ASP.NET 응용 프로그램에서는 각 요청에 대한 culture를 선택하는 데 두 가지 주요 방법이 고려되었습니다. culture 특정 하위 디렉터리에서 전체 사이트를 복제한 응용 프로그램의 경우 web.config의 <globalization> 요소는 이러한 하위 디렉터리에서 리소스를 요청하는 런타임 스레드가 사용해야 하는 culture 및 UI culture를 나타냈습니다. <system.web> <globalization culture="es-ES" uiCulture="es"> </system.web> 단일 코드 베이스를 사용한 응용 프로그램의 경우 이러한 선언적 설정이 유용하지 않습니다. 대신에 각 요청 스레드의 culture를 수동으로 설정하기 위한 런타임 코드가 필요하므로 요청을 하는 각 사용자에 대해 culture를 동적으로 선택할 수 있습니다. 사용자의 기본 설정 culture는 데이터베이스 프로필, HTTP 쿠키 또는 웹 브라우저의 언어 설정에서 수집할 수 있습니다. 어떠한 경우든 요청 스레드의 UI culture를 설정하면 ResourceManager가 런타임에 가져오는 지역화된 리소스가 결정되며 이러한 culture 설정은 앞에서 언급한 것처럼 culture 인식 서식에 영향을 줍니다. ASP.NET 2.0에는 웹 브라우저 기본 설정을 기반으로 하여 런타임에 culture 선택을 자동화하는 새 기능이 포함되어 있습니다. culture 및 UI culture 설정 또한 지원하는 @Page 지시문을 사용하면 브라우저의 기본 설정에 기초하여 특정 페이지를 실행해야 함을 나타낼 수 있습니다. <%@ Page uiCulture="auto" culture="auto"> 또한 응용 프로그램의 web.config 파일도 전체 응용 프로그램에 대해 이 설정을 적용할 수 있습니다. <system.web> <globalization culture="auto:en-US" uiCulture="auto:en"> </system.web> auto 뒤의 콜론을 사용하면 HTTP 헤더를 사용할 없는 경우의 기본 culture를 지정할 수 있습니다. culture를 특정 culture로 설정해야 하므로 위 예제에서는 en-US가 사용되었습니다. 결과적으로 런타임은 브라우저에서 보낸 ACCEPT_LANG 헤더를 자동으로 감지하고 페이지 수명 주기의 초기에 스레드를 사용자의 언어 기본 설정 목록에 있는 첫 번째 언어로 설정합니다. 응용 프로그램 사용자에 대해 프로필이 저장되거나 사용자가 사이트를 통해 특정 culture를 선택할 수 있는 경우 개발자는 런타임이 처리하는 auto 설정을 무시하기 위한 코드를 작성해야 합니다. 이를 위한 한 가지 기술이 샘플 코드에 나와 있습니다. <A name=asp2local_topic11??/?젇????.?????ÿ???? P < 줄어듭니다. 대폭 노력이 비용과 관련된 제공과 솔루션 하는 대상으로 시장을 세계 전 있으므로 수 제공할 프로그램을 응용 웹 통해 베이스를 코드 단일 결과적으로, 없습니다. 필요가 설정할 스레드를 요청 따라 culture에 인스턴스화하거나, 관리자를 리소스 컴파일하거나, 어셈블리를 위성 이상 더 개발자는 사용하면 모델을 런타임 새로운 지원합니다. 생성을 자동 리소스의 페이지 적절한 하며, 있도록 지역화할 모두 요소를 필요한 식은 지역화 선언적 있습니다. 수행할 자연스럽게 더욱 작업을 작성하는 리소스를 위한 편집기를 관리 생성과 줄일 비용을 주기의 개발 지역화하면서 간편하게 전략에 특정 기능을 2.0의 ASP.NET 설명한 지금까지 필수적입니다. 것이 정의하는 전략을 세계화 초기에 수명 수용하려면 신속하게 보다 사항을 요구하는 릴리스가 제품 미래의 있는>추가 리소스Globalization Architecture for ASP.NET 1.x .NET Dashboard Globalization Resources 관련 서적
Michele Leroux Bustamante는 IDesign Inc.의 소프트웨어 설계 책임자, 샌디에이고의 Microsoft 지역 책임자, XML 웹 서비스 부문의 Microsoft MVP이자 BEA 기술 국장입니다. Michele은 10년 이상 Visual Basic, C++, Java, C# 및 Visual Basic .NET으로 응용 프로그램을 개발하고 ATL, MFC, COM 등의 관련 기술 작업을 수행한 경력을 보유하고 있습니다. IDesign에서 Michele은 웹 서비스, .NET을 위한 확장 가능 보안 아키텍처 디자인, 상호 운용성 등을 중심으로 교육, 조언 및 고급 아키텍처 컨설팅 서비스를 제공하고 있습니다. INETA(International .NET Speakers Association)의 회원이자 SD의 웹 서비스 및 .NET 트랙의 회장이기도 한 Michele은 각종 회의에 발표자로서 자주 참석하며 여러 주요 기술 저널에 글을 기고하고 있습니다. 또한 Michele는 UCSD Extension의 프로그램 고문이며 SearchWebServices.com 의 .NET 전문가입니다. Michele에게 연락하려면 mlb@idesign.net으로 전자 메일을 보내거나 http://www.idesign.net/ 및 http://www.dasblonde.net/ 을 방문하십시오. | |
'.net' 카테고리의 다른 글
Asp.net 2.0 Smtp 메일 보내기 (3) | 2007.05.03 |
---|---|
웹 사이트 레이아웃 (1) | 2007.05.03 |
ASP.NET 2.0 내부 변경 사항 (0) | 2007.05.03 |
ASP.NET 2.0의 마스터 페이지 (0) | 2007.05.03 |
Visual Studio 2005의 새로운 보안 기능 (0) | 2007.05.03 |