This article is currently in the process of being translated into Turkish (~59% done).
Uygulama Bölgesel Ayarları / Kullanıcı Arayüzü Bölgesel Ayarları
WPF uygulamanızda sayılar veya tarihlerle birazcık da olsa çalıştıysanız, (örn: Bu eğitici yazıda bulunan makalelerden biri nedeniyle) güzel bir şey fark etmiş olabilirsiniz: Sayılar ve tarihler bilgisayarınızda kullanılan formatla eşleşen bir biçimde otomatik olarak görüntülenir. İngilizce konuşulan bir ülkede yaşıyorsanız, muhtemelen bu büyük bir şey gibi görünmeyecektir, fakat tarih ve/veya sayıların farklı şekilde görüntülendiği pek çok diğer ülkelerinden birinde yaşıyorsanız, bu özellik gerçekten harika bir şeydir.
Eğer "sayılar ve tarihler gibi basit şeyler biçimlendirilirken çok da fazla farklılık olamaz" diye düşünüyorsanız, aynı sayıyı ve aynı tarihi biçimlendirdiğim bu örnek uygulamaya bir göz atmanızı öneririm. Aynı tarih/sayıların ABD, Almanya ve İsveç'te nasıl görüntülendiğine bir bakalım:

Gördüğünüz gibi, sayı ve tarihlerin görüntülenme biçimlerinde pek çok küçük farklılıklar var. İyi haber şu ki, .NET altyapısı bu konuda bize yardımcı olup bunu bizim yerimize zaten yapıyor: Varsayılan olarak, tarihler ve sayılar, uygulamamızın çalıştığı bilgisayarın sistem ayarlarına göre görüntülenir. Kötü haber de şu ki, bu davranış her zaman istediğimiz şekilde olmayabilir. Fakat endişelenmeye gerek yok, bunu kolayca değiştirebiliyoruz. Tüm bunlar, CultureInfosınıfıyla ilgili olup konuyla ilgili daha detaylı bilgileri CultureInfo hakkındaki C# Eğitimi makalesindeokuyabilirsiniz. Şimdilik, bu teknikleri WPF uygulamanıza nasıl uygulayacağınızı tartışalım.
Geçici biçimlendirme
Yalnızca belirli bir bilgi parçası için biçimlendirme yapmanız gerekiyorsa (örn. Tek bir "Label" (etiket) kontrolünün içeriği), bunu ToString() metodu ve CultureInfo sınıfının bir kombinasyonunu kullanarak, anında kolayca yapabilirsiniz. Örneğin, yukarıdaki örnekte, şunun gibi bölgesel ayar bazlı farklı bir format uyguladım:
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);
Bu, birkaç yerde sadece özel biçimlendirmeye ihtiyaç duyduğunuz bazı durumlarda yeterli olabilir. Ancak genel olarak uygulamanızda varsayılan sistem ayarlarını mı yoksa tüm uygulama bazında spesifik bir bölge ayarlarını mı kullanıp kullanmayacağınıza karar vermelisiniz.
Mevcut Bölgesel Ayar & Mevcut Kullanıcı Arayüzü Bölgesel Ayarı
WPF uygulamanızda başka bir bölgesel ayar kullanmak oldukça kolaydır. Potansiyel olarak, Thread sınıfının CurrentThread özelliğinde bulunan iki nitelik ile uğraşacaksınız: CurrentCulture ve CurrentUICulture. Peki bunların aralasındaki fark ne?
CurrentCulture özelliği, sayıların ve tarihlerin vs. nasıl formatlandığını kontrol eden özelliktir. Varsayılan değer, uygulamayı çalıştıran bilgisayarın işletim sisteminden gelir ve işletim sistemleri tarafından kullanılan dilden bağımsız olarak değiştirilebilir. Örneğin, Almanya'da yaşayan bir insanın arayüz olarak Windows'u İngilizce kurması, sayı ve tarihler için Almanca gösterimi tercih etmesi çok yaygın bir durumdur. Böyle bir durumda, CurrentCulture (mevcut bölgesel ayar) özelliği varsayılan olarak Almanca olur.
CurrentUICulture (mevcut kullanıcı arayüzü bölgesel ayarları) özelliği, arayüzün kullanması gereken dili belirler. Bu durum, uygulamanız birden çok dili destekliyorsa (örneğin farklı dillere ait kaynak dosyalarının kullanımı söz konusuysa) geçerlidir. Bir kez daha belirtmek gerekirse, bu durum sayı, tarih vs gibi girdi/çıktılarla uğraşırken bir dili (örneğin, Almanca) kullanmanıza izin verirken, arayüz için başka bir dil (örneğin İngilizce) kullanmanıza olanak sağlar.
Uygulamanın bölgesel ayarlarını değiştirme
Bunu akılda tutarak, şimdi CurrentCulture (mevcut bölgesel ayarları) ve/veya CurrentUICulture (mevcut kullanıcı arayüzü bölgesel ayarlarını) değiştirip değiştirmeyeceğinize karar vermeniz gerekir. İstediğiniz zaman istediğiniz kadar değişiklik yapabilirsiniz, ancak uygulamanızı başlatırken bunu yapmak çok daha mantıklıdır - aksi takdirde, bazı çıktılar değişiklik yapmanızdan önce varsayılan bölgesel ayarlarla oluşturulmuş olabilir. WPF uygulamanızın App.xaml.cs dosyasında kullanılabilecek Application_Startup() olayında bölgesel ayarları (Culture) ve kullanıcı arayüzü bölgesel ayarları (UICulture) değiştirdiğimiz bir örnek:
private void Application_Startup(object sender, StartupEventArgs e)
{
Thread.CurrentThread.CurrentCulture = new CultureInfo("de-DE");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-US");
}
"CultureInfo" ile birlikte "Thread" sınıfını da kullandığımızdan, gerekli ad alanlarını (namespace) dosyanıza eklemeyi unutmayın, zaten ekli değilse.
using System.Threading;
using System.Globalization;
With this in place, numbers and dates will now be formatted according to how they prefer it in German (de-DE). As mentioned, you can leave out the line defining the culture for the UICulture (the last line) if your application doesn't support multiple languages.
Changing the culture during the Application_Startup event, or at the latest in the constructor of your main window, makes most sense, because values that are already generated aren't updated automatically when you change the CurrentCulture property. That doesn't mean that you can't do it though, as illustrated by this next example, which also serves as a fine demonstration of how the output is affected by the CurrentCulture property:
<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();
}
}
}
The interesting part is found in the CultureInfoSwitchButton_Click event, where we set CurrentCulture based on which of the buttons were clicked, and then update the two labels containing a number and a date:

Culture & Threads: The DefaultThreadCurrentCulture property
If your application uses more than one thread, you should consider using the DefaultThreadCurrentCulture property. It can be found on the CultureInfo class (introduced in .NET framework version 4.5) and will ensure that not only the current thread, but also future threads will use the same culture. You can use it like this, e.g. in the Application_Startup event:
CultureInfo.DefaultThreadCurrentCulture = new CultureInfo("de-DE");
So, will you have to set both the CurrentCulture AND the DefaultThreadCurrentCulture properties? Actually, no - if you have not already changed the CurrentCulture property, setting the DefaultThreadCurrentCulture property will also be applied to the CurrentCulture property. In other words, it makes sense to use the DefaultThreadCurrentCulture instead of CurrentCulture if you plan on using multiple threads in your application - it will take care of all scenarios.
Summary
Dealing with the culture of your WPF application is very important, but fortunately for you, WPF will do a lot of it for you completely out-of-the-box. If you need to change the default behavior, it's quite easy as well, using the CurrentCulture and CurrentUICulture properties, as illustrated in the numerous examples of this article.