다음을 통해 공유


특정 문화권의 리소스 찾기 및 사용

업데이트: 2010년 5월

공용 언어 런타임에서는 위성 어셈블리에서 패키지되고 배포된 문화권 관련 리소스를 검색하기 위한 지원을 제공합니다. 위성 어셈블리는 리소스 파일 또는 .gif와 같은 간단한 리소스 파일만 포함하며 실행 코드는 포함하지 않습니다.

위성 어셈블리 배포 모델을 사용하여 하나의 기본 어셈블리(주 어셈블리)와 여러 개의 위성 어셈블리를 가지는 응용 프로그램을 만듭니다. 기본 또는 중립 문화권의 리소스를 주 어셈블리와 함께 패키지하고 응용 프로그램에서 지원하는 각 언어에 대해 별도의 위성 어셈블리를 만듭니다. 위성 어셈블리는 주 어셈블리의 일부가 아니므로 응용 프로그램의 주 어셈블리를 바꾸지 않고도 특정 문화권에 해당하는 리소스를 손쉽게 바꾸거나 업데이트할 수 있습니다.

예를 들어 간단한 "Hello world" 응용 프로그램에서 기본 또는 중립 문화권이 "en"(영어)이면 Greeting이라는 리소스를 만들어 값이 "Hello world!"인 HelloString이라는 단일 문자열에 저장할 수 있습니다. "en"이 응용 프로그램의 기본 문화권임을 나타내려면 다음 System.Resources.NeutralResourcesLanguageAttribute 특성을 응용 프로그램의 AssemblyInfo 파일이나 응용 프로그램의 주 어셈블리로 컴파일될 소스 코드 파일 중 하나에도 추가해야 합니다.

<Assembly: NeutralResourcesLanguageAttribute("en")>

그런 다음 추가 문화권에 대한 지원을 응용 프로그램에 추가합니다. 예를 들어 "en-US", "fr-FR" 및 "ru-RU" 문화권을 다음과 같이 지원할 수 있습니다.

  • "en-US" 또는 영어(미국) 문화권을 지원하려면 Greeting.en-US.resx라는 리소스 파일을 만들어 값이 "Hi world!"인 HelloString이라는 단일 문자열에 저장합니다.

  • "fr-FR" 또는 프랑스어(프랑스) 문화권을 지원하려면 Greeting.fr-FR.resx라는 리소스 파일을 만들어 값이 "Salut tout le monde!"인 HelloString이라는 단일 문자열에 저장합니다.

  • "ru-RU" 또는 러시아어(러시아) 문화권을 지원하려면 Greeting.ru-RU.resx라는 리소스 파일을 만들어 값이 "Всем привет!"인 HelloString이라는 단일 문자열에 저장합니다.

System.Resources.ResourceManager 클래스를 통해 런타임에 문화권별 리소스에 액세스할 수 있으며, 리소스 대체(fallback) 프로세스를 사용하여 응용 프로그램에서 리소스를 검색하는 방법을 제어할 수 있습니다. 자세한 내용은 리소스 패키징 및 배포 항목의 "리소스 대체(fallback) 프로세스" 단원을 참조하십시오.

ResourceManager 개체는 현재 스레드의 CultureInfo.CurrentUICulture 속성에 따라 검색할 리소스를 결정합니다. 예를 들어 주 어셈블리에 기본 영어 리소스가 사용되고 두 위성 어셈블리에 프랑스어(프랑스) 및 러시아어(러시아) 리소스가 사용되는 응용 프로그램을 컴파일한 경우 CurrentUICulture 속성을 "fr-FR"로 설정하면 ResourceManager 개체가 프랑스어 리소스를 검색합니다.

