TOC

This article has been localized into Turkish by the community.

Bir WPF Uygulaması:

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;

Böyle yaparak sayılar ve tarihler tercih edilen Alman (de-DE) formatında olacaktır. Bahsedildiği üzere eğer uygulamanız çoklu dil desteği vermeyecekse UICulture için yapılan tanımı yapmayabilirsiniz (son satır).

Application_Startup olayı esnasında ya da ana pencerenizin oluşturulması sonunda kültür değerini değiştirmek mantıklı olacaktır, çünkü CurrentCulture özelliğini değiştirdiğinizde kullandığınız değerler henüz otomatik update edilmemiştir. Bu aslında başka türlü yapılamayacağını ifade etmez, bir sonraki örnekte CurrentCulture özelliğinin çıktıya etkisi gösteriliyor.

<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();  
}  
    }  
}

Enteresan parça CultureInfoSwitchButton_Click olayında bulunuyor, CurrentCulture değerini tıklanan buton verisine göre değiştiriyoruz ve sonra tarih ve sayı bulunan iki Label kontrolün içeriğini yeniliyoruz.

Kültür & İş parçacıkları : DefaultThreadCurrentCulture özelliği

Eğer uygulamanız birden fazla iş parçacığı (Thread) içeriyorsa CultureInfo sınıfında (.NET framework versiyon 4.5'te tanıtıldı) bulunanDefaultThreadCurrentCulture özelliğini tercih etmelisinizi Bu sadece bulunulan iş parçacığında değil ileride kullanılacak iş parçacıklarında da geçerli olacaktır. Application_Startup olayı kodu içinde şöyle kullanabilirsiniz :

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

Peki , hem CurrentCulture hem de DefaultThreadCurrentCulture özelliklerini ayarlamak zorunda mısınız? Gerçekte, hayır - eğer CurrentCulture özelliğini henüz ayarlamamışsanız, DefaultThreadCurrentCulture özelliği aynı zamanda CurrentCulture özelliğine de uygulanacaktır. Eğer birden çok iş parçacığı kullanacaksanız CurrentCulture yerine DefaultThreadCurrentCulture kullanmanız mantıklı olacaktır - tüm olası durumları dikkate alacaktır.

Sonuç

WPF uygulamanızda kültür ile uğraşmak önemli fakat şükür ki WPF işin büyük kısmını sizin haricinizde yapıyor. Eğer default davranışı değiştirmeniz gerekiyorsa bu makalede gösterilen örneklerdeki gibi CurrentCulture ve CurrentUICulture özelliklerini kullanarak kolayca yapılır.


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!