localization - django translated urls and accept-language header -
i've setup translated urls languages. default language django has been set en-us.
if request page /registration/ nl-nl accept-language header, 404. wasn't expecting such behaviour. rather hoping redirected /registratie/ ,the tranlated url corresponds accept-language header. ofcourse /registratie/ nl-nl accept-language header, works fine , gives me expected 200.
i'm guessing normal can ?
isn't there chance user might link website , link build english language, user in question has different supported language setting, accept-language header ? in such case presented 404. should presented or english (default) content or or redirected correct url language if supported.
also happens if user has not supported language setting ? django default language_code used, en-us in case ?
is there way work around or handle in different better way ?
an extract urls.py file, shows how i've setup translated urls:
url(_(r'^step1/$'), accounttypeselectionview.as_view(), name="registration_step1"),
i'm making wild assumption _ ugettext_lazy.
also happens if user has not supported language setting ? django default language_code used, en-us in case ?
yes, ugettext use default value if no specific value set. can see behaviour in do_translate in django.utils.translation.trans_real.
what happens ugettext_lazy prior url being looked up, translated user's language , part of url checked against these. (django uses per-thread language setting changed reflect user's choices.)
isn't there chance user might link website , link build english language, user in question has different supported language setting, accept-language header ? in such case presented 404. should presented or english (default) content or or redirected correct url language if supported.
well, yes believe should supported feature quick @ source made appear url resolving have changed bit accomodate this.
what can do, use custom 404 page (as briefly mentioned here under customizing error views):
in urls.py:
handler404 = 'mysite.views.i18n_retry' and in view
from django.utils.translation import override django.core.urlresolvers import resolve def i18n_retry(request): language in settings.languages: override(language, deactivate=true): try: result = resolve(request.path) #here know language url in #if supported format #and can smart except http404: #http404 thrown whenever resolving fails pass #here should return real 404 i've used override context manager django 1.4. there longer way of doing same without.
Comments
Post a Comment