Search code examples
djangodjango-i18n

When using i18n_patterns, how to reverse url without language code


I am using i18n_patterns but I want to use reverse to create a link to the page without language in the url (such that the user will be redirected based on cookies and headers and such).

I have tried

from django.utils.translation import activate, deactivate, get_language
current_lang = get_language()
deactivate()
url = reverse(things)
activate(current_lang)

That works for getting other language versions using activate(target_lang), but if I deactivate I just get urls for the default language (/en/account/ but I want /account/).

I already thought getting alternate language versions is overly complicated, but this I cannot manage at all. Any hints? (Without manually stripping LANGUAGE_CODE from the url)

UPDATE: I also tried

from django.core.urlresolvers import get_resolver
get_resolver(None).reverse(*args, **kwargs)

but get NoReverseMatch


Solution

  • I think the easiest way is to let Django resolve the URL with the language prefix and then just remove the language prefix.

    You can write the following function:

    import re
    from django.core.urlresolvers import reverse
    
    def reverse_no_i18n(viewname, *args, **kwargs):
        result = reverse(viewname, *args, **kwargs)
        m = re.match(r'(/[^/]*)(/.*$)', result)
        return m.groups()[1]
    

    Now, anywhere in your code you can do something like this:

    from myproject.utils import reverse_no_i18n
    
    def my_view(request):
        return HttpResponseRedirect(reverse_no_i18n('my_view_name'))
    

    You might also want to create a custom {% url %} templatetag which calls your custom function.