Artykuł

kwi 15 2010
0

Tworzenie aplikacji wielojęzycznych z C# i ASP.NET w Visual Studio

W dobie postępującej globalizacji oraz otwarcia Polski na świat, warto rozpatrzyć możliwość tworzenia aplikacji w wielu wersjach językowych. Pozwoli to z pewnością na zwiększenie potencjalnego grona odbiorców. Kiedy mamy już takie ambitne plany, pozostaje jednak kwestia doboru języka/technologii, która to zadanie zrealizuje. Ja wybrałem do tego celu C# z frameworku .NET, który w banalny sposób umożliwia tworzenie zlokalizowanych aplikacji.

Jeśli nie jesteście jednak koderami tworzącymi aplikacje okienkowe, a osobami bardziej z działki WWW, mam również rozwiązanie dla Was - wielojęzyczne strony w ASP.NET:)

Zasoby w .NET

Kluczem do sukcesu w platformie .NET, są tzw. zasoby (z ang. resources). Pozwalają one na przechowywanie łańcuchów tekstowych, obrazów, ikon, plików audio oraz wielu innych pożytecznych elementów. Można je również z powodzeniem wykorzystywać do lokalizacji aplikacji oraz stron internetowych.

Aby tego dokonać, należy zbudować odpowiednią strukturę plików zasobów. Np. taką jak na screenie 1.

Widzimy tutaj trzy przykładowe pliki:

  • Messages.resx - główny plik językowy, u mnie zawierać będzie łańcuchy w języku angielskim
  • Messages.pl-PL.resx - plik językowy zawierający polskie komunikaty
  • Messages.de-DE.resx - plik językowy zawierający niemieckie komunikaty

To na co warto zwrócić uwagę, to konwencja nazewnictwa tych plików. Główny plik, zawierający angielskie komunikaty, pojawiać się będzie domyślnie (czyli jeżeli żadne ustawienia nie zostaną zmienione, albo zmiana się nie powiedzie). Pozostałe dwa pliki, zawierają oznaczenie kulturowe (z ang. Culture Info). Jeśli chcemy utworzyć inny język, musi skorzystać z odpowiedniego oznaczenia (w tej samej postaci). Obszerną listę można znaleźć pod tym linkiem.

Każdy z takich plików zasobów (screen 2), posiada wiersze w których znajdują się trzy pola:

  • Name - Nazwa, używana do pobierania wartości
  • Value - Odpowiednia wartość (tłumaczenie)
  • Comment - Komentarz, pole opcjonalne

Tworząc tłumaczenie, powinniśmy zawsze wykorzystać te same nazwy (kolumna Name) i zmieniać tylko wartość (tłumaczenie - Value).

Aplikacje wielojęzyczne w praktyce w C#

Powiedzieliśmy już sobie naprawdę sporo na temat lokalizacji. Czas jednak zabrać się zaczyny. Na screenie 1, przedstawiłem strukturę przykładowej aplikacji, na screenie 2 - fragment pliku zasobów. Poniższy listing, pokazuję bardzo prostą aplikację korzystającą z tych zasobów:

using System;
using MultiLanguage.Properties;
using System.Threading;
using System.Globalization;

namespace MultiLanguage
{
    class Program
    {
        static void Main(string[] args)
        {
            Thread.CurrentThread.CurrentUICulture = new CultureInfo(string.Empty);
            Console.WriteLine(Messages.Help);
            Thread.CurrentThread.CurrentUICulture = new CultureInfo("pl-PL");
            Console.WriteLine(Messages.Help);
            Thread.CurrentThread.CurrentUICulture = new CultureInfo("de-DE");
            Console.WriteLine(Messages.Help);
            Console.ReadKey();
        }
    }
}

