Не удается локализовать python HTMLCalendar в django



Обновление: после исследования немного о проблеме (решена ошибка ASCII, но теперь возвращает ValueError) я обнаружил, что это документально подтвержденная Ошибка (проблема #3067) и поэтому неразрешима, пока ошибка не будет исправлена в Python 2.7.3





Я пытаюсь локализовать календарь, сделанный с помощью python HTMLCalendar в django, безрезультатно. Календарь был составлен с помощью кода от Эльвинга Уггедала, но локализовать его, похоже, невозможно.



Вот код:



Models.py



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', '&nbsp;')

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



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))


Я пробовал использовать LocalizeHTMLCalendar, который должен возвращать локализованный HTMLCalendar, но, используя его в качестве базового класса, он возвращает ошибку декодирования ASCII в календарном модуле (файлы имеют кодировку 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'), ]


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

657   2  

2 ответов:

Забавно, я только вчера сделал это и случайно наткнулся на ваш вопрос.

Вот как я преодолел препятствия, извините, немного сложно:

Настройки:

LANGUAGE_CODE           = 'en-us'
FIRST_DAY_OF_WEEK       = 0     # 0 is Sunday
# Convert to calendar module, where 0 is Monday :/
FIRST_DAY_OF_WEEK_CAL   = (FIRST_DAY_OF_WEEK - 1) % 7

# figure locale name
LOCAL_LANG              = LANGUAGE_CODE.split('-')[0]
LOCAL_COUNTRY           = LANGUAGE_CODE.split('-')[1].upper()
LOCALE_NAME             = LOCAL_LANG + '_' + LOCAL_COUNTRY + '.UTF8'

Я думаю, что это ответ выше. Вы используете Ubuntu / Debian? Я не смог бы заставить его работать, если бы не'.UTF8 ' был там. Мне также нужен был заголовок utf8 python ниже. Продолжающий...

Вид:

# -*- coding: utf8 -*-
class kCalendar(calendar.LocaleHTMLCalendar):
    def __init__(self, *args):
        # some customization I did ...
        calendar.LocaleHTMLCalendar.__init__(self, *args)  
        # super didn't work, can't remember why...
# more customization here...

kcal = kCalendar(date, settings.FIRST_DAY_OF_WEEK_CAL, 
    settings.LOCALE_NAME)
calhtml = kcal.formatmonth(date.year, date.month)

Кроме того, мне нужно было установить некоторые языковые "пакеты", так как я взорвал все с местным буржуем. Вот скрипт для Ubuntu:

Add_lang_pack.sh:

#!/usr/bin/env bash

if [ "$#" -eq 0 ]; then
  echo -e "\nUsage: `basename $0` <locale, eg: en_US>\n"
  exit 1
fi

sudo /usr/share/locales/install-language-pack $1

if grep -q "$1" /etc/locale.nopurge
then
    # code if found
    echo -e "\n** not adding $1 to /etc/locale.nopurge, is already there.\n"
else
    sudo sh -c "echo $1 >> /etc/locale.nopurge"
    sudo sh -c "echo $1.UTF-8 >> /etc/locale.nopurge"
fi

sudo dpkg-reconfigure locales
Надеюсь, это поможет.

Это может быть совершенно неуместно, но в случае отсутствия других идей попробуйте добавить

# -*- coding: UTF-8 -*-

Как первая строка файла модуля.

Comments

    Ничего не найдено.