CurrentUICulture 속성은 명시적으로나 암시적으로 설정할 수 있습니다. 이 속성을 설정하는 방법은 ResourceManager 개체가 문화권에 따라 리소스를 검색하는 방법에 영향을 줍니다.

  • 응용 프로그램이 응용 프로그램 코드에서 CurrentUICulture 속성을 특정 문화권으로 명시적으로 설정하면 사용자의 브라우저나 운영 체제 언어와 관계없이 항상 해당 문화권의 리소스가 검색됩니다. 기본 영어 리소스 및 영어(미국), 프랑스어(프랑스) 및 러시아어(러시아) 리소스를 포함하는 세 개의 위성 어셈블리로 컴파일된 응용 프로그램의 경우, CurrentUICulture 속성을 "fr-FR"로 설정하면 ResourceManager 개체는 사용자의 운영 체제 언어가 프랑스어가 아닌 경우에도 항상 프랑스어(프랑스) 리소스를 검색합니다. 이 속성을 명시적으로 설정하기 전에 이 동작이 바람직한지 검토해야 합니다.

    참고

    ASP.NET 응용 프로그램에서는 서버의 설정이 들어오는 클라이언트 요청과 일치할 가능성이 거의 없으므로 CurrentUICulture 속성을 명시적으로 설정해야 합니다.ASP.NET 응용 프로그램은 CurrentUICulture 속성을 사용자 브라우저가 허용하는 언어로 명시적으로 설정할 수 있습니다.

  • 응용 프로그램에서 CurrentUICulture 속성을 명시적으로 설정하지 않으면 Windows 2000 및 Windows XP에서 GetUserDefaultUILanguage 함수에 의해 이 속성이 암시적으로 설정됩니다. 이 함수는 사용자가 기본 언어를 설정할 수 있도록 하는 MUI(Multilingual User Interface)에서 제공됩니다. 사용자가 UI 언어를 설정하지 않았으면 UI 언어는 운영 체제 리소스의 언어인 시스템 설치 언어로 기본적으로 설정됩니다.

다음 예제에서는 CurrentUICulture 속성을 명시적으로 설정합니다. 이 예제에서는 간단한 "Hello world" 응용 프로그램에 대한 지원되는 문화권의 이름을 포함하는 배열을 정의한 다음 이러한 문화권 이름 중 하나를 임의로 선택하여 CultureInfo 개체를 인스턴스화한 후 해당 문화권을 현재 스레드의 현재 문화권으로 설정합니다. 또한 MessageBox.Show 메서드(C# 예제의 경우) 또는 Interaction.MsgBox 함수(Visual Basic 예제의 경우)를 호출하여 HelloString 리소스에 할당된 지역화된 문자열을 표시합니다.

Imports System.Globalization
Imports System.Resources
Imports System.Threading

Module Module1

   Sub Main()
      ' Create array of supported cultures
      Dim cultures() As String = {"en-CA", "en-US", "fr-FR", "ru-RU" }
      Dim rnd As New Random()
      Dim cultureNdx As Integer = rnd.Next(0, cultures.Length)
      Dim originalCulture As CultureInfo = Thread.CurrentThread.CurrentCulture

      Try
         Dim newCulture As New CultureInfo(cultures(cultureNdx))
         Thread.CurrentThread.CurrentCulture = newCulture
         Thread.CurrentThread.CurrentUICulture = newCulture
         Dim greeting As String = String.Format("The current culture is {0}.{1}{2}",
                                                Thread.CurrentThread.CurrentUICulture.Name,
                                                vbCrLf, My.Resources.Greetings.HelloString)

         MsgBox(greeting)
      Catch e As CultureNotFoundException
         Console.WriteLine("Unable to instantiate culture {0}", e.InvalidCultureName)
      Finally
         Thread.CurrentThread.CurrentCulture = originalCulture
         Thread.CurrentThread.CurrentUICulture = originalCulture
      End Try
   End Sub
End Module
using System;
using System.Globalization;
using System.Reflection;
using System.Resources;
using System.Threading;
using System.Windows.Forms;

class Program
{
   static void Main()
   {
      // Create array of supported cultures
      string[] cultures = {"en-CA", "en-US", "fr-FR", "ru-RU"};
      Random rnd = new Random();
      int cultureNdx = rnd.Next(0, cultures.Length);
      CultureInfo originalCulture = Thread.CurrentThread.CurrentCulture;

      try {
         CultureInfo newCulture = new CultureInfo(cultures[cultureNdx]);
         Thread.CurrentThread.CurrentCulture = newCulture;
         Thread.CurrentThread.CurrentUICulture = newCulture;
         ResourceManager rm = new ResourceManager("LocatingCS1.Greetings", Assembly.GetExecutingAssembly()); 
         string greeting = String.Format("The current culture is {0}.\n{1}",
                                         Thread.CurrentThread.CurrentUICulture.Name,
                                         rm.GetString("HelloString"));

         MessageBox.Show(greeting);
      }
      catch (CultureNotFoundException e) {
         Console.WriteLine("Unable to instantiate culture {0}", e.InvalidCultureName);
      }
      finally {
         Thread.CurrentThread.CurrentCulture = originalCulture;
         Thread.CurrentThread.CurrentUICulture = originalCulture;
      }
   }
}

참고 항목

개념

응용 프로그램의 리소스

위성 어셈블리의 리소스 검색

Resources in ASP.NET Applications

기타 리소스

인코딩 및 지역화

변경 기록

날짜

변경 내용

이유

2010년 5월

광범위하게 수정되었습니다.

고객 의견