다음을 통해 공유


구성 요소 라이브러리에 대한 리소스 지역화 개요

업데이트: 2007년 11월

지역화란 특정 언어나 문화권에 맞도록 응용 프로그램을 사용자 지정하는 과정입니다. ASP.NET의 AJAX 기능은 클라이언트 스크립트과 함께 작동하기 위해 다음과 같은 지역화 모델을 지원합니다.

  • ECMAScript(JavaScript) 구성 요소와 연결된 지역화된 리소스에 대한 지원이 확장된 .NET Framework 리소스 모델. 이 모델에서는 스크립트 파일과 지역화된 스크립트 리소스를 허브 및 스포크 구성의 어셈블리에 포함하므로 위성 어셈블리를 사용하게 됩니다. 그러면 이러한 포함된 클라이언트 스크립트와 리소스를 특정 언어 및 지역에 대해 선택적으로 사용할 수 있습니다. 이 모델을 사용하면 단일 코드베이스로 여러 문화권을 지원할 수 있습니다.

  • 디스크의 정적(독립 실행형) JavaScript 파일. 이 모델에서는 지역화된 파일이 어셈블리에 포함되는 대신 단일 디렉터리에 .js 파일로 그룹화됩니다.

  • 정적 JavaScript 파일을 사용하여 어셈블리에 포함되는 스크립트 및 스크립트 리소스 업데이트. 이 모델에서는 원래 어셈블리를 변경할 필요 없이 포함된 스크립트 및 포함된 리소스에 대한 지역화를 추가로 지원할 수 있습니다.

이 항목에서는 다음 내용에 대해 설명합니다.

  • 시나리오

  • 배경

  • 어셈블리의 클라이언트 스크립트 및 스크립트 리소스 지역화

  • 정적 스크립트 파일 및 리소스 지역화

  • ScriptManager를 사용하여 중앙에서 스크립트 관리

  • 코드 예제

  • 클래스 참조

시나리오

ASP.NET의 AJAX 기능을 사용하면 페이지 개발자와 구성 요소 개발자가 클라이언트 지역화를 손쉽게 수행할 수 있습니다. 페이지 개발자는 일반적으로 다음 사항을 지역화합니다.

  • 브라우저의 언어 설정을 기반으로 ASP.NET AJAX 또는 구성 요소 라이브러리에서 생성되는 예외 메시지

  • Button 컨트롤의 Text 속성에 대한 문자열 등의 컨트롤 UI

  • ASP.NET AJAX 서버 컨트롤의 공용 속성 값

  • 비시각적 구성 요소, 동작, 컨트롤 등의 구성 요소 및 클라이언트 스크립트 개체의 속성 값

구성 요소 개발자는 대개 다음과 같은 항목에 대해 지역화 기능을 사용합니다.

  • JavaScript 라이브러리(.js 파일)의 코드에서 참조하는 리소스 지역화. 지역화된 리소스는 주 어셈블리 및 스크립트 라이브러리를 다시 빌드하지 않고 개별 설치에 배포할 수 있습니다.

  • 클라이언트 개체의 속성에 매핑된 서버 컨트롤의 지역화 가능한 속성 노출

배경

ASP.NET의 AJAX 기능은 ASP.NET 2.0 지역화 모델에서 빌드되며 어셈블리에 포함되어 있거나 디스크의 정적 .js 파일인 지역화된 스크립트 파일에 대한 추가 지원을 제공합니다.

ASP.NET 지역화 모델에 익숙하지 않은 경우에는 다음 항목에서 자세한 내용을 확인할 수 있습니다.

어셈블리의 클라이언트 스크립트 파일 및 스크립트 리소스 지역화

ASP.NET AJAX 기능에서는 지역화를 위해 .NET Framework 리소스 모델을 활용합니다. 이 모델에서는 허브 및 스포크 배열을 사용하여 증분 업데이트가 가능한 지역화된 리소스를 패키지화 및 배포합니다. 허브는 지역화되지 않은 실행 코드가 포함된 주 어셈블리로, .NET Framework 서버 코드와 어셈블리에 리소스로 포함된 .js 파일의 모든 JavaScript 코드가 들어 있습니다.

