연습: Windows Forms 지역화
Visual Studio 프로젝트 시스템은 Windows Forms 응용 프로그램의 지역화를 위한 많은 기능을 지원합니다. Visual Studio 개발 환경에서 리소스 파일을 만드는 방법은 두 가지가 있습니다.
프로젝트 시스템에서 폼에 사용된 텍스트나 이미지와 같은 지역화할 수 있는 UI 요소의 리소스 파일이 생성되도록 합니다. 이 경우, 생성된 리소스 파일은 위성 어셈블리 안에 빌드됩니다. 이러한 리소스는 폼 기반 리소스라고 합니다.
리소스 파일 템플릿을 추가한 다음 XML 디자이너에서 템플릿을 편집합니다. 이 방법은 대화 상자와 오류 메시지에 표시되는 지역화 가능한 문자열을 만들기 위해 사용합니다. 그런 다음에는 이러한 리소스에 액세스하기 위한 코드를 작성해야 합니다. 이러한 리소스는 프로젝트 리소스라고 합니다.
일반적으로 Windows Forms 응용 프로그램의 폼에만 사용되는 모든 리소스에는 폼 기반 리소스를 사용해야 합니다. 오류 메시지와 같이 폼 기반이 아닌 모든 사용자 인터페이스 문자열 및 이미지에는 프로젝트 리소스를 사용해야 합니다.
참고
일관성을 유지하는 것이 중요하며, 같은 속성에는 폼 기반 리소스나 프로젝트 리소스 중 하나만 사용해야 합니다. PictureBox의 Image 속성과 같은 여러 이미지 속성에서는 프로젝트 리소스의 이미지를 선택할 수도 있고 새 이미지를 폼 기반 리소스로 가져올 수도 있습니다. 프로젝트 리소스를 사용하여 기본 이미지를 설정하고 폼 기반 리소스를 사용하여 이미지의 언어별 버전을 설정하려고 하면 기본 이미지가 표시되지 않습니다.
이 연습에서는 Windows 응용 프로그램 프로젝트 하나를 사용하여 두 가지 방법을 모두 보여 줍니다.
텍스트 파일을 리소스 파일로 변환할 수도 있습니다. 자세한 내용은 텍스트 파일 형식의 리소스 및 Resgen.exe(리소스 파일 생성기)를 참조하십시오.
Visual Studio를 사용하여 자동으로 리소스 파일을 생성하려면
"WindowsApplication1"이라는 새 Windows 응용 프로그램을 만듭니다. 자세한 내용은 방법: 새 Windows Forms 응용 프로그램 프로젝트 만들기를 참조하십시오.
속성 창에서 폼의 Localizable 속성을 true로 설정합니다.
Language 속성은 이미 **(기본값)**으로 설정되어 있습니다.
도구 상자의 Windows Forms 탭에서 Button 컨트롤을 폼으로 끌어 온 다음 Text 속성을 Hello World로 설정합니다.
폼의 Language 속성을 **독일어(독일)**로 설정합니다.
단추의 Text 속성을 Hallo Welt로 설정합니다.
폼의 Language 속성을 **프랑스어(프랑스)**로 설정합니다.
단추의 Text 속성을 Bonjour le Monde로 설정합니다. 필요한 경우 단추 크기를 조정하여 더 긴 문자열을 표시할 수 있습니다.
솔루션을 저장하고 빌드합니다.
솔루션 탐색기에서 모든 파일 표시 단추를 클릭합니다.
리소스 파일이 Form1.vb, Form1.cs 또는 Form1.jsl 아래에 나타납니다. Form1.resx는 주 어셈블리 안에 빌드될 기본 culture용 리소스 파일입니다. Form1.de-DE.resx는 독일에서 사용되는 독일어용 리소스 파일입니다. Form1.fr-FR.resx는 프랑스에서 사용되는 프랑스어용 리소스 파일입니다.
또한 Form1.de.resx와 Form1.fr.resx라는 파일이 생성된 것을 알 수 있습니다. 이들 파일은 Visual SourceSafe에서 프로젝트에 새 파일을 추가해야 하는 문제점을 해결하기 위해 저장 작업 중에 Visual Studio에서 자동으로 생성됩니다. .resx는 리소스가 포함되어 있지 않은 빈 파일입니다.
F5 키를 누르거나 디버그 메뉴에서 시작을 선택합니다.
운영 체제의 UI 언어에 따라 영어, 프랑스어 또는 독일어 인사말이 포함된 대화 상자가 나타납니다.
참고
Windows에서 사용되는 UI 언어는 CurrentUICulture 설정의 기능입니다. 사용자의 Windows에 MUI(다국어 사용자 인터페이스 팩)가 설치된 경우 제어판에서 UI 언어를 변경할 수 있습니다. 자세한 내용은 Windows Server 2003, Windows XP & Windows 2000 MUI 사이트를 참조하십시오. MUI가 설치되어 있지 않은 경우 다음에 설명된 것처럼 프로그래밍 방식으로 현재의 UI culture를 변경할 수 있습니다.
아래에서는 응용 프로그램에서 프랑스어 리소스를 표시하도록 UI culture를 설정하는 방법을 보여 줍니다. 실제 응용 프로그램에서는 이와 같이 UI culture를 하드 코딩하지는 않으며, UI culture에 대한 설정은 사용자 설정이나 응용 프로그램 설정을 따릅니다.
특정 리소스를 표시하도록 UI Culture를 설정하려면
코드 편집기를 사용하여 모듈 시작 부분에서 Form1을 선언하기 전에 아래 코드를 추가합니다.
' Visual Basic Imports System.Globalization Imports System.Threading // C# using System.Globalization; using System.Threading;
다음 코드를 추가합니다. Visual Basic에서는 New 함수에서 InitializeComponent 함수를 호출하기 전에 삽입해야 합니다. Visual C#에서는 Form1에서 InitializeComponent 함수를 호출하기 전에 삽입해야 합니다.
' Visual Basic ' Sets the UI culture to French (France). Thread.CurrentThread.CurrentUICulture = New CultureInfo("fr-FR") // C# // Sets the UI culture to French (France). Thread.CurrentThread.CurrentUICulture = new CultureInfo("fr-FR");
솔루션을 저장하고 빌드합니다.
F5 키를 누르거나 디버그 메뉴에서 시작을 선택합니다.
이제 폼은 항상 프랑스어로 표시됩니다. 앞에서 긴 프랑스어 문자열에 맞도록 단추 크기를 변경한 경우, 프랑스어 리소스 파일에 단추 크기가 그대로 유지되어 있다는 점에 유의하십시오.
수동으로 리소스 파일을 프로젝트에 추가하고 편집하려면
프로젝트 메뉴에서 새 항목 추가를 클릭합니다.
템플릿 상자에서 리소스 파일 템플릿을 선택합니다. 이름 상자에 파일 이름으로 "WinFormStrings.resX"를 입력합니다. WinFormStrings.resx 파일에 영어로 된 대체 리소스가 포함됩니다. 응용 프로그램에서는 UI culture에 대한 좀 더 적합한 리소스를 찾지 못할 경우 이 리소스에 액세스합니다.
솔루션 탐색기를 보면 파일이 프로젝트에 추가되었음을 알 수 있으며, 파일이 XML 디자이너의 데이터 뷰에 자동으로 열립니다.
데이터 테이블 창에서 data를 선택합니다.
Data 창에서 빈 행을 클릭한 다음 name 열에 strMessage를, value 열에 Hello World를 입력합니다.
type 또는 mimetype은 개체에 사용되므로 문자열에 대해서는 지정할 필요가 없습니다. 형식 지정자는 저장되는 개체의 데이터 형식을 보유하고, 개체가 이진 데이터로 구성된 경우에는 저장된 이진 정보의 기본 형식(base64)에 관한 정보가 MIME 형식 지정자에 저장됩니다.
파일 메뉴에서 WinFormStrings.resX 저장을 클릭합니다.
1-5단계를 두 번 더 수행하여 아래 표와 같은 문자열 리소스를 포함하는 WinFormStrings.de-DE.resx와 WinFormStrings.fr-FR.resx라는 두 개의 리소스 파일을 추가로 만듭니다. WinFormStrings.de-DE.resx 파일에는 독일에서 사용하는 독일어 관련 리소스가 포함됩니다. WinFormStrings.fr-FR.resx 파일에는 프랑스에서 사용하는 프랑스어 관련 리소스가 포함됩니다.
리소스 파일 이름
Name
값
WinFormStrings.de-DE.resX
strMessage
Hallo Welt
WinFormStrings.fr-FR.resX
strMessage
Bonjour le Monde
수동으로 추가한 리소스에 액세스하려면
코드 편집기에서 System.Resources 네임스페이스를 코드 모듈의 시작 부분으로 가져옵니다.
' Visual Basic Imports System.Resources // C# using System.Resources;
디자인 뷰에서 단추를 두 번 클릭하여 Click 이벤트 처리기의 코드를 표시한 다음 아래 코드를 추가합니다. ResourceManager 생성자는 두 개의 인수를 사용합니다. 첫 번째 인수는 리소스의 루트 이름(culture와 .resx 접미사가 없는 리소스 파일의 이름)입니다. 두 번째 인수는 주 어셈블리입니다.
이 연습에서는 네임스페이스를 선언하지 않으므로 ResourceManager 생성자의 첫 번째 인수는 ProjectName.ResourceFileRootName 형식이 됩니다. 그러나 실제 응용 프로그램에서는 DefaultNamespace 속성을 설정합니다. 그럴 경우에는 네임스페이스를 포함한 리소스 파일의 정규화된 루트 이름을 사용하여 리소스 관리자를 선언해야 합니다. 예를 들어, 기본 네임스페이스가 MyCompany.MyApplication.MyComponent이면 ResourceManager 생성자의 첫 번째 인수는 MyCompany.MyApplication.MyComponent.WinFormStrings가 됩니다.
' Visual Basic ' Declare a Resource Manager instance. Dim LocRM As New ResourceManager("WindowsApplication1.WinFormStrings", GetType(Form1).Assembly) ' Assign the string for the "strMessage" key to a message box. MessageBox.Show(LocRM.GetString("strMessage")) // C# // Declare a Resource Manager instance. ResourceManager LocRM = new ResourceManager("WindowsApplication1.WinFormStrings",typeof(Form1).Assembly); // Assign the string for the "strMessage" key to a message box. MessageBox.Show(LocRM.GetString("strMessage"));
참고
기본적으로 ResourceManager 개체는 대/소문자를 구분합니다. "TXTWELCOME"과 "txtWelcome"에서 동일한 리소스가 검색될 수 있도록 대/소문자를 구분하지 않고 조회하려면 리소스 관리자의 IgnoreCase 속성을 true로 설정합니다. 그러나 빠른 검색을 위해서는 리소스 이름의 대/소문자를 정확하게 지정하는 것이 좋습니다. 대/소문자를 구분하지 않고 리소스를 조회하면 성능이 저하될 수 있습니다.
폼을 빌드하여 실행합니다. 단추를 클릭합니다.
UI culture 설정에 적합한 문자열이 메시지 상자에 표시됩니다. UI culture에 적합한 리소스가 없으면 대체 리소스에서 가져온 문자열이 표시됩니다.