Search code examples
djangodjango-1.5django-i18n

Django 1.5: Remove default language prefix from url in django i18n


I'm using Django 1.5.

I have setup internationalization in the project and has set up following variables in the settings.py file

LANGUAGE_CODE = 'en'

LANGUAGES = (
    ('en', 'English'),
    ('es', 'Spanish')
)

and the urls.py file contians

urlpatterns += i18n_patterns('',
    url(r'^', include(app_urlpatterns)),
)

But this appends en to every URL like

https://example.com/en/dashboard

I want to hide the default language from the URL pattern.

I tried putting prefix_default_language=False in the url pattern

urlpatterns += i18n_patterns('',
    url(r'^', include(app_urlpatterns)),
    prefix_default_language=False
)

But this gives error as

i18n_patterns() got an unexpected keyword argument 'prefix_default_language'

How can I hide default language prefix from the URL in Django 1.5?


Solution

  • As far as I can understand from docs, by default there is no support for prefix_default_language in django 1.5. So either you need to discard the idea of using that, or you need to implement that on your own. If you choose latter option, you need to create a new i18n_patterns function, also need to update LocaleRegexURLResolver inside that. For example:

    from django.core.urlresolvers import LocaleRegexURLResolver
    
    
    class CustomLocaleRegexURLResolver(LocaleRegexURLResolver):
         def __init__(self, urlconf_name, default_kwargs=None, app_name=None, namespace=None, prefix_default_language=True):
            self.prefix_default_language = prefix_default_language
            super(LocaleRegexURLResolver, self).__init__(None, urlconf_name, default_kwargs, app_name, namespace)
    
         @property
         def regex(self):
            language_code = get_language()
            if language_code == settings.LANGUAGE_CODE and not self.prefix_default_language:
                 return re.compile('^')
            if language_code not in self._regex_dict:
                regex_compiled = re.compile('^%s/' % language_code, re.UNICODE)
                self._regex_dict[language_code] = regex_compiled
            return self._regex_dict[language_code]
    

    Now, you need to use CustomLocaleRegexURLResolver in custom i18n_patterns, like this:

    from django.conf import settings
    from django.conf.urls import patterns, url
    from django.core.urlresolvers import LocaleRegexURLResolver
    
    def custom_i18n_patterns(prefix, *args, *kwargs):
        prefix_default_language = kwargs.get('prefix_default_language', True)
        pattern_list = patterns(prefix, *args)
        if not settings.USE_I18N:
            return pattern_list
        return [CustomLocaleRegexURLResolver(pattern_list, prefix_default_language=prefix_default_language)]
    

    Finally, use this in your url:

    urlpatterns += custom_i18n_patterns('',
        url(r'^', include(app_urlpatterns)),
        prefix_default_language=False
    )
    

    Implementation has been done based on code available here.