또한 주 어셈블리에는 중립 또는 기본 문화권이라고 하는 단일 문화권에 대한 리소스가 포함되어 있습니다. 중립 문화권은 응용 프로그램의 대체 문화권으로, 문화권이 지정되어 있지 않거나 지정된 문화권에 대한 리소스가 없는 경우에 사용됩니다.

지역화된 문화권 리소스는 대개 .resx 파일에 이름/값 쌍으로 만들어집니다. 이러한 .resx 파일은 .resources 파일로 컴파일될 수 있습니다. 이름은 코드의 정보에 액세스할 수 있도록 하며 값은 지역화(번역)된 용어, 이미지 또는 해당 이름에 대한 기타 요소입니다. 어셈블리가 빌드되면 .resx 파일에 대한 형식이 생성됩니다. 이 파일의 이름은 값에 프로그래밍 방식으로 액세스할 수 있도록 하는 필드로 노출됩니다. 이렇게 생성된 형식의 이름은 뒷부분에 설명된 것처럼 어셈블리 속성의 일부로 지정합니다.

허브 및 스포크 모델에서 각 스포크는 단일 문화권의 리소스를 포함하는 위성 어셈블리에 연결됩니다. 위성 어셈블리에는 서버에서 실행하는 코드가 들어 있지 않으며 해당 문화권의 리소스 값에 프로그래밍 방식으로 액세스할 수 있도록 하는 생성된 형식만 포함되어 있습니다.

이 모델에서는 다음과 같은 기능을 제공합니다.

  • 어셈블리를 이미 배포한 후 새 위성 어셈블리를 배포하여 새 문화권의 리소스를 추가할 수 있습니다. 문화권별 리소스를 개발하려면 시간이 추가로 필요할 수 있으므로 이 모델을 사용하면 기본 응용 프로그램을 먼저 릴리스하고 나중에 문화권별 리소스를 전달할 수 있습니다.

  • 주 어셈블리를 다시 컴파일하지 않고 응용 프로그램의 위성 어셈블리를 업데이트할 수 있습니다.

  • 응용 프로그램에서는 주 어셈블리를 언로드 및 다시 로드하는 대신 특정 문화권에 대해서만 위성 어셈블리를 로드해야 합니다. 이렇게 하면 시스템 리소스 사용을 상당히 줄일 수 있습니다.

ASP.NET의 리소스 파일을 만드는 방법에 대한 자세한 내용은 방법: ASP.NET 웹 사이트의 리소스 파일 만들기(Visual Studio)리소스를 사용하여 ASP.NET 웹 페이지 지역화를 참조하십시오.

.NET Framework 리소스 파일 생성기(Resgen.exe) 도구를 사용하는 방법에 대한 자세한 내용은 리소스 파일 생성기(Resgen.exe)를 참조하십시오. 이 도구는 .resx 또는 .txt 파일을 어셈블리에 연결할 수 있는 이진 .resources 파일로 변환합니다.

지역화된 주 및 위성 어셈블리 구성

허브 및 스포크 모델은 JavaScript(.js) 파일이 포함되는 응용 프로그램을 지역화려는 경우에 사용할 수 있습니다. 일반적으로 어셈블리는 지역화되는 ASP.NET 응용 프로그램처럼 구성합니다.

AJAX 사용 ASP.NET 웹 응용 프로그램에 대해 JavaScript 파일을 관리하려면 지역화해야 하는 문자열이나 기타 요소를 하드 코딩하지 않도록 JavaScript 코드를 작성합니다. 대신 JavaScript 코드가 지역화된 값을 사용해야 하는 위치에서는 리소스 파일 외부에서 생성된 형식에서 필드를 가져옵니다.

주 어셈블리에는 대개 다음과 같은 요소가 포함되어 있습니다.

  • 응용 프로그램 작업을 수행하고 하드 코딩된 리소스가 아닌 지역화된 리소스를 사용하도록 작성된 JavaScript 파일. 어셈플리에는 이러한 JavaScript 파일의 디버그 버전이 선택적으로 포함될 수 있습니다.

  • 응용 프로그램에 대한 대체 문화권 역할을 하는 단일 중립 문화권에 대한 리소스(.resx 또는 .resources 파일)(선택적)

  • 중립 문화권 리소스의 디버그 버전(선택적). 디버그 버전의 리소스 파일에는 디버그 버전의 JavaScript 파일에 필요한 추가 이름/값 쌍이 포함되어 있습니다.

