更新:問題について少し研究した後、(解決ASCIIエラーが、今とValueErrorを返します)私は、これは、文書化バグ(issue #3067)とまでので解決できないであることがわかりましたバグがノー結果とジャンゴでのpython HTMLCalendarで作ったカレンダーを、ローカライズしようとしているはジャンゴでのpython HTMLCalendarをローカライズすることはできません
のPython 2.7.3で修正されています。カレンダーはcode from Elving Uggedalで作成されましたが、ローカライズすることは不可能です。ここで
はコードです:models.pyローカライズHTMLCalendarを返す必要があり、私はLocalizeHTMLCalendarを使用してみました
from django.shortcuts import render_to_response, get_object_or_404 from django.utils.safestring import mark_safe from django.template import RequestContext from django.utils import translation from e_cidadania.apps.spaces.models import Meeting, Space from e_cidadania.apps.cal.models import EventCalendar def calendar(request, space_name, year, month): # Avoid people writing wrong numbers or any program errors. if int(month) not in range(1, 13): return render_to_response('cal/error.html', context_instance=RequestContext(request)) place = get_object_or_404(Space, url=space_name) next_month = int(month) + 1 prev_month = int(month) - 1 meetings = Meeting.objects.order_by('meeting_date') \ .filter(space = place, meeting_date__year = year, meeting_date__month = month) cur_lang = translation.get_language() print 'DEBUG:LANG: %s' % cur_lang cur_locale = translation.to_locale(cur_lang)+'.UTF-8' #default encoding with django print 'DEBUG:LOCALE: %s' % cur_locale cal = EventCalendar(meetings, settings.FIRST_WEEK_DAY, cur_locale).formatmonth(int(year), int(month)) return render_to_response('cal/calendar.html', {'calendar': mark_safe(cal), 'nextmonth': '%02d' % next_month, 'prevmonth': '%02d' % prev_month, 'get_place': place}, context_instance = RequestContext(request))
import calendar
from datetime import date
from itertools import groupby
from django.utils.html import conditional_escape as esc
class EventCalendar(calendar.LocaleHTMLCalendar):
"""
Event calendar is a basic calendar made with HTMLCalendar module.
"""
def __init__(self, events, *args, **kwargs):
self.events = self.group_by_day(events)
super(EventCalendar, self).__init__(*args, **kwargs)
def formatday(self, day, weekday):
if day != 0:
cssclass = self.cssclasses[weekday]
if date.today() == date(self.year, self.month, day):
cssclass += ' today'
if day in self.events:
cssclass += ' filled'
body = ['<ul>']
for event in self.events[day]:
body.append('<li>')
body.append('<a href="%s">' % event.get_absolute_url())
body.append(esc(event.title))
body.append('</a></li>')
body.append('<ul>')
return self.day_cell(cssclass, '%d %s' % (day, ''.join(body)))
return self.day_cell(cssclass, day)
return self.day_cell('noday', ' ')
def formatmonth(self, year, month):
self.year, self.month = year, month
return super(EventCalendar, self).formatmonth(year, month)
def group_by_day(self, events):
field = lambda event: event.meeting_date.day
return dict(
[(day, list(items)) for day, items in groupby(events, field)]
)
def day_cell(self, cssclass, body):
return '<td class="%s">%s</td>' % (cssclass, body)
views.py
、それを基本クラスとして使用すると、カレンダーモードにASCIIデコードエラーが返されますdule(ファイルにはutf-8コーディングが宣言されています)。また、ロケール配列day_name、day_abbr、month_name、month_abbrを上書きしようとしましたが、カレンダーのレンダリングが空の状態で終了しました。
例:
from django.utils.translation import ugettext_lazy as _
calendar.day_name = [_('Monday'), _('Tuesday'), _('Wednesday'), _('Thursday'), _('Friday'), _('Saturday'), _('Sunday'), ]
私はこのカレンダーをローカライズする方法を見つけるように見えることはできません。何か案は?
ニース!しかし、そのコードは、私が見ている限り、1つの言語に対してしか機能しません。私は私のアプリは多言語であるので、get_current_language()で現在のユーザーlangを取得できると思います。とにかく、答えをありがとう、私はいくつかのテストを行うつもりです –
はい、設定からロケール名を取得する代わりに、ユーザープロファイルから取得し、コンストラクタに渡します。うまく動作するはずです。 –
コードを修正しましたが、ロケールを管理できないようにValueError "値が大きすぎます"と返されました:/ –