niedziela, 12 czerwca 2011

70-511: Enhancing Usability: Implementacja „Globalizacji” i „Lokalizacji” (teoria) [PL]

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:
  1. Ustawiamy właściwość Localizable okienka (Form) na True.
  2. Projektujemy UI okna i tłumaczymy wszystkie elementy UI na języki, w których chcemy mieć zlokalizowaną aplikację.
  3. Dodajemy elementy UI dla domyślnej kultury. Będą one wykorzystane, gdy wspierana kultura nie będzie wyspecyfikowana.
  4. Ustawiamy właściwość Language okienka (Form) na kulturę, w której chcemy mieć zlokalizowane okno.
  5. Dodajemy zlokalizowaną zawartość UI do okna.
  6. Powtarzamy kroki 4 i 5 dla każdego języka.
  7. 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:
  1. Dodanie atrybutu kultury (UICulture) do pliku projektu i build projektu, by wygenerować katalogi dedykowane dla danej kultury.
  2. 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.
  1. Ekstrahujemy lokalizowaną zawartość z aplikacji przy użyciu specjalistycznego narzędzia.
  2. Tłumaczymy lokalizowaną zawartość.
  3. Tworzymy podkatalogi, które będą przechowywać assembly dla różnych kultur.
  4. 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:
  1. Otwieramy plik projektu (<ProjectName>.csproj dla C# lub <ProjectName>.vbproj dla Visual Basic) przy pomocy dowolnego edytora tekstu (np. Notepad’a).
  2. Odnajdujemy element XML: <PropertyGroup>. Wewnątrz elementu dodajmy ustawienie domyślnej kultury: <UICulture>en-US</UICulture>
  3. 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:
  1. Generujemy plik csv ze wszystkimi elementami do lokalizacji locbaml /parse en-US\myApplication.resources.dll
  2. Tłumaczymy
  3. 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.
Promuj

Brak komentarzy:

Prześlij komentarz

Posty powiązane / Related posts