위성 어셈블리에는 대개 ASP.NET 응용 프로그램의 단일 문화권에 대한 지역화된 리소스가 들어 있습니다. 대체 문화권에는 위성 어셈블리가 필요 없습니다. 단일 문화권의 리소스는 개별 리소스 파일(.resx 또는 .resources 파일)에서 만들어진 다음 단일 위성 어셈블리로 컴파일됩니다.

참고:

ASP.NET에서는 사용자 지정 UI 문화권 및 사용자 지정 문화권 이름을 만들 수 있습니다. 하지만 일반적으로 문화권 이름은 언어를 나타내는 두 문자와 국가 또는 지역을 나타내는 두 문자(대문자)로 구성된 ISO 언어를 기반으로 합니다. es-MX(스페인어, 멕시코), es-CO(스페인어, 콜롬비아), fr-CA(프랑스어, 캐나다) 등을 예로 들 수 있습니다. 전체 문화권 이름 목록을 보려면 System.Globalization.CultureInfo 클래스 개요를 참조하십시오.

지역화된 포함 스크립트 파일의 이름

다음 명명 규칙은 리소스로 포함된 지역화된 스크립트 파일에 사용하는 것이 좋습니다.

scriptname_noextension.[debug].[UI culture identifier].[resources|resx]

디버그 버전의 파일 이름에는 ".debug"가 포함되어 있지만 릴리스 버전에는 포함되어 있지 않습니다.

다음 표에서는 이러한 명명 규칙의 예제를 보여 줍니다. 이 예제에서는 릴리스 및 디버그 버전의 포함 스크립트 파일이 나와 있습니다. 또한 이러한 스크립트 파일에 대한 연결된 릴리스 및 디버그 버전의 리소스도 보여 줍니다.

  • Sample.js
    주 어셈블리에 포함된 릴리스 버전의 중립 문화권 스크립트 파일입니다.

  • Sample.debug.js
    주 어셈블리에 포함된 디버그 버전의 중립 문화권 스크립트 파일입니다.

  • Sample.fr-FR.resources
    특정 UI 문화권에 대해 지역화된 Sample.js 스크립트 파일과 연결된 릴리스 버전의 리소스 파일입니다. 이러한 리소스는 위성 어셈블리의 일부가 됩니다.

  • Sample.debug.fr-FR.resources
    특정 UI 문화권에 대해 지역화된 Sample.debug.js 스크립트 파일과 연결된 디버그 관련 리소스입니다. 이러한 리소스는 Sample.fr-FR.resources 파일이 포함된 위성 어셈블리의 일부가 됩니다.

어셈블리에 포함된 스크립트 파일이나 리소스 파일에는 이 명명 규칙이 반드시 필요한 것은 아닙니다. 이는 리소스에 대해 생성된 형식과 리소스 이름 간의 매핑이 어셈블리 특성을 사용하여 수행되기 때문입니다.

디버그 스크립트 리소스 지역화

디버그 모드에서 작업하는 경우 ASP.NET은 런타임에 스크립트 파일에 대한 릴리스 버전의 리소스와 추가 디버그 리소스를 조합합니다. 그런 다음 결과로 만들어진 조합을 브라우저로 보냅니다. 따라서 디버그 버전의 스크립트에 대한 리소스 파일을 만드는 경우에는 릴리스 스크립트 리소스 파일에 아직 포함되지 않은 이름/값 쌍만 정의해야 합니다. 규칙에 따라 디버그 버전의 스크립트 및 스크립트 리소스는 릴리스 버전의 경우와 동일한 이름을 사용하지만 스크립트 파일 이름 뒤에 ".debug"가 붙습니다.

지역화된 스크립트 및 스크립트와 연결된 지역화된 리소스에 대한 어셈블리 특성 지정

어셈블리가 빌드될 때 리소스 파일이 관리되는 방식을 지정하려면 AssemblyInfo 파일(AssemblyInfo.vb 또는 AssemblyInfo.cs 파일)에 특성을 포함합니다.

참고:

