2015-02-01 7 views
0

это, очевидно, уже обсуждаемая тема, но я борюсь с ответами, которые я нашел в Google, и здесь, на StackOverflow.Django Website multi-language

Я реализовал модели для включения нескольких языков, которые отлично работают. Моя проблема заключается в том, чтобы позволить пользователю на веб-сайте постоянно менять язык для себя.

У меня есть флаг языка в верхней строке меню, который пользователь может щелкнуть, чтобы изменить язык. Затем он открывается/setlanguage/de, тогда как de - это язык. а на английском языке и т.д.

def setlanguage(request, lang): 
    defaultLanguage = 'en' 
    try: 
     if 'language' in request.session: 
      pass 
    except KeyError: 
     request.session['language'] = defaultLanguage 

    if defaultLanguage == lang: 
     return redirect("/") 

    if lang not in list(Language.objects.all().values_list('code').distinct()): 
     request.session['language'] = defaultLanguage 
    else: 
     request.session['language'] = lang 

    return redirect('/') 

Причина этого не работает это редирект и что я не могу установить любой переменные по запросу.

Однако, у меня действительно есть одна страница в любом случае, поэтому мне нужно перенаправить пользователя на «/». Мои переводы также поддерживают разные слизни в URL.

url(r'^show/(?P<slug>[-\w]+)', views.show, name='show'), 

Так что я могу сделать AJAX запросы «/ страница/простой в использовании» или «/ страница/Einfach-цу-bedinen», чтобы получить ту же страницу.

Я действительно не хочу устанавливать cookie на компьютер пользователя. Я исхожу из PHP-фона, я полагаю, что обработка сеансов немного отличается в Django, поскольку я ожидаю, что она будет доступна во всем мире, а не на основе запроса?

Есть ли работа вокруг, чтобы не использовать сеанс, а просто перезагрузить страницу с выбранным языком без кластеризации исходного кода?

ответ

0

Почему вы не используете встроенное представление django set_language?

https://docs.djangoproject.com/en/1.7/topics/i18n/translation/#set-language-redirect-view

Кроме того: что точка

try: 
    if 'language' in request.session: 
     pass 

это буквально ничего не делает.

Проверяется языки можно это сделать:

if lang not in list(Language.objects.all().values_list('code').distinct()): 

не хорошо, потому что вы каждый раз выборку всех языков из базы данных. Лучше сценарий:

if Language.objects.filter(code=lang): 

Рассмотрите возможность размещения доступных языков в файле settings.py вместо базы данных. Если вы действительно хотите сохранить его в базе данных, как-то синхронизируйте его с settings.LANGUAGES, так что все встроенные модули django и сторонние модули могут воспользоваться им.

+0

Спасибо! Это очень полезная информация. Для первого фрагмента кода из-за проблемы с запросом я получил страницы с ошибками из-за KeyError, таким образом я мог обойти эту проблему. Второй фрагмент кода: я не доверяю пользовательскому вводу, и поскольку он может быть вредоносным, я не хочу помещать его в запрос базы данных. Я знаю, что DJango заботится о SQL Injection, но почему-то я этому не верю. Я действительно вижу вашу работу! И я согласен, я не был доволен этим решением. Я думаю, файл настроек! – Richard

+0

Прежде всего, если вы переходите на django из PHP, забудьте о SQL-инъекции, если вы не используете raw SQL (весь оператор или его фрагменты). ORM заботится об этом, и вы не должны делать это снова. Во-вторых: первый фрагмент фактически ничего не делает.Если у вас есть 'if X in Y:' НИКОГДА не будет бросать KeyError, потому что если оператор предназначен для проверки наличия ключа. Поэтому вы снова делаете что-то дважды. – GwynBleidD

+0

Хорошо, хорошо. Я ценю вашу помощь! Я исправлю это и не буду производить такую ​​чушь снова :) – Richard