Makale Özeti

Bu yazımızda Silverlight 2.0 Beta 2 ile beraber istemci taraflı Localization yapmanın yolunu inceliyoruz. Örneğimizde Türkçe ve İngilizce metinlerin yapılan ayara göre otomatik olarak ekrana yansıtan ufak bir uygulama yapacağız.

Makale

Birden çok dil kullanılan projelerde .NET ile beraber gelen dahili Localization özellikleri hızlı çözümler yaratmak adına ciddi birer kurtarıcı olarak değerlendirilebilir. Kişisel olarak her zaman daha özelleştirilebilir altyapılara sahip olmak adına el yapımı altyapıları tercih etsem de her zaman bunun için zaman bulunamayabiliyor. Silverlight 2.0 ile beraber de artık .NET dillerini ve altyapısını kullanabildiğimize göre bize yardımcı olacak bir Localization sistemi olsa gerek diyerek beraberce yola çıkalım. Ürün Beta 2 aşamasında olduğu için bazı sorunları radikal çözümlerle atlatacağız fakat sonunda tabi ki çalışır bir örneğimiz olacak.

Yeni bir Silverlight 2.0 Beta 2 projesi yarattıktan sonra hemen Visual Studio içerisindeki Solution Explorer penceresinde Silverlight projemize sağ tuş tıklayarak "Add / New Folder" diyelim ve Resources adında bir klasör ekleyelim. Uygulamamızda olmasını istediğimiz dillere ait bilgileri bu klasör içerisine yerleştireceğiz. Resources klasörüne sağ tuş ile tıklayarak gelen menünden "Add / New Item" komutunu vererek yazilar.resx adında bir "Resources File" ekleyelim. Karşınıza çıkan ekranda Resource dosyası içerisine istediğiniz "Name / Value" çiftini girebilirsiniz. Şimdilik örnek olması amacıyla aşağıdaki şekilde düzenlememizi yapalım.

Localization Resource dosyamız.
İngilizce Localization Resource dosyamız.

Unutmamanız gereken detaylardan biri dosya ile ilgili Access Modifiers ayarsını Public olarak değiştirmek. Bu ayarı yaptığımızda aslında arka planda otomatik olarak değişmesi gereken bir kod daha var. Söz konusu kod Resource dosyamızla beraber otomatik olarak yaratılan Designer.vb veya Designer.cs dosyası içerisinde yer alıyor.

Arkaplandaki sinsi kod dosyası!
Arkaplandaki sinsi kod dosyası!

Yukarıdaki ekran görüntüsünde de görebileceğiniz üzere Visual Studio içerisinde Solution Explorer'da "Show All Files" düğmesine tıkladığınızda karşınıza ek dosyalar çıkacaktır. Bu dosyalardan Resource dosyamızın arkasında durdan VB/CS dosyasını açarak aşağıdaki kodları değiştirmemiz gerekiyor.

EskisiYenisi

[VB]

        Friend Sub New()

            MyBase.New()

        End Sub

[VB]

        Public Sub New()

            MyBase.New()

        End Sub

