W ramach mojego przygotowania do egzaminu 70-511 (Windows Applications Development with Microsoft .NET Framework 4) oraz uczestnictwa w „StudyGroup” organizowanym przez Łódzką Grupę Profesionalistów IT & .NET opracowałem zagadnienia związane z tematem określonym w training kicie jako „Enhancing Usability”. Z moimi czytelnikami chciałbym podzielić się moimi opracowaniami. W tym wpisie będzie o implementacji „Globalizacji” i „Lokalizacji”.
Globalizacja i lokalizacja to różne procesy związane z internacjonalizacją aplikacji. Globalizacja związana jest z formatowaniem istniejących danych do formatów właściwych dla danych ustawień kulturowych. Lokalizacja związana jest z dostarczaniem właściwych danych dla ustawień kulturowych. Może to zilustrować następujący przykład:
- Globalizacja – W niektórych krajach część całkowita liczby jest oddzielana od ułamkowej kropką, a w innych
przecinkiem. Globalizacja odpowiedzialna jest w takim przypadku za
odpowiednie wyświetlanie danych.
- Lokalizacja – Tytuł okienka, napisy na przyciskach często
powinny być różne, dla różnych języków, w których aplikacja
jest dostępna.
Globalizacja i lokalizacja jest nierozerwalnie związana z kulturą.
Kultura w .NET związana jest informacją dotyczącą kultury dla
danego kraju lub regionu, w którym aplikacja jest użyta. Kultura w
.NET wybierana jest za pośrednictwem kodu 1,2 lub 3 elementowego
(zwykle: język-region), np.: uz-UZ-Cyrl specyfikuje język
Uzbecki, w regionie Uzbekistanu i alfabet cyrylicę.
W celu ustawienia kultury z poziomu kodu w C#, należy:
- Dla wątku:
System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo(„pl-PL");
- Dla interfejsu:
System.Threading.Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(„pl-PL");
Lokalizacja w Windows Forms
Aby dokonać lokalizacji okna aplikacji korzystającej z Windows
Forms, należy wykonać następujące kroki:
- Ustawiamy właściwość Localizable okienka (Form)
na True.
- Projektujemy UI okna i tłumaczymy wszystkie elementy UI na
języki, w których chcemy mieć zlokalizowaną aplikację.
- Dodajemy elementy UI dla domyślnej kultury. Będą one
wykorzystane, gdy wspierana kultura nie będzie wyspecyfikowana.
- Ustawiamy właściwość Language okienka (Form)
na kulturę, w której chcemy mieć zlokalizowane okno.
- Dodajemy zlokalizowaną zawartość UI do okna.
- Powtarzamy kroki 4 i 5 dla każdego języka.
- Kompilujemy i budujemy aplikację.
Lokalizacja w WPF
Lokalizacja w WPF jest dostępna poprzez satelickie assembly
przygotowane dla konkretnych języków. Lokalizowane elementy
aplikacji korzystają z zasobów assembly, które są ładowane
automatycznie w zależności od aktualnej kultury UI.
Kiedy zlokalizowana aplikacja startuje, najpierw wyszukuje assembly z
zasobami dla określonego języka i regionu. Jeśli nie można
znaleźć właściwego assembly, wyszukiwane jest tylko dla
właściwego języka. Jeśli również to assembly nie można
znaleźć, wyszukiwany jest zestaw dla kultury neutralnej. Jeżeli
również tego nie można znaleźć rzucany jest wyjątek. Wyjątków
związanych z lokalizacją można uniknąć, poprzez ustawienie
atrybutu NeutralResourcesLanguage. Ten atrybut specyfikuje,
którą kulturę należy użyć w przypadku, gdy nie ma dostępnej
początkowo wymaganej. Atrybut można ustawić w następujący
sposób: NeutralResourcesLanguage: [assembly:
NeutralResourcesLanguage("en-US",
UltimateResourceFallbackLocation.Satellite)].
Aby dokonać lokalizacji okna aplikacji korzystającej z WPF, należy
wykonać następujące kroki:
- Dodanie atrybutu kultury (UICulture) do pliku projektu i
build projektu, by wygenerować katalogi dedykowane dla danej
kultury.
- Oznaczymy lokalizowalne elementy atrybutem Uid aby były
rozróżniane unikalnie. Należy wykonać ten krok dla każdego
pliku XAML w aplikacji.
- Uwaga: Lokalizowane właściwości mogą dotyczyć
innych elementów niż tylko łańcuchy tekstowe. Mogą to być
również kolory, układy kontrolek lub dowolnych innych elementów
ważnych dla kultury.
- Ekstrahujemy lokalizowaną zawartość z aplikacji przy
użyciu specjalistycznego narzędzia.
- Tłumaczymy lokalizowaną zawartość.
- Tworzymy podkatalogi, które będą przechowywać assembly
dla różnych kultur.
- Tworzymy assembly dla różnych kultur przy pomocy
specjalistycznego narzędzia.
Aby ustawić domyślną kulturę dla projektu, należy dodać atrybut
UICulture do projektu:
- Otwieramy plik projektu (<ProjectName>.csproj dla C#
lub <ProjectName>.vbproj dla Visual Basic) przy pomocy
dowolnego edytora tekstu (np. Notepad’a).
- Odnajdujemy element XML: <PropertyGroup>. Wewnątrz
elementu dodajmy ustawienie domyślnej kultury:
<UICulture>en-US</UICulture>
- Zapisujemy plik i wykonujemy Build aplikacji.
Trzeba pamiętać, że lokalizowane elementy UI powinny być
odpowiednio oznaczone. W tym celu w pliku XAML dodajemy atrybut Uid
do lokalizowanych elementów, np.: <Button
x:Uid="Button_1"
Margin="112,116,91,122„ Name="Button1">Button</Button>.
Można również wykorzystać msbuild, by zrobić to
automatycznie: msbuild
/t:updateuid myApplication.vbproj.
Kolejnymi ważnymi elementami jest ekstrakcja lokalizowanej
zawartości z aplikacji i generowanie satelickich assebly przy użyciu
specjalistycznego narzędzia. Tym specjalistycznym narzędziem może
być LocBaml
(http://msdn.microsoft.com/en-us/library/ms771568%28v=VS.90%29.aspx).
Lokalizacja odbywa się w następujących krokach:
- Generujemy plik csv ze wszystkimi elementami do lokalizacji
locbaml /parse
en-US\myApplication.resources.dll
- Tłumaczymy
- Tworzymy odpowiedni podkatalog (np. fr-CA) i generujemy w nim
assemlby: locbaml /generate
en-US\myApplication.resources.dll
/trans:myApplication.resources.FrenchCan.csv /cul:fr-CA /out:fr-CA
Niestety do LocBaml można mieć szereg uwag, m.in.:
- LocBaml nie jest narzędziem wchodzącym w skład VS lub .NET
SDK.
- Trzeba go osobno pobrać i skompilować.
- Identyfikatory zasobów w pliku CSV mogą się powtarzać. W
związku z tym proces odwrotny, czyli wygenerowanie dll'ki na
podstawie pliku CSV się nie powiedzie.
- Czasami VS sam generuje zlokalizowaną DLL’kę, wtedy nie
można użyć wygenerowanej przez LocBaml i trzeba dwie połączyć
linkerem (al.exe).
- Aby zautomatyzować proces trzeba napisać skrypty.
Warto w tym miejscu również przeczytać uwagi Michała
Komorowskiego na jego blogu:
http://www.michalkomorowski.com/2011/06/aplikacje-wielojezyczne-wpf.html.
Brak komentarzy:
Prześlij komentarz