Django i18n язык по умолчанию без префиксов пути - программирование
Подтвердить что ты не робот

Django i18n язык по умолчанию без префиксов пути

У меня есть многоязычное приложение Django, которое я переношу на Django 1.4. Поддержка I18n в настоящее время основана на некоторых уродливых хаках, я бы хотел, чтобы он использовал встроенные модули i18n Django.

Одно из ограничений заключается в том, что я не хочу менять URL-адреса, которые уже существуют. Этот сайт был активным некоторое время, и есть внешние ссылки на него, которые я не хочу ломать или перенаправлять. Схема URL-адресов работает следующим образом: английский язык находится в корне сайта, а другие языки используют префиксы в имени домена:

Английские URL:

/
/articles/
/suggestions/

Испанские URL:

/es/
/es/articulos/
/es/sugerencias/

У меня есть переведенные страницы, работающие с модулями Django 1.4 i18n, но на самом деле, действительно, действительно хочется поставить все английские URL под /en/. Я пробовал несколько разных хаков, включая определение неинтерминированных URL-адресов для английской версии:

def build(callback):
  return callback('',
    url(_(r'^$'), home.index, name="home"),
    url(_(r'^articles/$'), content.article_list, name='article_list'),
    url(_(r'^suggestions/$'), suggestions.suggestions, name='suggestions'),
  )

urlpatterns = build(patterns)
urlpatterns += build(i18n_patterns)

Это делает правильные URL-адреса, но тэг {% url%} для обратного разрешения не работает.

Каков наилучший способ выполнения неперечисленных англоязычных URL-адресов?

4b9b3361

Ответ 1

ОБНОВЛЕНИЕ: прочитайте ответ ниже, Django 1.10 поддерживает его

Я столкнулся с этой проблемой и решил так:

  • Создан альтернативный i18n_patterns который не префикс основного языка сайта (определенный в settings.LANGUAGE_CODE).

  • Создал альтернативное промежуточное программное обеспечение, которое использует язык префиксов URL для активации текущего языка.

Используя этот метод, я не видел побочных эффектов.

Код:

# coding: utf-8
"""
Cauê Thenório - cauelt(at)gmail.com

This snippet makes Django do not create URL languages prefix (i.e. /en/)
for the default language (settings.LANGUAGE_CODE).

It also provides a middleware that activates the language based only on the URL.
This middleware ignores user session data, cookie and 'Accept-Language' HTTP header.

Your urls will be like:

In your default language (english in example):

    /contact
    /news
    /articles

In another languages (portuguese in example):

    /pt/contato
    /pt/noticias
    /pt/artigos

To use it, use the 'simple_i18n_patterns' instead the 'i18n_patterns'
in your urls.py:

    from this_sinppet import simple_i18n_patterns as i18n_patterns

And use the 'SimpleLocaleMiddleware' instead the Django 'LocaleMiddleware'
in your settings.py:

    MIDDLEWARE_CLASSES = (
    ...
        'this_snippet.SimpleLocaleMiddleware'
    ...
    )

Works on Django >=1.4
"""

import re

from django.conf import settings
from django.conf.urls import patterns
from django.core.urlresolvers import LocaleRegexURLResolver
from django.middleware.locale import LocaleMiddleware
from django.utils.translation import get_language, get_language_from_path
from django.utils import translation


class SimpleLocaleMiddleware(LocaleMiddleware):

    def process_request(self, request):

        if self.is_language_prefix_patterns_used():
            lang_code = (get_language_from_path(request.path_info) or
                         settings.LANGUAGE_CODE)

            translation.activate(lang_code)
            request.LANGUAGE_CODE = translation.get_language()


class NoPrefixLocaleRegexURLResolver(LocaleRegexURLResolver):

    @property
    def regex(self):
        language_code = get_language()

        if language_code not in self._regex_dict:
            regex_compiled = (re.compile('', re.UNICODE)
                              if language_code == settings.LANGUAGE_CODE
                              else re.compile('^%s/' % language_code, re.UNICODE))

            self._regex_dict[language_code] = regex_compiled
        return self._regex_dict[language_code]


def simple_i18n_patterns(prefix, *args):
    """
    Adds the language code prefix to every URL pattern within this
    function, when the language not is the main language.
    This may only be used in the root URLconf, not in an included URLconf.

    """
    pattern_list = patterns(prefix, *args)
    if not settings.USE_I18N:
        return pattern_list
    return [NoPrefixLocaleRegexURLResolver(pattern_list)]

Код выше доступен по адресу: https://gist.github.com/cauethenorio/4948177

Ответ 3

Django 1.10 поддерживает его изначально. Как говорится в документе:

i18n_patterns (* urls, prefix_default_language = True)

Эта функция может использоваться в корневом URLconf, и Django автоматически добавит текущий код активного языка ко всем шаблонам url, определенным в i18n_patterns().

Настройка prefix_default_language для False удаляет префикс из языка по умолчанию (LANGUAGE_CODE). Это может быть полезно при добавлении переводов на существующий сайт, чтобы текущие URL-адреса не менялись.

Источник: https://docs.djangoproject.com/en/1.10/topics/i18n/translation/#language-prefix-in-url-patterns