Visual Studio에서는 Visual Basic에서 작성된 프로젝트의 경우 AssemblyInfo.vb 파일이 솔루션 탐색기내 프로젝트 노드에 있습니다. My Project 노드에 파일이 없으면 프로젝트 메뉴에서 모든 파일 표시를 클릭합니다. C#에서 작성된 프로젝트의 경우에는 AssemblyInfo.cs 파일이 솔루션 탐색기속성 노드에 있습니다.

ASP.NET에서는 WebResourceAttribute 클래스를 사용하여 응용 프로그램의 리소스를 표시합니다. 어셈블리에 JavaScript 파일을 포함하려면 이 특성을 사용하여 .js 파일을 웹 리소스로 지정합니다.

포함된 JavaScript 파일에 대해 리소스 파일을 포함하려면 ScriptResourceAttribute 클래스를 사용합니다. 이 특성은 텍스트 기반 리소스를 JavaScript 파일의 리소스로 식별합니다.

참고:

ScriptResourceAttribute 클래스는 JavaScript 파일의 텍스트 기반 리소스만 식별하는 데 사용할 수 있습니다. 지역화된 이미지(이진) 파일과 문화권을 연결하려면 해당 URL을 스크립트에서 확인하여 로드할 수 있는 지역화된 리소스로 저장합니다.

다음 예제에서는 어셈블리 특성을 사용하여 포함 스크립트 및 연결된 해당 스크립트 리소스를 식별하는 방법을 보여 줍니다.

' Indicates that neutral fallback resources are retrieved from 
' the main assembly named MainAssembly.
<assembly: NeutralResourcesLanguageAttribute("en-US",
  UltimateResourceFallbackLocation.MainAssembly)>

' Defines embedded scripts as Web resources.
<assembly:WebResource("Sample.js", "text/javascript")>
<assembly:WebResource("Sample.debug.js", "text/javascript")>

' Defines the script resources for the scripts and their types.
<assembly:ScriptResource("Sample.js", "Sample.resources", 
  "Sample.Res")>
<assembly:ScriptResource("Sample.debug.js", "Sample.debug.resources", 
  "Sample.Res")>
// Indicates that neutral fallback resources are retrieved from 
// the main assembly named MainAssembly.

[assembly: NeutralResourcesLanguageAttribute("en-US",
  UltimateResourceFallbackLocation.MainAssembly)]

// Defines embedded scripts as Web resources.
[assembly:WebResource("Sample.js", "text/javascript")]
[assembly:WebResource("Sample.debug.js", "text/javascript")]

// Defines the script resources for the scripts and their types.
[assembly:ScriptResource("Sample.js", "Sample.resources", 
  "Sample.Res")]
[assembly:ScriptResource("Sample.debug.js", "Sample.debug.resources", 
  "Sample.Res")]

이 예제에서는 MainAssembly라는 주 어셈블리에 Sample.js라는 포함된 릴리스 버전의 클라이언트 스크립트 파일이 들어 있습니다. 또한 어셈블리에는 Sample.debug.js라는 해당 디버그 버전이 포함되어 있습니다. .js 파일은 WebResourceAttribute 특성에 의해 리소스로 식별됩니다.

NeutralResourcesLanguageAttribute 어셈블리 특성은 주 어셈블리를 대체 문화권으로 지정하는 데 사용됩니다. 자세한 내용은 지역화를 위한 중립 리소스 언어System.Resources.NeutralResourcesLanguageAttribute 클래스 개요를 참조하십시오.

스크립트 파일에 사용되는 리소스는 ScriptResourceAttribute 특성을 사용하여 정의됩니다. Sample.resources 및 Sample.debug.resources 파일에는 Sample.js 및 Sample.debug.js 파일의 리소스 값이 각각 들어 있습니다.

Sample.Res라는 형식은 릴리스 및 디버그 버전의 스크립트 리소스에 대해 모두 생성됩니다. 이 형식은 JavaScript 코드에서 지역화된 값에 액세스하기 위해 사용하는 형식입니다. 릴리스 모드 및 디버그 모드 모두에 대해 빌드 프로세스에서는 하나의 형식만 생성합니다. 디버그 모드에서 릴리스 버전의 리소스는 디버그 버전의 추가 리소스와 결합됩니다.

어셈블리 정보 파일 및 버전 지정 어셈블리에 필요한 어셈블리 메타데이터를 만드는 방법에 대한 자세한 내용은 방법: 미리 컴파일된 웹 사이트에 사용할 버전 지정 어셈블리 만들기를 참조하십시오.

