2013-05-08 2 views
0

Из того, что я прочитал в Django документации, это то, что делает LocaleMiddleware:Джанго Интернационализация с геолокации

LocaleMiddleware пытается определить языковые предпочтения пользователя, следуя этому алгоритму:

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

В противном случае он ищет ключ django_language в сеансе текущего пользователя.

В противном случае он ищет печенье.

Имя используемого файла cookie устанавливается установкой LANGUAGE_COOKIE_NAME . (Имя по умолчанию - django_language.)

В противном случае он рассматривает HTTP-заголовок Accept-Language. Этот заголовок отправлен вашим браузером и сообщает серверу, какой язык (а) вы предпочитаете, в порядке приоритета. Django пробует каждый язык в заголовке , пока не найдет его с доступными переводами.

В противном случае используется глобальный параметр LANGUAGE_CODE.

Я хочу, чтобы мой проект django обнаружил страну-пользователя и использовал ее при выборе языка по умолчанию?

Как это сделать:

У меня есть две идей в виде:

  • Написать новую промежуточный программное обеспечение, которое запускаемые перед LocaleMiddleware и в этом промежуточном слое, если нет печенья LANGUAGE_COOKIE_NAME установить его с помощью Джанго GeoLocation

  • Заменить LocaleMiddleware и вместо того, чтобы искать заголовок HTTP Accept-Language использовать Джанго GeoLocation

Что вы думаете?

Может быть, есть еще один простой способ?

Редактировать: у меня будет возможность изменить язык, проблема возникает только при первом открытии веб-сайта (любой страницы, а не только первой страницы). Я рассматриваю сейчас, чтобы установить django_language для языка сайта по умолчанию/bg/(если таких параметров нет), а также использовать международные urls/en /,/bg /. Также должен быть вариант переключения языка. Таким образом, не будет проблем с поисковыми системами, и я вообще не буду использовать геолокацию.

Edit: Кроме того, есть такая проблема, что здесь (в Болгарии) большинство браузеров заголовков устанавливаются предпочитают английский язык, который не является хорошим вариантом :(

ответ

0

На самом деле это не очень хорошая идея в целом.Вы редко хотите, чтобы установил язык для клиента, поэтому большинство сайтов используют факультативную форму. (кнопки флага или, возможно, выпадающий список).

LocaleMiddleware спускается по иерархическому пути, который, скорее всего, выберет правильный перевод (если имеется). Правильным решением было бы передать вашим клиентам форму, чтобы установить или переключить их предпочтения. Вы можете заполнить ключ сеанса django_language, если форма обработана.

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

+0

У меня будет возможность изменить язык, проблема возникает только при первом открытии веб-сайта. Я рассматриваю сейчас, чтобы установить django_language для языка сайта по умолчанию/bg/(если таких параметров нет), а также использовать международные urls/en /,/bg /. Также должен быть вариант переключения языка. Таким образом, не будет проблем с поисковыми системами, и я вообще не буду использовать геолокацию. –

+0

Также есть эта проблема, что здесь (в Болгарии) большинство заголовков браузеров предпочитают английский язык, который не является хорошим вариантом :( –

0

Я нашел, что это очень полезно:

Middleware, который заставит Джанго использовать settings.LANGUAGE_CODE для языка по умолчанию и не использовать equest.META [ 'HTTP_ACCEPT_LANGUAGE']

class ForceDefaultLanguageMiddleware(object): 
    """ 
    Ignore Accept-Language HTTP headers 

    This will force the I18N machinery to always choose settings.LANGUAGE_CODE 
    as the default initial language, unless another one is set via sessions or cookies 

    Should be installed *before* any middleware that checks request.META['HTTP_ACCEPT_LANGUAGE'], 
    namely django.middleware.locale.LocaleMiddleware 
    """ 
    def process_request(self, request): 
     if request.META.has_key('HTTP_ACCEPT_LANGUAGE'): 
      del request.META['HTTP_ACCEPT_LANGUAGE'] 

Источник: https://gist.github.com/vstoykov/1366794

Смежные вопросы