Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to remove the language identifier from django-cms 2.4 URLs?

I have followed the tutorial to make a new Django-CMS (2.4) site. I am only using a single language (English).

There is an automatic redirect to include the language identifier '/en/' in my site's URLs. How do I remove it?

thanks.

like image 444
Racing Tadpole Avatar asked Jul 31 '13 01:07

Racing Tadpole


4 Answers

Option 1:

Set USE_I18N = False in your settings file.

Django’s internationalization hooks are on by default... If you don’t use internationalization, you should take the two seconds to set USE_I18N = False in your settings file. [Django documentation:Translation]

The internationalization is "inherited" from Django. Django-cms 2.4 uses Django 1.5 which supports internationalization and the use of USE_I18N flag. The flag has been used in all successive django releases.

Option 2:

replace this pattern registration:

urlpatterns = i18n_patterns('',
 url(r'^admin/', include(admin.site.urls)),
 url(r'^', include('cms.urls')),
)

with this:

from django.conf.urls import patterns

urlpatterns = patterns('',
  url(r'^admin/', include(admin.site.urls)),
  url(r'^', include('cms.urls')),
)

The tutorial you pointed to uses the i18n_patterns method which does exactly this: prepends the language code to your urls.

Also note you can safely remove 'django.middleware.locale.LocaleMiddleware' and 'cms.middleware.language.LanguageCookieMiddleware' from your MIDDLEWARE_CLASSES if you will not use multiple languages.

like image 64
ppetrid Avatar answered Nov 20 '22 02:11

ppetrid


@ppetrid's answer is still correct. However, as of Django 1.6 patterns is no longer available. Change the existing code to this:

from django.conf.urls import patterns

urlpatterns = (
  url(r'^admin/', include(admin.site.urls)),
  url(r'^', include('cms.urls')),
)

You will also get a warning if you leave the '', in the patterns too.

like image 21
Lewis Menelaws Avatar answered Nov 20 '22 04:11

Lewis Menelaws


In django version 1.8.18 you just need to put False at this variable in settings.py

USE_I18N = False

USE_L10N = False
like image 26
Yuda Prawira Avatar answered Nov 20 '22 02:11

Yuda Prawira


If you want to keep one language in the URL, for instance because you have backlinks in the web with the language code, you can simply take out the other language in settings.py

LANGUAGES = (        
    #('en', gettext('en')),
    ('de', gettext('de')),
)

CMS_LANGUAGES = {        
    'default': {
        'public': True,
        'hide_untranslated': False,
        'redirect_on_fallback': True,
    },
    1: [            
        {
            'public': True,
            'code': 'de',
            'hide_untranslated': False,
            'name': gettext('de'),
            'redirect_on_fallback': True,
        },
        # {
        #     'public': True,
        #     'code': 'en',
        #     'hide_untranslated': False,
        #     'name': gettext('en'),
        #     'fallbacks': ['de'],
        #     'redirect_on_fallback': True,
        # },
    ],
}

That way the URL still shows www.example.com/de/foo.html. In the Example above, that /de/ will be lost, which will render all your URLs in the web meaningless.

Thus, from an SEO perspective, it might not be the best option if you have already built up links with the language code in it.

like image 2
Özer Avatar answered Nov 20 '22 03:11

Özer