Culture SLLokalizacja polega na dostosowaniu aplikacji - w zależności od danej kultury bądź państwa. Lokalizacja polega na przetłumaczeniu interface użytkownika na dany język. Lokalizacja aplikacji polega na utworzeniu oddzielnego zestawu zasobów (jak tekst i obrazki). Jak to wygląda w Silverlight.



Lokalizacja w Silverlight
.
Ich działanie jest nieco skomplikowana ,ale na szczęście my nie musimy tego aż tak dokładnie zagłębiać.

Tworzenie plików .resx

Stworzyłem w projekcie Silverlight folder “resources” dla porządku a w nim za pomocą menu dodałem pliki .resx. W pliku jak widać dodałem trzy pola tekstowe, które później zostaną wyświetlone w odpowiednich kontrolkach. Tutaj widzicie zawartość angielską domyślnego pliku “resources.resx”.

Resources Silverlight

Oprócz stringów można też dodać inne zasoby, jednak nie chciałem utrudniać przykładu. Lepiej aby wszystkie pola miały dostęp publiczny.

Resources Folder in Visual Studio 2010

Platforma .Net jak i Silverlight używa plików .RESX do przechowywania tych danych . Główny plik nie zawiera żadnych zlokalizowanych danych do konkretnej kultury i jest plikiem domyślnym. Plik zostanie wykorzystany tylko wtedy, gdy użytkownik z danej kultury nie ma swojego podpliku .RESX. Podpliki, które powinny mieć taką samą nazwę jak plik główny, tylko po kropce podajemy w nich dane na temat lokalizacji.

Pierwsze dwa znaki reprezentują główny język danego kraju jak “en” to język angielski a “fr” to francuski. Następne dwa znaki reprezentują dany kraj czyli np. (fr-fr to język francuski we Francji , a fr-CA to język francuski dla Kanadyjczyków). Warto o tym pamiętać gdyż np. angielski w Wielkiej Brytanii i w USA trochę się różnią.

Ważne jest to, że chcemy aby każdy użytkownik kraju francuskojęzycznego mógł oglądać nasze aplikacje w tym języku, a nie w języku domyślnym.

Pliki podpliki nie posiadają żadnego kodu w przeciwieństwie do pliku głównego, który ustala swoją zawartość w zależności od kultury i posiada swoje domyślne wartości.

No tak prawie bym zapomniał to dość ważne!
Alternate Text W Visual Studio znajduje się pewien błąd . Nawet jeśli nasze pola są publiczne w pliku .resx to i tak nie mamy dostępu do nich, ponieważ konstruktor klasy jest typu “internal”.

To nic trudnego trzeba tylko zmienić konstruktor z internal na public…, ale prawdziwy problem polega na tym , że za każdym otworzeniem pliku .resx Visual Studio zmienia ten konstruktor automatyczne na internal. Zatem, jeśli nagle ta aplikacja przestała działać to na pewno z tego powodu.

Zmiana pola na public

Edytowanie projektu Visual Studio

Samo dodanie plików niczego jeszcze nie włączyło.

Skąd aplikacja ma wiedzieć jakie kultury obsługuje. Na razie bez względu na jakim komputerze jesteś i gdzie zawsze uruchomi się plik domyślny.

Jak edytować plik projektu Edycja projektu w Visaul Studio 2010

Deklaracja obsłużonych kultur zachodzi w pliku projektowym. Aby go otworzyć trzeba wybrać z menu “Unload Project” a potem “Edit <nazwa projektu>”. W tym pliku XML w elemencie “SupprotedCultures” dodałem kultury jak w plikach. Przy czym screenshot zawiera niewielki błąd zamiast eng-us powinno być en-us .

Powiązania w XAML

Na początek trzeba dodać przestrzeń, w której zawarte są nasze zasoby. Później nasz zasób musi być dodany do słownika w UserResources i dać mu klucz.

xmlns:local="clr-namespace:SilverResources.Resources"
...
<UserControl.Resources> 
     <local:Resource x:Key="LocResc" /> 
</UserControl.Resources>

Lokalizacja aplikacji wymaga zmiany paru pól w kontrolkach ze statycznych na powiązane. Poniższy kod to obrazuje.

<TextBlock Text="{Binding Source={StaticResource LocResc}, Path=TextBlockText}" />
<TextBlock Text="{Binding Source={StaticResource LocResc},Path=RandomText}" />
<Button Content="{Binding Source={StaticResource LocResc},Path=ButtonText}"  />

Testowanie

Zgodnie z MSDN do zasymulowania odpowiedniej kultury wystarczy tylko do kodu HTML gdzie Silverlight się znajduje dodać takie parametry. W tym wypadku zostaje ustawiony hiszpański język.

<param name="uiculture" value="es-es" /> 
<param name="culture" value="es-es" />

Inną alternatywą z MSDN

private void Application_Startup(object sender, StartupEventArgs e)
{
 Thread.CurrentThread.CurrentCulture = new CultureInfo("es-es");
 Thread.CurrentThread.CurrentUICulture = new CultureInfo("es-es");
 this.RootVisual = new MainPage();
}
jest w pliku app.xaml, w zdarzeniu "Application_Startu" (zachodzi on przed startem aplikacji więc nie będzie żadnych wyjątków) ustawić ręcznie daną kulturę.

Jak widzicie jest wiele sposobów na sprawdzenie, czy lokalizacja działa poprawnie, bez zmiany ustawień w swoim systemie operacyjnym Windows.

Ja jednak mam pewność, że to działa poprawnie ponieważ aplikacja wyświetla się w języku polskim, zamiast standardowego angielskiego.

Lokalizacja Japońska Silverlight

Kolejnym problemem jeśli chodzi o lokalizację jest długość słów, która w zależności od języka może się zmieniać. Dla japońskiego tytuł jest bardzo krótki, natomiast przycisk tekstem “Kliknij Tutaj” ma długość całego zdania.

Oto lista prostych zasad do zachowania porządku graficznego w aplikacji:

  • Nie stosować kontenerów z absolutnymi wielkościami ustalonymi w kodzie.
  • Dla kontrolki TextBlock używać “TextWrapping”.

Przykład Pobierz Kod