gettex i lokalizacja aplikacji


28 lutego 2013


Przetłumaczona aplikacja, może przyczynić się do wzrostu przychodów, ponieważ zwiększa liczbę potencjalnych klientów. Możemy powiększyć segment klientów, użytkowników naszej aplikacji przy użyciu małych środków i niewielkiego nakładu sił. Artykuł przedstawia w jaki sposób tłumaczyć interfejs aplikacji w Django.

Tłumaczenie aplikacji w wielu językach programowania jest uzyskiwane za pomocą programu gettex. gettex to zestaw programów, służących do internacjonalizacji aplikacji. Istnieje wiele implementacji dla języków: Python, C, Java, PHP itd.

Lokalizacja aplikacji Django przebiega następująco:
a) konfiguracja aplikacji

W pliku settings.py należy włączyć mechanizm poprzez poprawną konfigurację zmiennej USE_I18N oraz dodanie elementu do krotki MIDDLEWARE_CLASSES. Musimy także ustawić ścieżkę do katalogu tłumaczeń, który utworzymy w kolejnym kroku.

USE_I18N = True
...

LOCALE_PATHS = (
    '/home/greg/public_html/aplikacja/locale',
)
...

MIDDLEWARE_CLASSES = (
    ...
    'django.middleware.locale.LocaleMiddleware',
)

b) stworzenie katalogów

W głównym katalogu projektu musimy stworzyć strukturę katalogów: "locale/[jezyk]/LC_MESSAGES" oraz w katalogu LC_MESSAGES plik django.po (pusty) np. "locale/en/LC_MESSAGES". 

c) wywołanie poleceń

Możemy edytować plik django.po jeżeli znamy składnię używaną przez gettex. Na tym etapie użyjemy polecenia, które wyszuka w plikach aplikacji ciągi znaków, które zostały oznaczone do przetłumaczenia.

./manage.py makemessages -l en

Po wykonaniu komendy plik django.po będzie zawierał wyszukane elementy. 

W Django ciągi znaków, które będą tłumaczone przez gettex muszą być w specjalny sposób oznaczone. Ciągi znaków mogą być umieszczone w widokach, modelach, szablonach itd. Możemy np. po zaimportowaniu odpowiedniego modułu stworzyć funkcję widoku:

from django.utils.translation import ugettext_lazy as _
...

def about(request):
    """
    Information about company
    """
    message = _("Firma")
   
    return render_to_response('about.html', locals(), 
        context_instance = RequestContext(request))

Po ponownym wykonaniu komendy  "makemessages" plik django.po zostanie zaktualizowany. Gdy go zmodyfikujemy i ustawimy dla danego ciągu znaków wartość "msgstr" będziemy mogli przeprowadzić kompilację tłumaczenia. Edytując plik django.po należy pamiętać aby nie pominąć znaków "" ograniczających ciąg. W sytuacji gdy będziemy chcieli lokalizować ciągi, które zawierają polskie litery musimy do edycji pliku django.po użyć edytora, który umożliwia zapis w UTF-8.

Pisałem wcześniej o pliku django.po. Plik ten posłuży do wygenerowania pliku django.mo, który będzie przez aplikację wykorzystywany podczas lokalizacji. Pliki *.mo powstają w wyniku kompilacji plików *.po

Kompilację przeprowadzimy wywołując polecenie:

./manage.py compilemessages

Gdy zrestartujemy wbudowany serwer Django (lub serwer www ) w zależności od konfiguracji języka aplikacji zobaczymy odpowiednio przetłumaczono wartość. 

Przy użyciu mechanizmu lokalizacji możemy także zmodyfikować ciągi znaków w panelu admina Django aby bardziej dostosować go do naszych wymagać i wyeliminować sytuację polegającą na edycji plików szablonów. Po utworzeniu nowej strony "admina" już na etapie logowania widzimy tytuł "Administracja Django". Znając mechanizm tłumaczeń wiemy jak szybko możemy dokonać zmiany tego ciągu. 

Opiszę teraz jak dodać do naszej aplikacji mechanizm zmiany języka "w locie".

Na początku musimy do naszego szablonu dodać formularz zmiany języka:

<form style="display: inline;" action="/i18n/setlang/" method="post">

{% csrf_token %}<div style="display: inline;"><select name="language"

onchange="javascript:form.submit()"> 

{% for lang in LANGUAGES %} 

<option lang="" selected="selected"
value="{{ lang.0 }}">{{ lang.1 }}</option>

{% endfor %}
 </select></div>
</form>

Następnie w pliku urls.py dodajemy konfigurację adresu, pod którym nastąpi zmiana języka aplikacji:

urlpatterns = patterns('',
...
    (r'^i18n/', include('django.conf.urls.i18n')),
...

Domyślnie Djano pobierze listę wszystkich języków z konfiguracji globalnej (https://github.com/django/django/blob/master/django/conf/global_settings.py). 

Aby ograniczyć listę języków musimy do pliku settings.py dodać własną krotkę:

gettext = lambda s: s
LANGUAGES = (
    ('en', gettext('English')),
    ('pl', gettext('Polish')),
)

I to wszystko. Posiadamy już mechanizm zmiany języka w "locie". Pozostaje nam stopniowo zmieniać ciągi, które mają zostać przetłumaczone. 

Co zawiera blog?

Na blogu umieszczam wpisy dotyczące mojej pracy, zainteresowań. Głowna tematyka to programowanie oraz recenzje płyt oraz książek.

Wszechogarniająca chemia


Fotografia: © Virgin Records Ltd
Recenzja albumu "Surrender" The Chemical ...

Inteligentne techno?


Fotografia: © Sony Music Entertainment (UK) Ltd.
Recenzja albumu "Leftism" ...

Raport sportowy #8


Zdjęcie: Luke Stackpoole, Unsplash

Odrobina relaksu


Fotografia - Tom Hingston
© EMI Records Ltd.
Recenzja albumu ...

Żywy i martwy kot


Na początku miesiąca swoją premierę miała najnowsza wersja systemu operacyjnego ...

Domena, zmiany i plany


Nowy rok już niedługo. Aby dobrze go rozpocząć warto pewne ...