Anuj TBE
Anuj TBE

Reputation: 9790

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?

Upvotes: 0

Views: 2037

Answers (2)

ruddra
ruddra

Reputation: 51938

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.

Upvotes: 1

anjaneyulubatta505
anjaneyulubatta505

Reputation: 11665

you should take the two seconds to set USE_I18N = True in your settings file. Then Django will make some optimizations so as not to load the internationalization machinery. Add 'django.core.context_processors.i18n' in TEMPLATE_CONTEXT_PROCESSORS setting.

settings.py

USE_I18N = True
TEMPLATE_CONTEXT_PROCESSORS = (
    "django.contrib.auth.context_processors.auth",
    "django.core.context_processors.debug",
    "django.core.context_processors.i18n",
    "django.core.context_processors.media",
    "django.core.context_processors.static",
    "django.core.context_processors.tz",
    "django.contrib.messages.context_processors.messages"
)

urls.py

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

Reference: https://django-doc-test1.readthedocs.io/en/stable-1.5.x/topics/i18n/translation.html#overview

Upvotes: 0

Related Questions