정적 스크립트 파일 및 리소스 지역화

어셈블리에 스크립트 파일을 포함하는 대신 스크립트 라이브러리를 디스크에 지역화된 정적 스크립트 파일(.js 파일)로 구성할 수 있습니다. 페이지 개발자는 ScriptReferenceCollection 클래스를 통해 스크립트 파일을 참조할 수 있습니다.

정적 스크립트 파일 모델에서는 JavaScript 파일의 리소스로 자동으로 관리할 수 있는 개별 .resx 또는 .resources 파일이 없습니다. 대신 모든 UI 문화권 및 로캘 조합을 위한 .js 파일만 있습니다. 실제로 각 .js 파일은 로캘 관련 버전의 전체 JavaScript 코드를 나타냅니다. 이 모델에서 지역화된 스크립트 파일을 관리하는 일반적인 방버법은 각 .js 파일에 동일한 JavaScript 논리를 사용하는 것입니다. 어셈블리 포함 모델에서처럼 JavaScript 코드는 지역화된 리소스 값을 검색하기 위해 형식을 호출합니다. 차이점은 자동으로 생성되지 않는 지역화된 값이 포함된 형식을 제공해야 한다는 점입니다. 예를 들어 각 로캘의 .js 파일에는 지역화된 값이 포함된 필드를 정의하는 클래스와 응용 프로그램 코드가 모두 들어 있습니다. 각 .js 파일에서 이 클래스에는 값이 다양한 언어로 들어 있습니다.

참고:

정적 스크립트 파일 모델에서 .js 파일의 응용 프로그램 JavaScript 코드는 포함된 JavaScript 파일의 코드와 동기화 상태가 유지되지 않을 수 있습니다. 이는 각 스크립트 파일에 코드의 복사본이 들어 있기 때문입니다. 중복된 코드의 버전 제어 문제가 발생하지 않도록 하기 위해 JavaScript 소스 파일의 복사본을 하나만 유지 관리하고 개별 파일에 지역화된 리소스 형식을 만들 수 있습니다. 그러면 응용 프로그램에서 빌드 프로세스를 진행하는 동안 결합된 최종 파일을 생성할 수 있습니다.

지역화된 정적 스크립트 파일은 어셈플리에 포함된 리소스의 경우처럼 UI 문화권 이름을 파일 이름의 일부로 포함하여 해당 UI 문화권에 매핑됩니다. 예를 들어 프랑스어에 대해 문화권에 중립적인 포함 클라이언트 스크립트 파일의 이름은 Sample.fr.js가 되고 프랑스어(캐나다)의 문화권별 JavaScript 리소스 이름은 Sample.fr-CA.js가 됩니다.

정적 스크립트 파일 모델의 지역화된 디버그 스크립트

정적 스크립트 파일 모델에서 스크립트가 참조하는 지역화된 리소스는 대개 단일 .js 파일에서 형식의 일부로 정의됩니다. 디버그 버전의 스크립트 파일도 동일한 방식으로 구성됩니다. 즉, 지역화된 릴리스 리소스와 추가 디버그 리소스가 단일 파일에서 형식으로 정의됩니다. 디버그 버전의 스크립트는 해당하는 릴리스 버전과 동일한 이름을 사용하지만 이름 뒤에 ".debug"가 붙습니다.

ScriptManager를 사용하여 스크립트 관리

ScriptManager 컨트롤을 사용하여 디스크의 중앙 디렉터리에 있는 정적 스크립트를 관리할 수 있습니다. 이렇게 하려면 모든 버전의 스크립트 파일을 모든 지역화된 파일의 릴리스 및 디버그 버전이 포함된 하나의 폴더에 집어넣습니다. 다음 예제에서는 정적 스크립트 파일 라이브러리에 대한 디렉터리 구조의 레이아웃을 보여 줍니다.

SampleNamespace/

1.0.0.0/

Sample.js

Sample.debug.js

Sample.de-DE.js

Sample.debug.de-DE.js

Sample.fr-FR.js

Sample.debug.fr-FR.js

