2009-08-25 12 views
5

Od Django Dokumentacja:Korzystanie settings.LANGUAGES z poprawnie przetłumaczonych nazw korzystających gettext()

Jeśli zdefiniujemy LANGUAGES ustawienie niestandardowego, to OK, aby zaznaczyć języki jak ciągi tłumaczeń (jak w domyślnym wartość wyświetlona powyżej) - ale używa funkcji "dummy" gettext(), a nie tej w django.utils.translation. Nigdy nie należy importować django.utils.translation od wewnątrz plik ustawień, ponieważ moduł sam w sobie zależy od ustawień , a to spowodowałoby okrągły import. Rozwiązaniem jest użycie funkcji "dummy" gettext(). Oto plik ustawień przykładowych:

gettext = lambda s: s LANGUAGES = ( ('de', gettext('German')), ('en', gettext('English')), )

W tym układzie, django-admin.py makemessages będzie jeszcze znaleźć i zaznaczyć te ciągi do tłumaczenia, ale tłumaczenie nie będzie stało na wykonywania - - więc musisz zapamiętać , aby zawrzeć języki w rzeczywistym gettext() w dowolnym kodzie, który używa LANGUAGES W czasie wykonywania.

Co to właściwie oznacza owijanie języków w rzeczywistości gettext()? Jak to powinno być wywołane w kodzie?

Odpowiedz

3

dokładnie to co mówi: zadzwoń gettext() o nazwach językowych kiedy rzeczywiście z nich korzystać lub je pokazać użytkownikowi:

from django.utils.translation import ugettext 

for lang_code, lang_name in settings.LANGUAGES: 
    translated_name = ugettext(lang_name) 
    ... 

(Należy generalnie wykorzystać ugettext zamiast gettext, od całego tekstu w Django jest Unicode)

Aby zrobić równowartość w szablonie, wystarczy użyć {% blocktrans%} tag, który po prostu wywołuje ugettext za kulisami.

{% for lang in LANGUAGES %} 
    {% blocktrans %}{{ lang.1 }}{% endblocktrans %} 
{% endfor %} 
+0

Ta metoda jest dość stright naprzód i zrozumiałe. Ale w takim razie, jaki jest sens używania obojętnego opakowania w ustawieniach.LANGUAGES? Ponieważ w każdym razie musisz zawijać każdą linię kodu, jaki jest sens funkcji opakowania, która jest zasugerowana w samouczku. –

+2

Ponieważ po uruchomieniu narzędzia wiersza poleceń gettext nad drzewem źródłowym (prawdopodobnie za pośrednictwem makrumentów ./manage.py), chcesz, aby te łańcuchy były rozpoznawane jako "wymagające tłumaczenia", aby dodać je do pliku PO. –

0

to jest re sojusznikiem komentarz i dalsze wyjaśnienie powyższego Q & A. Nie mogłem dostać moje tłumaczenia do pracy, czytać i ponownie czytać dokumenty, wyszukiwane godzin online, a po przeczytaniu tego postu zdałem sobie sprawę, że to sprowadza się do tego:

pierwotnie miał:

LANGUAGES = (
    ('en', 'English'), 
    ('nl', 'Dutch'), 
    ) 

co nie działa, to po przeczytaniu tego próbował

ugettext = lambda s: s 
LANGUAGES = (
    ('en', ugettext('English')), 
    ('nl', ugettext('Dutch')), 
    ) 

co czyniło wszystko działa ... a ja po prostu szukał tego i to jest w doc pod adresem https://docs.djangoproject.com/en/1.4/topics/i18n/translation/#how-django-discovers-language-preference, w kierunku botto m tej sekcji ...

0

w Szablon można po prostu wykonaj następujące czynności:

{% for lang in LANGUAGES %} 
     {% trans lang.1 %} 
{% endfor %} 
2

Według latest docs można użyć ugettext_lazy w ustawieniach bez powodowania importu okrągłe:

from django.utils.translation import ugettext_lazy as _ 

LANGUAGES = [ 
    ('de', _('German')), 
    ('en', _('English')), 
]