WPF에서 지역화 하는 방법에는 여러가지가 있다.
첫번째로, WPF 프로젝트에서 기본으로 제공되는 Resources.resx 파일에 문자열들을 추가하여 사용하는 방법.
두번째는 별도의 .resx파일을 추가로 생성하여 사용하는 방법.
세번째는 ResourceDictionary에 문자열을 추가하여 사용하는 방법.
그 외에도 별도의 csv 파일을 사용하는 방법 등 다양하다.
그 중에서 가장 기본인 Resources.resx 파일을 이용한 지역화 방법에 대해 소개하고자 한다.
1. Edit Resources.resx
Visual Studio 에서 WPF 프로젝트를 생성하여 솔루션탐색기를 확인해보자.
생성된 WPF 프로젝트 아래에 Properties 노드가 있고, 이것을 펼쳐보면 Resources.resx 파일이 있다.
Resources.resx 파일을 더블클릭하면 문자열 리소스를 편집할 수 있는 창이 열린다.
‘HelloWorld’ 라는 이름(=키)를 가지는 문자열 리소스를 추가하고 그 값을 ‘Hello, World!’ 라고 설정하였다.
추후 사용시 이 리소스 명을 참조하게 된다.
화면에서 보듯이, 문자열 뿐만아니라 이미지, 아이콘, 오디오 파일 등의 리소스도 지역에 따라 구분하여 사용할 수 있다.
2. Addtional Locale
이젠 다국어 지원을 위하여 새로운 .resx 파일을 추가할 차례이다.
일반적으로 영어권의 리소스 문자열을 Resources.resx 파일에 설정하고,
그 외 지역명에 따라 Resources.ko-KR.resx, Resources.ja-JP.resx 와 같은 네이밍룰을 가지는 .resx 파일을 추가하여 사용한다.
솔루션탐색기에서 ‘새 항목 추가’ 버튼을 눌러 .resx파일을 생성해도 되지만, Resources.resx파일을 복사하여 붙여넣고 이름만 바꾸는 편이 더 수월하다.
복사하여 사용하면 리소스 명을 빼먹는 실수를 할 경우도 적어지며 실제 지역화된 값만 바꾸면 되기 때문이다.
솔루션탐색기에서 Resources.resx 파일을 선택 후, 우리가 자주 사용하던 Ctrl+C, Ctrl+V 를 누르자.
‘Resources – 복사본.resx’ 이라는 파일이 생성되었고, 이름을 ‘Resources.ko-KR.resx’로 변경한다.
그리고 ‘HelloWorld’ 라는 리소스의 값을 ‘안녕, 월드!’ 라고 변경한다.
이로써 지역화 문자열을 사용하기 위한 준비가 모두 끝났다.
다양한 지역을 추가하기 위해선 그저 Ctrl+C, Ctrl+V, F2(이름변경) 이 전부이다.
3. Using
사용할 문자열이 준비되었으면 이제 사용법을 확인할 차례이다.
WPF 에서는 기본적으로 System.Resources.ResourceManager 라는 클래스를 이용하여 Resources.resx를 사용할 수 있게 [프로젝트명].Properties.Resources 클래스를 제공한다.
이 클래스를 이용하여 Xaml 또는 C# 코드에서 지역화 문자열 리소스를 사용할 수 있다.
Xaml에서 Resources 를 참조하는 방법과 C#에서 사용하는 방법이 있다.
3.1. use in Xaml
xaml 파일, 즉 View에서 지역화된 문자열을 사용하는 방법이다.
일단 사용하고자 하는 Xaml파일(MainWindows.xaml)에 Namespace를 추가해야 한다. 나는 prop 라는 Namespace를 추가하였다. Xaml에서 Namespace를 추가하는 방법/형식은 MSDN을 참고하자.
그리고 지역화 문자열을 표시하기 위하여 TextBlock를 하나 추가하고, Text에 아래와 같이 작성한다.
Static 데이터인 prop네임스페이스를 가지는 Resources 클래스의 HelloWorld를 표시한다는 내용이다.
<Window x:Class="MyLocalization.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:MyLocalization" xmlns:prop="clr-namespace:MyLocalization.Properties" mc:Ignorable="d" Title="MainWindow" Height="350" Width="525"> <Grid> <TextBlock Text="{x:Static prop:Resources.HelloWorld}"/> </Grid> </Window>
..아직 끝난게 아니다..
다시 Resources.resx 파일을 열어 확인해 보면 ‘엑세스 한정자‘가 ‘Internal’ 로 되어있다. 이 값을 ‘Public‘으로 변경해야 Xaml에서 정상적으로 동작한다.
엑세스 한정자 변경을 하지않아 엄청난 삽질을 한 경험이 있으니 반드시 기억하길 바란다.
3.2. use in C#
C# 코드에서 지역화된 문자열을 사용하는 방법은 더 간단하다. Resources.HelloWorld 속성이 static 이기 때문에 원하는 부분에 그대로 작성하면 된다.
<Window x:Class="MyLocalization.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:d="http://schemas.microsoft.com/expression/blend/2008" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" xmlns:local="clr-namespace:MyLocalization" xmlns:prop="clr-namespace:MyLocalization.Properties" mc:Ignorable="d" Title="MainWindow" Height="350" Width="525"> <Grid> <TextBlock x:Name="txtBlock"/> </Grid> </Window>
using System.Windows; namespace MyLocalization { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); txtBlock.Text = MyLocalization.Properties.Resources.HelloWorld; } } }
4. 실행
이제 실행해보자. 현재 Windows의 지역설정에 해당하는 리소스가 로드되어 화면에 텍스트가 표시된다.
나는 한국어 버전의 Windows를 사용하고 있기 때문에 (정확히는 ‘제어판’-‘국가 또는 지역’에서 한국어로 설정되었기 때문에) ‘안녕, 월드!’ 라고 표시된다.
만약 내가 영어 버전의 Windows를 사용했었다면 ‘Hello, World!’ 라고 표시되었을 것이다.
해당 지역의 리소스가 포함되지 않았을 경우에는 기본 리소스인 Resources.resx의 문자열이 표시된다.
간단하게 확인해 보려면, Resources 클래스의 Culture 속성을 변경하면 된다.
정상적으로 영어가 나오는지 확인하기 위하여 ‘en-US’로 변경해 보겠다.
public partial class App : Application { public App() { MyLocalization.Properties.Resources.Culture = new System.Globalization.CultureInfo("en-US"); } }
뭐, 정확히는 Resources.en-US.resx 파일이 없어서 기본 리소스인 Resources.resx의 문자열이 표시되었지만, 그래도 지역화가 정상적으로 동작한다는 사실을 알 수 있다.