2016-09-19 26 views
13

Chciałbym mieć kilka różnych wersji tego samego języka w Django, dostosowanych do różnych krajów (np. locale/en, locale/en_CA, locale/en_US itd.). Jeśli nie ma języka dla konkretnego kraju, spodziewam się użyć domyślnej wersji językowej (locale/en)).Jak zachować różne wersje językowe tego samego języka w Django?

Następnie w pliku ustawień dla każdej witryny określam LANGUAGE_CODE i LANGUAGES.

Z jakiegoś powodu, nawet jeśli określenie następujących ustawień, locale/en_US tłumaczenia są nadal używane:

LANGUAGE_CODE = 'en' 
LANGUAGES = (
    ('en', ugettext('English')), 
) 

Choć wyraźnie określić, że kod języka powinny być en (nie en-us).

Czy brakuje mi czegoś? Próbowano już znaleźć odpowiedź w wielu miejscach, w tym w dokumentacji Django.

+0

Właściwie, jeśli Django obsługuje tę funkcję, należy zachować minimalne wpisy w en_CA, en_US itp. I awaryjnie powielać na zasadzie main * en * przez większość czasu, ponieważ większość słów jest taka sama we wszystkich smakach. To znaczy. wybierz z konkretnego, jeśli znajdziesz w nim słowo * sąsiad * i * sąsiad *, ale pozostawiasz * dom * tylko w głównym. –

+0

Zgadza się, ale problem polega na tym, że Django z jakiegoś powodu używa "en_US", nawet jeśli po prostu określam "en". Jakieś wskazówki? Edycja: jeśli podam "en-ca", to poprawnie używa "en_CA". –

+0

Nie, niestety, ta odrobina porad pochodzi z mojego doświadczenia w innym systemie i była tylko wskaźnikiem, aby obniżyć koszty tłumaczeń. Nie korzystałem jeszcze z obsługi tłumaczeń Django. –

Odpowiedz

0

Obejście problemu polega na dodaniu następującego fragmentu do pliku settings.py.

import locale 
locale.locale_alias.pop('en', None) 

specjalna kredytowej Venelin Stoykov który był w stanie zbadać zachowanie modułu Pythona locale.

0

czy mogę zaproponować, aby umieścić punkt przerwania w klasie LocaleMiddleware?

W ten sposób dowiesz się, która rzecz rzeczywiście znalazła sposób na uzyskanie właściwego języka.

Becaue zgodnie z source code z LocaleMiddleware Class i How Django discovers language preference , może być tak wiele rzeczy, które mogą wpłynąć na wynik.

+0

Mam rację, jestem tego świadomy, ale tak nie jest, ponieważ używam 'i18n_patterns' i to jest pierwsza rzecz, której szuka' LocaleMiddleware'. –

+0

Ok, właśnie próbowałem dodawać punkty przerwania w 'process_request' i' process_response' metodach 'LocaleMiddleware', a język jest poprawnie ustawiony na' en'. Mimo że używane jest locale "en_US'. –

3

To jest dziwactwo Pythona (nie konkretnie Django) i modułu gettext.

Bilet 8626 został zgłoszony w śledzącym wydaniu Django w czasie wydania wersji 1.0, a po kilku sugestiach i debatach twórcy Django uznali go za "nie naprawi".

W wątku zgłoszenia znajdują się sugestie, aby domyślnie używać "en-en". Moja pamięć jest trochę szorstka, ale jeśli dobrze pamiętam, to podejście nie działało dobrze z innymi częściami mojego narzędzia i18n (np. Biblioteka ospy). Zrezygnowałem i zdecydowałem się na używanie en-US jako domyślnego dla projektu i wymieniając inne warianty (na przykład en-au) jako alternatywy.

+1

Dzięki za wskazanie kierunku - otrzymałeś nagrodę! Rzecz w tym, że używam również i18n_patterns do dostosowywania adresów URL w językach. Sztuczka z "en-us" lub "en-en" może działać, ale zmieni strukturę adresu URL aplikacji. Wszelkie sugestie na ten temat? –

+0

Czy możesz zadowalać się tłumaczeniem przysięgłym na oba adresy: ogólny angielski (.../en /) i amerykański (.../en-us /)? Szczerze mówiąc, wolę trzymać języki/lokalizacje poza adresami URL, ale być może możesz udostępnić swój schemat URL w innym pytaniu i mogę dać mu trochę do myślenia. –