[C#]

        internal yazilar() {

        }

[C#]

        public Resource1() {

        }

Artık sıra geldi bu Resource dosyası içerisindeki verileri Silverlight XAML sayfalarımızda kullanmaya. Bunun için Page.XAML dosyamızı açarak hemen Root XML elementimize yeni bir XML NameSpace eklememiz şart.

<UserControl x:Class="SilverlightApplication31.Page"

   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

   xmlns:yerel="clr-namespace:SilverlightApplication31.My.Resources"

   Width="400" Height="300">

Yukarıdaki şekli ile eklediğimiz NameSpace aslında Intellisense desteği sayesinde otomatik olarak karşınıza çıkacaktır. Eğer herhangi bir hata alırsanız projenizi bir kereliğine Build ederek sonra tekrar deneyin. NameSpace'in ismini tanımlamak tamamen size kalmış ben örnekte "yerel" anahtar kelimesini kullanmayı tercih ettim. Son olarak aşağıdaki kod ile Assembly içerisinden kullanacağımız kaynağımızı da sayfanın Resource'ları içerisine ekleyelim.

    <UserControl.Resources>

        <yerel:yazilar x:Name="LocStrings" />

    </UserControl.Resources>

Dillere göre metinleri görebilmek için uygulamamızın arayüzüne iki adet TextBlock koymakta fayda var. TextBlock'ları da koyduğumuzda uygulamanın XAML kodu aşağıdaki şekilde sonuçlanıyor.

<UserControl x:Class="SilverlightApplication31.Page"

   xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

   xmlns:yerel="clr-namespace:SilverlightApplication31.My.Resources"

   Width="400" Height="300">

    <UserControl.Resources>

        <yerel:yazilar x:Name="Kaynak" />

    </UserControl.Resources>

    <Grid x:Name="LayoutRoot" Background="White">

        <TextBlock Height="40" HorizontalAlignment="Left" Margin="40,40,0,0" VerticalAlignment="Top" Width="160" Text="TextBlock" TextWrapping="Wrap" x:Name="Label1"/>

        <TextBlock HorizontalAlignment="Left" Margin="40,120,0,140" Width="160" Text="TextBlock" TextWrapping="Wrap" x:Name="Label2"/>

    </Grid>

</UserControl>

Resource'lar içerisindeki bilgileri bu TextBlock'lara bağlamamız gerek. Bunun için klasik bir Binding kullanırken veri kaynağı olarak da sayfanın Resource'larına eklediğimiz Kaynak adındaki veri kaynağımızı kullanacağız.

    <Grid x:Name="LayoutRoot" Background="White">

        <TextBlock Height="40" HorizontalAlignment="Left" Margin="40,40,0,0" VerticalAlignment="Top" Width="160" Text="{Binding Baslik, Source={StaticResource Kaynak}}" TextWrapping="Wrap" x:Name="Label1"/>

        <TextBlock HorizontalAlignment="Left" Margin="40,120,0,140" Width="160" Text="{Binding Metin, Source={StaticResource Kaynak}}" TextWrapping="Wrap" x:Name="Label2"/>

    </Grid>

Bağlama işlemini de tamamladığımıza göre geri kaldı ikinci bir dil için Resource dosyası oluşturmaya. Elde olan yazilar.resx dosyasından bir kopya alarak yaziler.tr.resx adında bir dosya yaratabilirsiniz. Bu dosya içerisinde de yine Baslik ve Metin kaynaklarının Türkçe karşılıklarını yazmamız gerekecek.

Localization Resource dosyamız.
Türkçe Localization Resource dosyamız.

Artık neredeyse her şey hazır. Fakat ufak bir sorunumuz daha var. Visual Studio bizim için Silverlight projemizin Bin/Debug klasöründe gerekli dillere özel klasörleri yaratarak DLL'leri yaratsa da maalesef bunları Silverlight'ın XAP dosyasına kopyalamıyor. Bu ufak hata Silverlight'ın Beta 2 sonrası sürümlerinde düzeltilene kadar bizim Silverlight projemizin .proj uzantılı dosyasını NotePad ile açarak elle düzenlememiz gerekiyor.

    <SupportedCultures>tr</SupportedCultures>

Yukarıda gördüğünüz şekilde PROJ dosyası içerisinde normalde içi boş olan bu tagların arasında kullanacağımız dillerin dil kodlarını sıralamamız şart. Tüm işlemlerimizi tamamladık, artık Silverlight uygulamasını sayfaya yerleştirirken hangi dil ayarını parametre olarak aktarırsanız o dile uygun kaynaklar yüklenecektir.

        <object data="data:application/x-silverlight," type="application/x-silverlight-2-b2" width="100%" height="100%">

            <param name="source" value="ClientBin/SilverlightApplication31.xap"/>

            <param name="background" value="white" />

            <param name="culture" value="tr" />

            <param name="uiculture" value="tr" />

        </object>

Yukarıdaki kod içerisinde uygulamanın Türkçe ayarlar ile açılmasını sağlıyoruz.

Hepinize kolay gelsin.

Daron Yöndem
MVP, MCT, MCPD, MCITP, MCTS
MCSD, MCAD, MCDBA, MCP, ACP, ICSD
Blog: http://daron.yondem.com
Sorularınız için: http://daron.yondem.com/tr/sorusor