Найти - Пользователи
Полная версия: Интернационализация \\ проблема переключения языка
Начало » Django » Интернационализация \\ проблема переключения языка
1 2
[NK]_Jezz
По идее всё должно работать но не могу понять гдя напорол и почему не переключаются языки!
Версия 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
помогло закоментить
'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
параметры языка проекта меняются но сами фразы не заменяются
buddha
Утилиту gettext качал?
Команды makemessages, compilemessages запускал?
Какая структура папок проекта? Где находится папка locale?
[NK]_Jezz
Утилита установлена gettext установлена
Подготовил шаблон прописал makemessages сделал перевод прописал compilemessages
mysite/
/mysite/
/myapp/
/locale/
/manage.py

если закоментить строку в setting.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 />
Но сами фразы не переводятся хотя перевод написан и скомпилирован.
А если строку в setting не комментирование то выдаёт ошибку при смене языка по адресу, скрин ошибки прилагается
http://127.0.0.1:8000/i18n/setlang/
хотя в шаблоне используется вполне адекватное изменение языка в котором имеется {% csrf_token %}
<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>
buddha
Ты не на все вопрос ответил! Доответь , пожалуйста…

-Не вижу конструкций, которые нужны для перевода, т.е. слова/предложения обёртнутые в “_('Message')”(кроме как в файле settings, но там макетный перевод).

Сам я делал через форму выбора…
Что вижу у тебя:
1) Не нужно комментировать ‘django.middleware.csrf.CsrfViewMiddleware’. Он как раз нужен для тега {% csrf_token %}
2) Папка locale может находиться либо в папке проекта, либо в папке приложения, либо в стандартной папке в корне django. В твоём случае папку проекта надо кинуть в ПОДпапку mysite(папкой проекта стичается папка, содержащая settings.py, urls.py, wsgi.py, выяснил методом хождения по граблям).

По идее должно помочь…
Да и обязательно посмотри реализацию функции представлении django.views.i18n.set_language().
Я делал свою, но она похожа на стандартную…
[NK]_Jezz
Ну модель я решил не переводить, хотя потом возможно и сделаю, перевод у меня требуется только в шаблонах.
То что комментировать не нужно я уже понял.
Вот так выглядит допустим у меня шаблон выглядит
<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
Всё таки закомментировал строку
'django.middleware.csrf.CsrfViewMiddleware',
Перенёс папку locale в папку приложения и заработало!
Если в папку с проектом кидать где setting лежит то там вообще данные не собирает, а если в основную где проект и приложения лежат то данные собираются но не используются!
Так что не могу понять зачем нам требуется в шаблоне и объявление в настройках!
{% csrf_token %}
buddha
{% csrf_token %} нужно подставлять всегда после форм, это нужно для безопасности, в противном случае будет ругаться django, как у тебя. Про эту уязвимость я толком не знаю. https://docs.djangoproject.com/en/1.4/topics/security/#cross-site-request-forgery-csrf-protection

Про сбор данных… Всё так и есть, как ты пишешь, почти… Данные собираются отталкиваясь от директории, в которой ты запускаешь команду makemessages. Если бы ты все приложения перенёс в подпапку mysite, то утилита бы находила всё без нареканий.

Skype есть? Я на интернационализации столько нервов потратил) хочу тебе до конца помочь)
Из сообщений пока не могу понять, почему csrf предупреждение вылазит…
[NK]_Jezz
Ну я оставил {% csrf_token %} но закомментил саму библиотеку, поэтому она как бы никаких функций не выполняет, и без этого работает отлично.
Со сбором данных я тоже разобрался за это тебе отдельное спасибо.

Проблема решилась просто.
вот так у меня было
def index (request):
contacts = Contacts.objects.all()
t = loader.get_template("index.html")
c = Context({ 'contacts':contacts })
return HttpResponse(t.render(c))
в страницу не передавался request
def index (request):
contacts = Contacts.objects.all()
t = loader.get_template("index.html")
c = RequestContext(request, { 'contacts':contacts })
return HttpResponse(t.render(c))
Теперь всё работает как положено!
док по этой теме https://docs.djangoproject.com/en/dev/topics/http/shortcuts/#example
GaiveR
_Jezz, отключив защиту от csrf вы оставили серьезную дыру в безопасности сайта. Рекомендую все же включить её обратно, а с ошибкой - разобраться.

Скорее всего проблема заключалась в использовании Context вместо RequestContext (о необходимости которого недвусмысленно говорилось в описании ошибки).

В общем рекомендую не забивать на это дело, а разобраться. Будут вопросы - пишите.


This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB