Django 1.5: удалить префикс языка по умолчанию из URL-адреса в django i18n

Я использую Django 1.5.

Я настроил интернационализацию в проекте и установил следующие переменные в файле settings.py.

LANGUAGE_CODE = 'en'

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

и файл urls.py содержит

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

Но это добавляет en к каждому URL-адресу, например

https://example.com/en/dashboard

Я хочу скрыть язык по умолчанию из шаблона URL.

Я попытался поместить prefix_default_language=False в шаблон URL.

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

Но это дает ошибку как

i18n_patterns() got an unexpected keyword argument 'prefix_default_language'

Как скрыть префикс языка по умолчанию из URL-адреса в Django 1.5?


person Anuj TBE    schedule 20.02.2019    source источник


Ответы (2)


Насколько я понимаю из docs, по умолчанию prefix_default_language не поддерживается в django 1.5. Так что либо вам нужно отказаться от идеи использовать это, либо вам нужно реализовать это самостоятельно. Если вы выберете последний вариант, вам нужно создать новую функцию i18n_patterns, а также обновить LocaleRegexURLResolver внутри нее. Например:

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]

Теперь вам нужно использовать CustomLocaleRegexURLResolver в пользовательском i18n_patterns, например:

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)]

Наконец, используйте это в своем URL-адресе:

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

Реализация выполнена на основе кода доступно здесь.

person ruddra    schedule 20.02.2019

вы должны потратить две секунды, чтобы установить USE_I18N = True в файле настроек. Затем Django сделает некоторые оптимизации, чтобы не нагружать механизм интернационализации. Добавьте 'django.core.context_processors.i18n' в настройку TEMPLATE_CONTEXT_PROCESSORS.

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)),
)
   

Ссылка: https://django-doc-test1.readthedocs.io/en/stable-1.5.x/topics/i18n/translation.html#overview

person anjaneyulubatta505    schedule 20.02.2019
comment
Но я хочу интернационализации в своем приложении и просто хочу удалить префикс для языка по умолчанию. Для других языков это нормально. - person Anuj TBE; 20.02.2019