TOC

This article is currently in the process of being translated into Korean (~94% done).

WPF application:

Application Culture / UICulture

WPF 응용프로그램에서 숫자나 날짜를 가지고 몇몇 작업을 수행하는 경우에 이번 글을 통해 유용한 정보를 확인할 수 있게 될 것입니다. 숫자 또는 날짜 정보는 응용프로그램을 실행하는 컴퓨터의 특정 언어 설정에 기반하여 자동으로 변환됩니다. 당신이 영어권에 산다면 이러한 기능에 대해 크게 와닿지 않겠지만, 그 외에 다양한 언어를 사용하는 환경에서는 이러한 기능이 큰 도움이 될 것입니다.

아직 당신이 "숫자나 날짜와 등 간단한 정보에 대해서 해당 지역에 따른 형식화 작업을 할 때 많은 차이가 있을 수 없다"고 생각한다면, 이 샘플 응용프로그램을 살펴보는 것을 권유합니다. 미국, 독일, 스웨덴에서 각자 선호하는 방식에 따라 동일한 숫자와 날짜 정보를 형식화했습니다.

보시다시피 어떻게 날짜와 숫자 정보를 표현하느냐에 따라 미묘한 차이가 많이 있다는 것을 알 수 있습니다. 다행히 .NET 프레임워크는 이런 것에 도움을 줄 수 있습니다. 실제로는 이미 그렇게 수행되고 있습니다. 기본적으로 날짜나 숫자 정보는 응용프로그램이 동작하는 컴퓨터의 설정에 따라 올바른 형식으로 보여줍니다. 하지만 이런 기능이 항상 동작하지는 않습니다. 그렇다고 걱정할 필요는 없습니다. 쉽게 풀어갈 수 있습니다. 해결하기 위한 방법은 모두 CultureInfo 클래스 사용에 있습니다. 더 자세한 정보는 C# Tutorial article on CultureInfo에서 확인할 수 있습니다. 여기서는 당신의 WPF 응용프로그램에 어떻게 적용하는지에 대해 다뤄보겠습니다.

Ad-hoc formatting

당신이 만약 특정 정보, 가령 단일 Label의 내용에 서식을 지정해야하는 경우라면 ToString() 메소드(함수)와 CultureInfo 클래스를 조합하여 바로 쉽게 적용할 수 있습니다. 예를 들어 위의 예제는 아래 코드처럼 각기 다른 문화권(언어권) 형식을 지정하였습니다.

double largeNumber = 123456789.42;

CultureInfo usCulture = new CultureInfo("en-US");
CultureInfo deCulture = new CultureInfo("de-DE");
CultureInfo seCulture = new CultureInfo("sv-SE");

lblNumberUs.Content = largeNumber.ToString("N2", usCulture);
lblNumberDe.Content = largeNumber.ToString("N2", deCulture);
lblNumberSe.Content = largeNumber.ToString("N2", seCulture);

이 방법은 직접 특정 서식을 지정하기 위해 충분한 방법입니다. 보통 응용프로그램이 시스템 설정(기본)을 따를지 아니면 직접 서식을 지정할지에 대해서는 선택해야 될 것입니다.

CurrentCulture & CurrentUICulture

다른 문화권의 표현 형식을 WPF 응용프로그램에 적용하는 것은 매우 쉽습니다. 당신은 Thread 클래스의 CurrentThread 속성 내부에서 찾을 수 있는 CurrentCulture 속성과 CurrentUICulture 속성을 통해 처리할 수 있습니다. 그렇지만 무슨 차이가 있는건가요?

CurrentCulture 속성은 숫자와 날짜를 어떻게 표현할지 제어합니다. 기본값은 응용프로그램을 실행하는 운영체제로부터 결정되며 운영체제에서 사용하는 언어와 별개로 변경할 수 있습니다. 예를 들어 독일에 사는 사람이 영어를 가지고 윈도우를 설치하더라도 날짜와 숫자는 독일식으로 표기되기를 선호합니다. 이러한 상황에서는 CurrentCulture 속성은 독일어가 기본 설정이 됩니다.

CurrentUICulture 속성은 인터페이스로 사용할 언어를 특정합니다. 예를 들어 언어별 자원 파일을 통해 응용프로그램이 다중 언어를 지원할 경우에 해당됩니다. 정리하자면 숫자나 날짜 정보의 입출력을 처리할 때 독일어를 대신 영어를 사용할 수 있다는 것입니다.

Changing the application Culture

따라서, 당신은 CurrentCulture와 CurrentUICulture에 대해 변경할지 또는 하지 않을지에 대해 결정해야됩니다. 언제든지 원하는 시점에 변경할 수 있지만, 주로 응용프로그램이 시작할 때 수행하는 것이 좋습니다. 그렇지 않으면 이전 문화권 설정으로 일부 처리가 될 수 있기 때문입니다. 다음 예시는 WPF 응용프로그램의 App.xaml.cs에서 Application_Startup() 이벤트가 발생했을 시 Culture와 UICulture를 변경합니다.