이 예제에서 모든 스크립트 파일은 스크립트 라이브러리 버전(1.0.0.0)을 사용하여 이름이 지정된 폴더에 있습니다. 또한 이 버전 관련 폴더는 라이브러리의 네임스페이스에 따라 이름이 지정된 폴더에 들어 있습니다. 폴더 내의 스크립트 라이브러리를 네임스페이스 및 버전별로 구성하면 라이브러리에 대해 일부 버전 제어 기능을 제공할 수 있습니다. 또한 라이브러리 간에 스크립트 이름 충돌 문제가 발생하지 않도록 하는 데 도움이 됩니다. 뿐만 아니라 라이브러리 소비자가 파일이 속한 라이브러리 및 라이브러리 버전을 식별할 수 있게 해 줍니다.

지역화에서 ScriptManager 컨트롤의 역할 이해

ScriptManager 컨트롤은 지역화된 스크립트 및 스크립트 리소스를 사용하기 위해 다음과 같은 기능을 제공합니다.

  • 사용자 지정 UI 문화권을 포함하여 지원되는 UI 문화권을 정의할 수 있습니다.

  • 문화권별 어셈블리 특성을 해석하고 브라우저의 UI 문화권(있는 경우)을 자동으로 감지합니다. 그런 다음 어셈블리에서 지역화된 스크립트나 대체 스크립트 및 리소스를 읽습니다. 디버그 모드에서는 파일 이름에 해당 UI 문화권 이름과 ".debug" 문자열이 모두 포함된 스크립트 리소스(예: Sample.debug.fr-FR.resources)에 대한 로드를 시도합니다.

  • 해당 스크립트와 지역화된 리소스를 가리키는 URL을 생성합니다. 또한 보안 수준을 높이기 위해 URL을 암호화합니다.

  • 생성된 URL의 매개 변수에 따라 스크립트 또는 스트립트 리소스를 압축할지 여부를 결정합니다.

  • 브라우저가 스크립트를 무기한 캐시하지 않도록 포함 스크립트가 들어 있는 어셈블리에 타임스탬프를 추가합니다.

자세한 내용은 ScriptManager 클래스 개요를 참조하십시오.

다음 예제에서는 ScriptManager 컨트롤을 사용하여 어셈블리에 있는 클라이언트 컨트롤을 등록하는 웹 페이지의 일부를 보여 줍니다. 포함 스크립트는 AssemblyName 속성을 사용하여 등록됩니다.

<%@ Register TagPrefix="Samples" Namespace="DemoControls" 
  Assembly=" SampleAssembly" %>
<!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 >
  <title>ScriptReference</title>
</head>
<body>
  <form id="form1" >
    <div>
      <asp:ScriptManager ID="ScriptManager1" >
        <Scripts>
          <asp:ScriptReference Assembly="SampleAssembly"
              Name="DemoControls.SampleControl.js" />
        </Scripts>
      </asp:ScriptManager>

      <!-- Additional markup here. -->

    </div>
  </form>
</body>

코드 예제

다음 단원에는 JavaScript 파일 및 리소스를 사용하여 작업을 수행하는 방법을 보여 주는 코드 예제가 나와 있습니다.

방법 및 연습 항목

클래스 참조

다음 표에서는 구성 요소 라이브러리의 지역화에 사용되는 핵심 클래스를 보여 줍니다.

  • ScriptManager
    ASP.NET 서버 페이지에서 AJAX 구성 요소, 부분 페이지 렌더링, 클라이언트 요청 및 서버 응답을 관리합니다.

  • ScriptReference
    어셈블리에 포함되어 있거나 디스크에 있는 JavaScript 파일을 웹 페이지에 사용하기 위해 등록하는 데 필요한 API를 제공합니다.

  • ScriptReferenceCollection
    클라이언트 스크립트 파일을 나타내는 ScriptReference 개체에 액세스할 수 있도록 합니다.

참고 항목

작업

사용자 지정 비시각적 클라이언트 구성 요소 만들기

방법: ASP.NET 웹 사이트의 리소스 파일 만들기(Visual Studio)

방법: 미리 컴파일된 웹 사이트에 사용할 버전 지정 어셈블리 만들기

동적으로 스크립트 참조 할당

개념

ASP.NET 웹 페이지 리소스 개요

참조

리소스 파일 생성기(Resgen.exe)

기타 리소스

리소스를 사용하여 ASP.NET 웹 페이지 지역화