Как заставить Django поддерживать языковой тег IETF (формат xx-YY)?

У нас есть сайт Django, который поддерживает множество языков. Попытка добавить поддержку плагинов opensearch для нескольких языков.

В спецификации OpenSearch.org используется языковой тег IETF (формат xx-YY). Стандартная настройка Django использует точное соответствие.

  • Текущее состояние, сайт поддерживает только хх форму, что-либо еще возвращает E404. Пример:

    http://website.domain/en/...
    

В зависимости от конфигурации пользователя браузер вставляет языковой параметр как xx или xx-YY. Это должно работать для обоих

  • Если xx-YY не доступен, сайт должен предоставить xx (язык родной страны) результаты.
  • если xx не доступен, сайт должен предоставить en (Английский) результаты.

Пример поддерживаемого URL:

http://website.domain/fr-YY/...

  fall-back to: http://website.domain/fr/...

http://website.domain/xx/...

  fall-back to: http://website.domain/en/...

Пример URL с сайта Mozilla: https://support.mozilla.org/en-US/questions/949545

Как заставить Django поддерживать языковой тег IETF (формат xx-YY)? Я ищу даже подсказки для реализации этого без изменения исходного кода Django.

Обновить:

Ну, в официальной документации ясно сказано, что она должна быть откатной (например, en-us to en), но в моем случае возникает ошибка 404.

Источник: https://django.readthedocs.io/en/1.5.x/topics/i18n/translation.html

Если базовый язык доступен, но указанный подъязык недоступен, Django использует базовый язык. Например, если пользователь указывает de-at (австрийский немецкий), но у Django есть только de, Django использует de.

...

ЯЗЫКИ = ( ('de', _('German')), ('en', _('English')),)

Этот пример ограничивает языки, доступные для автоматического выбора, немецким и английским (и любым подъязыком, например, de-ch или en-us).

Вот связанные части кода:

settings.py

# Language code for this installation. All choices can be found here:
# http://www.i18nguy.com/unicode/language-identifiers.html
LANGUAGE_CODE = 'en'

LANGUAGES = (
  ( 'ar', "Arabic" ),
  ( 'en', "English" ),
  ( 'fr', "French" ),
  ( 'id', "Indonesian" ),
  ( 'ja', "Japanese"),
  ( 'ku', "Kurdish" ),
  #( 'ur', "Urdu" ),
  ( 'ms', "Malay" ),
  ( 'ml', "Malayalam" ),
  #( 'tr', "Turkish" ),
  ( 'es', "Spanish" ),
  ( 'pt', "Portuguese"),
  #( 'sv', "swedish" )
)

# These are languages not supported by Django core. We have to provide
# their info here so we can use them in our templates. This is mainly
# used in `wui.templatetags.languages`.
EXTRA_LANGUAGES = {
  'ku': {
    'code': 'ku',
    'name': 'Kurdish',
    'bidi': True,
    'name_local': 'Kurdish'
  },
  'ms': {
    'code': 'ms',
    'name': 'Malay',
    'bidi': False,
    'name_local': 'Malay'
  },
}


SITE_ID = 1

# If you set this to False, Django will make some optimizations so as not
# to load the internationalization machinery.
USE_I18N = True

# If you set this to False, Django will not format dates, numbers and
# calendars according to the current locale
USE_L10N = True

urls.py

from django.conf.urls import patterns, include, url
from django.conf.urls.i18n import i18n_patterns

# Uncomment the next two lines to enable the admin:
# from django.contrib import admin
# admin.autodiscover()

urlpatterns = patterns( '',
  url( r'^jos2', 'wui.views.jos2' ),
  url(r'^r', 'wui.views.one_aya_page'),
  url(r'^$', 'wui.views.results'),
  # url( r'^admin/', include( admin.site.urls ) ),
)

# These URLs accept the language prefix.
urlpatterns += i18n_patterns('',
  url(r'^$', 'wui.views.results'),
  url(r'^(?P<unit>\w{3,15})/', 'wui.views.results'),
)

# 404 not found handler

handler404 = 'wui.views.custom_404'

2 ответа

Решение

Ну, насколько я могу проверить, Django i18n поддерживает откат xx-YY в xx затем по умолчанию (en в моем случае) но только для Accept-Language заголовок пользовательского агента. Это не делает то же самое для переключения языка URL.

Вот решение, которое я мог бы придумать:

from django.views.generic import RedirectView
from django.conf import settings
...
urlpatterns += patterns('',
  url(r'^(?P<lang>[a-z]{2})-[A-Za-z]{2}/(?P<path>.*)$', RedirectView.as_view(url='/%(lang)s/%(path)s',query_string=True)),
  url(r'^[a-z]{2}/(?P<path>.*)$', RedirectView.as_view(url='/{}/%(path)s'.format(settings.LANGUAGE_CODE),query_string=True)),
)
  • любой xx-YY не обрабатывается шаблоном i18n, перенаправленным на xx
  • любой xx не обрабатывается шаблоном i18n, перенаправленным на язык по умолчанию, установленный с помощью LANGUAGE_CODE,

Вам необходимо указать поддерживаемые языки в настройках:

LANGUAGES = (
    ('en', _('English'),
    ('en-gb', _('British English'),
    ('en-au', _('Australian English'),
    ('es', _('Spanish'),
    ('es-ar', _('Argentinian Spanish'),
)

Оттуда использовать i18n_urlpatterns, Когда вы создаете PO файлы, вам нужно будет запустить python manage.py makemessages -l en_GBи т. д. Проверьте здесь для получения дополнительной информации.

Другие вопросы по тегам