2011-06-27 10 views
3

更新:問題について少し研究した後、(解決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', '&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

、それを基本クラスとして使用すると、カレンダーモードに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'), ] 

私はこのカレンダーをローカライズする方法を見つけるように見えることはできません。何か案は?

答えて

6

おかしい、私はちょうどこれを昨日して、あなたの質問を偶然に遭遇しました。私は上記の答えだと思う

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) 

はまた、私は私がlocalepurgeですべてを吹き飛ばされていたので、いくつかのロケール「パック」をインストールする必要がありました。ここでは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 

希望。

+0

ニース!しかし、そのコードは、私が見ている限り、1つの言語に対してしか機能しません。私は私のアプリは多言語であるので、get_current_language()で現在のユーザーlangを取得できると思います。とにかく、答えをありがとう、私はいくつかのテストを行うつもりです –

+0

はい、設定からロケール名を取得する代わりに、ユーザープロファイルから取得し、コンストラクタに渡します。うまく動作するはずです。 –

+0

コードを修正しましたが、ロケールを管理できないようにValueError "値が大きすぎます"と返されました:/ –

0

それは完全に無関係である、ない他のアイデアの場合には、お使いのモジュールファイルの最初の行として

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

を追加してみてください。

+0

ファイルの先頭にutf-8コーディングが既にありますが、動作していないようです。 –

関連する問題