Przeanalizujmy kod od początku. Pierwsze na co warto zwrócić uwagę, to import Propertisów (czyli naszych plików językowych) w drugiej linijce. Kolejnym kluczowym punktem, są linie 12, 14 oraz 16. Zmieniają one aktualne ustawienia kulturowe aplikacji. Z reguły robi się to raz na początku aplikacji, aby ustawić konkretny język. W tym przypadku, robimy to trzy razy (tak właściwie pierwsza deklaracja nie jest konieczna w tym przypadku, gdyż jest ona wykonywana domyślnie), aby wykorzystać wszystkie języki przez nas przygotowane. I tak kolejno, na ekranie zostanie wyświetlony napis w języku angielskim, polskim oraz niemieckim.

Odwołanie do samych komunikatów jest również proste. Messages, to tak naprawdę nazwa głównego pliku językowego (bez rozszerzenia). Po kropce następuje dostęp do określonego zasobu (stringu). W przypadku zmiany ustawień kulturowych, odpowiednie pliki wczytywane są automatycznie - warunek, należy zadbać o odpowiednie nazewnictwo (patrz wyżej).

Wielojęzyczne strony w ASP.NET

Mamy już pojęcie na temat zasobów oraz wielojęzycznych aplikacji w C#. Czas stworzyć wielojęzyczne strony ASP.NET. Tutaj sprawy kształtują się nieco inaczej. Również korzystamy z zasobów, tworzymy je w ten sam sposób, ale zmienia się nazewnictwo oraz sposób użycia.

Położenie zasobów w projekcie

W przypadku aplikacji ASP.NET, zasoby mogą znajdować się w dwóch specjalnych folderach:

  • App_GlobalResources
  • App_LocalResources

Oba te katalogi, możemy utworzyć z poziomu Solution explorera (zaznaczmy projekt, a potem z menu kontekstowego Add oraz Add ASP.NET Folder). Pierwszy z nich, pozwala na składowanie globalnych plików zasobów. Drugi składuje pliki językowe przeznaczone dla konkretnego dokumentu aspx. Ponieważ drugie podejście jest preferowane to na nim się właśnie skupimy.

Załóżmy, że mamy stronę Default.aspx, chcąc stworzyć dla niej języki angielski, polski oraz niemiecki, musimy stworzyć następujące pliki (screen 3):

  • Default.aspx.resx - angielskie komunikaty - domyślne
  • Default.aspx.pl-PL - polskie komunikaty
  • Default.aspx.de-DE - niemieckie komunikaty

Wykorzystanie wielojęzyczności w kodzie

Aby zmienić ustawienia kulturowe postępujemy identycznie jak w przypadku klasycznego C# (zakładam, że klasy Code behind tworzone są w C#). Najlepiej jest to uczynić w metodzie Page_Load pliku Default.aspx.cs:

protected void Page_Load(object sender, EventArgs e)
{
    Thread.CurrentThread.CurrentUICulture = new CultureInfo("pl-PL");
}

Teraz, możemy wykorzystać nasze łańcuchy językowe zarówno w klasach Code behind oraz plikach aspx. Aby uczynić to w przypadku pierwszym, należy skorzystać z następującej konstrukcji:

GetLocalResourceObject("Help");

Pobieramy tutaj string o nazwie Help z lokalnych zasobów łańcuchowych. Ten sam kod można również wykorzystać z poziomu stron asp:

<%= GetLocalResourceObject("Help") %>

I już mamy nasz tekst na ekranie:)

Na sugestię z komentarzy, dodałem bardzo prosty projekt wykorzystujący wielojęzyczność na stronie WWW. Do pobrania z działu Download.

Podsumowanie

Platforma .NET daje szerokie możliwości w tworzeniu zlokalizowanych aplikacji. Przedstawione w niniejszym wpisie sposoby to nie jedyne rozwiązania jakie są tutaj dopuszczalne. Aczkolwiek myślę, że dają one dość spore pole do popisu i mam nadzieję, że przyczynią się do powstania wielu dobrych wielojęzycznych aplikacji:)

Data ostatniej modyfikacji: 27.03.2012, 09:10.

Podoba Ci się ten wpis? Powiedz o tym innym!

Send to Kindle

Komentarze

blog comments powered by Disqus