지역화란 특정 문화권이나 로캘에 맞도록 응용 프로그램을 사용자 지정하는 것입니다. 지역화는 주로 사용자 인터페이스를 특정 문화권이나 로캘의 언어로 번역하는 작업으로 구성되어 있습니다. 응용 프로그램 지역화에는 각 대상 문화권이나 로캘의 사용자에게 적합하고 문화권과 로캘에 따라 동적으로 검색할 수 있는 별도의 리소스 집합(예: 문자열 및 이미지)을 만드는 작업이 포함됩니다.
이 항목에는 다음과 같은 단원이 포함되어 있습니다.
.NET Framework for Silverlight에서는 허브와 스포크 모델을 사용하여 리소스를 패키지하고 배포합니다. 허브는 지역화할 수 없는 실행 코드와 중립 또는 기본 문화권이라고 하는 단일 문화권의 리소스를 포함하는 주 어셈블리입니다. 기본 문화권은 응용 프로그램의 대체 문화권입니다. 기본 문화권은 기본 언어가 영어인 경우 "en"이나 기본 언어가 프랑스어인 경우 "fr"과 같은 지역 중립 언어를 나타냅니다. 스포크는 위성 어셈블리에 연결되고 각 위성 어셈블리는 지원되는 단일 문화권의 리소스를 포함하지만 코드는 포함하지 않습니다. 런타임에 리소스는 CultureInfo.CurrentUICulture 속성에 정의된 응용 프로그램의 현재 UI(사용자 인터페이스) 문화권 값에 따라 적절한 리소스 파일에서 로드됩니다.
리소스의 계층적 구성
지역화된 리소스가 계층 방식으로 구성되어 있다고 가정하면 이러한 리소스가 로드되는 방식을 쉽게 이해할 수 있습니다. 지역화된 응용 프로그램은 세 가지 수준에서 리소스 파일을 포함할 수 있습니다.
-
계층의 맨 위에는 영어("en")와 같은 기본 문화권의 대체 리소스가 있습니다. 이들은 고유한 파일을 갖지 않는 유일한 리소스로서, 주 어셈블리에 저장됩니다.
-
두 번째 수준에는 지역 중립 문화권의 리소스가 있습니다. 지역 중립 문화권은 지역이 아니라 언어와 연결되어 있습니다. 예를 들어, 프랑스어("fr")는 언어 중립 문화권입니다.
-
계층의 맨 아래에는 특정 문화권의 리소스가 있습니다. 특정 문화권은 언어 및 지역과 연결되어 있습니다. 예를 들어, 프랑스어(캐나다)("fr-CA")는 특정 culture입니다.
응용 프로그램에서 지역화된 리소스를 로드하려고 하면 리소스 관리자가 다음을 수행합니다.
-
사용자의 특정 문화권에 속한 리소스를 로드하려고 합니다. 특정 문화권의 위성 어셈블리가 없거나 위성 어셈블리에서 리소스를 찾을 수 없으면 리소스 검색의 2단계가 계속됩니다.
-
특정 문화권의 위성 어셈블리가 없거나 위성 어셈블리에서 리소스를 찾을 수 없는 경우 또는 운영 체제 대체 논리에서 정의된 문화권의 리소스를 찾을 수 없는 경우에는 리소스 관리자가 현재 UI 문화권의 부모(언어 중립 문화권)에 대한 위성 어셈블리에서 리소스 로드를 시도합니다.
-
운영 체제에서 기본 설정 대체 언어의 목록을 제공하는 경우 리소스 관리자가 목록을 반복하면서 일치하는 것을 찾을 때까지 각 문화권의 리소스 로드를 시도합니다. 일치하는 것이 없거나 운영 체제에서 대체 논리를 지원하지 않는 경우 다음 단계로 계속합니다.
-
위성 어셈블리가 없거나 위성 어셈블리에서 리소스를 찾을 수 없으면 리소스 관리자가 System.Resources.NeutralResourcesLanguageAttribute 클래스에 지정된 어셈블리에서 대체 리소스를 로드합니다.
-
리소스를 찾을 수 없으면 고정 문화권의 리소스가 사용됩니다.
중요:
|
|---|
|
특정 문화권이나 언어 중립 문화권의 위성 어셈블리에 리소스를 저장할지 여부를 결정할 때 최대한 일반화하는 것이 좋습니다. 예를 들어, 프랑스어(프랑스) 문화권("fr-FR")의 응용 프로그램을 지역화하는 경우 언어 중립 문화권의 위성 어셈블리에 프랑스어 문화권에 일반적인 리소스를 모두 저장하는 것이 좋습니다. 이렇게 하면 프랑스어(캐나다) 문화권("fr-CA") 등의 다른 프랑스어 문화권의 사용자가 기본 문화권의 리소스 대신 지역화된 리소스에 액세스할 수 있습니다. |
Silverlight 기반 응용 프로그램에 리소스 포함
리소스 파일의 이름을 제대로 지정하고 프로젝트를 적절하게 구성한 경우 Visual Studio와 .NET Framework 공용 언어 런타임은 리소스 파일을 컴파일하고 사용자의 현재 문화권에 적절한 리소스를 로드하는 작업의 대부분을 처리합니다. 응용 프로그램에 지역화된 리소스 파일을 포함시키는 방법에 대한 자세한 내용은 방법: Sliverlight 기반 응용 프로그램에 리소스 추가를 참조하십시오.
지역화된 리소스 파일을 응용 프로그램에 추가한 후 ResourceManager 클래스를 사용하여 문자열 리소스를 검색할 수 있습니다. 다음 예제에서는 Greeting이라는 문자열을 검색하는 방법을 보여 줍니다. Visual Basic 코드에서는 ResourceManager 메서드 호출을 래핑하는 My.Resources 클래스를 사용합니다. ResourceManager 클래스를 사용할 때 현재 UI 문화권의 리소스가 아닌 지역화된 리소스를 검색하려는 경우가 아니면 검색할 리소스를 지정할 필요가 없습니다. 런타임에서는 현재 스레드의 CultureInfo.CurrentUICulture 속성에 따라 올바른 리소스를 자동으로 검색하려고 합니다. 현재 문화권의 문화권별 리소스를 찾을 수 없는 경우 런타임에서는 리소스의 계층적 구성에서 설명하는 방법을 사용하여 리소스를 제공합니다.
Dim greeting As String = My.Resources.StringLibrary.Greeting
ResourceManager rm = null; rm = new ResourceManager("SilverlightApplication.StringLibrary", Assembly.GetExecutingAssembly()); string greeting = rm.GetString("Greeting");
프로젝트가 컴파일될 때 기본 문화권의 리소스가 .xap 파일에 포함된 Silverlight 기반 응용 프로그램의 주 어셈블리에 포함됩니다. 또한 프로젝트 파일에서 SupportedCultures> 속성에 지정된 각 문화권의 위성 어셈블리도 응용 프로그램의 .xap 파일에 포함됩니다. 각 위성 어셈블리는 AppManifest.xml 파일의 <Deployment.Parts> 섹션에도 표시됩니다.
응용 프로그램의 .xap 파일에서 각 위성 어셈블리는 응용 프로그램 디렉터리의 하위 디렉터리에 패키지됩니다. 개별 위성 어셈블리는 모두 applicationName.Resources.dll로 이름이 지정되어 위성 어셈블리의 리소스가 나타내는 문화권을 지정하는 이름의 하위 디렉터리에 저장됩니다. 예를 들어, 독일어(독일) 문화권("de-DE")의 리소스는 de-DE 하위 디렉터리에 저장됩니다.
이 방법에서는 Silverlight 기반 응용 프로그램의 지역화 가능한 리소스를 모두 포함하는 다운로드를 만듭니다. 응용 프로그램이 여러 문화권에 대해 지역화되었거나 지역화된 리소스의 크기가 큰 경우 이 배포 방법을 사용하면 응용 프로그램의 크기가 커지고 다운로드 시간이 길어집니다. 이 방법 대신 특정 문화권을 대상으로 하는 Silverlight 기반 응용 프로그램의 개별 버전을 만들 수 있습니다.
XAML을 지역화할 수 있게 만들기
응용 프로그램을 지역화할 수 있게 만들려면 응용 프로그램의 XAML에 정의되는 문자열을 수정해야 합니다. 예를 들어 응용 프로그램에 다음과 같이 정의된 Button 컨트롤이 있을 수 있습니다:
<Button Content="Click Me!" />
한 가지 정적 문자열을 제공하는 대신 XAML을 지역화할 수 있게 만들어서 Button 컨트롤에 표시되는 텍스트에 사용자의 문화권이 반영되게 할 수 있습니다.
XAML을 지역화할 수 있게 만드는 것은 코드를 지역화하는 것과 비슷합니다. 즉, 모든 지역화 가능한 문자열을 별도의 리소스(.resx) 파일에 넣고 해당 파일에서 문자열을 추출하는 XAML 코드를 사용합니다. 문자열을 추출하려면 {Binding} 태그 확장을 사용하여 Visual Studio에서 리소스 파일에 대해 생성되는 강력한 형식의 래퍼에 XAML 속성을 바인딩합니다. 자세한 내용은 방법: XAML 콘텐츠를 지역화할 수 있게 만들기를 참조하십시오.
XML 콘텐츠, 서식 있는 텍스트, 문자열이 아닌 값 및 비종속성 속성을 지역화할 수 있게 만들 수도 있습니다. 이러한 시나리오에 대해서는 이 항목의 끝에 있는 참고 항목 단원에 나열된 항목을 참조하십시오.
브라우저 외부에서 실행하는 지역화된 응용 프로그램을 지원하려면 응용 프로그램에서 지원하는 지역화된 문화권 또는 로캘마다 새 .xap 파일을 만들어야 합니다. Visual Studio에서는 새 빌드 구성을 만들어 이 작업을 수행할 수 있습니다. 자세한 내용은 이 항목의 뒷부분에 나오는 대상으로 지정된 지역화된 응용 프로그램 배포를 참조하십시오.
참고:
|
|---|
|
브라우저 외부 실행 응용 프로그램 개발에 대한 자세한 내용은 브라우저 외부 실행 지원 및 방법: 브라우저 외부 실행 지원을 위해 응용 프로그램 구성을 참조하십시오. |
브라우저 외부 실행 응용 프로그램의 창 제목, 바로 가기 이름 및 설명을 지역화할 수 있게 만들 수도 있습니다. 일반적으로 브라우저 외부 실행 응용 프로그램은 응용 프로그램의 OutOfBrowserSettings.xml 구성 파일에서 창 설정을 검색합니다. 응용 프로그램의 창 설정을 지역화하려면 지원하는 문화권별로 고유한 OutOfBrowserSettings.xml 파일을 만듭니다. 예를 들어 프랑스어(프랑스) 문화권에 대한 응용 프로그램을 지역화할 경우 OutOfBrowserSettings.fr-FR.xml 파일을 만듭니다. 그런 다음 새 설정 파일을 사용하도록 프로젝트 설정을 수정할 수 있습니다. 자세한 내용은 방법: 브라우저 외부 실행 응용 프로그램에 대한 정보 지역화을 참조하십시오.
변환된 문자열이 원본 문자열보다 화면에서 공간을 더 많이 차지할 수 있습니다. Silverlight 기반 응용 프로그램을 영어로 개발하여 지역화할 경우 일부 언어의 문자열이 영어보다 약 40% 더 길다는 사실을 고려해야 합니다. 따라서 지역화된 텍스트를 포함하는 요소에 대해 자동 레이아웃을 사용하는 것이 좋습니다. 고려할 사항은 다음과 같습니다.
-
하드 코딩된 크기와 위치를 사용하는 Canvas 컨트롤을 금지합니다. 대신 자동 레이아웃을 지원하는 Grid 컨트롤, StackPanel 또는 다른 패널 요소를 사용합니다.
-
긴 문자열의 경우 TextBlock 컨트롤에서 TextWrapping="Wrap"을 설정합니다.
-
TextBlock 컨트롤의 Height 및 Width 속성은 설정하지 말고 Silverlight 런타임에서 크기를 자동으로 결정하게 합니다. Height 또는 Width 속성을 설정하고 Silverlight에서 다른 속성을 자동으로 계산하게 할 수도 있습니다. 이렇게 하려면 TextWrapping="Wrap"을 설정해야 합니다.
동일한 유니코드 문자가 언어에 따라 다르게 표시되므로 중국어, 일본어 및 한국어 텍스트를 제대로 표시하려면 Silverlight에서 표시할 언어를 알아야 합니다. Silverlight에서는 FrameworkElement.Language 속성 또는 xml:lang 특성으로부터 언어를 결정합니다. XAML이 단일 언어에만 적용되는 경우 파일의 맨 위에서 속성을 쉽게 설정할 수 있습니다. 아래 예에서는 언어를 일본어로 설정합니다.
<UserControl Language="ja-JP" />
XAML을 지역화할 수 있게 만들려면 Language 속성을 지역화된 값으로 설정합니다. 이렇게 하려면 리소스 파일에 Language와 같은 항목을 만들고 지역화된 언어 또는 문화권의 이름을 해당 항목에 값으로 할당합니다. 다른 속성을 지역화할 때와 같은 방법으로 {Binding} 태그 확장을 사용하도록 XAML을 변경합니다. 예를 들면 다음과 같습니다.
<UserControl Language="{Binding Path=SilverlightApp.Language,
Source={StaticResource LocalizedStrings}}"
대부분의 경우 사용자가 지역화된 위성 어셈블리의 전체 집합에 있는 리소스 대신 중립 및 특정 문화권의 리소스만 포함된 Silverlight 기반 응용 프로그램을 다운로드하게 합니다. Visual Studio를 사용하여 응용 프로그램의 위성 어셈블리 중 지정된 하위 집합을 포함하는 지역화된 Silverlight 기반 응용 프로그램을 만들 수 있습니다. 자세한 내용은 방법: 특정 문화권을 대상으로 하는 빌드 만들기를 참조하십시오. 그런 다음 ASP.NET을 사용하여 사용자의 문화권에 따라 응용 프로그램을 배포할 수 있습니다.
사용자의 문화권 결정
지역화된 리소스가 포함된 .xap 파일의 집합을 만든 후 사용자가 해당 문화권에 적합한 Silverlight 기반 응용 프로그램의 버전을 다운로드할 수 있게 해야 합니다. 이렇게 하는 방법은 여러 가지입니다. 예를 들어, 사용자가 포털 페이지에서 언어를 선택할 수 있게 하거나, 사용자 요청에서 헤더를 읽고 사용자를 지역화된 응용 프로그램으로 리디렉션하거나, 응용 프로그램의 지역화된 버전을 포함하도록 사용자에게 제공되는 HTML 페이지를 동적으로 수정할 수 있습니다.
다음 예제에서는 가능한 한 가지 구현 방법을 보여 줍니다. 사용자가 포털 페이지를 요청하는 경우 ASP.NET 페이지의 현재 문화권과 현재 UI 문화권이 사용자의 브라우저 설정에 있는 언어 기본 설정과 일치하도록 자동으로 설정됩니다. Silverlight 기반 응용 프로그램의 지역화된 버전을 해당 언어에 사용할 수 있는 경우 사용자가 해당 응용 프로그램으로 리디렉션됩니다. 그렇지 않은 경우 사용자의 지역 중립 문화권에 대한 Silverlight 기반 응용 프로그램을 사용할 수 있으면 사용자가 해당 응용 프로그램으로 리디렉션되고, 그렇지 않으면 사용자가 기본 문화권에 대한 응용 프로그램으로 리디렉션됩니다. 이 예제에서는 ASP.NET 페이지의 Page 탭에 UICulture="auto" 특성이 포함되어 있어야 합니다.
Imports System.Globalization Imports System.Threading Partial Class _Default Inherits System.Web.UI.Page Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load ' Create array of available languages. Dim availableCultures() As String = {"fr-FR", "en-US"} Dim availableNeutralCultures() As String = {"fr", "en"} Dim url As String = "TestPage.html" ' Get user's language preferences. Dim currentUi As CultureInfo = Thread.CurrentThread.CurrentUICulture ' Redirect if user language preference is available. For Each culture As String In availableCultures If culture = currentUi.Name Then Response.Redirect(culture + "/" + url) Next ' Get user's neutral culture. Dim neutralCulture As CultureInfo = currentUi.Parent ' Determine if neutral culture is supported. For Each culture As String In availableNeutralCultures If culture = neutralCulture.Name Then Response.Redirect(culture + "/" + url) Next ' Fall through to non-localized version of application. Response.Redirect(url) End Sub End Class
using System; using System.Globalization; using System.Net; using System.Threading; using System.Web; using System.Web.UI; public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { // Create array of available languages. string[] availableCultures = {"fr-FR", "en-US"}; string[] availableNeutralCultures = { "fr", "en" }; string url = "TestPage.html"; // Get user's language preferences. CultureInfo currentUi = Thread.CurrentThread.CurrentUICulture; // Redirect if user language preference is available. foreach (string culture in availableCultures) { if (culture == currentUi.Name) Response.Redirect(culture + "/" + url); } // Get user's neutral culture. CultureInfo neutralCulture = currentUi.Parent; // Determine if neutral culture is supported. foreach (string culture in availableNeutralCultures) { if (culture == neutralCulture.Name) Response.Redirect(culture + "/" + url); } // Fall through to non-localized version of application. Response.Redirect(url); } }
경우에 따라 사용자의 현재 문화권이 아닌 문화권에서 리소스를 검색할 수 있습니다. 다음 두 가지 방법을 사용하여 이를 수행할 수 있습니다.
-
다음과 같은 매개 변수를 추가하여 HTML 페이지에서 응용 프로그램을 로드하는 작업을 담당하는 Object 태그에서 Silverlight 기반 응용 프로그램의 현재 문화권과 현재 UI 문화권을 설정할 수 있습니다.
<param name="uiculture" value="pt-BR" /> <param name="culture" value="pt-BR" />
이 경우 pt-BR 문화권이 클라이언트에서 지원되면 uiculture 및 culture의 값을 사용하여 Silverlight 기반 응용 프로그램의 스레드 문화권이 "pt-BR"로 초기화됩니다. culture 또는 uiculture 매개 변수의 값이 auto이거나 이러한 매개 변수가 없는 경우 현재 문화권과 현재 UI 문화권은 기본적으로 브라우저에서 실행되는 클라이언트 운영 체제에서 정의된 값이 됩니다.
-
일반적으로 응용 프로그램의 Application.Startup 이벤트 처리기에서 지정된 문화권을 나타내는 CultureInfo 개체를 System.Threading.Thread.CurrentThread.CurrentUICulture 속성에 할당하여 현재 문화권과 현재 UI 문화권을 프로그래밍 방식으로 설정할 수 있습니다. 다음 예제에서는 이 작업을 수행하는 방법을 보여 줍니다. 이 예제에서는 문화권 이름의 배열을 만들고 임의로 하나를 선택한 다음 해당 이름을 사용하여 응용 프로그램의 현재 UI 문화권을 설정합니다.
Visual BasicPrivate Sub Application_Startup(ByVal o As Object, ByVal e As StartupEventArgs) Handles Me.Startup ' Create an array of culture names. Dim cultureStrings() As String = {"en-US", "fr-FR", "ru-RU", "en-GB"} ' Get a random integer. Dim rnd As New Random() Dim index As Integer = rnd.Next(0, cultureStrings.Length) ' Set the current culture and the current UI culture. Thread.CurrentThread.CurrentCulture = New CultureInfo(cultureStrings(index)) Thread.CurrentThread.CurrentUICulture = New CultureInfo(cultureStrings(index)) Me.RootVisual = New Page() End Sub
C#private void Application_Startup(object sender, StartupEventArgs e) { // Create an array of culture names. string[] cultureStrings = { "en-US", "fr-FR", "ru-RU", "en-GB", "fr-BE", "de-DE" }; // Get a random integer. Random rnd = new Random(); int index = rnd.Next(0, cultureStrings.Length); // Set the current UI culture. Thread.CurrentThread.CurrentCulture = new CultureInfo(cultureStrings[index]); Thread.CurrentThread.CurrentUICulture = new CultureInfo(cultureStrings[index]); // Load the main control this.RootVisual = new Page(); }
리소스별로 문화권별 리소스를 검색할 수도 있습니다. 이렇게 하려면 리소스 검색 메서드를 호출할 때 검색할 리소스에 대한 문화권을 지정합니다. 예를 들어, 응용 프로그램의 현재 문화권이 영어(영국)("en-GB")일 때 스페인어(스페인) 문화권("es-ES")에 대한 문자열을 검색하려면 ResourceManager.GetString(String) 메서드 대신 ResourceManager.GetString(String, CultureInfo) 메서드를 호출합니다. 이와 마찬가지로 이미지나 다른 이진 리소스를 검색하려면 ResourceManager.GetObject(String) 메서드 대신 ResourceManager.GetObject(String, CultureInfo) 메서드를 호출합니다.
중요:
참고: