Reputation: 9790
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
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
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.
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"
)
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