Silverlight 2.0 içerisinde Localization kullanımı

0 dakikada yazıldı

6231 defa okundu

Düzenle

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.

+--------------------------------------+--------------------------------------+
| Eskisi | Yenisi |
+--------------------------------------+--------------------------------------+
| [VB] | [VB] |
| | |
|         <span |         <span |
| style="color: blue;">Friend | style="color: blue;">Public |
| <span | <span |
| style="color: blue;">Sub | style="color: blue;">Sub |
| <span | <span |
| style="color: blue;">New() | style="color: blue;">New() |
| | |
|             <span |             <span |
| style="color: blue;">MyBase.N | style="color: blue;">MyBase.N |
| ew() | ew() |
| | |
|         <span |         <span |
| style="color: blue;">End | style="color: blue;">End |
| <span | <span |
| style="color: blue;">Sub | style="color: blue;">Sub |
+--------------------------------------+--------------------------------------+
| [C#] | [C#] |
| | |
|         <span |         <span |
| style="color: blue;">internal | style="color: blue;">public |
| yazilar() { | 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.