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

32👍

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.

5👍

@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.

4👍

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

USE_I18N = False

USE_L10N = False

2👍

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.

👤Özer

Leave a comment