Форум сайта python.su
По идее всё должно работать но не могу понять гдя напорол и почему не переключаются языки!
Версия Django - 1.4
http://python.su/forum/topic/10922/
Нашел такую же тему но там ответа так и не дали.
#setting
import os
DEBUG = True
TEMPLATE_DEBUG = DEBUG
ADMINS = (
# ('Your Name', 'your_email@example.com'),
)
MANAGERS = ADMINS
DATABASES = {
'default': {
'ENGINE': 'django.db.backends.sqlite3', # Add 'postgresql_psycopg2', 'mysql', 'sqlite3' or 'oracle'.
'NAME': '/home/jezz/workspace/freezer_ice_cream/sqlite.db', # Or path to database file if using sqlite3.
'USER': '', # Not used with sqlite3.
'PASSWORD': '', # Not used with sqlite3.
'HOST': '', # Set to empty string for localhost. Not used with sqlite3.
'PORT': '', # Set to empty string for default. Not used with sqlite3.
}
}
TIME_ZONE = 'America/Chicago'
LANGUAGE_CODE = 'ru-RU'
_ = lambda s: s
LANGUAGES = (
('ru', _('Russian')),
('en', _('English')),
)
USE_I18N = True
USE_L10N = True
USE_TZ = True
MEDIA_ROOT = '/home/jezz/workspace/freezer_ice_cream/freezer_info/media'
ADMIN_MEDIA_PREFIX = '/media/'
STATIC_URL = '/static/'
STATICFILES_FINDERS = (
'django.contrib.staticfiles.finders.FileSystemFinder',
'django.contrib.staticfiles.finders.AppDirectoriesFinder',
)
TEMPLATE_LOADERS = (
'django.template.loaders.filesystem.Loader',
'django.template.loaders.app_directories.Loader',
)
MIDDLEWARE_CLASSES = (
'django.middleware.common.CommonMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.locale.LocaleMiddleware',
'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
)
ROOT_URLCONF = 'freezer_info.urls'
WSGI_APPLICATION = 'freezer_ice_cream.wsgi.application'
TEMPLATE_DIRS = (
os.getcwd() + '/freezer_info/templates',
)
INSTALLED_APPS = (
'freezer_info',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.sites',
'django.contrib.messages',
'django.contrib.staticfiles',
'django.contrib.admin',
'django.contrib.admindocs',
)
#url.py
from django.conf.urls import *
from django.contrib import admin
from django.conf import settings
from freezer_info.views import equipment,contacts,materials,index
admin.autodiscover()
from django.utils import translation
urlpatterns = patterns('',
(r'^i18n/', include('django.conf.urls.i18n')),
(r'^media/(?P<path>.*)$', 'django.views.static.serve', {'document_root': settings.MEDIA_ROOT}),
url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
url(r'^admin/', include(admin.site.urls)),
url(r'^$', index),
)
template
{% extends "base.html" %}
{% block content %}
{% load i18n %}
{% get_current_language as LANGUAGE_CODE %}
{% get_available_languages as LANGUAGES %}
{% get_current_language_bidi as LANGUAGE_BIDI %}
<h2>Main Page!!!</h2>
<form action="/i18n/setlang/" method="post">
{% csrf_token %}
<input name="next" type="hidden" value="{{ redirect_to }}" />
<select name="language">
{% get_language_info_list for LANGUAGES as languages %}
{% for language in languages %}
<option value="{{ language.code }}">{{ language.name_local }} ({{ language.code }})</option>
{% endfor %}
</select>
<input type="submit" value="Go" />
</form>
{% get_language_info for LANGUAGE_CODE as lang %}
Language code: {{ lang.code }}<br />
Name of language: {{ lang.name_local }}<br />
Name in English: {{ lang.name }}<br />
Bi-directional: {{ lang.bidi }}
{% endblock %}
#views.py
from django.template import loader, Context
from django.http import HttpResponse
from freezer_info.models import Contacts
def index (request):
contacts = Contacts.objects.all()
t = loader.get_template("index.html")
c = Context({ 'contacts':contacts })
return HttpResponse(t.render(c))
Отредактировано [NK]_Jezz (Дек. 14, 2012 17:44:11)
Офлайн
помогло закоментить
'django.middleware.csrf.CsrfViewMiddleware',
но почему-то теперь сами фразы не меняют значение на требуемое
А если не коментить то вылетает ошибка
Forbidden (403)
CSRF verification failed. Request aborted.
Help
Reason given for failure:
CSRF token missing or incorrect.
и вообще ничего не работает
Language code: en
Name of language: English
параметры языка проекта меняются но сами фразы не заменяются
Отредактировано [NK]_Jezz (Дек. 14, 2012 21:01:54)
Офлайн
Утилиту gettext качал?
Команды makemessages, compilemessages запускал?
Какая структура папок проекта? Где находится папка locale?
Отредактировано buddha (Дек. 15, 2012 06:27:02)
Офлайн
Утилита установлена gettext установлена
Подготовил шаблон прописал makemessages сделал перевод прописал compilemessages
mysite/
/mysite/
/myapp/
/locale/
/manage.py
'django.middleware.csrf.CsrfViewMiddleware',
{% get_current_language as LANGUAGE_CODE %}
{% get_available_languages as LANGUAGES %}
{% get_current_language_bidi as LANGUAGE_BIDI %}
{% get_language_info for LANGUAGE_CODE as lang %}
Language code: {{ lang.code }}<br />
Name of language: {{ lang.name_local }}<br />
Name in English: {{ lang.name }}<br />
http://127.0.0.1:8000/i18n/setlang/
<form action="/i18n/setlang/" method="post">
{% csrf_token %}
<input name="next" type="hidden" value="{{ redirect_to }}" />
<select name="language">
{% get_language_info_list for LANGUAGES as languages %}
{% for language in languages %}
<option value="{{ language.code }}">{{ language.name_local }} ({{ language.code }})</option>
{% endfor %}
</select>
<input type="submit" value="Go" />
</form>
Отредактировано [NK]_Jezz (Дек. 15, 2012 11:13:22)
Прикреплённый файлы: Безымянный.png (26,0 KБ)
Офлайн
Ты не на все вопрос ответил! Доответь , пожалуйста…
-Не вижу конструкций, которые нужны для перевода, т.е. слова/предложения обёртнутые в “_('Message')”(кроме как в файле settings, но там макетный перевод).
Сам я делал через форму выбора…
Что вижу у тебя:
1) Не нужно комментировать ‘django.middleware.csrf.CsrfViewMiddleware’. Он как раз нужен для тега {% csrf_token %}
2) Папка locale может находиться либо в папке проекта, либо в папке приложения, либо в стандартной папке в корне django. В твоём случае папку проекта надо кинуть в ПОДпапку mysite(папкой проекта стичается папка, содержащая settings.py, urls.py, wsgi.py, выяснил методом хождения по граблям).
По идее должно помочь…
Да и обязательно посмотри реализацию функции представлении django.views.i18n.set_language().
Я делал свою, но она похожа на стандартную…
Отредактировано buddha (Дек. 15, 2012 15:38:06)
Офлайн
Ну модель я решил не переводить, хотя потом возможно и сделаю, перевод у меня требуется только в шаблонах.
То что комментировать не нужно я уже понял.
Вот так выглядит допустим у меня шаблон выглядит
<h1> mysite.example.com</h1>
<a href='/'>{% trans "Main Page!" %}</a><br>
<a href='/contacts/'>{% trans "Contacts" %}</a><br>
<a href='/equipment/'>{% trans "Equipment" %}</a><br>
<a href='/materials/'>{% trans "Materials" %}</a><br>
{% block content %}
{% endblock %}
Отредактировано [NK]_Jezz (Дек. 15, 2012 16:22:19)
Офлайн
Всё таки закомментировал строку
'django.middleware.csrf.CsrfViewMiddleware',
{% csrf_token %}
Офлайн
{% csrf_token %} нужно подставлять всегда после форм, это нужно для безопасности, в противном случае будет ругаться django, как у тебя. Про эту уязвимость я толком не знаю. https://docs.djangoproject.com/en/1.4/topics/security/#cross-site-request-forgery-csrf-protection
Про сбор данных… Всё так и есть, как ты пишешь, почти… Данные собираются отталкиваясь от директории, в которой ты запускаешь команду makemessages. Если бы ты все приложения перенёс в подпапку mysite, то утилита бы находила всё без нареканий.
Skype есть? Я на интернационализации столько нервов потратил) хочу тебе до конца помочь)
Из сообщений пока не могу понять, почему csrf предупреждение вылазит…
Офлайн
Ну я оставил {% csrf_token %} но закомментил саму библиотеку, поэтому она как бы никаких функций не выполняет, и без этого работает отлично.
Со сбором данных я тоже разобрался за это тебе отдельное спасибо.
Проблема решилась просто.
вот так у меня было
def index (request):
contacts = Contacts.objects.all()
t = loader.get_template("index.html")
c = Context({ 'contacts':contacts })
return HttpResponse(t.render(c))
def index (request):
contacts = Contacts.objects.all()
t = loader.get_template("index.html")
c = RequestContext(request, { 'contacts':contacts })
return HttpResponse(t.render(c))
Отредактировано [NK]_Jezz (Дек. 15, 2012 20:36:22)
Офлайн
_Jezz, отключив защиту от csrf вы оставили серьезную дыру в безопасности сайта. Рекомендую все же включить её обратно, а с ошибкой - разобраться.
Скорее всего проблема заключалась в использовании Context вместо RequestContext (о необходимости которого недвусмысленно говорилось в описании ошибки).
В общем рекомендую не забивать на это дело, а разобраться. Будут вопросы - пишите.
Отредактировано GaiveR (Янв. 2, 2013 02:21:01)
Офлайн