private void Application_Startup(object sender, StartupEventArgs e)
{
    Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
    Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
}

Thread 클래스와 CultureInfo 클래스를 사용하기 위해 필요한 네임스페이스를 파일에 꼭 추가해야 합니다.

using System.Threading;
using System.Globalization;

위 코드를 통해 숫자와 날짜 정보는 선택한 독일 문화권(de-DE)에 따라 표현될 것입니다. 앞서 언급한대로 다중 언어 지원 응용프로그램이 아닌 경우에는 UICulture를 지정하는(코드의 마지막 줄) 부분을 생략할 수 있습니다.

Application_Startup 이벤트가 발생했을 때 또는 Main Window의 생성자에서 문화권을 변경하는 것이 가장 적절합니다. 왜냐하면 CurrentCulture 속성을 변경할 때 이미 생성된 값은 자동으로 처리되지 않았기 때문입니다. 그렇다고해서 항상 처음에만 할 수 있는 것은 아닙니다. 다음 예시에서 보여주는 것처럼 CurrentCulture 속성에 의해서 출력 형식이 훌륭하게 반영됩니다.

<Window x:Class="WpfTutorialSamples.WPF_Application.ApplicationCultureSwitchSample"
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:WpfTutorialSamples.WPF_Application"
mc:Ignorable="d"
Title="ApplicationCultureSwitchSample" Height="200" Width="320">
    <StackPanel Margin="20">
<Grid>
    <Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
    </Grid.RowDefinitions>
    <Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
    </Grid.ColumnDefinitions>
    <Label>Number:</Label>
    <Label Name="lblNumber" Grid.Column="1" />
    <Label Grid.Row="1">Date:</Label>
    <Label Name="lblDate" Grid.Row="1" Grid.Column="1" />
</Grid>
<StackPanel Orientation="Horizontal" HorizontalAlignment="Center" Margin="0,20">
    <Button Tag="en-US" Click="CultureInfoSwitchButton_Click" HorizontalContentAlignment="Stretch">English (US)</Button>
    <Button Tag="de-DE" Click="CultureInfoSwitchButton_Click" HorizontalContentAlignment="Stretch" Margin="10,0">German (DE)</Button>
    <Button Tag="sv-SE" Click="CultureInfoSwitchButton_Click" HorizontalContentAlignment="Stretch">Swedish (SE)</Button>
</StackPanel>
    </StackPanel>
</Window>
using System;  
using System.Globalization;  
using System.Threading;  
using System.Windows;  
using System.Windows.Controls;  

namespace WpfTutorialSamples.WPF_Application  
{  
    public partial class ApplicationCultureSwitchSample : Window  
    {  
public ApplicationCultureSwitchSample()  
{  
    InitializeComponent();      
}  

private void CultureInfoSwitchButton_Click(object sender, RoutedEventArgs e)  
{  
    Thread.CurrentThread.CurrentCulture = new CultureInfo((sender as Button).Tag.ToString());      
    lblNumber.Content = (123456789.42d).ToString("N2");  
    lblDate.Content = DateTime.Now.ToString();  
}  
    }  
}

CultureInfoSwitchButton_Click 이벤트에서 흥미로운 점은, 어떤 버튼을 클릭했는지에 따라서 숫자와 날짜에 대한 Label 내용을 변경합니다.

Culture & Threads: The DefaultThreadCurrentCulture property

만약 응용프로그램에서 1개보다 많은 스레드를 사용한다면 DefaultThreadCurrentCulture 속성을 사용하는 것에 대해 고려해야합니다. 이것은 CultureInfo 클래스(.NET 프레임워크 버전 4.5에서 소개)에서 찾을 수 있고 현재 스레드 뿐만아니라 후에 생성된 스레드들에 대해서도 같은 문화권 형식을 사용하도록 보장합니다. 예를 들어 아래의 코드를 Application_Startup 이벤트에서 사용할 수 있습니다.

CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("de-DE");

그러면, CurrentCulture 속성과 DefaultThreadCurrentCulture 속성을 모두 설정해야될까요? 아닙니다. DefaultThreadCurrentCulture 속성은 CurrentCulture 속성도 같이 변경합니다. 즉, 응용프로그램에서 멀티스레딩 환경이라면 CurrentCulture 속성 보다는 DefaultThreadCurrentCulture 속성을 사용하십시오. 모든 경우에 대해 처리해줍니다.

Summary

WPF 응용프로그램에서 문화권에 따른 형식을 지정하는 일은 매우 중요합니다. 하지만 다행히도 WPF는 가능한 많은 것을 처리해줍니다. 이번 글에서 제시된 다양한 예제와 같이 CurrentCulture 속성과 CurrentUICulture 속성을 이용하여 기본 수행 방법을 변경하는 것은 매우 쉽습니다.

This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!