2012-07-18 12 views
5

Mam stronę django Dodaję tłumaczenia do z selektorem języków, który wymienia dostępne języki w języku użytkownika. Chciałbym, aby lista zawierała również pisownię natywną.Selektor języka Django w języku lokalnym i ojczym

Obecnie wygląda to tak:
English
holenderski
chiński uproszczony

Kiedy przełączyć na chińskim wygląda:
英语
荷兰语
简体 中文

jestem próbując sprawić, aby wyglądało:
Angielski/angielski
Holenderski/Nederlands
Uproszczony Chiński/简体 中文

settings.py zawiera:

ugettext = lambda s: s 
LANGUAGES = (
    ('en', ugettext('English')), 
    ('nl', ugettext('Dutch')), 
    ('zh-cn', ugettext('Simplified Chinese')), 
) 

base.html:

{% load i18n %} 
    {% get_available_languages as LANGUAGES %} 
    <form action="/i18n/setlang/" method="post">{% csrf_token %} 
     <input name="next" type="hidden" value="/" /> 
     {% csrf_token %} 
     <select name="language"> 
      {% for lang in LANGUAGES %} 
      <option value="{{ lang.0 }}">{{ lang.1 }}</option> 
      {% endfor %} 
     </select> 
     <input type="submit" value="Go" /> 
    </form> 

Moja myśl była, aby dodać kolejny element do języków, które jest język ojczysty, na przykład:

LANGUAGES = (
    ('en', ugettext('English'), 'English'), 
    ('nl', ugettext('Dutch'), 'Nederlands'), 
    ('zh-ch', ugettext('Simplified Chinese'), '简体中文'),) 

Jednak Django wydaje się oczekiwać 2-krotnej krotki dla JĘZYKÓW. Jakieś inne pomysły?

EDIT na komentarz Aleksandra: Myślałem, że może być prostsze rozwiązanie, ale po zmianie kodu:

 <form action="/i18n/setlang/" method="post">{% csrf_token %} 
     <input name="next" type="hidden" value="/" /> 
     <select name="language"> 
      <option value="en">English</option> 
      <option value="nl">Dutch\Nederlands</option> 
      <option value="ru">Russian\Русский</option> 
      <option value="zh-cn">Simplified Chinese-简体中文</option> 
     </select> 
     <input type="submit" value="Go" /> 
    </form> 

skrypty rosyjskich i chińskich są wyświetlane jako znaki zapytania - Rosyjski \ ?? ?????, Chiński-????

Mam <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> w html, inny tekst rosyjski i chiński (poza tym formularzem) wygląda dobrze.

+0

Nie zawracaliśmy sobie głowy takim problemem: zakodowano jedną część w szablonie i to wszystko. –

+0

Musisz przełączać/ustawiać języki i wyliczyć je wszystkie, aby wygenerować wszystkie możliwe natywne tłumaczenia dla każdej nazwy języka. O wiele łatwiej jest po prostu osadzić predefiniowany dyktat nazw z pisownią natywną dla każdego języka i przekazać go do szablonu. – astevanovic

Odpowiedz

5

Spróbuj tego:

LANGUAGES = (
    ('en', '{}/{}'.format(ugettext('English'), 'English')), 
    ('nl', '{}/{}'.format(ugettext('Dutch'), 'Nederlands')), 
    ('zh-cn', '{}/{}'.format(ugettext('Simplified Chinese'), '简体中文')), 
) 

Następnie można użyć tego w szablonach:

{% for lang in LANGUAGES %} 
    <option value="{{ lang.0 }}">{{ lang.1 }}</option> 
{% endfor %} 
+0

Kod ten daje kod UnicodeDecodeError pod/ "ascii" nie może dekodować bajt 0xd0 na pozycji 8: porządkowy nie w zakresie (128), gdy szablon wywołuje {% get_available_languages ​​jako LANGUAGES%}. Jeśli zmienię na "简体 中文", otrzymam kod UnicodeEncodeError: kodek "ascii" nie może kodować znaków w pozycjach 0-6: porządkowych nie w zakresie (128) podczas importowania ustawień .py – Steve

+0

Niestety, nie wiem jak dobrze sformatować komentarze ... Musiałem ustawić kodowanie pliku settings.py na utf-8 i kilka innych regulacji. Kodowanie tego języka ma wiele podstaw do opanowania, aby działało dobrze! – Steve

+0

Nie musisz używać {% get_available_languages ​​jako LANGUAGES%}. Jeśli nie zmieniłeś 'TEMPLATE_CONTEXT_PROCESSORS', domyślnie masz już dostęp do szablonów" {{LANGUAGES}} ". {% get_available_languages%} powoduje błąd UnicodeDecodeError. –

1

Biorąc sugestię Aleksandra, udało mi się dostać kod w edycji powyżej działał poprawnie. Nie miałem linii <meta http-equiv="content-type" content="text/html;charset=UTF-8" /> w obszarze "głowy", która jest wymagana, a to dawało mi ???? gdzie powinny być chińskie znaki.

Po obejrzeniu go w akcji mogę mieć 2 selektory języka, jeden z nich zostanie przetłumaczony na bieżący język, a drugi z angielskimi/znakami natywnymi, jeśli nie jest zbyt zajęty.

Umieszczę także listę języków w module i przekazuję ją do szablonu podobnego do uzyskiwania JĘZYKÓW.